{"id":14289,"url":"\/distributions\/14289\/click?bit=1&hash=892464fe46102746d8d05914a41d0a54b0756f476a912469a2c12e8168d8a933","title":"\u041e\u0434\u0438\u043d \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043b \u043f\u0440\u043e\u0434\u0430\u0436\u0438 \u043d\u0430 5%, \u0430 \u0441\u0440\u0435\u0434\u043d\u0438\u0439 \u0447\u0435\u043a \u2014 \u043d\u0430 20%","buttonText":"","imageUuid":""}

Я пользуюсь ChatGPT для создания скриптов на Python

Я не программист и Python не знаю. Сегодня ChatGPT написал мне скрипт, который выбирает из кучи папок картинки, собирает их в одну, при этом масштабирует по нужному алгоритму, добавляет тень, потом кладёт их на фон, сверху водяной знак и потом ещё сортирует по нужным папкам.

С некоторых пор стал активно использовать ChatGPT для написания простых скриптов для автоматизации действий. Это не руководство к действию и не «волшебные промпты», лишь описываю свой опыт.

Начну с выводов (дальше статью можно не читать):

Пишите на Python

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

Вот рейтинг знаний языков программирования, который мне составил сам ChatGPT:

Вот список языков программирования и моя оценка возможности писать на них скрипты:

Python - 10/10

JavaScript - 8/10

Java - 7/10

C++ - 7/10

C# - 6/10

Ruby - 6/10

PHP - 5/10

Swift - 4/10

Go - 4/10

Kotlin - 3/10

ChatGPT

Понятен смысл, да? Я сначала пытался писать скрипты для сортировки файлов на CMD (Batch) и это было адом. Часами объяснял, а в ответ «Простите, я ошибся, вот исправленный скрипт...» и выдавал очередную неработающую фигню.

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

Не ставить безумных задач

Ну ребята и девчата, задача «Вот тебе $100 преврати их в $100 000 максимально быстро и законно», конечно, хайповая, но выполнена не будет. А вот «Возьми файл 1.JPG из директории 1, проверь подпапки в директории 2 и если в подпапке есть файл с именем 2.jpg скопируй его туда» будет прекрасно работать.

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

Модульность и структура

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

Можно ли написать с помощью ChatGPT большую программу? Я поковырялся некоторое время и могу сказать, что да, наверное можно. Но! Для этого надо:

  • Спланировать структуру проекта;
  • Использовать функции и методы;
  • Изучить классы и объекты;
  • Использовать модули;
  • Использовать пакеты;
  • Использовать Git;
  • Наладить тестирование.

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

Тут есть грань между экономией времени и сил и «день потерять за час долететь». Я всегда оцениваю сколько времени потрачу на написание скрипта, работу без скрипта и изучением тематики для написания скрипта. Иногда проще руками сделать и никакие программы не писать.

Мне нравится сравнение про автомобили: в начале XX века ими управляли профессиональные шофёры, а сегодня профессия не то что бы исчезла, но есть дальнобойщики, таксисты, механики, а есть я — который машину чинить не любит, она неделями стоит, но может сесть и поехать на ней в отпуск. Потому, что это удобно. Вот со скриптами ChatGPT так же — «не хочу разбираться, дайте мне скрипт за 10 минут».

Нюансы и пошаговость

ChatGPT не умеет думать, у него есть некие связи, но нет понимания почему это так. Многое он не понимает «по умолчанию». Поэтому отмечаем нюансы:

  • Это должно быть прозрачным.
  • Используй только JPG файлы.
  • В этой папке нет подпапок.
  • Скрипт лежит в той же папке, что и файлы.

Подробнее и, ещё раз повторюсь, пошагово. Рисуйте у себя в голове процесс. Это и есть программирование. А ChatGPT просто переводчик, он ваш алгоритм переводит на известный ему язык — например Python (другие он пока знает средненько и хуже).

GPT-4 лучше чем 3.5

Да, жаба давит, но надо признать , что GPT-4 пишет код лучше чем 3.5. Причём это даже не про сам код, а про интерпретацию поставленной задачи и понимание, что нужно.

Чтобы не выбирать лимит слишком быстро я простые вопросы или объяснения спрашиваю у 3.5, а код пишет 4.

И да, всё равно они пока оба тупня, попробуйте спросить «Зачем Герасим утопил Муму?» или дайте текст в неправильной раскладке, таблицу соответствия и попросите расшифровать. Вечер веселья обеспечен.

У меня своя фишка, про «лихих пиратов»:

Пример практической задачи

У меня есть магазинчик, там нужно было сделать витрину, это тысячи файлов и папок. Как оцениваю по времени? Около двух дней. Написание скрипта заняло примерно 2–3 часа. Причём я много понял и сейчас напишу подобный скрипт с помощью ChatGPT на порядок быстрее, примерно за 30 минут. Ну давайте уже картинки котиков покажу.

Было:

  • Два котика, цветной и чёрно-белый, с прозрачным фоном.
  • Сотни папок, где лежат аналогичные картинки: собачки, черепашки, лошадки.
  • Фон.
  • Водяной знак.
  • Нужно поместить котиков (собачек, черепашек, лошадок etc.) на фон, масштабировать, добавить тень, положить водяной знак, переименовать файл и положить в нужную папку.

Результат:

Сотни файлов обрабатываются за минуты. Я очень доволен.

Вот пример первоначального запроса:

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

Ниже код (в одно окошко не влезло):

from PIL import Image import os import glob def merge_images(): resize_factor1 = 1.5 # Resize factor for special images resize_factor2 = 1.3 # Resize factor for special images resize_factor3 = 1.15 # Resize factor for special images watermark = Image.open("2.png").convert("RGBA") background = Image.open("1.jpg").convert("RGBA") subfolders = [f.path for f in os.scandir() if f.is_dir()] for subfolder in subfolders: bw_file = glob.glob(os.path.join(subfolder, "*-bw-*.png")) color_file = glob.glob(os.path.join(subfolder, "*-color-*.png")) if not bw_file or not color_file: continue # Skip if either of the files are not found files = [color_file[0], bw_file[0]] # Ensuring color image is on the left images = [] for file in files: im = Image.open(file).convert("RGBA") # Check for special numbered files and process accordingly base = os.path.basename(file) num = base.split('-')[0] if num in ['005', '007', '029', '033', '034', '035', '039', '040', '042', '043', '048', '057', '058', '061', '062', '067', '079', '082', '083', '084', '086', '088', '089', '090', '096', '097', '098', '099', '101', '112', '113', '115', '133', '138', '141', '151', '152', '154', '155', '156', '163', '164', '184']: new_size = (int(im.width * resize_factor1), int(im.height * resize_factor1)) im = im.resize(new_size) # Resize the image left = (im.width - 2000) // 2 right = (im.width + 2000) // 2 im = im.crop((left, 0, right, im.height)) # Crop the image # Check for special numbered files and process accordingly 2 base = os.path.basename(file) num = base.split('-')[0] if num in ['038','049','051','063','072','073','076','077','078','080','119','121','127','128','150','153','157','168','172']: new_size = (int(im.width * resize_factor2), int(im.height * resize_factor2)) im = im.resize(new_size) # Resize the image left = (im.width - 2000) // 2 right = (im.width + 2000) // 2 im = im.crop((left, 0, right, im.height)) # Crop the image # Check for special numbered files and process accordingly 3 base = os.path.basename(file) num = base.split('-')[0] if num in ['144','145','147']: new_size = (int(im.width * resize_factor3), int(im.height * resize_factor3)) im = im.resize(new_size) # Resize the image left = (im.width - 2000) // 2 right = (im.width + 2000) // 2 im = im.crop((left, 0, right, im.height)) # Crop the image images.append(im) widths, heights = zip(*(i.size for i in images)) total_width = sum(widths) max_height = max(heights) new_img = Image.new('RGBA', (total_width, max_height)) x_offset = 0 for img in images: y_offset = (max_height - img.height) // 2 new_img.paste(img, (x_offset, y_offset)) x_offset += img.width # Resize the merged image new_img = new_img.resize((2000, int(2000 * new_img.height / new_img.width))) # Crop the image to 2000x1500 top = (new_img.height - 1500) // 2 bottom = (new_img.height + 1500) // 2 new_img = new_img.crop((0, top, 2000, bottom)) # Apply shadow effect new_img = shadow(new_img, 0.65, 21, 25, 0.9) # Paste the new image onto the background bg_copy = background.copy() bg_copy.paste(new_img, (bg_copy.width // 2 - new_img.width // 2, bg_copy.height // 2 - new_img.height // 2), new_img) # Apply the watermark bg_copy.paste(watermark, (0, 0), watermark) # Save the image with a new name new_name = color_file[0].replace("Photo-", "Photo-2-1-").replace(".png", ".jpg") bg_copy.convert("RGB").save(new_name, "JPEG", quality=85) merge_images()

Тень:

from math import cos, sin from PIL import ImageEnhance, ImageFilter def shadow(image, opacity, radius, offset, angle): # Create the shadow image, same size as the input Image shadow = Image.new('RGBA', image.size, color=(0,0,0,0)) # Create a shadow mask with alpha channel only shadow_mask = image.filter(ImageFilter.GaussianBlur(radius)).split()[3] # Offset the shadow mask shadow_offset = shadow_mask.transform(shadow.size, Image.AFFINE, (1,0,-offset*cos(angle), 0,1,-offset*sin(angle))) # Paste the shadow mask into alpha channel of the shadow shadow.putalpha(shadow_offset) # Enhance (darken) the shadow enhancer = ImageEnhance.Brightness(shadow) shadow = enhancer.enhance(opacity) # Create a new image for the final result final = Image.new('RGBA', image.size, color=(0,0,0,0)) # Paste the shadow onto the final image final.paste(shadow, (0,0), shadow) # Paste the original image onto the final image final.paste(image, (0, 0), image) return final

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

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

import os import shutil def find_files_with_substring(folder, substring): found_files = [] for root, _, files in os.walk(folder): for file in files: if substring in file and file.endswith(".jpg"): found_files.append(os.path.join(root, file)) return found_files def main(): folder1 = "1" folder2 = "2" files_photo_2_1 = find_files_with_substring(folder1, "Photo-2-1") files_photo_2 = find_files_with_substring(folder2, "Photo-2") for file_2_1 in files_photo_2_1: file_name_2_1 = os.path.basename(file_2_1) file_name_2 = file_name_2_1.replace("Photo-2-1", "Photo-2") for file_2 in files_photo_2: if os.path.basename(file_2) == file_name_2: destination_folder = os.path.dirname(file_2) shutil.copy(file_2_1, destination_folder) break if __name__ == "__main__": main()

Возражения, придирки, оговорки

  • Я не программист и не хочу им быть. Меня всё устраивает. Мне нравится и интересно программирование, но изучение это слишком много времени. Или посвящай всю жизнь, или ничего не пиши. Вот тут мы видим третий путь — я могу писать простенькие скрипты, которые экономят кучу времени и не требуют погружения.
  • «Твой код не PEP8! 🤬» — мне вообще без разницы как он выглядит, работает и зашибись.
  • «Можно взять плагин Photoshop и сделать то же самое» — нельзя, к сожалению. Нет такого плагина, который:

    1. Выбирает два файла по имени.
    2. По вхождению в имя ставит один файл слева.
    3. Избранные по имени файлы добавляет в исключения и обрабатывает иначе.

    Конечно написанный скрипт всегда будет гибче и с большими возможностями. Наверное такое может ImageMagick, но там опять командная строка.

Итоги и взгляд в будущее

За пару месяцев написал штук 20 утилитарных скриптов, которые значительно облегчили мне жизнь. В основном это обработка рутинных операций с большим количеством файлов, сортировки, исправление изображений. Очень много времени сэкономил, а, главное, душевных сил: знаете как мерзко, когда два дня сидишь и однообразные картинки правишь. И ведь не делегируешь — объяснять дольше чем самому делать.

Очень доволен. 😊

В дальнейшем, конечно, буду продолжать такие скрипты. Так и подмывает изучить ООП, методы, пакеты, модули и прочую хрень и нырнуть в программирование, очень уж увлекательно, но торможу себя, сейчас другие планы и задачи. Было бы здорово если бы появилась IDE для непрограммистов, чтобы изначально поддерживалась структура, но пока такого нет.

Чисто для собственного удовольствия планирую написать скриптик, который будет работать на Cloudflare Workers с интерфейсом на Cloudflare Pages и разбанивать людей, которых я забанил в Твиттере по запросу.

Относительно ChatGPT, мне кажется, что сейчас люди ещё не поняли всю мощь языковых моделей и куда его можно применять:

  • Сайты, которые автоматически переводятся на десятки языков «на лету».
  • Игры, где процесс перевода на три десятка языков занимает минуты и стоит копейки.
  • Написание текстов для карточек товаров, подбор ключей для магазинов (это делается потихоньку, но пока зачаточное).
  • Предварительная классификация и отбор текстов, сайтов, страниц, предметов и вообще составление любых списков и каталогов — огромнейшая отрасль с миллиардами.
  • Перевод «на лету» в оффлайне.

Думаю, что в течении ближайших лет 10 мы многое увидим.

А вот мой блог: «Злая Печенька», он вообще не про это, но если я такую статью написал, то представляете сколько там ещё полезного?

Ну и чатик: «Печенькочат», это для избранной элиты.

0
127 комментариев
Написать комментарий...
Евгений Вилков

“Я не программист и Python не знаю”.
Почитав статью, для 90% людей вы именно программист и есть😂

Ответить
Развернуть ветку
Evil Pechenka
Автор

Наверное, но написать ничего не могу. Ну т.е. знание языка у меня примерно ноль.

Это легко поправить, но это время и изменение образа жизни. В программирование нельзя вкатиться на «полшишечки».

Ответить
Развернуть ветку
Ilnur Abbasov

не беда, главное найти учебник с картинками))

Ответить
Развернуть ветку
Evil Pechenka
Автор

Картинка как бы намекает, что я дебил, не могу разобраться в программировании на Python, потому, что не грамотный и не умею читать. И общий смысл — «ты просто тупой, не втирай нам тут про „не хочу“»

Всё верно?

Ответить
Развернуть ветку
Ilnur Abbasov

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

Ответить
Развернуть ветку
Evil Pechenka
Автор

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

Это не так.

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

Ровно так же, как я вообще ничего не хочу делать с машиной. Вот ни колодки менять, ни масло. Хочу только ездить и всё.

И если посвящать жизнь программированию, то это практически в 99% случаем означает наёмное рабство. А если ты пилишь стартап или фирму, то ты мигом вывалишься в менеджеры.

Ответить
Развернуть ветку
Sergey S

А зачем тебе "нормально разбираться" и "этим жить" для нужд типа поресайзить пару картинок? Какой-то нездоровый максимализм. Так-то подобные задачи решаются и фотошопными макросами, и другими специализированными инструментами, где не надо ничего знать о коде вообще.

Ответить
Развернуть ветку
Evil Pechenka
Автор

Не решаются от слова вообще. И да, я в посте про это написал. Можно прочесть, а потом комментировать.

Почему все аргументы программистов сводятся к «Программа этого не делает? Ну правильно, значит тебе это не нужно!»

Ответить
Развернуть ветку
Sergey S

Ну, ок, не умеешь, значит невозможно, договорились.

Ответить
Развернуть ветку
Evil Pechenka
Автор

Вот что ты выделываешься? Я автоматизацией в графических программах пользовался побольше твоего.

Ну давай, сделай в Фотошопе задачу из примера. Написать тебе ТЗ?

В конце ты должен будешь написать: «простите, у меня нихрена не получилось, я зря выпендривался».

ТЗ писать?

Ответить
Развернуть ветку
Sergey S

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

Ответить
Развернуть ветку
Evil Pechenka
Автор

Слив защитан. Чмак в носик. 🥰

Ответить
Развернуть ветку
Sergey S

Да, да, ты победил, ты повелитель нейросетевого ресайза.

Ответить
Развернуть ветку
Sergey

Я не совсем согласен с фразой про то, что нужно этим прямо жить. С машиной так или иначе, но вы что-то делаете - банально посещаете мойку, заливаете бенз, проверяете уровень масла и прочее. Игры с chatgpt, python и прочим - это как раз на уровне залить бенз - главное набить руку, труда никакого не составляет. Чтобы обработать массив функцией - не обязательно знать, как он там внутри работает, это же не собеседование, работает - да и бог с ним (самое ужасное, что большинство джунов так и работают)

Но если уже хочется быть в теме, делать что-то сложнее crud, то уже нужно вливаться)

А вообще, мне очень сравнение с машиной понравилось

Ответить
Развернуть ветку
Вася Пражкин
В программирование нельзя вкатиться на «полшишечки».

Миллионы индусов сейчас:
- Ну здрасьте..

Ответить
Развернуть ветку
Evil Pechenka
Автор

Ну вот да, таких программистов сейчас полно и не среди индусов.

ChatGPT пишет очень средненькие тексты, но это сильно лучше, скажем, 60% писателей. И с программированием так же, наверное код не огонь, но сильно лучше большинства.

Потому, что большинство это тот ещё пипец, а не потому, что ChatGPT сильно великолепный.

Ответить
Развернуть ветку
Вася Пражкин

А Вы попробуйте ошибки в коде поправить при помощи ChatGPT ).

Ответить
Развернуть ветку
Andrey Fedorov

Без проблем это делает. Кидаю кусок кода и пишу "не работает, как надо, а надо так" или просто текст ошибки. Исправляет.

Ответить
Развернуть ветку
Bo.G

рефренсы берет с govnokod.ru
ппц. точно чатгпт зафлудил ресурс... сайт не работает

Ответить
Развернуть ветку
Марк Наумов

думаю используя gpt вы будете примерно понимать, как выглядит код и как что писать, и ваши знания в разы увеличатся, главное практиковаться

Ответить
Развернуть ветку
Evil Pechenka
Автор

Примерно ноль таких планов. Мне эти знания не нужны. Я не программист и не планирую им быть.

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

Ответить
Развернуть ветку
Виктор Шираз

На что?

Ответить
Развернуть ветку
Evil Pechenka
Автор

Менеджер, делаю проекты, это невозможно совмещать с программированием просто физически.

Так получается, что ты или программист и 100% времени этому посвящаешь, но тогда работаешь на кого-то, а как только ты становишься руководителем, то неизбежно отходишь от программирования непосредственно.

Сейчас вот работаю над тем чтобы страну сменить, программирование тут быстро не поможет, да и в найм точно не хочу, хватило на моём веку корпоративного рабства.

***

Меня бы устроил вариант программирования как хобби.

Ответить
Развернуть ветку
Revolution

Для менеджеров/аналитиков это отличный инструмент)

Ответить
Развернуть ветку
Bo.G

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

Ответить
Развернуть ветку
Bo.G

когда болеете, то диагноз и схему лечения тоже в чатгпт запрашиваете?

Ответить
Развернуть ветку
Evil Pechenka
Автор

Кстати, ChatGPT неплохо даёт диагнозы и схемы лечения. Думаю, что большая часть врачей делает это хуже. Особенно если учесть, что там полно вообще тёмных, например антиваксеров.

Ответить
Развернуть ветку
Аккаунт удален

Комментарий недоступен

Ответить
Развернуть ветку
Bo.G

а вы как оцениваете? как врач, или как мимокрокрдил?

Ответить
Развернуть ветку
Кибергадалка

О, загадочный непрограммист! Согласно гаданию, вы — чародей кода, скрывающий свои истинные способности

Ответить
Развернуть ветку
124 комментария
Раскрывать всегда