По вашему запросу ничего не найдено :(
Убедитесь, что запрос написан правильно, или посмотрите другие наши статьи:
img
Когда мы только начинаем изучать Python, мы закладываем некоторые вредные привычки при написании кода, о которых мы можем даже не подозревать. Вы можете написать код, который сработает сейчас, но может не сработать в будущем, или вы можете использовать какие-то хитрые ходы вместо встроенной функции, которая могла бы облегчить вашу жизнь. У большинства из нас сохранились не одна из тех вредных привычек при программировании на Python, что формируются в период первых месяцев обучения. Отличная новость в том, что вы можете с легкостью искоренить их, прочитав приведенный ниже текст. 1. Использование import * Каждый раз, когда нам становится лень, то возникает соблазн импортировать все необходимое из модуля с помощью from xyz import *. Это не самый лучший подход по многим причинам. Кот несколько из них: Это может оказаться неэффективно: если в модуле очень много объектов, то вам придется долго ждать, пока все импортируется. Это может вызвать конфликт имен переменных: когда вы используете *, то вы понятия не имеете, какие объекты вы импортируете и как они называются. Как же с этим бороться? Импортируйте либо какой-то конкретный объект, либо весь модуль целиком. # Using import * # Bad from math import * print(floor(2.4)) print(ceil(2.4)) print(pi) # Good import math from math import pi print(math.floor(2.4)) print(math.ceil(2.4)) print(pi) 2. Try/except: отсутствие указания исключения в блоке «except» Я очень долго пренебрегал этим. Сложно посчитать, сколько раз Pycharm давал мне понять (этими противными подчеркиваниями), что не нужно использовать «голое» исключение. Это идет в разрез с рекомендациями PEP8. # Try - except # Bad try: driver.find_element(...) except: print("Which exception?") # Good try: driver.find_element(...) except NoSuchElementException: print("It's giving NoSuchElementException") except ElementClickInterceptedException: print("It's giving ElementClickInterceptedException") Проблема «голых» исключений заключается в том, что оно будет перехватывать исключения SystemExit и KeyboardInterrupt, что затрудняет прерывание программы с помощью Control-C. В следующий раз, когда вы будете использовать try/except, укажите исключение в блоке except. 3. Не использовать Numpy для математических вычислений Очень часто мы забываем, что в Python есть множество пакетов, которые могут значительно облегчить нашу жизнь и сделать ее более продуктивной. Одним из таких пакетов является Numpy – пакет для математических вычислений. Numpy может помочь вам вычислять математические операции быстрее, чем циклы for. Допустим, что у нас есть массив random_scores, и мы хотим получить средний балл тех, кто не сдал экзамен (score>>dict_countries.keys() dict_keys(['USA', 'UK', 'Canada'])>>>dict_countries.values() dict_values([329.5, 67.2, 38]) Проблема тут заключается в том, что мы не всегда используем их должным образом. Например, мы хотим просмотреть словарь и получить ключи. Вы можете использовать метод .keys, но знаете ли вы, что ключи можно получить, просто перебирая словарь? В этом случае использование метода .keys будет излишним. # Not using .keys() properly # Bad for key in dict_countries.keys(): print(key) # Good for key in dict_countries: print(key) Кроме того, можно придумать некоторые хитрости для получения значений словаря, например, с помощью метода .items(). # Not using .items() # Bad for key in dict_countries: print(dict_countries[key]) # Good for key, value in dict_countries.items(): print(key) print(value) 7. Никогда не использовать генераторы (или использовать их всегда) Генератор предлагает более простой синтаксис при создании новой последовательности (списка, словаря и т.д.) на основе уже определенной последовательности. Допустим, мы хотим перевести все элементы в нашем списке countries в нижний регистр. И хотя вы могли бы это сделать просто с помощью цикла for, но также вы можете упростить работу при помощи генератора списка. # Bad countries = ['USA', 'UK', 'Canada'] lower_case = [] for country in countries: lower_case.append(country.lower()) # Good (but don't overuse it!) lower_case = [country.lower() for country in countries] Генераторы – это очень полезно, но не злоупотребляйте ими! Помните правило Дзен Python: «Простое лучше, чем сложное». 8. Использование range(len()) Одни из первых функций, которые мы изучили будучи новичками – это range и len, поэтому не удивительно, почему многие люди имеют дурную привычку писать range(len()) при переборе списков. Допустим у нас есть два списка: countries и populations. Если мы хотим пройтись по обоим спискам одновременно, то, вероятнее всего, вы воспользуетесь range(len()). # Using range(len()) countries = ['USA', 'UK', 'Canada'] populations = [329.5, 67.2, 38] # Bad for i in range(len(countries)): country = countries[i] population = populations[i] print(f'{country} has a population of {population} million people') И хотя это в принципе выполняет свою работу, вы все равно можете упростить задачу, воспользовавшись enumerate (или, что еще лучше, воспользовавшись функцией zip для сопряжения элементов из обоих списков). # OK for i, country in enumerate(countries): population = populations[i] print(f'{country} has a population of {population} million people') # Much Better for country, population in zip(countries, populations): print(f'{country} has a population of {population} million people') 9. Форматирование с помощью оператора + Вероятно, одна из первых вещей, которую мы изучаем в Python, - это то, как соединять строки с помощью оператора +. Это полезный, но не самый эффективный способ соединения строк в Python. Помимо этого, это не очень красиво – чем больше строк вам нужно соединить, тем больше операторов + вы будете использовать. Вместо этого вы можете воспользоваться f-строкой. # Formatting with + operator # Bad name = input("Introduce Name: ") print("Good Morning, " + name + "!") # Good name = input("Introduce Name: ") print(f'Good Morning, {name}') Преимуществом f-строк в том, что они полезны не только для конкатенации, но и для других целей. 10. Использование изменяемых значений в качестве значений по умолчанию Если вы включите изменяемое значение (например, список) в качестве параметра функции по умолчанию, то увидите нечто неожиданное. # Bad def my_function(i, my_list=[]): my_list.append(i) return my_list>>> my_function(1) [1] >>> my_function(2) [1, 2] >>> my_function(3) [1, 2, 3] В приведенном выше коде каждый раз, когда мы вызываем функцию my_function, список my_list сохраняет значения из предыдущих вызовов (а мы, скорее всего, хотим инициировать пустой список при каждом вызове функции). Чтобы избежать такой проблемы, мы должны установить этот параметр my_list равным None и добавить условие if как показано ниже. # Good def my_function(i, my_list=None): if my_list is None: my_list = [] my_list.append(i) return my_list>>> my_function(1) [1] >>> my_function(2) [2] >>> my_function(3) [3]
img
Для каждого сервера нелишним будет установка баннера, который мог бы проинформировать злоумышленника о том, какие риски он несёт в случае взлома иили просто каждому пользователю демонстрировать важную информацию о сервере после успешной авторизации. По сути, есть две сущности – баннер и MOTD. После ввода логина вы увидите баннер, и после успешной авторизации будет показан MOTD. Настройка Для начала отредактируем файл /etc/issue.net – например, с помощью редактора Vim: vim /etc/issue.net И вставим в него любой желаемый текст, например: ############################################################### # ACCESS RESTRICTED # # Please disconnect immediately! # # All you actions will be recorded! # ############################################################### Следующим шагом необходимо отредактировать конфиг-файл сревиса sshd и указать путь для баннера. Для этого сначала откроем конфиг следующей командой: vim /etc/ssh/sshd_config Далее необходимо найти строчку, которая относится к баннеру, и прописать путь как на скриншоте ниже: То есть Banner /etc/issue.net. После этого сохраняем конфиг (в Vim нажимаем Esc и вводим :x!, затем Enter). Последним шагом отредактируем файл MOTD, для этого используем команду vim /etc/motd и добавим в неё свой баннер, к примеру: ########################################## # TEST SERVER# # # PLEASE DISCONNECT IF YOU ARE NOT ADMIN # ########################################## Также сохраняем файл и пробуем зайти на сервер, вы должны увидеть следующее: Для формирования баннеров также можно использовать ASCII код, поэтому будьте креативны! :) К примеру, любую картинку можно перевести в код с помощью онлайн ASСII конвертера.
img
В сегодняшней статье расскажем как с помощью сервера Asterisk и и телефонных офисных аппаратов можно создать простейшую, эффективную систему оповещения и организовать внутреннюю селекторную связь. Как можно догадаться, речь сегодня пойдёт о модуле Paging and Intercom на примере Asterisk и FreePBX 13 /p> Модуль Paging and Intercom позволяет сконфигурировать группы телефонных аппаратов, которые будут автоматически принимать вызов при звонке из, так называемой Page Group , и проигрывать оповещательное сообщение через свои динамики. Например, в небольшом офисе можно настроить Page Group со специальным внутренним номером. Когда кто-либо из локальных пользователей наберет этот номер, все телефоны, находящиеся в группе автоматически примут вызов, и можно будет озвучивать сообщение одновременно на все телефоны. Нужно отметить, что этот модуль будет работать практически со всеми SIP телефонами, которые поддерживаются IP-АТС Asterisk. Модуль Paging and Intercom связан с другим модулем – Extensions, который предназначен для создания внутренних добавочных номеров (extension). При настройке Paging группы можно будет выбирать, какие внутренние номера необходимо в неё включить. Рассмотрим настройку модуля Paging and Intercom на примере FreePBX 13. Для того, чтобы попасть на страницу конфигурации модуля, необходимо с главной страницы перейти по следующему пути Applications -> Paging and Intercom . Перед нами откроется окно глобальных настроек Settings, где можно настроить, например, звуковое оповещение, которое услышат участники Page группы, когда локальный пользователь наберет номер группы. По умолчанию – это гудок (Beep), однако можно выбрать любой звук из System Recordings или выставить None, чтобы никакого звука не было вообще. Далее, на вкладке Paging Groups настраиваются непосредственно группы оповещения. Необходимо нажать Add Paging Group, чтобы открылись параметры новой группы. Рассмотрим ключевые параметры при создании Page Group Paging Extension – Внутренний номер группы оповещения. Именно его необходимо набрать, чтобы передать на телефоны участников группы необходимое сообщение Group Description – Описание группы, задается опционально. На примере выше указано “Sales”, то есть участники группы являются сотрудниками отдела продаж Device List – Здесь необходимо выбрать добавочные номера (Extensions) сотрудников, которые будут участниками группы оповещения. Рекомендуется не набирать в одну группу более 25 участников Announcement – Звуковое сообщение, проигрывающееся членам группы, когда происходит вызов группы Busy Extensions – Параметр, позволяющий настроить как поступать с участниками группы, если в момент вызова группы они разговаривают (Busy) Duplex – Параметр, позволяющий включить двустороннюю связь между членами группы Default Page Group – Определить данную группу как группу по умолчанию. В группу по умолчанию можно добавлять участников прямо из модуля Extensions
ВЕСЕННИЕ СКИДКИ
40%
50%
60%
До конца акции: 30 дней 24 : 59 : 59