StackOverflow-ориентированное vs GPT-ориентированное
От: Shmj Ниоткуда  
Дата: 04.07.24 04:15
Оценка:
Вот ранее было т.н. StackOverflow-ориентированное программирование. Каждый блок строительный, скажем так, был описан на StackOverflow, оставалось только вбить запрос в гугле и скопировать, был даже плагин чтобы копировать прямо из IDE.

Сейчас все изменилось — то же самое, но делает GPT.

Для примера решил написать прогу с помощью GPT-ориентированного программирования.

Прога простая как 2 пальца — нужно построить XML-файла на основе файловой системы. Т.е. указываете папку — оно сканирует все файлы и составляет XML-файл. Для каждого файла имя, размер, дата изменения и хеш.

Честно пробовал делать через GPT. Вот что получилось: https://chatgpt.com/share/99e8b658-6e0b-414c-b581-7cd92caab94c Ушло 3 часа времени.

Самый смак начался, когда потребовалось вычислять хеш-код файла в n потоков, ибо иначе весьма долго получается.

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

Худо-бедно что-то получилось. Времени как-то заняло не мало.

P.S.
В конце оно привело не полный код, но уже сил не хватило об этом писать. Полный код:

  Скрытый текст
#include <QCoreApplication>
#include <QDir>
#include <QFile>
#include <QXmlStreamWriter>
#include <QDateTime>
#include <QDebug>
#include <QCryptographicHash>
#include <QThreadPool>
#include <QRunnable>
#include <QMutex>
#include <QQueue>
#include <QStack>
#include <QMutexLocker>
#include <QTemporaryFile>

QMutex hashMutex;  // Мьютекс для синхронизации доступа к хэш-мап

struct FileHashTask : public QRunnable {
    QString filePath;
    QHash<QString, QString> &hashMap;

    FileHashTask(const QString &filePath, QHash<QString, QString> &hashMap)
        : filePath(filePath), hashMap(hashMap) {}

    void run() override {
        qDebug().noquote() << "Processing:" << filePath << "...";

        QFile file(filePath);
        if (!file.open(QIODevice::ReadOnly)) {
            qWarning() << "Cannot open file for reading:" << file.errorString();
            return;
        }

        QCryptographicHash hash(QCryptographicHash::Sha256);
        if (!hash.addData(&file)) {
            qWarning() << "Failed to calculate hash for file:" << filePath;
            return;
        }

        QString fileHash = hash.result().toHex();
        file.close();

        // Запись хэша в хэш-мап
        QMutexLocker locker(&hashMutex);
        hashMap.insert(filePath, fileHash);

        qDebug().noquote() << "Completed:" << filePath << "... ready";
    }
};

void writeDirectoryXml(const QDir &directory, QXmlStreamWriter &xmlWriter) {
    xmlWriter.writeStartElement("directory");
    xmlWriter.writeAttribute("name", directory.dirName());

    QFileInfoList entries = directory.entryInfoList(QDir::NoDotAndDotDot | QDir::AllEntries);
    for (const QFileInfo &entry : entries) {
        if (entry.isDir()) {
            writeDirectoryXml(QDir(entry.absoluteFilePath()), xmlWriter);
        } else if (entry.isFile()) {
            xmlWriter.writeStartElement("file");
            xmlWriter.writeAttribute("name", entry.fileName());
            xmlWriter.writeAttribute("size", QString::number(entry.size()));
            xmlWriter.writeAttribute("lastModified", entry.lastModified().toString(Qt::ISODate));
            xmlWriter.writeAttribute("originalPath", entry.absoluteFilePath());
            xmlWriter.writeEndElement(); // file
        }
    }

    xmlWriter.writeEndElement(); // directory
}

void writeInitialXml(const QString &rootDirPath, const QString &xmlFilePath) {
    QFile file(xmlFilePath);
    if (!file.open(QIODevice::WriteOnly)) {
        qWarning() << "Cannot open file for writing:" << file.errorString();
        return;
    }

    QXmlStreamWriter xmlWriter(&file);
    xmlWriter.setAutoFormatting(true);
    xmlWriter.writeStartDocument();
    xmlWriter.writeStartElement("filesystem");

    QDir rootDir(rootDirPath);
    if (rootDir.exists()) {
        writeDirectoryXml(rootDir, xmlWriter);
    } else {
        qWarning() << "Root directory does not exist:" << rootDirPath;
    }

    xmlWriter.writeEndElement(); // filesystem
    xmlWriter.writeEndDocument();

    file.close();
}

QQueue<QString> extractFilePathsFromXml(const QString &xmlFilePath) {
    QQueue<QString> filePaths;

    QFile file(xmlFilePath);
    if (!file.open(QIODevice::ReadOnly)) {
        qWarning() << "Cannot open file for reading:" << file.errorString();
        return filePaths;
    }

    QXmlStreamReader xmlReader(&file);

    while (!xmlReader.atEnd()) {
        xmlReader.readNext();
        if (xmlReader.isStartElement()) {
            if (xmlReader.name().toString() == "file" || xmlReader.name().toString() == "directory") {
                QString originalPath = xmlReader.attributes().value("originalPath").toString();
                if (!originalPath.isEmpty()) {
                    filePaths.enqueue(originalPath);
                }
            }
        }
    }

    file.close();
    return filePaths;
}

QHash<QString, QString> computeHashes(const QQueue<QString> &filePaths, int numThreads) {
    QThreadPool threadPool;
    threadPool.setMaxThreadCount(numThreads);

    QHash<QString, QString> hashMap;

    QQueue<QString> queue = filePaths;

    while (!queue.isEmpty()) {
        QString filePath = queue.dequeue();
        FileHashTask *task = new FileHashTask(filePath, hashMap);
        threadPool.start(task);
    }

    threadPool.waitForDone();
    return hashMap;
}

void updateXmlWithHashes(const QString &xmlFilePath, const QString &outputXmlFilePath, const QHash<QString, QString> &hashMap) {
    QFile xmlFile(xmlFilePath);
    if (!xmlFile.open(QIODevice::ReadOnly)) {
        qWarning() << "Cannot open XML file for reading:" << xmlFile.errorString();
        return;
    }

    QXmlStreamReader xmlReader(&xmlFile);
    QFile outputFile(outputXmlFilePath);
    if (!outputFile.open(QIODevice::WriteOnly)) {
        qWarning() << "Cannot open output XML file for writing:" << outputFile.errorString();
        return;
    }

    QXmlStreamWriter xmlWriter(&outputFile);
    xmlWriter.setAutoFormatting(true);
    xmlWriter.writeStartDocument();
    xmlWriter.writeStartElement("filesystem");

    while (!xmlReader.atEnd()) {
        xmlReader.readNext();

        if (xmlReader.isStartElement()) {
            QXmlStreamAttributes attributes = xmlReader.attributes();
            QString elementName = xmlReader.name().toString();

            if (attributes.hasAttribute("originalPath")) {
                QString originalPath = attributes.value("originalPath").toString();
                if (hashMap.contains(originalPath)) {
                    attributes.append("sha256", hashMap[originalPath]);
                }
            }

            xmlWriter.writeStartElement(elementName);
            for (const QXmlStreamAttribute &attr : attributes) {
                if (attr.name().toString() != "originalPath") {
                    xmlWriter.writeAttribute(attr.name().toString(), attr.value().toString());
                }
            }
        } else if (xmlReader.isEndElement()) {
            xmlWriter.writeEndElement();
        } else if (xmlReader.isCharacters() && !xmlReader.isWhitespace()) {
            xmlWriter.writeCharacters(xmlReader.text().toString());
        }
    }

    xmlReader.clear();
    xmlFile.close();

    xmlWriter.writeEndElement(); // filesystem
    xmlWriter.writeEndDocument();
    outputFile.close();
}

int main(int argc, char *argv[]) {
    QCoreApplication app(argc, argv);

    if (argc != 3) {
        qCritical() << "Usage:" << argv[0] << "<directory_path> <output_xml_file>";
        return -1;
    }

    QString rootDirPath = argv[1]; // Принимаем путь к директории из аргументов командной строки
    QString xmlFilePath = argv[2];


    QTemporaryFile tempXmlFile;
    tempXmlFile.setAutoRemove(true);

    if (!tempXmlFile.open()) {
        qWarning() << "Failed to create temporary file:" << tempXmlFile.errorString();
        return 1;
    }

    QString tempXmlFilePath = tempXmlFile.fileName();

    // Этап 1: Запись всех данных в XML-файл, с учетом структуры файловой системы
    writeInitialXml(rootDirPath, tempXmlFilePath);

    // Этап 2: Формирование очереди заданий на основе оригинальных путей из XML-файла
    QQueue<QString> filePaths = extractFilePathsFromXml(tempXmlFilePath);

    // Этап 3: Выполнение заданий в нескольких потоках для вычисления хэшей
    int numThreads = QThread::idealThreadCount(); // Получаем количество потоков
    QHash<QString, QString> hashMap = computeHashes(filePaths, numThreads);

    // Этап 4: Обновление XML-файла: замена originalPath на вычисленный хэш
    updateXmlWithHashes(tempXmlFilePath, xmlFilePath, hashMap);

    // Очистка

    if (!tempXmlFile.remove()) {
        qWarning() << "Failed to remove temporary file:" << tempXmlFile.errorString();
        return 2;
    }

    return 0;
}
Отредактировано 04.07.2024 4:47 Shmj . Предыдущая версия .
Re: StackOverflow-ориентированное vs GPT-ориентированное
От: vsb Казахстан  
Дата: 04.07.24 04:19
Оценка:
Это не очень интересно. Вот смог бы ты написать программу, которая, используя API от OpenAI, написала бы желаемую тобой программу? Т.е. чтобы не ты копипастил туда-сюда куски кода и ошибки, а она бы сама это делала. Ты ей лишь поставил бы задачу. Ну в каких-то случаях пускай она уточняет у тебя что-то, но это должно быть именно то, что неочевидно.
Re[2]: StackOverflow-ориентированное vs GPT-ориентированное
От: Shmj Ниоткуда  
Дата: 04.07.24 05:00
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>Это не очень интересно. Вот смог бы ты написать программу, которая, используя API от OpenAI, написала бы желаемую тобой программу? Т.е. чтобы не ты копипастил туда-сюда куски кода и ошибки, а она бы сама это делала. Ты ей лишь поставил бы задачу. Ну в каких-то случаях пускай она уточняет у тебя что-то, но это должно быть именно то, что неочевидно.


Пока нет. Оно не смогло само распараллелить — по этому дал ему рецепт как это сделать наиболее простым (но не самым красивым) способом.
Re: StackOverflow-ориентированное vs GPT-ориентированное
От: Нomunculus Россия  
Дата: 04.07.24 05:02
Оценка: +2 -2
Здравствуйте, Shmj, Вы писали:

S>Вот ранее было т.н. StackOverflow-ориентированное программирование.


У кого было «т. н. StackOverflow-ориентированное программирование» тот не может сейчас даже простенький XML вьювер написать
Re[2]: StackOverflow-ориентированное vs GPT-ориентированное
От: Shmj Ниоткуда  
Дата: 04.07.24 05:11
Оценка:
Здравствуйте, Нomunculus, Вы писали:

Н>У кого было «т. н. StackOverflow-ориентированное программирование» тот не может сейчас даже простенький XML вьювер написать


Заплатишь — напишу.
Re[3]: StackOverflow-ориентированное vs GPT-ориентированное
От: Нomunculus Россия  
Дата: 04.07.24 05:12
Оценка: +1
Здравствуйте, Shmj, Вы писали:

S>Здравствуйте, Нomunculus, Вы писали:


Н>>У кого было «т. н. StackOverflow-ориентированное программирование» тот не может сейчас даже простенький XML вьювер написать


S>Заплатишь — напишу.


Не-а. Не напишешь. Вот мозги форуму конопатить четвертый день — это ты можешь
Re[4]: StackOverflow-ориентированное vs GPT-ориентированное
От: Shmj Ниоткуда  
Дата: 04.07.24 05:24
Оценка: :)
Здравствуйте, Нomunculus, Вы писали:

Н>Не-а. Не напишешь. Вот мозги форуму конопатить четвертый день — это ты можешь


Давай за 200 долларов — напишу. Могу сначала написать, потом заплатишь. Но не ожидай завершенный продукт — это будет работающий быстрый прототип.
Re[5]: StackOverflow-ориентированное vs GPT-ориентированное
От: Нomunculus Россия  
Дата: 04.07.24 05:27
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Давай за 200 долларов — напишу. Могу сначала написать, потом заплатишь. Но не ожидай завершенный продукт — это будет работающий быстрый прототип.


Если бы мне нужна была такая тулза, то тебя бы я для этого точно не нанял бы.
Так что тут да непреодолимых препятсвия — во-первых, мне это не нать, во-вторых — ты
Re: StackOverflow-ориентированное vs GPT-ориентированное
От: Doom100500 Израиль  
Дата: 04.07.24 05:33
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Для примера решил написать прогу с помощью GPT-ориентированного программирования.


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

EDIT:

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

Развивается бот...
Спасибо за внимание
Отредактировано 04.07.2024 5:38 Doom100500 . Предыдущая версия .
Re[5]: StackOverflow-ориентированное vs GPT-ориентированное
От: Нomunculus Россия  
Дата: 04.07.24 05:50
Оценка: 3 (1)
Здравствуйте, Shmj, Вы писали:

Кстати, я писал нечто подобное когда-то. Правда не для XML, я его не люблю, слишком перегружен для хуман-ридабл, а для JSON, но суть та же. И это была не ТУЛЗА!!!! а просто окошко в программе.

ТОлько моя прога была гораздо навороченее. Я писал свой скриптовый язык для моделирования сложных строительных контструкций:

  пикчуре


И с подследующим показом деталей в виде дерева с сортировкой по атрибутам


  пикчуре
Re[6]: StackOverflow-ориентированное vs GPT-ориентированное
От: Shmj Ниоткуда  
Дата: 04.07.24 08:16
Оценка:
Здравствуйте, Нomunculus, Вы писали:

Н>Кстати, я писал нечто подобное когда-то. Правда не для XML, я его не люблю, слишком перегружен для хуман-ридабл, а для JSON, но суть та же. И это была не ТУЛЗА!!!! а просто окошко в программе.

Н>ТОлько моя прога была гораздо навороченее. Я писал свой скриптовый язык для моделирования сложных строительных контструкций:

Простой вопрос — ты писал для себя или же тобой управляли умные люди и платили деньги?
Re[7]: StackOverflow-ориентированное vs GPT-ориентированное
От: Нomunculus Россия  
Дата: 04.07.24 08:21
Оценка: +1
Здравствуйте, Shmj, Вы писали:

S>Простой вопрос — ты писал для себя или же тобой управляли умные люди и платили деньги?


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

Если ты про то, что я не стал бы делать это бесплатно. Именно это — стал бы если это было мне просто интересно или для саморазвития. Я полно сделал всего, что улетело в помойку за ненадбностью, но то как именно делать — осталось у меня в голове

Задачи деляться на два типа — на заказ — и тебе за это платят. И для само-развития и интереса — и тебе никто за это не платитит. То что ты в твоем мировоззрении выкинул для себя второй тип задач — ну, успехов тебе.
Re[8]: StackOverflow-ориентированное vs GPT-ориентированное
От: Shmj Ниоткуда  
Дата: 04.07.24 08:30
Оценка: :))
Здравствуйте, Нomunculus, Вы писали:

S>>Простой вопрос — ты писал для себя или же тобой управляли умные люди и платили деньги?

Н>Мне поставили конечную задачу, что им надо

Тут важно кто дает дух, кто дает порыв, мотивацию, становление. Изначальный источник всего — Бог. Яхве переводится как "Дающий становиться".

Порывы и возможности от Него идут.

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

Естественно регулируется все деньгами, т.е. для нас легко определить кто обладает властью давать становиться — кто платит деньги.

Сами же по себе мы ничего сделать не можем и даже если сделаем — это будет зря потраченное время. В мелочах, когда уже тебе задали движение высшие люди — ты уже можешь по мелочи что-то там добавить по своему усмотрению, но не сам по себе с нуля.
Re[9]: StackOverflow-ориентированное vs GPT-ориентированное
От: Нomunculus Россия  
Дата: 04.07.24 08:31
Оценка: +1
Здравствуйте, Shmj, Вы писали:

Ой блин, как всегда решил суть в словоблудии утопить. Даже не дочитал, не интересен твой очередной бред, уводящий от темы в твои бредни
Re: StackOverflow-ориентированное vs GPT-ориентированное
От: Privalov  
Дата: 04.07.24 13:26
Оценка: +1
Здравствуйте, Shmj, Вы писали:

S>Вот ранее было т.н. StackOverflow-ориентированное программирование. Каждый блок строительный, скажем так, был описан на StackOverflow, оставалось только вбить запрос в гугле и скопировать, был даже плагин чтобы копировать прямо из IDE.


Двести метров джаваскрипта грузят текста триста байт
Только теперь ещё ChatGPT добавился.
А потом пользователи удивляются, почему несложная вроде бы программа совершенно неюзабельна.
Re[2]: StackOverflow-ориентированное vs GPT-ориентированное
От: Shmj Ниоткуда  
Дата: 04.07.24 13:49
Оценка: -1 :)
Здравствуйте, Privalov, Вы писали:

P>Двести метров джаваскрипта грузят текста триста байт


Есть категория людей, которые отыскивают дерьмо в любом месте — даже в богатейшем городе мира покажут кучи дерьма.

P>Только теперь ещё ChatGPT добавился.

P>А потом пользователи удивляются, почему несложная вроде бы программа совершенно неюзабельна.

А какие претензии по существу к проге, которую написал GPT? В моем стартовом сообщении есть полный код под катом.
Re[3]: StackOverflow-ориентированное vs GPT-ориентированное
От: Privalov  
Дата: 05.07.24 19:22
Оценка: +1
Здравствуйте, Shmj, Вы писали:

S>Есть категория людей, которые отыскивают дерьмо в любом месте — даже в богатейшем городе мира покажут кучи дерьма.


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

S>А какие претензии по существу к проге, которую написал GPT? В моем стартовом сообщении есть полный код под катом.


К этой — не знаю. Не запускал и не смотрел. А мне этот ваш GPT всё время выдавал неработаюзий код. Подозрительно похожий на публикации на StackOverflow или примеры из MSDN. Я сделал по-другому, но точно знаю, что и такой вариант должен работать. Но нет времени для глубокого анализа. И GPT не знает. Так что мы по старинке. Зато всё ещё понимаем, как оно работает.
Re[3]: StackOverflow-ориентированное vs GPT-ориентированное
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 05.07.24 21:00
Оценка:
Здравствуйте, Shmj, Вы писали:

S>А какие претензии по существу к проге, которую написал GPT? В моем стартовом сообщении есть полный код под катом.


У программ от GPT есть фатальный недостаток — они не верифицированы. Пока не будут ИИ агенты работать в команде сообща, толку не дождёмся. То есть минимум 3 агента должно быть: ИИ-проджект, ИИ-программист и ИИ-тестировщик. Плюс callback на вызовы компилятора и анализ логов.
Сейчас программа, написанная GPT, является галлюцинацией. Да, она идноогда может быть верной, компилироваться. Если повезёт, то и делать примерно то, что надо.
А надо задачу ставить ПМ, который будет детализировать её программисту, тот писать код, смотреть вывод компилятора, исправлять код, тестировщик должен проверять, верное ли рабтает программа, а ПМ в конце концов проверять тестировщика и финализировать процесс.
Это не просто чат: дал задачу — получил какой-то код. Это среда, где ИИ-агенты живут и взаимодействуют друг с другом и выдают результат только после того, как всё закончили.
Re[4]: StackOverflow-ориентированное vs GPT-ориентированное
От: Shmj Ниоткуда  
Дата: 06.07.24 00:30
Оценка:
Здравствуйте, Nuzhny, Вы писали:

N>Сейчас программа, написанная GPT, является галлюцинацией. Да, она идноогда может быть верной, компилироваться. Если повезёт, то и делать примерно то, что надо.


Вроде уже нет — вроде добавили агенты, как минимум оно компилируется.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.