По вашему запросу ничего не найдено :(
Убедитесь, что запрос написан правильно, или посмотрите другие наши статьи:
img
Одной из важнейших потребностей системы Linux является постоянное обновление последних исправлений безопасности, доступных для соответствующего дистрибутива. В этой статье мы объясним, как настроить систему Debian и Ubuntu для автоматической установки и обновления необходимых пакетов безопасности или исправлений при необходимости. Для выполнения задач, описанных в этой статье, вам понадобятся права суперпользователя. Настройка автоматических обновлений безопасности в Debian и Ubuntu Для начала установите следующие пакеты: # aptitude update -y && aptitude install unattended-upgrades apt-listchanges -y где apt-listchanges сообщит, что было изменено во время обновления. Кстати, у нас есть статья, как сделать автоматическое обновление пакетов безопасности на CentOS или RHEL Затем откройте /etc/apt/apt.conf.d/50unattended-upgrades в текстовом редакторе и добавьте эту строку в блок Unattended-Upgrade :: Origins-Pattern : Unattended-Upgrade::Mail "root"; Наконец, используйте следующую команду для создания и заполнения необходимого файла конфигурации /etc/apt/apt.conf.d/20auto-upgrades для активации автоматических обновлений: # dpkg-reconfigure -plow unattended-upgrades Выберите Yes, когда будет предложено установить автоматические обновления (Automatically download and install stable updates? ) и затем убедитесь, что следующие две строки были добавлены в /etc/apt/apt.conf.d/20auto-upgrades: APT::Periodic::Update-Package-Lists "1"; APT::Periodic::Unattended-Upgrade "1"; И добавьте эту строку, чтобы сделать отчеты подробными: APT::Periodic::Verbose "2"; Наконец, проверьте /etc/apt/listchanges.conf, чтобы убедиться, что уведомления будут отправлены в root. email_address=root Готово! В этой статье мы объяснили, как обеспечить регулярное обновление вашей системы последними обновлениями безопасности. Кроме того, вы узнали, как настроить уведомления, чтобы держать себя в курсе, когда применяются исправления.
img
Монорепозиторий использует единый репозиторий системы контроля версий для всех ваших проектов и файлов. Вы можете объединить все свои файлы конфигурации серверной и клиентской частей и инфраструктуры в один репозиторий, которым смогут пользоваться все. Нужно ли это вам? Такая структура популярна среди многих крупных IT-компаний. В число организаций, которые используют монорепозиторий, входят такие, как Google, Microsoft и Facebook. Чем же так привлекают монорепозитории? Альтернативный подход Альтернатива монорепозитория - мультирепозиторий. В случае мультирепозитория вы создаете новый репозиторий для каждого вашего проекта. Как правило, сразу бывает видно, какой проект достоин отдельного репозитория. Если вы разрабатываете приложение, то у вас может быть три репозитория: серверный код : ваш API (возможно, с дополнительными репозиториями для схем баз данных и документации); проект для Android : сборка вашего приложения для Android с помощью Java или Kotlin; проект для iOS : Objective-C или Swift для вашего приложения iOS. Здесь все, что составляет ваше технологическое решение, разделено на отдельные функциональные единицы. Если вы используете монорепозиторий, вы заведомо отказываетесь от такого формата группировки и используете только агрегированное представление. Все ваши файлы составляют одно целое и, соответственно, имеют нумерацию версий.  Совместная работа Одно из преимуществ монорепозитория, которое довольно часто упоминается, гласит о возможности работать совместно. В монорепозитории все видят все. Это помогает добиться ясности, способствует открытости и упрощает доступ членов разных команд к работе друг друга.  Людям становится легче работать совместно над одной задачей, даже если она выходит за рамки их привычных обязанностей. Если вы используете мультирепозиторий, то для того, чтобы получить доступ к какому-либо репозиторию, возможно, вам придется отправить запрос на доступ к нему. Это создает дополнительные проблемы, которых монорепозиторий полностью избегает.  Монорепозитории предлагают распоряжаться конечной целью, а не отдельными ее элементами. Это позволяет людям ощущать себя более вовлеченными в процесс и, к тому же, они будут лучше информированы о происходящем. Разработчик приложения может не трогать серверные компоненты, но он может «чувствовать», как они формируются параллельно с его собственной работой.  Простота абстрактного представления Монорепозитории к тому же упрощают абстрактное представление кода. Как правило, в компонентах серверной и клиентской частей используют схожий функционал. Поэтому целесообразно будет обобщить их в отдельную библиотеку.  Когда вы используете мультирепозиторий и создаете в нем новый репозиторий, вам нужно добавить ссылку на него в остальные. Это можно сделать с помощью создания программного пакета или подмодулей Git. Как бы там ни было, прежде чем ваш абстрактный код можно будет вернуть обратно в проекты, из которых он был получен, нужно будет проделать много работы.  Процесс можно сделать намного проще, если у вас есть монорепозиторий. Вы можете поместить код в каталог, а затем импортировать его туда, куда требуется. «Абстрагирование» занимает считанные секунды. Аналогично при документировании кода - вы можете добавить документацию в свою общую систему документации.  Мультирепозитории препятствуют абстрагированию кода. Члены команды разработчиков часто не имеют необходимых прав доступа GitLab, GitHub или Bitbucket для того, чтобы создать новый репозиторий. Это приводит к дополнительным издержкам, когда руководитель должен утвердить новую библиотеку и настроить репозиторий. Монорепозитории помогают отдельным разработчикам создавать многократно используемый код, игнорируя абстрагирование.  Помимо абстрактного представления кода, монорепозитории упрощают сопровождение общих модулей. Когда вы обновляете программный пакет, вам не нужно обновлять всех пользователей этого пакета. Все зависимости находятся в одной и той же базе данных, поэтому вы можете делать на них ссылки, не прибегая к помощи диспетчера пакетов или специального управления версиями.  Скорость разработки С помощью монорепозитория можно ускорить процесс разработки. Мы упоминали этот момент в предыдущих разделах, но уделим все же ему больше внимания. Монорепозитории позволяют не выполнять одни и те же действия многократно. Если вам нужно провести перепроектирование программного кода, то достаточно будет одной команды «Найти и заменить» (Find and Replace), чтобы применить изменения ко всей кодовой базе. Итого: меньше переключений между проектами и меньше запросов на включение изменений, которые нужно рассмотреть.  Участники разработки получают больше возможностей для самообслуживания. Так как информация не разбивается на отдельные репозитории, то люди имеют больше возможностей для поиска дополнительных данных. Это может сократить переходы туда-сюда в процессе планирования и анализа программного кода.  Эти свойства также помогают, когда вы перепроектируете уже существующую систему. Попытка разделить унаследованное приложение на «клиентскую часть» и «серверную часть» может оказаться не самой удачной идеей. Изменения, которые вы вносите в одной части, обязательно повлияют и на другую, и вам придется постоянно синхронизировать два репозитория. Монорепозитории помогают быстро перепроектировать большие куски кодовой базы, и при этом вы будете знать, что вы влияете на всю систему, а не на отдельные ее компоненты.  Для кого предназначены монорепозитории? Монорепозитории хорошо подходят для больших команд разработчиков, которые ведут множество проектов. Если вы используете его для нескольких небольших проектов, то преимущества могут быть не так очевидны. Монорепозитории лучше всего подходят для работы в тех масштабах, для которых использование мультирепозиториев будет не очень эффективно.  Монорепозитории – это не то же самое, что и монолитные системы. Понятие «монолитная система», как правило, относится к приложениям, в которых уровень данных и уровень представления объединены. Каждый раз, когда вы вносите изменения, задействуется вся система.  Как правило, монорепозитории охватывают несколько систем. У них есть несколько выходных компонентов, таких как API, веб-сайт и мобильное приложение. Не все компоненты нужно создавать, когда вы вносите изменения. Монорепозитории предназначены для того, чтобы облегчить совместное использование программы и ее перепроектирование. Они не предназначены для создания системы с сильными искусственными связями.  Такая структура подходит не для каждой команды разработчиков. Зачастую проще работать с несколькими репозиториями, поскольку они кажутся более логичными, и с ними в принципе легче работать. Не будет необходимости разрешать конфликты слияния в разрозненных частях системы, и будет проще работать с версиями программы. Конвейеры непрерывной интеграции будут быстрее, так как вы не будете тестировать все проекты в каждом конвейере.  Отдельные репозитории также предоставляют более понятную историю версий. Истории монорепозиториев засоряются коммитами, которые делаются для каждого проекта в репозитории. Это затрудняет процесс отслеживания развития отдельных компонентов.  Когда репозиториев несколько, то их легче интегрировать с программным обеспечением контроля версий, таким как GitHub и GitLab. Эти инструменты предполагают однозначное соответствие репозиториев и проектов. Отслеживание проблем и запросов на включение изменений в монорепозитории может оказаться проблематичным – необходимо будет активно использовать теги для того, чтобы привязать каждую проблему к соответствующему проекту.  И, наконец, стоит обратить внимание на тот факт, что большая часть организаций с монорепозиториями используют специализированную инфраструктуру для их поддержки. Git не предназначен для монорепозиториев, и поэтому могут возникнуть проблемы, когда вы достигнете какого-то определенного масштаба. Если в вашей истории версий есть миллион объектов, то, если Git необходимо пройти по всем зависимостям, это может привести к уменьшению скорости работы. Заключение Монорепозиторий упрощает совместное использование программного кода и улучшает визуальный доступ к вашим файлам. Но при этом он делает историю версий менее понятной, повышает риск конфликтов слияния и имеет слабую поддержку со стороны популярных инструментов. Также вы можете столкнуться с проблемами, связанными с производительностью, по мере роста репозитория. Прозрачность монорепозитория подходит не для всех случаев. Если вы находитесь в строго контролируемой среде, то вам может потребоваться использовать отдельные репозитории для того, чтобы у вас была возможность обеспечить надлежащий контроль доступа. Монорепозитории также увеличивают риск потери или кражи устройства сотрудника. Люди, которые получили физический доступ к устройству, могут просматривать весь ваш программный код, а не только те проекты, к которым данный сотрудник имеет какое-либо отношение. Решение, использовать монорепозиторий или нет, должно зависеть от ваших собственных проектов, от их межпроектных зависимостей и членов вашей команды. Не смотрите на крупные IT-компании и не ждите такого же успеха в ваших проектах. Хорошая культура кода – это нечто большее, чем тип репозитория, который вы используете. Монорепозитории больше нужны тогда, когда люди добровольно сотрудничают, работая над общими проектами.
img
В этой статье мы расскажем как интегрировать Python c Excel и Word, чтобы без проблем создавать автоматические отчеты. Microsoft Excel и Microsoft Word – это, без доли сомнений, две наиболее широко используемые программы как в мире бизнеса, так и в некорпоративной сфере. Они практически являются синонимами слову «работа». Как правило, не проходит и недели, чтобы мы тем или иным способом не воспользовались их преимуществами. И хотя для обычных повседневных задач автоматизация не требуется, бывают случаи, когда она может стать необходимостью. А именно, когда у вас есть множество диаграмм, рисунков, таблиц и отчетов, которые необходимо сделать, это может стать очень утомительным занятием, если все это выполнять вручную. А это не должно быть так. На самом деле существует способ создать конвейер в Python, где можно будет легко интегрировать эти программы для создания электронных таблиц в Excel, а затем передавать результаты в Word для создания отчета практически мгновенно. Openpyxl Познакомьтесь с Openpyxl, возможно, одной из самых универсальных привязок в Python, которая превращает взаимодействие с Excel буквально в прогулку по парку. Используя этот пакет, вы сможете читать и записывать все новые и старые форматы Excel, то есть .xlsx и .xls. Openpyxl позволяет заполнять строки и столбцы, выполнять формулы, создавать 2D- и 3D-диаграммы, маркировать оси и заголовки, а также имеет множество других возможностей, которые могут пригодиться. Однако здесь наиболее важно то, что этот пакет позволяет вам перебирать бесконечное количество строк и столбцов Excel, тем самым избавляя вас от всех этих утомительных вычислений и построения графиков, которые вам приходилось делать ранее самим. Python-docx А затем появляется Python-docx – пакет для Word – то же, что Openpyxl для Excel. Если вы все еще не изучили их документацию, то вам все же стоит на нее взглянуть. Python-docx – без преувеличения один из самых простых и понятных наборов инструментов, с которыми я работал с тех пор, как начал работать с Python. Он позволяет автоматизировать создание документов, автоматически вставляя текст, заполняя таблицы и отображая изображения в отчете без каких-либо усилий. Без лишних церемоний давайте создадим наш собственный автоматизированный конвейер. Запустите IDE по вашему выбору и установите следующие пакеты: pip install openpyxlpip install python-docx Автоматизация Microsoft Excel Для начала загрузим уже созданную книгу Excel (как показано ниже): workbook = xl.load_workbook('Book1.xlsx') sheet_1 = workbook['Sheet1'] Затем мы пройдемся по всем строкам в нашей электронной таблице для того, чтобы вычислить и вставить значение мощности, которую мы получим, умножив ток на напряжение: for row in range(2, sheet_1.max_row + 1): current = sheet_1.cell(row, 2) voltage = sheet_1.cell(row, 3) power = float(current.value) * float(voltage.value) power_cell = sheet_1.cell(row, 1) power_cell.value = power Как только мы сделаем это, то мы сможем использовать рассчитанные значения мощности для построения линейной диаграммы, которая будет вставлена в указанную ячейку, как показано ниже: values = Reference(sheet_1, min_row = 2, max_row = sheet_1.max_row, min_col = 1, max_col = 1) chart = LineChart() chart.y_axis.title = 'Power' chart.x_axis.title = 'Index' chart.add_data(values) sheet_1.add_chart(chart, 'e2') workbook.save('Book1.xlsx') Извлечение диаграммы Теперь, когда мы построили нашу диаграмму, нам нужно ее извлечь в формате изображения для того, чтобы мы могли использовать ее в нашем отчете Word. Для начала объявим точное местоположения нашего файла Excel, а также место, куда мы хотим сохранить изображение получившейся диаграммы: input_file = "C:/Users/.../Book1.xlsx" output_image = "C:/Users/.../chart.png" Затем необходимо получить доступ к таблице, используя следующий метод: operation = win32com.client.Dispatch("Excel.Application") operation.Visible = 0 operation.DisplayAlerts = 0 workbook_2 = operation.Workbooks.Open(input_file) sheet_2 = operation.Sheets(1) И далее вы можете перебрать все диаграммы в таблице (если их больше одной) и сохранить их в указанном месте: for x, chart in enumerate(sheet_2.Shapes): chart.Copy() image = ImageGrab.grabclipboard() image.save(output_image, 'png') passworkbook_2.Close(True) operation.Quit() Автоматизация Microsoft Word Теперь, когда у нас есть изображение диаграммы, мы должны создать шаблон документа, который представляет собой обычный документ Microsoft Word (.docx), сформированный именно так, как нам необходимо, чтобы наш отчет имел определенный тип и размер шрифта, нужное форматирование и структуру страницы. Далее, все, что нам необходимо сделать, это создать заполнители для нашего автоматизированного содержимого, то есть значений таблиц и изображений, и объявить их с переменными, как показано ниже. Внутри двойных фигурных скобок {{variable_name}} может быть объявлен любое автоматизированное содержимое, включая текст и изображения. Для таблиц вам необходимо создать таблицу с шаблонной строкой, в которую включены все столбцы, а затем вам необходимо добавить еще одну строку выше и одну строку ниже со следующими обозначениями: Первая строка: {%tr for item in variable_name %} Последняя строка: {%tr endfor %} На рисунке выше указаны следующие имена переменных: table_contents для словаря Python, в котором будут храниться наши табличные данные. Index для ключей словаря (первый столбец). Power, Current и Voltage для значений словаря (второй, третий и четвертый столбцы). Затем мы импортируем наш документ-шаблон в Python и создаем словарь, в котором будут храниться значения нашей таблицы: template = DocxTemplate('template.docx') table_contents = []for i in range(2, sheet_1.max_row + 1): table_contents.append({ 'Index': i-1, 'Power': sheet_1.cell(i, 1).value, 'Current': sheet_1.cell(i, 2).value, 'Voltage': sheet_1.cell(i, 3).value }) Далее мы импортируем изображение диаграммы, которое ранее мы создали в Excel, и создаем еще один словарь для создания экземпляров всех переменных-заполнителей, объявленных в документе-шаблоне: image = InlineImage(template,'chart.png',Cm(10))context = { 'title': 'Automated Report', 'day': datetime.datetime.now().strftime('%d'), 'month': datetime.datetime.now().strftime('%b'), 'year': datetime.datetime.now().strftime('%Y'), 'table_contents': table_contents, 'image': image } И, наконец, мы отображаем отчет с нашей таблицей значений и изображением диаграммы: template.render(context) template.save('Automated_report.docx') Заключение И вот, мы получили автоматически созданный отчет Microsoft Word с числами и диаграммами, созданными в Microsoft Excel. При этом у вас есть полностью автоматизированный конвейер, который можно использовать для создания любого количества таблиц, диаграмм и документов. Исходный код программы import openpyxl as xl from openpyxl.chart import LineChart, Reference import win32com.client import PIL from PIL import ImageGrab, Image import os import sys from docx.shared import Cm from docxtpl import DocxTemplate, InlineImage from docx.shared import Cm, Inches, Mm, Emu import random import datetime import matplotlib.pyplot as plt ######## Generate automated excel workbook ######## workbook = xl.load_workbook('Book1.xlsx') sheet_1 = workbook['Sheet1'] for row in range(2, sheet_1.max_row + 1): current = sheet_1.cell(row, 2) voltage = sheet_1.cell(row, 3) power = float(current.value) * float(voltage.value) power_cell = sheet_1.cell(row, 1) power_cell.value = power values = Reference(sheet_1, min_row = 2, max_row = sheet_1.max_row, min_col = 1, max_col = 1) chart = LineChart() chart.y_axis.title = 'Power' chart.x_axis.title = 'Index' chart.add_data(values) sheet_1.add_chart(chart, 'e2') workbook.save('Book1.xlsx') ######## Extract chart image from Excel workbook ######## input_file = "C:/Users/.../Book1.xlsx" output_image = "C:/Users/.../chart.png" operation = win32com.client.Dispatch("Excel.Application") operation.Visible = 0 operation.DisplayAlerts = 0 workbook_2 = operation.Workbooks.Open(input_file) sheet_2 = operation.Sheets(1) for x, chart in enumerate(sheet_2.Shapes): chart.Copy() image = ImageGrab.grabclipboard() image.save(output_image, 'png') pass workbook_2.Close(True) operation.Quit() ######## Generating automated word document ######## template = DocxTemplate('template.docx') #Generate list of random values table_contents = [] for i in range(2, sheet_1.max_row + 1): table_contents.append({ 'Index': i-1, 'Power': sheet_1.cell(i, 1).value, 'Current': sheet_1.cell(i, 2).value, 'Voltage': sheet_1.cell(i, 3).value }) #Import saved figure image = InlineImage(template,'chart.png',Cm(10)) #Declare template variables context = { 'title': 'Automated Report', 'day': datetime.datetime.now().strftime('%d'), 'month': datetime.datetime.now().strftime('%b'), 'year': datetime.datetime.now().strftime('%Y'), 'table_contents': table_contents, 'image': image } #Render automated report template.render(context) template.save('Automated_report.docx')
ВЕСЕННИЕ СКИДКИ
40%
50%
60%
До конца акции: 30 дней 24 : 59 : 59