По вашему запросу ничего не найдено :(
Убедитесь, что запрос написан правильно, или посмотрите другие наши статьи:
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
Если вам захотелось автоматизировать рутинные задачи по управлению сетью - присмотритесь к Puppet Почему и зачем? В последние десятилетия развитие компьютерных сетей достигает небывалых масштабов. Рост крупных корпораций приводит к тому, что в отдельные сети объединяются сотни и тысячи машин, и это не считая глобальной сети. Темпы этого развития ускоряются с появлением новых программных продуктов, которые позволяют в разы ускорить процессы развертывания и обслуживания сети. Десятки тысяч операций, которые раньше выполнялись вручную, сейчас выполняются за считанные минуты в автоматическом режиме. Одним из таких программных решений стал продукт Puppet. В этой статье мы постараемся подробно осветить плюсы и минусы этой программы. Что же такое Puppet? Как говорит нам Википедия, это кроссплатформенная система управления и конфигурирования операционных систем, построенная на основе клиент-серверной архитектуры. Если говорить проще - это и есть та самая программа, которая позволяет конфигурировать операционные системы для развертывания, управления и обновления компьютерных сетей на десятках, сотнях и тысячах удаленных машин. Под кроссплатформенностью в данном случае понимается то, что клиентская часть программы полностью совместима и корректно работает на широком спектре самых распространенных операционных систем, что позволяет объединять в единую сеть рабочие станции под Windows, CentOS и Debian. А теперь давайте рассмотрим плюсы и минусы Puppet - ведь не может же все быть прекрасно и красиво. Кратко о светлых и положительных сторонах решения Автоматизация: как и говорилось выше Puppet позволяет автоматически конфигурировать операционные системы на удаленных машинах, что избавляет системного инженера десятки раз вручную одинаковым образом настраивать машины, выезжая на места. Можно возразить "а что мешает доверить эту работу нескольким специалистам?" Такой вариант тоже возможен, но это повлечет за собой дополнительные расходы, да и общая надежность системы сильно упадет, поскольку каждый специалист пишет код по-своему, из-за этого может пострадать совместимость. Скорость развертывания: автоматизация передачи и применения настроек не только экономит ресурсы пользователя, а еще и ускоряет процесс развертывания и обновления сети в десятки раз. Та работа, на которую ранее уходили дни и недели работы, сейчас выполняется за считанные минуты. Это позволяет разгрузить занятость сетевого инженера и высвободить его время для решения других задач - например, для разработки программного обеспечение или работы с клиентами. Кроссплатформенность: однозначным плюсом этого решения является поддержка различных операционных систем. На заре становления компьютерных сетей невозможность взаимодействия из-за конфликтов кода вынуждало корпорации применять одни и те же операционные системы на всех рабочих станциях компании, что снижало эффективность за счет узкой специализации ОС. Сейчас Puppet позволяет включать в общую сеть компьютеры под различными операционными системами, и обеспечивать их эффективное взаимодействие. Это позволяет увеличить общую эффективность деятельности компании в несколько раз Поддержка: программа достаточно проста в использовании. Однако, иногда возникают проблемы. Puppet имеет техническую поддержку, специалисты которой фиксируют обращения пользователей и работают над исправлением проблем. Продукт развивается непрерывно, поэтому каждая следующая версия работает все более эффективно. Общая безопасность системы: поскольку Puppet обновляет конфигурацию множества узлов системы параллельно, не составляет особых сложностей применить в конфигурировании клиентских операционных систем гибкие настройки безопасности. Это обеспечивает достаточно эффективную защиту данных от внешних угроз. Вы спросите неужели всё так идеально? Добавим в описание ложку дегтя разберем минусы Puppet Квалификация администратора: обслуживание сети с помощью Puppet рекламируется как довольно простое. Однако, обслуживание крупных сетей всегда требует от администратора высокой квалификации и предельной внимательности. Если при составлении файла конфигурации допустить ошибку, и затем не проверить этот файл должным образом, можно одним махом "положить" несколько сотен серверов. Конечно, откат системы к предыдущей конфигурации настроек восстановит ее работу, но в современном бизнесе любая потеря времени чревата крупными убытками компании. Поэтому сетевой специалист должен быть ответственным и внимательным. Несовместимость с некоторыми версиями ОС: так себе минус, скажете вы. Ну кому сейчас потребуется совместимость с ранними версиями Windows NT? Однако, как показывает практика, кое-где такие сервера до сих пор успешно применяются. В основном, это актуально для небольших компаний с невысокой нагрузкой на сеть. Однако, принцип "работает и ладно" неприменим для современного бизнеса, в котором, чтобы оставаться на плаву, нужно непрерывно улучшать свой продукт. Уязвимость сервера Puppet: централизованное управление сетью может легко породить такую проблему. Безопасность сервера должна стоять превыше всего. Если злоумышленник получит доступ к серверу Puppet, то может сконфигурировать клиентские операционные системы так, как ему заблагорассудится. Например, отдать команды на шифрование данных, или же на их удаление. В этом случае убытки компании-пользователя не поддадутся исчислению. Эта проблема решается установкой современных механизмов защиты сервера от внешних угроз. Но, как известно, стоимость защиты информации не должна превышать стоимость самой информации, а значит здесь нужно руководствоваться в первую очередь здравым смыслом и пониманием базовых принципов информационной безопасности. Очевидно, что плюсов больше, чем минусов - но решать всегда только вам. Опять же, Puppet - не единственный игрок подобного класса решений, и всегда имеет смысл посмотреть и попробовать все, что доступно на рынке - ведь вы никогда не ошибетесь, если поступите правильно :)
img
Сегодня рассказываем про стандартный набор сервисных кодов в FreePBX 13. Спросите, почему стандартный? Потому что ваша сборка FreePBX может иметь более широкий от стандартного диапазона набор модулей, каждый из которых будет иметь свой собственный набор сервисных кодов (Feature Codes). Ну что же, давайте начнем разбираться. Для того, чтобы найти все сервисные коды на вашей IP - АТС Asterisk, перейдите в вкладку Admin -> Feature Codes Коды создания черного списка Ранее мы рассказывали про настройку черного списка в FreePBX 13 и поведали о возможностях его настройки. Вот как его настроить с помощью сервисных кодов: Название Код Описание Blacklist a number *30 Добавить новый номер в черный список. Все звонящие с заблокированных номеров будут слышать соответствующую аудио – запись. Blacklist the last caller *32 Добавить последнего звонящего на IP – АТС в черный список Remove a number from the blacklist *31 Удаление номера из черного списка. Номер вводится вручную Коды перенаправления вызова Название Код Описание Call Forward All Activate *72 Перенаправлять все поступающие на внутренний номер на другой номер. Call Forward All Deactivate *73 Выключить перенаправление вызовов. Call Forward All Prompting Activate *93 Запрашивает у звонящего ввести номер, на котором необходимо включить перенаправление вызовов. Call Forward All Prompting Deactivate *74 Запрашивает у звонящего ввести номер, на котором необходимо отключить перенаправление вызовов Call Forward Busy Activate *90 Включает функцию перенаправления вызовов, если вызываемый номер занят. Call Forward Busy Deactivate *91 Отключает функцию перенаправления вызовов, если вызываемый номер занят. Call Forward Busy Prompting Activate *94 Запрашивает ввести номер, на котором необходимо включить перенаправление вызов по результату «Занято» Call Forward Busy Prompting Deactivate *92 Запрашивает ввести номер, на котором необходимо отключить перенаправление вызов по результату «Занято» Call Forward No Answer/Unavailable Activate *52 Активирует перенаправление вызовов в случае, если пользователь недоступен или не отвечает на вызов Call Forward No Answer/Unavailable Deactivate *53 Деактивирует перенаправление вызовов в случае, если пользователь недоступен или не отвечает на вызов Call Forward No Answer/Unavailable Prompting Activate *95 Запрашивает ввести номер, на котором необходимо подключить перенаправление вызовов по не ответу или недоступности Call Forward Toggle *96 Включает или выключает режим перенаправления вызовов. Первый вызов на *96 выключит функцию, а второй включит. И так далее. Коды ожидания вызова Название Код Описание Call Waiting - Activate *70 Данная функция позволяет настроить прием вызова, даже если абонент уже находится в состоянии разговора. Данная опция поддерживается только на телефонных аппаратах, на которых есть возможность принятия нескольких вызовов. Call Waiting - Deactivate *71 Отключает указанный ваше функционал Коды ядра системы (core) Название Код Описание Asterisk General Call Pickup *8 Наберите данные сервисных код чтобы перехватить вызов, звонящий на другом телефоне Чтобы данная функция сработала, убедитесь: - На звонящем телефоне должен быть настроен Call Group в настройках внутреннего номера. - На номере, с которого вы хотите перехватить вызов, должно быть настроено поле Pickup Group в настройках номера. ChanSpy 555 Очень – очень удобная функция ? Позволяет слушать разговоры сотрудников, при этом, давая подсказки абоненту своей сети, которые не услышит звонящий из города. Это удобно, если вы обучаете нового сотрудника, и, при его общении с клиентом хотите подсказать ему какие-то нюансы в режиме реального времени Directed Call Pickup ** Наберите сервисных код данной функции, а затем внутренний номер, с которого вы хотите перехватить вызов. Функция позволяет перехватывать вызовы с даже номеров, у которых не настроены общие Call Group и Pickup Group In-Call Asterisk Attended Transfer *2 Данная фича позволяет совершить консультативный трансфер вызова, т.е трансфер, при котором оператор изначально дозванивается до абонента, на которого необходимо перевести вызов, говорит с ним, а затем уже соединяет звонящего с этим абонентом. In-Call Asterisk Blind Transfer ## Наберите данный код, чтобы осуществить «слепой», то трансфер, без предварительной консультации. In-Call Asterisk Disconnect Code ** Моментальный сброс входящего звонка. In-Call Asterisk Toggle Call Recording *1 По факту, данный сервисный код активирует запись звонка «по требованию». В мире, данный вид записи известен как On Demand или Prerecording. Запись по требованию означает то, что по умолчанию, вызов не записывается, но, если появляется необходимость записать разговор, достаточно просто нажать указанный сервисный код. Simulate Incoming Call 7777 IP – АТС Asterisk производит тестовый входящий вызов на внутренний номер User Logoff *12 Этот код позволяет разлогиниваться пользователю с телефона. Данная опция доступна только если АТС настроена для использования Device & User Mode. User Logon *11 Позволяет произвести логин пользователю в случае, который описан выше ZapBarge 888 Данный код позволяет пользователю мониторить аудио на драйверах интерфейса Е1, то есть на Zaptel или Dahdi драйверах. Коды управления режимом «Не беспокоить (DND)» Название Код Описание DND Activate *78 Данный сервисный код ставит внутренний номер в состояние «Не беспокоить» (Do Not Disturb). Это означает, что все звонящие на номер абоненты будут либо слышать сигнал занято, либо будут отправлены на голосовую почту. DND Deactivate *79 Выключает режим DND на номере DND Toggle *76 Включает/выключает возможность активации DND для внутреннего номера Прочие коды Call Flow Control Данный код позволяет управлять настройками в модуле Call Flow Control Dictate Название Код Описание Email completed dictation *35 Данный код позволяет записать сообщение и отправить его в виде вложения на электронную почту, следуя подсказкам автоинформатора. Perform dictation *34 Запись голоса, затем ввод имени для файла и сохранение его в файловой структуре IP - АТС Follow Me Название Код Описание Findme Follow Toggle *21 Код позволяет включать или выключать настройки Follow Me для внутреннего номера. Информационные сервисы Название Код Описание Call Trace *69 Система озвучивает CallerID последнего звонящего на данный внутренний номер. Echo Test *43 Данная функция используется для проверки качества связи, в том числе микрофона, динамика аппарата и так далее. Speak Your Exten Number *65 Система произносит настроенный на используемом телефонном аппарате внутренний номер. Speaking Clock *60 Система произносит текущее серверное время. Функции Paging (пейджинга) и Intercom (интеркома) Название Код Описание Intercom prefix *80 Данная функция необходимо для того, чтобы вместо обычного набора на номер, вы не дожидались гудков, а с помощью громкоговорителя произнесли сообщение. Вот пример, как это работает: Пользователь набирает данный сервисный код, а следом за ним внутренний номер. Далее, все последующие звонки на этот номер будут сразу приниматься без участия вызываемого абонента и по громкой связи звонящий сможет произнести свое сообщение. User Intercom Allow *54 Включить прием сообщений по интеркому (громкая связь, как описано выше). User Intercom Disallow *55 Отключает указанную выше функцию. Парковка вызова Название Код Описание Pickup ParkedCall Prefix *85 Когда администратор сконфигурировал слот для «парковки» (Parking) вызова, пользователь может «припарковать» этот вызов путем трансфера на номер паркинга – по умолчанию, это номер 70. Даже если данный слот занят, в настройка модуля Parking можно обозначить количество возможных слотов. Система автоматически запаркует вызов на доступный слот и произнесет его номер. Данный сервисный код как раз и отвечает за поднятие вызова с парковочного слота. Очереди Название Код Описание Allow Dynamic Members of a Queue to login or logout. See the Queues Module for how to assign a Dynamic Member to a Queue. *45 Данная опция позволяет динамическим участниками очередь подключаться и отключаться от нее Playback Queue Caller Count *47 Проговорить количество человек, находящихся в очереди Queue Pause Toggle *46 Взять паузу в очереди и не принимать вызовы. Повторная активация вернет пользователя в очередь. Временные условия (Time Conditions) Указанный сервисный код, а по умолчанию это *27 позволяет управлять настройками временного условия. В рамках системы для каждого нового Time Condition генерируется собственный сервисный код, который имеет формат *27X, где X – это номер временного условия. Голосовая почта (Voicemail) Название Код Описание Dial Voicemail *98 Набрав этот сервисный код будет предложено ввести номер голосового ящика и прослушать его. My Voicemail *97 Доступ к голосовому ящику, который относится к номера, с которого данный код набран (прослушивание собственных записей)
ВЕСЕННИЕ СКИДКИ
40%
50%
60%
До конца акции: 30 дней 24 : 59 : 59