Понравилось, как он щёлкает пальцами и говорит, что GPT по щелчку генерирует змейку. Хорошо, змейку по щелчку он генерировать умеет, а когда я спрашиваю Copilot'а что-то, приближенное к реальности, он бодро начинает писать код с несуществующими функциями, выдавая абсолютно синтаксически корректный код, но совершенно бессмысленный. Видимо, это подразумевалось под тезисом о том, что нейронки пишут код уровня миддла. Хорошо, пройдёт десять лет и GPT научится действительно придумывать рабочий код, а не воспроизводить по выученному шаблону. А как верифицировать написанное? Сто строк в змейке мы можем пробежать глазами, а что делать, если мы его попросили написать банковский сервис на пару миллионов строк, и он его действительно написал? Мы получили чёрный ящик, который неизвестно как тестировать, в котором никто не знает ни строчки, как не знает и логики, по которой GPT его писал. А давайте попросим GPT объяснить. И он объяснит: а где гарантия, что то, что он ответил, действительно соответствует тому, что он делал пять минут назад? Ладно, пропускаем - действительно, кого это волнует, клиент же говорит "а пофиг, софт работает, мне больше ничего не надо". И вот софт работал и внезапно сломался. Мы говорим: "GPT, а твой код падает" (а мы даже не знаем, где и почему) - здесь блогер снова щёлкает пальцами и предлагает сгенерировать новый вариант с учётом правок. А нам не надо новый вариант, нам надо исправить один конкретный баг. Надо снова убедиться, что его правки не затронули весь остальной функционал (тесты, видимо, тоже предлагается писать с помощью GPT). Дальше он говорит, что ИИ уже подвинул творческие специальности. Художников? Да, он может нарисовать миллион вариантов одной картинки, но художественная ценность таких работ нулевая (и мы ещё не говорим про хтонь с пальцами, но её пофиксят). Актёров озвучки? Ну, разве как говорилку. Интонации и тембр у каждого человека уникальны, людей не заменить и здесь - банки голосов надо у кого-то брать. Музыкантов? На ютубе полно треков, сгенеренных нейросетями, только их что-то никто не слушает. Зато GPT неплохо справляется с рутинной работой. Тот же Copilot неплохо угадывает, когда надо сделать что-то по шаблону, что-то переименовать или создать какие-то последовательности. Как чуть более умное дополнение для интеллисенса, не более. Для художников - как инструмент для генерации заготовок или аналог фотостоков. В озвучке - например, когда надо "воскресить" чей-то голос или озвучить малобюджетный проект (например, как недавнюю мемную игру про Русов против Ящеров). Всё это просто инструменты, наравне со всем уже имеющимся у людей инструментарием, но не самостоятельные творцы. --- Сообщение объединено, 16 янв 2024 --- Ну и немного рандомного бреда. Вот что будет, если попросить Copilot'а сделать деревянную вешалку с металлическим крючком:
А я как то попросил написать ChatGPT умножение двух байт на 8-битном MOS 6502 он такой мрак выдал, что видно только то, что он знает как выглядят инструкции на асме 6502 и отдалённо какие то проблески что имена регистров в коде прошивают его какой то связью как в других языках программирования, но даже какого то приближения к понятию умножения у огрызка кода не было. Тупое какое то перекладывание из регистра в регистр. Т.е. он вообще не понимал этот 8-битный ассемблер никак. Видимо всё-таки чем больше по какому то языку открытых проектов на гитхабе и чем обильнее в них комментарии, тем лучше он сопоставляет шаблоны свои. --- Сообщение объединено, 16 янв 2024 --- P.S. Попросил сейчас Copilot "write procedure for multiplication of two bytes for MOS 6502" и он справился намного намного лучше, чем когда то ChatGPT, а именно вот так: Код (Text): ; Multiply two bytes ; Inputs: ; A - Multiplicand ; X - Multiplier ; Outputs: ; A - Lower byte of the result ; Y - Upper byte of the result Multiply: LDA #0 ; Clear the accumulator STA Result ; Clear the result LDX #8 ; Set the loop counter MultiplyLoop: ASL Result ; Shift the result left ROL A ; Rotate the multiplicand left BCC SkipAdd ; If carry is clear, skip the add CLC ; Clear the carry ADC Multiplier ; Add the multiplier to the result SkipAdd: DEX ; Decrement the loop counter BNE MultiplyLoop ; If not zero, continue the loop ; The result is now in the A and Y registers RTS Result: DS 2 ; Reserve 2 bytes for the result Multiplier: DS 1 ; Reserve 1 byte for the multiplier Кхем кхем. Ну на самом деле даже стало просматриваться тело цикла умножения где сдвиги со накоплением происходят. Но. Согласно комментарию на входе в аккумуляторе первое множимое, в регистре X второе множимое, а на выходе в аккумуляторе будет нижний байт результата, а в регистре Y будет верхний байт результата. Но начинаем всматриваться в код и мрачнеем: 1. первым же действием входной параметр в A разрушается перетираясь нулём 2. третьим действием входное значение в X разрушается заменяясь счётчиком цикла по битам 3. далее он начинает перегонять нулевые биты из Result в A на что-то надеясь (всегда будет переход на SkipAdd) 4. регистр Y в кодесе вообще не упоминается, хотя в нём обещали часть результата 5. под переменную Result зачем то выделяется два байта, хотя по коду используется только один 6. внезапно оказывается что параметр Multiplier лежит как еще одна переменная в памяти, но до неё дело никогда не дойдёт В общем намного лучше, чем когда то генерировал ChatGPT, но до рабочего кодеса ну ооооочень далеко.
Кстати, в тему обработки ошибок: есть два распространённых крейта от одного автора: anyhow и thiserror. Anyhow позволяет добавлять к ошибкам контекст и заворачивать разные ошибки в обобщённый тип, а thiserror - более простой и короткий способ создавать свои статусы: https://www.shakacode.com/blog/thiserror-anyhow-or-how-i-handle-errors-in-rust-apps/
если всё же надо использовать крейт, то в cargo.toml лучше записать его так.. some_crate = "=x.y.a" с обратной совместимостью у ржаки весьма туговато.. вообще со ржакой вспоминается анекдот/ Герда: Кай, а чё ты делаешь??? - Снежная Королева сказала мне написать слово ХОРОШО из букв Ж.. О.. П.. А..
А вот скажи, мне просто интересно, когда мы собираем вот такое на Ubuntu 23.10: Код (C): // gcc ./main.c -o ./program #include <stdio.h> int main() { printf("Yo man!\n"); return 0; } …и запускаем на Ubuntu 22.04, получая вот примерно такую ошибку: Код (Text): /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found - это ведь мы считаем хорошей совместимостью, верно? Ну чисто чтобы понимать, что мы берём за эталон.
так совместимость бывает разных видов - одно дело взять бинарь из одной системы и пытаться запустить его на другой версии либы. и совсем иной случай, когда один и тот же сорц перестаёт собираться с обновлённой либой иль собирается и начинает крошиться.
оно то работает, когда ты исполняешься как легальный процесс. но вот с урезанными правами - нет. есть идеи как захватить чей-нить токен посерьёзнее?
даже ОдЭпты ржаки ничего хорошего сказать не могут всех дыренек не опишешь, но можно делать адаптивные модели, кои сами ищут возможный вектор атаки
ржака сам не очень-то годно свою панику перехватывает. а на крейте regex умудрились запаять такое.. Код (Text): impl<'h> core::ops::Index<usize> for Captures<'h> { type Output = str; // The lifetime is written out to make it clear that the &str returned // does NOT have a lifetime equivalent to 'h. fn index<'a>(&'a self, i: usize) -> &'a str { self.get(i) .map(|m| m.as_str()) .unwrap_or_else(|| panic!("no group at index '{}'", i)) } } вернуть нон прям западло?