CodeWhisperer в PyCharm – Как установить и использовать

Что такое Amazon CodeWhisperer?

Amazon CodeWhisperer это помощник программирования на машинном обучении, который в реальном времени даёт рекомендации и подсказки.

Когда вы пишете код, CodeWhisperer генерирует релевантную контексту подсказку, основанную на существующем коде и комментариях: подсказки от одной строчки, до целых функций.

Он может сканировать ваш код на наличие ошибок в безопасности, улучшая общее качество и безопасность кода.

CodeWhisperer интегрируется в различные среды разработки (IDEs), например в PyCharm, IntelliJ IDEA, и прочие:

CodeWhisperer поддерживаемые IDEs и языки программирования

Первостепенная цель — ускорить разработку вашего приложения и эффективность написания кода, особенно в среде, которая все больше зависит от инструментов на базе искусственного интеллекта.

Как установить CodeWhisperer in PyCharm?

Откройте программу PyCharm IDE. И выберите  File > Settings чтобы открыть окно настроек:

PyCharm File > Settings

Выберите вкладку Plugins в окне Settings:

Находим плагин CodeWhisperer для установки в PyCharm

Наберите aws в строке поиска плагинов и нажмите Install:

Устанавливаем плагин CodeWhisperer в PyCharm

Убедитесь, что плагин успешно установился и появилась надпись Restart IDE. Нажмите кнопку Restart IDE чтобы закрыть окно Settings и перезапустить PyCharm.

Перезапуск IDE PyCharm после установки CodeWhisperer

Нажмите AWS Toolkit > кнопку Sign in to AWS:

CodeWhisperer sing in

Необходимо авторизоваться на сайте AWS:

Amazon Q и CodeWhisperer в PyCharm

Если учетной записи у вас нет, то надо зарегистрироваться.

Чтобы CodeWhisperer заработал мне потребовалось установить ещё один плагин — Amazon Q:

CodeWhisperer в PyCharm

После его установки и перезапуска PyCharm заклинатель кода заработал.

Как пользоваться CodeWhisperer

Чтобы CodeWhisperer предложил код, надо начать набирать название функции и плагин на основе этого названия (название функции должно обозначать её действие). Как только плагин поймёт чего вы хотите, он предложит код для вставки. При этом выводится несколько вариантов из которых можно выбрать тот, который вам больше нравится. Пример использования плагина в видео:

Впечатляет, правда? С данным плагином можно писать код гораздо быстрее.

Как создать пост WordPress средствами Python

Создание постов wordpress средствами python достаточно не сложный процесс.

Выясняя как это сделать, я обнаружил примеры либо слишком сложные либо очень простые.

Я не хотел использовать сложные методы аутентификации требующие установки специальных плагинов на блог. И мне нужен был пример с постом содержащим более одной строки.

Наиболее простой пример создания wordpress поста средствами Python это использовать библиотеку python-wordpress-xmlrpc.

Как создать пост WordPress средствами Python

Библиотека Python для создание постов WordPress

Для того чтобы создавать посты WordPress средствами Python потребуется всего одна библиотека: python-wordpress-xmlrpc.

Установить её можно командой Pip из командной строки.

pip install python-wordpress-xmlrpc

Импортируем необходимые классы из wordpress-xmlrpc

В начале вашего скрипта нужно импортировать несколько классов из библиотеки wordpress-xmlrpc:

from wordpress_xmlrpc import Client, WordPressPost
from wordpress_xmlrpc.methods.posts import NewPost
from wordpress_xmlrpc.methods import posts

Как подключиться к вашему блогу на WordPress

Чтобы создавать посты или страницы блога на WordPress, вашему скрипту нужно подключиться к WordPress и пройти аутентификацию.

Для подключения к блогу потребуется:

  • Адрес файла xmlrpc.php
  • Логин
  • Пароль
wp = Client('https://адрес_сайта.ру/xmlrpc.php', 'username', 'password')

Важно: на некоторых хостингах файл xmlrpc.php заблокирован и к нему нету доступа (это связано с безопасностью, т.к. через данный файл злоумышленники пытаются взломать сайт). Открывать доступ к xmlrpc.php через хостера плохая идея. Быстрее и проще сделать копию данного файла и переименовать его.

Задаём название поста и категорию

После подключения, следующими строчками кода создаём объект поста WordPress и задаём ему название и категорию.

Это создаёт объект поста:

post = WordPressPost()

Имейте в виду, что код не создаёт пост на WordPress. Мы просто создали объект в коде питона.

Название поста

Следующая строка задаёт название поста.

Обратите внимание, что когда вы задаёте название (title), нет необходимости указывать тег заголовка H1. В противном случае этот тег задвоится.

post.title = f'My Post Title'

Категория поста и метки

Можно задать одновременно и категорию и метки для поста.

Эти строки задают категорию поста. Если этого не сделать, то WordPress добавить пост в категорию по умолчанию.

post.terms_names = {
	'category': ['name-of-category'],
	'post_tag': ['tag1', 'tag2']
}

Создаём пост в WordPress используя Python

Итак, у нас есть название поста и категория, это необходимый минимум чтобы создать пост на нашем WordPress движке.

На самом деле категорию, тоже можно не указывать!

А как же насчет контента поста? Мы перейдём к этому в следующем разделе.

К этому моменту мы мы создали скелет поста. Вот всё что нам нужно:

post.id = wp.call(NewPost(post))

Ранее мы определили переменную «wp» как объект прошедший авторизацию на блоге. Функция NewPost() добавляет пост на ваш сайт WoredPress, и возвращает идентификатор ID, уникальный для каждого поста.

Теперь, если вы войдёте в админку WordPress, то обнаружите во вкладке «Все записи» черновик нового поста.

Черновик или опубликованный пост?

Я намеренно оставил пост в режиме черновика. Вы можете опубликовать сообщение немедленно, но это может быть нежелательно, когда вы тестируете код.

Но если вы захотели опубликовать пост? добавьте эти две строчки кода после вызова функции NewPost(). Функции EditPost() требуется передать уникальный идентификатор поста.

post.post_status = 'publish'
wp.call(posts.EditPost(post.id, post))

Пишем простой контент поста на Python

В простом примере найденном в интернете в качестве контента используется лишь одна строка текста.

Код при этом выглядит примерно так:

post.content = 'Hello World.'
post.id = wp.call(NewPost(post))

Этот пример заставил меня задуматься, а как обходиться с подзаголовками и другими элементами кода страницы.

Пример как создавать реалистичный WordPress пост на Python

Есть несколько способов как это можно сделать, но далее будет приведен наиболее простой для способ на мой взгляд.

Содержимое записи должно быть составлено на HTML, при этом блоки html должны быть обрамлены в специальную «обёртку» wordpress.

Вот пример создания многострочного поста блога wordpress:

wpcontent += f'<!-- wp:paragraph -->'
wpcontent = f'<p>Это открывающий абзац текста записи.</p>'
wpcontent += f'<!-- /wp:paragraph -->'
wpcontent += f'<!-- wp:heading -->'
wpcontent += f'<h2>Первый заголовок поста</h2>'
wpcontent += f'<!-- /wp:heading -->'
wpcontent += f'<!-- wp:paragraph -->'
wpcontent += f'<p>Это первый абзац следующий на первым заголовком H2.</p>'
wpcontent += f'<!-- /wp:paragraph -->'
wpcontent += f'<!-- wp:paragraph -->'
wpcontent += f'<p>Это второй абзац следующий на первым заголовком H2.</p>'
wpcontent += f'<!-- /wp:paragraph -->'

На мой взгляд выглядит несколько громоздко. В принципе, можно написать функцию и передавать в неё просто html код, а она будет обрамлять теги в нужную обёртку wordpress в зависимости от тега. Можно в переменной wpcontent передавать просто html без «обёртки», но в таком случае пост будет написан в «классическом» режиме. Его можно будет преобразовать в «блоки» при редактировании поста из админки WordPress.

Когда контент поста готов, задайте атрибут post.content и создайте пост:

post.content = wpcontent
post.id = wp.call(NewPost(post))

Собираем всё вместе: готовый код

Вот скрипт Python который создаёт новый пост WordPress:

from wordpress_xmlrpc import Client, WordPressPost
from wordpress_xmlrpc.methods.posts import NewPost
from wordpress_xmlrpc.methods import posts


def create_content():

    wpcontent = f'<!-- wp:paragraph -->'
    wpcontent += f'<p>Это открывающий абзац текста записи.</p>'
    wpcontent += f'<!-- /wp:paragraph -->'
    wpcontent += f'<!-- wp:heading -->'
    wpcontent += f'<h2>Первый заголовок поста</h2>'
    wpcontent += f'<!-- /wp:heading -->'
    wpcontent += f'<!-- wp:paragraph -->'
    wpcontent += f'<p>Это первый абзац следующий на первым заголовком H2.</p>'
    wpcontent += f'<!-- /wp:paragraph -->'
    wpcontent += f'<!-- wp:paragraph -->'
    wpcontent += f'<p>Это второй абзац следующий на первым заголовком H2.</p>'
    wpcontent += f'<!-- /wp:paragraph -->'

    return wpcontent
def new_post(wpcontent):
    wp = Client('https://адрес_сайта.ру/xmlrpc.php', 'login', 'password')

    post = WordPressPost()

    post.title = f'My Post Title'
    post.content = wpcontent
    post.terms_names = {
        'category': ['test'],
        'post_tag': ['tag1', 'tag2']
    }
    post.post_status = 'publish'  # Сразу публикуем создаваемый пост минуя черновик

    post.id = wp.call(NewPost(post))


if __name__ == '__main__':
    wpcontent = create_content()

    new_post(wpcontent)  
    

Посудомоечная машина AEG F65402VI0P ремонтируем сами.

Проблема

Недавно возникла такая проблема: посудомоечная машина (модель AEG F65402VI0P) перестала реагировать на кнопку включения и подавать хоть какие-то признаки жизни. Как будто в розетку не включена… Я решил проверить что с ней случилось (очевидно что проблема по питанию). Думал что сгорел какой-то предохранитель и его надо просто заменить на новый.

Модель посудомойки AEG F65402VI0P

Поискал в интернете, но сервисных мануалов моей модели я не нашёл. Поэтому посмотрел в ютубе как примерно разбираются посудомойки и приступил к поиску проблемы. Решил идти по проводу питания. В розетке питание есть идём дальше.

Разбираем машинку… Питание приходит в своего рода сетевой фильтр и из него выходит. На входе напряжение есть и на выходе тоже (проблема не в нём, идём дальше).

Фильтр питания посудомойки

А дальше питание идёт к плате управления, которая находится в двери. Поэтому то что было разобрано ранее можно собирать обратно и разбирать дверь.

Неисправность

Плата управления в сборе выглядит следующим образом:

Плата управления посудомойкой electrolux 15004271-00

На колодке питания напряжение присутствует, значит проблема как раз таки с платой управления. Отсоединяем все разъёмы и извлекаем плату:

electrolux 15004271-00

Первое что бросается в глаза — это сгоревший резистор, обозначенный на плате R70. В остальном, на мой взгляд, всё выглядит прилично. Никаких плавких предохранителей, которые можно было бы поменять на плате не оказалось… Простой ремонт с заменой предохранителя не проканает.

Решение

Я решаю поискать информацию в интернете по названию платы. В результатах поиска в основном предложения по продаже таких б/у плат. И ценник начинается от 4000 руб. По наитию перехожу в поиск картинок и смотрю там… И в поиске среди картинок я нашёл заметку на одном чешском сайте и на картинке как раз был обведён красным сгоревший резистор и ещё один чип.

заметка с описанием проблемы

Из авто перевода стало ясно, что проблема эта довольно распространённая с этими платами и надо заменить ac/dc преобразователь LNK304GN и резистор на 49ом (иногда встречаются LNK364GN и резистор 47ом).

Тогда я пригляделся к своей плате получше и заметил, что на моей плате стоит LNK304GN и на ней есть странные пятна (чип пробит).

electrolux 15004271-00 сгоревшие элементы

На следующий день я поехал в радио лавку и купил детали. На замену старых и установку новых компонентов у меня ушло минут 10. Данный ремонт обошёлся в 110 руб.

После установки as/dc преобразователя LNK304GN и резистора на 47ом посудомоечная машина AEG F65402VI0P снова работает.

Как удалить один набор двойных кавычек из строк в Python

Формулировка проблемы и обзор решения

При работе с данными, можно встретить строку или список строк содержащие две двойные кавычки. Эта статья описывает как удалить один набор этих двойных кавычек.

Вопрос в следующем: как писать код чтобы убрать ненужный набор двойных кавычек?

Выполнить эту задачу можно одним из следующих способов:

  • Способ 1: Использовать startswith(), endswith(), и slising
  • Способ 2: Использовать регулярные выражения
  • Способ 3: Использовать replace()
  • Способ 4: Использовать list()
  • Способ 5: Использовать Pandas

Способ 1: Использовать startswith(), endswith(), и slising

Этот способ использует функции startswith() и endswith() в сочетании slising для удаления набора двойных кавычек из строк.

web_name = '""adasd""'
if web_name.startswith('"') and web_name.endswith('"'):
  web_name = web_name[1:-1]
print(web_name)

Первая строка представленного кода объявляет строку содержащую два набора двойных кавычек и сохраняет её в переменную web_name.

Следующая строка вызывает условный оператор if с функциями startswith() и endswith(). В обе функции передан аргумент ('""').

Это выражение проверяет начинается и заканчивается ли переменная web_name обозначенным аргументом. Если да, код переходит к следующей строчке и используя slicing, удаляет указанный символ.

Далее результат выводится в терминал.

Способ 2: Использовать регулярные выражения

Чтобы удалить один набор двойных кавычек в строке, можно использовать регулярные выражения — метод re.sub().

import re

string = '""Какой-то текст с двойными кавычками""'
string = re.sub(r'^"|"$','',string)
print(string)

Первой строкой мы импортируем библиотеку re. Она позволяет получить доступ к манипуляции строками чтобы получить нужный нам результат.

Далее объявляем строку с двойным набором двойных кавычек и помещаем её в переменную string.

В следующей строке используется re.sub() : находится двойной набор двойных кавычек, удаляется один и результат присваивается обратно переменной string.

Результат выводится в терминал.

Другой вариант использовать re.sub() и передать этой функции два аргумента:

  • строка которую нужно заменить и
  • строка на которую нужно заменить первую
import re

string = '""Какой-то текст с двойными кавычками""'
string = re.sub('""','"',string)
print(string)

Данный вариант заменяет двойные кавычки стоящие рядом не только вначале и в конце строки, но и в середине строки.

Способ 3: Использовать replace()

Этот метод использует replace() чтобы убрать один набор двойных кавычек из строки.

string = '""Всякий разный текст с лишними кавычками""'
string = string.replace('""', '"')
print(string)

В первой строке, как и в предыдущих примерах создаём строку и присваиваем её значение переменной string.

В следующей строке добавляем функцию replace() к переменной string и передаём ей два аргумента:

  • строка которую нужно заменить и
  • строка на которую нужно заменить первую

Результат сохраняем обратно в переменную string и далее выводим результат в терминал.

Способ 4: Использовать list()

Этот метод подразумевает обработку списка содержащего двойной набор двойных кавычек функцией list(). Этот вариант отличается от предыдущих тем, что удаляет все двойные кавычки.

user_emails = [""'asdasd@asdasd.com','asdasd@sdfdsf.ru','sdfdsf@sdfds.ch','sadas@dsvsdfds.tw'""]
user_emails = list(user_emails)
print(user_emails)

Первая строчка кода состоит из списка емэйлов пользователей с двойными кавычками вначале и конце. Этот список помещён в переменную user_emails.

Следующая строчка использует переменную user_emails в качестве аргумента функции list. Результат обработки сохраняется обратно в переменную user_emails, а затем выводится втерминал.

Обратите внимание: Конвертация списка содержащего двойные кавычки используя функцию list() приведёт к удалению всех двойных кавычек.

Способ 5: Использовать Pandas

Этот метод предполагает использование Pandas чтобы удалить все двойные кавычки из CSV файла.

Содержание CSV файла

Store,Category,Product,Number
""Toronto"",""Jeans"",""10534"",""15""
""Montreal"",""Tops"",""5415"",""32""
""Ottawa"",""Coats"",""98341"",""22""
import pandas as pd

df = pd.read_csv('quotes.csv', header = None)
df.replace('"', '', inplace = True, regex = True)
print(df)

В приведенном выше примере импортируется библиотека Pandas. Эта библиотека позволяет получить доступ и манипулировать Pandas DataFrame.

Следующая строчка кода считывает CSV файл без шапки в DataFrame и передаёт значение в переменную df.

Если вывести в терминал данные из DataFrame, то они будут выглядеть следующим образом:

0123
0StoreCategoryProductNumber
1Toronto»»Jeans»»10534″»15″»
2Montreal»»Tops»»5415″»32″»
3Ottawa»»Coats»»98341″»22″»
содержание DataFrame без обработки

Примечание: По умолчанию, когда импортируются данные из CSV файла, открывающие двойные кавычки удаляются, оставляя двойные кавычки в конце.

Следующая строчка кода удаляет все оставшиеся двойные кавычки из DataFrame.

Результат модифициро ванных данных DataFrame сохраняется в переменную df и выводится в терминал.

0123
0StoreCategoryProductNumber
1TorontoJeans1053415
2MontrealTops541532
3OttawaCoats9834122
обработанные данные DataFrame

Резюме

Мы рассмотрели пять способов как можно убрать двойной набор двойных кавычек из строки и все двойные кавычки. Под свои конкретные нужды можно выбрать наиболее подходящий вариант.

Как открыть сайт в браузере из скрипта Python

Чтобы открыть сайт в браузере по умолчанию (Windows, macOS, Linux) из скрипта Python, нужно использовать команду webbrowser.open('https://ya.ru') чтобы открыть Яндекс. Не забудьте импортировать модуль webbrowser (import webbrowser). Устанавливать ничего не нужно, т.к. этот модуль уже присутствует в стандартной библиотеке Python.

Пример

Вот пример скрипта Python, который открывает следующий сайт https://mmazurenko.com

import webbrowser
webbrowser.open('https://mmazurenko.com')

Новая вкладка вашего браузера по умолчанию (Chrome, Edge, Safari, FireFox — любой который установите в ОС по умолчанию) откроется отправленная аргументом функции webbrowser.open()

Как открыть сайт в браузере из скрипта Python

О модуле Webbrowser

Модуль Webbrowser это часть стандартной библиотеки Python, поэтому можно импортировать его без необходимости что-либо устанавливать дополнительно.

Также можно запустить модуль из командной строки или терминала следующей строкой:

python -m webbrowser -t "https://mmazurenko.com"

Это пригодится когда вдруг понадобится открыть сайт из командной строки ОС или из терминала (Windows, macOS, Linux). Это делает использование Python переносимым и независимым от операционной системы.

Webbrowser open()

Можно задать дополнительные аргументы, чтобы получить больше контроля над тем какая вкладка открывается с помощью нового аргумента функции webbrowser.open().

webbrowser.open(url, new=0, autoraise=True)

Аргумент new позволяет контролировать окно браузера:

  • Если задать new=0 (значение по умолчанию), откроется URL в том же окне браузера.
  • Если задать new=1, откроется новое окно браузера.
  • Если задать new=2, откроется новая вкладка браузера.

Webbrowser Open in New Tab

Простой способ открыть URL в новой вкладке из Python скрипта вызвав webbrowser.open_new_tab() и передать строку с адресом в качестве единственного аргумента.

import webbrowser
my_url = 'http://mmazurenko.com'
webbrowser.open_new_tab(my_url)

Выбор браузера

Можно также передать объекту контроллера заданный браузер вызвав функцию webbrowser.get() и передав в неё тип браузера. Теперь можно вызвать open() или open_new_tab() методы объекта контроллера чтобы открыть URL в определённом браузере.

import webbrowser
webbrowser.get("firefox").open("http://mmazurenko.com")

Вот поддерживаемые типы браузеров:

Имя типаИмя класса
‘mozilla’Mozilla(‘mozilla’)
‘firefox’Mozilla(‘mozilla’)
‘netscape’Mozilla(‘netscape’)
‘galeon’Galeon(‘galeon’)
‘epiphany’Galeon(‘epiphany’)
‘skipstone’BackgroundBrowser(‘skipstone’)
‘kfmclient’Konqueror()
‘konqueror’Konqueror()
‘kfm’Konqueror()
‘mosaic’BackgroundBrowser(‘mosaic’)
‘opera’Opera()
‘grail’Grail()
‘links’GenericBrowser(‘links’)
‘elinks’Elinks(‘elinks’)
‘lynx’GenericBrowser(‘lynx’)
‘w3m’GenericBrowser(‘w3m’)
‘windows-default’WindowsDefault
‘macosx’MacOSXOSAScript(‘default’)
‘safari’MacOSXOSAScript(‘safari’)
‘google-chrome’Chrome(‘google-chrome’)
‘chrome’Chrome(‘chrome’)
‘chromium’Chromium(‘chromium’)
‘chromium-browser’Chromium(‘chromium-browser’)

Следует добавить, что если интерпретатор Python не найдет выбранный браузер, то скрипт завершится ошибкой: webbrowser.Error: could not locate runnable browser.

Таким простым способом, можно открыть сайт в браузере из скрипта Python.

P.S. У меня почему-то вариант с выбором браузера работает только при запуске через IDLE (Python). Запуск по двойному клику по скрипту не срабатывает (Windows 10). Хотя простой запуск без выбора браузера работает.

Читайте также другие статьи о Python.

Python 3 — как проверить является ли строка числом

В этой заметке давайте разберем как проверить является ли строка числом в программе на Python 3.

Python 3 имеет встроенную функцию называемую str.isnumeric() которая призвана делать проверку является ли строка числом или нет. Однако функция str.isnumeric() возвращает значение False если в строке число с плавающей запятой. Чтобы проверить является ли строка числом с плавающей запятой, можно использовать оператор try-except.

Функция Python str.isnumeric()

Функция python str.isnumeric() возвращаяет True если в представленной строке число и возвращает False в противном случае.

Пример 1

print(str.isnumeric("10"))

Данный код возвратит True так как «10» это числовое значение.

Пример 2

print(str.isnumeric("qwerty"))

А этот код возвратит False.

Также мы можем использовать функцию isnumeric() со строковыми переменными как в примере:

number = "100"
print(number.isnumeric())

Чтобы функция возвратила True, вся строка должна состоять только из чисел, в противном случае результат будет False. Например, следующий код вернет значение False, так как в строке содержится буква.

number = "100q"
print(number.isnumeric())

Проверяем является ли строка числом с плавающей запятой

Функция Python str.isnumeric() вернет значение False если в строке окажется число с плавающей запятой. Но мы можем написать простую функцию используя оператор try-except, чтобы проверить является ли строка числом с плавающей запятой или нет.

def is_number(string):
    try:
        float(string)
        return True
    except ValueError:
        return False

Мы создали функцию с названием is_number(). Она пытается конвертировать строку в число с плавающей запятой. Если строка может быть конвертирована, то функция возвращает True.

Пример

def is_number(string):
    try:
        float(string)
        return True
    except ValueError:
        return False
        
print(is_number("15.2"))

Этот код возвратит значение True.

Подводим итог

В данной заметке мы разобрали как проверить является ли строка числом в программе Python.

  • Мы использовали встроенную функцию Python str.isnumeric(), чтобы проверить является строка целым числом
  • Чтобы проверить числа с плавающей запятой, мы написали простую функцию и назвали её is_number().

Как сжать PDF файлы используя Python

Формулировка проблемы

Предположим у вас есть PDF файл, но он слишком большой и вы бы хотели его сжать. Возможно вы хотите уменьшить размер чтобы можно было быстрее отправить через интернет, или сохранить место на жестком диске.

Всё усложняется, когда у вас много таких файлов PDF которые нужно сжать.

Конечно существуют онлайн сервисы, позволяющие это сделать. Но обычно они позволяют обработать ограниченное количество файлов за раз. Также потребуется длительное время для загрузки оригиналов, а потом на скачивание обработанных файлов. И возможно вам было бы не комфортно делиться своими файлами в интернете (вопрос конфиденциальности).

К счастью все эти задачи мы можем переложить на Python. Но перед тем как разобрать как это сделать, давайте немного узнаем о PDF файлах.

О сжатии PDF файлов

Согласно словам Дова Айзекса, бывшего главного научного сотрудника Adobe, PDF-документы уже существенно сжаты.

Части документа с текстом и векторной графикой уже сжаты zipом, поэтому возможностей дальнейшего сжатия не много.

Улучшение сжатия можно добиться путем сжатия частей PDF содержащих изображения, правда придется пожертвовать их качеством.

Итак, сжатие PDF достижимо, но придется выбирать между силой сжатия и тем, сколько мы сможем пожертвовать качеством изображений.

Настройка

Программист Theeko74 написал, Python скрипт «pdf_compressor.py». Этот скрипт представляет собой оболочку для ghostscript функций, которые выполняют основную работу по сжатию PDF файлов.

Этот скрипт распространяется по лицензии MIT и его можно использовать как пожелаете.

Важно: чтобы скрипт работал, нужно чтобы на вашем компьютере был установлен ghostscript. Скачать установщик ghostscript можно на сайте.

Скачайте скрипт pdf_compressor.py с GitHub отсюда.

Теперь приступим к написанию нашего скрипта по сжатию PDF файлов.

Создадим папку pdf_comp и создадим в ней наш скрипт. В этом примере я использую ОС Windows и SublimeText3 в качестве редактора кода. Вы можете использовать любой другой редактор, который вам нравится больше.

Подготовка директории для скрипта Python который сжимает PDF файлы

Сам скрипт назовем «app.py». Теперь импортируем в наш скрипт «pdf_compressor.py», импортируем как модуль.

Чтобы это сделать, надо создать поддиректорию в папке где находится наш скрипт. Также надо скопировать в эту поддиректорию скрипт «pdf_compressor.py». В этой же папке надо создать файл «__init__.py» (в названии используется двойное нижнее подчеркивание с обеих сторон от init).

Подключаем pdf_compressor.py в качестве модуля нашего скрипта Python

Таким образом мы создали локальный пакет pdf_comp, содержащий модуль pdf_compressor.py. Теперь настало время написать скрипт.

Скрипт Python для сжатия PDF

Вот наш скрипт:

from pdf_compressor.pdf_compressor import compress
compress('06-2022.pdf', '06-2022comp.pdf', power=4)
input('Press ENTER to exit')

Как видите, это очень маленький скрипт.

Сначала мы импортируем функцию «compress» из модуля «pdf_compressor».

Затем вызываем функцию «compress» и передаём в качестве аргументов параметры: входящий файл (который требуется обработать), итоговый файл и аргумент «power» (степень сжатия). В конец скрипта я добавил input, чтобы после выполнения скрипт сразу не закрылся и можно было посмотреть подробности выполнения.

Степени сжатия можно указать следующие:

  • 0 — default (качество по умолчанию)
  • 1 — prepress (предпечатная подготовка)
  • 2 — printer (печать)
  • 3 — ebook (электронная книга)
  • 4 — screen (экран)

Чем больше значение «power» тем ниже качество изображений в итоговом файле и меньше его размер (сильнее сжатие).

Запуск скрипта

Теперь можно запустить скрипт:

Окно выполнения скрипта Python который сжимает PDF файлы

Размер обрабатываемого файла до обработки был 210.8mb, на выходе получилось 37.2mb. Сжатие составило 83%.

В этом примере мы сжали один документ, но если модифицировать скрипт, можно будет запускать его в циклично, обрабатывая сразу несколько файлов сразу. Однако, оставим это на упражнение для читателя.

Как из принтера Epson P50 сделать L800

Оговорюсь сразу, я не задавался целью сделать L800 из P50, я просто хотел починить принтер :). Однако в итоге у меня получилось именно это. В этом посте я описываю как у меня это вышло. Это лишь один из вариантов как это сделать.

Примерно год назад у меня сломался мой принтер Epson P50, основной рабочий принтер, на котором я печатал документы и фотографии. Понять что с ним не так, у меня не получалось до самого последнего момента. Я думал, что у него сгорел или блок питания или форматтер. Форматтер это материнская плата на сленге ремонтников принтеров. Оставалось определить что не исправно и заказать на Ali для замены. Целый год я собирался «когда-нибудь» починить принтер.

В один прекрасный день мне на глаза попалось объявление на авито о продаже точно такого же принтера. Цена вопроса 1500р. Он работал, но был изрядно потрёпанным жизнью. И было видно, что его не раз ремонтировали, он был весь залит чернилами. Памперс на принтере не был выведен наружу. Он переполнился и отработанные чернила постепенно разливались по всему дну корпуса принтера. На все его «недостатки» я закрыл глаза, т.к. цена покрывала их все.

В итоге у меня на руках было 2 принтера один весь в чернилах, но рабочий и второй чистый, но не включающийся. Я решил восстанавливать свой «чистый» поломанный P50. Решение, как оказалось, спорное, т.к. я не знал причину и что именно сломалось. Ремонт я начал с перестановки блока питания с нерабочего принтера в рабочий. Рабочий принтер не запустился. Из этого я сделал вывод, что сломался блок питания. Переставил блок питания с рабочего принтера в нерабочий, но принтер, не заработал. Второй вывод: форматтер тоже сгорел.

Тогда я переставил на свой P50 блок питания и форматтер от рабочего принтера. Он заработал и я обрадовался :). Но радость моя очень быстро прошла, так как он снова сломался… Через несколько минут работы. Как я потом узнал, форматтер у принтера не сгорает сам по себе. Для того, что бы он сгорел, нужна веская причина. Самой распространенной такой причиной является залитая печатающая головка. Реже шлейф печатающей головки. Я этого не знал и спалил рабочий форматтер. На этом ремонт «заглох».

Нужно было где-то доставать новый форматтер. За ним я пошел конечно же на AliExpress. Со скидкой он мне обошёлся 1082,93р. Приехал он ко мне недели за 3. Когда у меня появились недостающие элементы, я решил собирать залитый принтер. Более-менее отмыв принтер, я собрал его и о чудо, он заработал. Определился в системе он как Epson L800. Китайцы прислали плату от L800. Правда, печатать принтер не хотел и всё время выдавал ошибку переполнения памперса. Сброс счетчика памперса не помог… Счетчик показывал 0, но при этом сообщал, что памперс переполнен. Исправить ошибку мне помогла программа L800 Adjustment program Epson. Находил я её по поиску в интернете. В этой программе надо было сделать «Первичную настройку» (Initial setting).

L800 Adjustment program Epson основное окно
Открываем программу и жмём Particular adjustment mode
L800 Adjustment program Epson Particular adjustment mode
Выбираем Initial setting
Запускаем Первичную настройку кнопкой Perform

Сразу скажу, что процедуру эту мне пришлось запускать 2 раза. т.к. в первый раз я не убрал галочку с пункта серийный номер. В итоге принтер заработал как надо.

Вот так, ремонтируя, вышедший из строя принтер Epson P50 я получил Epson L800. Вернее физически то он остался P50, но система, и он сам считают что это L800.

Как добавить мультикнопку в instagram без taplink

Всем известно, что в профиль instagram можно разместить только одну ссылку. А так хочется разместить там ссылку на сайт, на блог, на свои страницы в других сетях или на пец предложения… Учитывая высокую популярность этой сети и наличия проблемы очень быстро появился сервис taplink, который предоставляет решение. Он позволяет добавить мультикнопку в instagram.

Вначале это был сервис создания и редактирования простейшего одностраничника (страницы с кнопками-ссылками). Затем туда добавили дополнительный функционал: красивые лендинги, магазин со своими товарами и прочие плюшки. Все плюшки конечно же можно получить только за соответствующую плату.

Из бесплатного осталось только простейшая страница на которой можно разместить несколько ссылок и бонусом мы получаем копирайт со ссылкой на taplink.

Есть ли альтернатива таплинку? Да есть. Уже появились другие похожие сервисы с аналогичным функционалом. Разница между ними в названии и возможно небольшая разница в цене. В целом это те же яйца только сбоку 🙂

Но мы же олдскульные блоггеры с wordpress блогом, а значит все плюшки taplink мы можем сделать сами да ещё и бесплатно 🙂 Для этого нам понадобится всего один плагин (для базового функционала).

Мультикнопку в instagram без taplink сделаем в Elementor

Плагин, который мы будем использовать называется Elementor. Это бесплатный плагин для создания одностраничников. Если у вас он ещё не установлен, то надо открыть раздел ПлагиныДобавить новый и в поле поиска плагинов набрать Elementor. Первый плагин который выпадет — «Elementor — конструктор сайтов и страниц» как раз то, что мы ищем. Нажимаем Установить, а затем Активировать.

Установка плагина Elementor для WordPress
Активация плагина Elementor для WordPress

После того как плагин установлен и активирован, можно приступать к созданию страницы — «мультикнопки». Для этого переходим в раздел страницы и жмем кнопку «Добавить новую». Откроется стандартный редактор wordpress который работает со стандартными страницами WP. Он нам сейчас не нужен, поэтому находим в меню редактора красную кнопку «Редактировать в Elementor» и жмем на неё.

Стандартный редактор страниц WordPress

Должен открыться редактор Elementor.

Окно редактора Elementor. В нем и сделаем мультикнопку для Instagram

По умолчанию Elementor создает страницу со стандартным шаблоном блога, что нам не подходит для решения нашей задачи. Надо выбрать шаблон в котором не будет стандартной шапки, подвала и виджетов. Для этого надо войти в настройки записи и вместо Макет страницы — По умолчанию, выбрать Холст Elementor.

Макет По умолчанию: видны шапка и виджеты блога, для мультикнопки не подходит
Холст Elementor: страница пустая, то что нужно, можно делать мультикнопку для Instagram

Далее надо просто, как конструктор, создать страницу из готовых элементов просто перетягивая с панели слева на холст :). Весь процесс в данном посте я описывать не буду, но если у вас возникнут трудности задавайте вопросы, я постараюсь ответить в комментариях. Похожим образом я отвечаю на вопросы в комментариях как поменять footer блога на wordpress в одном из своих постов.

Можно попытаться максимально повторить Taplink или же наоборот создать что-то своё. Возможности Elementor это позволяют даже в урезанной бесплатной версии. У меня получилась такая страница:

Готово: страница мультикнопка для Instagram без использования taplink

Останется только сохранить страницу и вставить ссылку на неё в описание профиля instagram. Результат можно посмотреть в моём профиле Instagram: @fugass_rus.

P.S. Подведем итог нашей работы: сегодня мы добавили мультикнопку в наш профиль Instagram без использования taplink. Что же это нам дало?

Во-первых, мы получили возможность вставить в профиль инстаграм нужное нам количество ссылок.

Во-вторых, мы больше не ограничены бесплатными (очень ограниченными) возможностями сервиса taplink.

В-третьих, мы избавились от «посредника» в лице сервиса Taplink. И теперь ссылаемся напрямую на наш сайт (это однозначный плюс для нашего сайта +1 ссылка). Продвинули наш сайт увеличив ссылочную массу 🙂 .

КОД-ОБМАНКА В ПОДАРОК К КОПИРАЙТУ

Сегодня редактируя одну тему для WordPress нашел в ней копирайт. Точнее, нашел его еще вчера, но после удаления выплывала ошибка, а разбираться в ней не было времени, поэтому я просто скрыл копирайт с помощью display: none;. Тем не менее, сегодня я решил с этим разобраться и посмотреть, что к чему. Я понял, что изобретательность кулхацкеров не знает предела, а все лишь потому, что им нужна одна-две жалких ссылочки.

wordpress

Так вот, о чем же я? В футере была вот такая реклама:

<a class="copyr" href="link" title="Темы для WordPress">Шаблоны WordPress</a>. При поддержке <a class="copyr" href="link" title="IT блог">site_name</a> и <a class="copyr" href="link" title="Блог автомобилиста">site_name</a>.

Естественно, там были ссылки, которые я в примере изменил на «link», а домены в анкорах на «site_name». Итак, после удаления этого кода, вроде как безобидного, на любой странице сайта появлялась надпись: «Fatal error: Call to undefined function do_action() in http://адрес_блога/wp-admin/admin.php on line 231».

Меня это сразу насторожило, ведь не могло обычное удаление копирайта повлечь за собой ошибку в файлах движка. На всякий случай я даже проверил. 231 строка в этом файле является последней и она пустая. Значит, искать нужно точно не здесь.

Если вы немного знакомы с WordPress, то знаете, что в теме каждого файла существует такой файл как functions.php. Все функции, которые вызываются данной темой, находятся там. У каждой темы этот файл свой, поэтому приходится внимательно смотреть на код. И вот что я там нашел:

function mike_thread() {
    $lua = '<a class="copyr" href="link" title="Темы для WordPress">Шаблоны WordPress</a>. При поддержке <a class="copyr" href="link" title="IT блог">site_name</a> и <a class="copyr" href="link" title="Блог автомобилиста">site_name</a>.';
    $fox = dirname(__FILE__).'/footer.php';
    $fd=fopen($fox,'r');
    $caf = fread($fd,filesize($fox));
    fclose($fd);
    if(strpos($caf,$lua)==0) {
        echo '<br/><b>Fatal error</b>:  Call to undefined function  do_action() in <b>' . admin_url('admin.php') . '</b> on line <b>231</b><br />';
        die;
    }
}

Естественно, код не был таким красивым, да и вообще он был вытянут в строчку и спрятан с помощью кучи пробелов подальше от людского взора. Однако, в редакторе тем WordPress не существует горизонтального скролла, поэтому он был прямо как на ладони.

Окей, удалил, получил ошибку: «Fatal error: Call to undefined function  mike_thread() in http://путь_до_темы_блога/header.php on line 28». Но с этим было просто. Заходим в header.php темы и удаляем вызов функции, то есть:

<?php mike_thread(); ?>

На этом все, тема чиста. В итоге скрипт действовал довольно интересно. Если вы удаляете или хоть как-то изменяете строчку с копирайтом, то вызванная функция выдавала вам ложную ошибку, дабы вы пошли копать код самого WordPress. Будьте бдительны, не поддавайтесь на провокации кулхацкеров.

P.S. Текст заметки не мой. Когда-то ссылался на эту статью, но сайт автора канул в лету… Чтобы материал не пропадал и текст дальше помогал людям, достал его из «архива».