{"id":14287,"url":"\/distributions\/14287\/click?bit=1&hash=1d1b6427c21936742162fc18778388fc58ebf8e17517414e1bfb1d3edd9b94c0","title":"\u0412\u044b\u0440\u0430\u0441\u0442\u0438 \u0438\u0437 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0434\u043e \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044f \u0437\u0430 \u0433\u043e\u0434","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 комментариев
Написать комментарий...
Антон Карцев

Сейчас пишу mvp небольшого онлайн сервиса, стаяла задача написать функцию выполняющая математическую операцию вычисления нужной строки от 6 параметров. 2 часа бился, потом вспомнил про chatgpt, который решил все за пару минут. Сначала просто просил выдать формулу, не справился, но когда попросил написать пример кода функции, получил нужный результат.

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

Математика у него слабое место, он не умеет считать. Т.е. он каким-то образом имитирует счёт, но даже я могу его в угол загнать. А вот код — да. Наблатыкался.

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

Они выкатили Plugins для Plus версии, там можно вольфрам подключить и он становится математическим гением со всеми возможностями вольфрама - матан, графики и т.п.

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