LINUX.ORG.RU

Программирование с помощью нейросетей

 ,


0

2

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

В данный момент мне нужно писать скрипты на Bash. Хочу делегировать эту задачу нейросетям.

Ответ на: комментарий от snizovtsev

Помню пытался добиться от нейронки того, в чём был пробел и в документации – не осилило оно.

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

alysnix ★★★
()
Ответ на: комментарий от alysnix

Ну держи бенчмарк. Есть исходники тулы на расте - https://github.com/astral-sh/uv , пользуются ей как CLI интерфейс + toml конфиг pyproject.toml. Доки тут: https://docs.astral.sh/uv/, issues тут https://github.com/astral-sh/uv/issues. Для сборки пользуемся hatchling, доки здесь https://hatch.pypa.io/1.9/config/metadata/

Так вот, я утверждаю, что поддерживается environment expansion, т.е. в pyproject.toml можно написать что-то такое:

[project]
dependencies = [
  "ai-is-dummy == XXX",
]
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
  1. Что конкретно написать вместо XXX, чтобы версия пакета бралась из переменной окружения $AI_IS_DUMMY_VERSION?
  2. Поддерживается ли подобный синтаксис в tool.uv.index.url?
  3. А в каких ещё ключах из pyproject.toml поддерживается этот expansion?

Не нужно быть PhD чтобы ответить на эти вопросы, человеку достаточно потратить времени на гугление, почитать комменты, почитать код – любой справится. А ИИ 99.9% не сможет, и ты заранее не знаешь сможет ли.

snizovtsev ★★★★★
()
Последнее исправление: snizovtsev (всего исправлений: 7)
Ответ на: комментарий от alysnix

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

у вас парсеры медленней чтения из фс. пазор.

Обработка записей состоит только из их чтения. Л - Логика …

Update: и только один читатель наверное - остальные в очереди подождут.

necromant ★★
()
Последнее исправление: necromant (всего исправлений: 1)
Ответ на: комментарий от necromant

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

но это уже не будет называться «парсером» файла тривиального формата. а какой-нить задачей медленной и печальной обработки данных записанных в файл.

зы.

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

alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 1)
Ответ на: комментарий от LightDiver

Вот результат, просто скормил ваш main.rs

#!/bin/bash

CONFIG_FILE="config.json"
LOG_FILE="kbd_switcher.log"

# Получить класс окна по window_id
get_window_class() {
    local window_id=$1
    xdotool getwindowclass "$window_id"
}

# Получить текущую раскладку клавиатуры
get_current_layout() {
    xkblayout-state print "%s"
}

# Получить целевую раскладку по классу окна
get_target_layout() {
    local window_class=$1
    jq -r --arg class "$window_class" '.window_layout_map[$class] // empty' "$CONFIG_FILE"
}

# Переключить раскладку
switch_keyboard_layout() {
    local layout=$1
    setxkbmap -layout "$layout"
}

# Основная функция
main() {
    while true; do
        local window_id=$(xdotool getactivewindow)
        local window_class=$(get_window_class "$window_id")
        local current_layout=$(get_current_layout)
        local target_layout=$(get_target_layout "$window_class")

        if [[ -n "$target_layout" && "$current_layout" != "$target_layout" ]]; then
            switch_keyboard_layout "$target_layout"
            echo "$(date): switched to $target_layout for $window_class" >> "$LOG_FILE"
        fi

        sleep 0.5
    done
}

main

Код не проверял.

Obezyan
()
Ответ на: комментарий от Obezyan

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

Но проверить стоит. Редко когда с первого раза работает. Обычно после перевода на другой язык надо дорабатывать.

Ну вот тебе, смотри:

diver ~/Скрипты/bash % sh kbd.sh                                                                19:41:19
xdotool: Unknown command: getwindowclass
Run 'xdotool help' if you want a command list
kbd.sh: строка 14: xkblayout-state: команда не найдена
kbd.sh: строка 20: jq: команда не найдена
xdotool: Unknown command: getwindowclass
Run 'xdotool help' if you want a command list
kbd.sh: строка 14: xkblayout-state: команда не найдена
kbd.sh: строка 20: jq: команда не найдена
xdotool: Unknown command: getwindowclass
Run 'xdotool help' if you want a command list
kbd.sh: строка 14: xkblayout-state: команда не найдена
kbd.sh: строка 20: jq: команда не найдена
xdotool: Unknown command: getwindowclass
Run 'xdotool help' if you want a command list
kbd.sh: строка 14: xkblayout-state: команда не найдена
kbd.sh: строка 20: jq: команда не найдена
xdotool: Unknown command: getwindowclass
Run 'xdotool help' if you want a command list
kbd.sh: строка 14: xkblayout-state: команда не найдена
kbd.sh: строка 20: jq: команда не найдена
xdotool: Unknown command: getwindowclass
Run 'xdotool help' if you want a command list
kbd.sh: строка 14: xkblayout-state: команда не найдена
kbd.sh: строка 20: jq: команда не найдена
^C
diver ~/Скрипты/bash %       

Тут даже с готовым промтом и структурой еще доработай попробуй это все.

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

LightDiver ★★★★★
()
Последнее исправление: LightDiver (всего исправлений: 4)
Ответ на: комментарий от alysnix

Вы кажется не поняли сути, разбирать числа разделенные запятой нужно параллельно с декодером gzip.
Иначе получается чтение файла в буфер, довольно долгое декодирование в текст, затем парсинг csv, затем уже какая-то финальная обработка. Все это в многоядерной системе будет висеть на 1 ядре и работать довольно паршиво.
Я предложил нейронке написать поток чтения файла, поток декодирования кусочков gzip, поток декодирования csv, дабы это хоть как-то распараллелить.

vazgen05 ★★★
()
Ответ на: комментарий от LightDiver

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

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

Тут даже с готовым промтом и структурой еще доработай попробуй это все.

Я запостил только код, а не весь выхлоп сети. Сеть сразу сказала что на чистом bash это не написать, нужно использовать сторонние программы, привела список и попросила разрешения использовать их. Я разрешил, она выдала вот этот код и попросила проверить что все эти утилиты установлены в системе.

Obezyan
()
Последнее исправление: Obezyan (всего исправлений: 1)
Ответ на: комментарий от vazgen05

Я предложил нейронке написать поток чтения файла, поток декодирования кусочков gzip, поток декодирования csv, дабы это хоть как-то распараллелить.

и она запуталась в потоках? и что за сеть?

если она понимает как сделать все это по-отдельности, то должна понять и как сделать паралельно. покольку это тривиально ващета.

alysnix ★★★
()
Ответ на: комментарий от Obezyan

Ах да, похвастаюсь своим вариантом еще - заметь, тебе он сделал через таймер. 0.5 секунд задержки. Я тоже сначала так делал. Но потом повесил триггер на событие иксов. Мгновенное переключение без нагрузки на цпу. Кто молодец, а?

Не справится ИИ с этим на баше даже за 10 промтов. Нужно долго пробовать, искать варианты.

LightDiver ★★★★★
()
Ответ на: комментарий от Obezyan

А инструментов много разных. Можно сделать это разными путями. Мои первоначальные варианты использовали сторонние софтины. Включая программу на си https://github.com/nonpop/xkblayout-state например.

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

LightDiver ★★★★★
()
Ответ на: комментарий от LightDiver

Я вам даю выхлоп не из общедоступных сетей в интернете, если вы не поняли. С версиями там все в порядке.

Тема беседы была о том что современные сети плохо знают bash. Я показал что специализированные сети знают его вполне на уровне человеков.

Obezyan
()
Последнее исправление: Obezyan (всего исправлений: 1)
Ответ на: комментарий от alysnix

и она запуталась в потоках?

Ага, либо синхронизирует так, что каждый поток ждет предыдущий, либо выдает что-то нерабочее.

и что за сеть?

Я через новомодный cursor писал, не помню что за модель. Могу какому-нибудь grok'у скормить попробовать, но сомневаюсь что результат изменится.

если она понимает как сделать все это по-отдельности, то должна понять и как сделать паралельно. покольку это тривиально ващета.

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

vazgen05 ★★★
()
Ответ на: комментарий от Obezyan

А я показал результат работы скрипта) И там вопрос далеко не только в том, что не установлены нужные зависимости, но и в том, что он неправильно использует уже установленные. То есть - нужны доработки. Не знает он баш.

Не, точнее может баш он в какой то мере и знает, ок. Но не разбирается в инструментах. Путается в показаниях.

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

LightDiver ★★★★★
()
Последнее исправление: LightDiver (всего исправлений: 2)
Ответ на: комментарий от LightDiver

Получается, вы тоже не знаете баш, тк сами писали выше о том что сначала шли по тому же пути что и сеть, те не с первого раза все написали. Странно было бы ожидать этого от нее. Никто не говорит что сети лучше людей знают bash. Речь о том что они «знают» баш также как люди.

Попросил перепроверить:

Извините за путаницу. Верно, xdotool не имеет команды getwindowclass. Вместо этого, мы можем использовать команду getwindowname для получения имени окна, а затем извлечь из него класс. Вот обновленная функция get_window_class:

get_window_class() {
    local window_id=$1
    if window_name=$(xdotool getwindowname "$window_id" 2>/dev/null); then
        echo "$window_name" | awk '{print $1}'
    else
        echo "Ошибка: не удалось получить класс окна" >&2
        echo ""
    fi
}

Эта функция использует xdotool getwindowname для получения имени окна, а затем с помощью awk извлекает первое слово, которое обычно является классом окна. Если возникает ошибка, функция выводит сообщение об ошибке и возвращает пустую строку.

В остальном ваш скрипт на bash выглядит правильно и использует утилиты правильно. Однако, есть несколько моментов, которые можно улучшить или исправить:

Добавьте shebang с опцией -e для завершения скрипта при ошибке:

#!/bin/bash -e

Добавьте проверку наличия необходимых утилит:

for cmd in xdotool xkblayout-state jq setxkbmap; do
    if ! command -v $cmd &> /dev/null; then
        echo "Ошибка: утилита $cmd не установлена" >&2
        exit 1
    fi
done

Добавьте проверку наличия конфигурационного файла:

if [[ ! -f "$CONFIG_FILE" ]]; then
    echo "Ошибка: конфигурационный файл $CONFIG_FILE не найден" >&2
    exit 1
fi

Улучшите обработку ошибок в функции get_target_layout:

get_target_layout() {
    local window_class=$1
    if target_layout=$(jq -r --arg class "$window_class" '.window_layout_map[$class] // empty' "$CONFIG_FILE" 2>/dev/null); then
        echo "$target_layout"
    else
        echo "Ошибка: не удалось получить целевую раскладку" >&2
        echo ""
    fi
}

Добавьте обработку сигналов для корректного завершения скрипта:

trap 'echo "Завершение скрипта"; exit 0' SIGINT SIGTERM

Улучшите форматирование вывода в лог-файл:

echo "$(date '+%Y-%m-%d %H:%M:%S'): переключено на $target_layout для $window_class" >> "$LOG_FILE"

Вот обновленный скрипт с этими улучшениями:

#!/bin/bash -e

CONFIG_FILE="config.json"
LOG_FILE="kbd_switcher.log"

# Проверка наличия необходимых утилит
for cmd in xdotool xkblayout-state jq setxkbmap; do
    if ! command -v $cmd &> /dev/null; then
        echo "Ошибка: утилита $cmd не установлена" >&2
        exit 1
    fi
done

# Проверка наличия конфигурационного файла
if [[ ! -f "$CONFIG_FILE" ]]; then
    echo "Ошибка: конфигурационный файл $CONFIG_FILE не найден" >&2
    exit 1
fi

# Получить класс окна по window_id
get_window_class() {
    local window_id=$1
    if window_name=$(xdotool getwindowname "$window_id" 2>/dev/null); then
        echo "$window_name" | awk '{print $1}'
    else
        echo "Ошибка: не удалось получить класс окна" >&2
        echo ""
    fi
}

# Получить текущую раскладку клавиатуры
get_current_layout() {
    xkblayout-state print "%s"
}

# Получить целевую раскладку по классу окна
get_target_layout() {
    local window_class=$1
    if target_layout=$(jq -r --arg class "$window_class" '.window_layout_map[$class] // empty' "$CONFIG_FILE" 2>/dev/null); then
        echo "$target_layout"
    else
        echo "Ошибка: не удалось получить целевую раскладку" >&2
        echo ""
    fi
}

# Переключить раскладку
switch_keyboard_layout() {
    local layout=$1
    setxkbmap -layout "$layout"
}

# Обработка сигналов
trap 'echo "Завершение скрипта"; exit 0' SIGINT SIGTERM

# Основная функция
main() {
    while true; do
        local window_id=$(xdotool getactivewindow)
        local window_class=$(get_window_class "$window_id")
        local current_layout=$(get_current_layout)
        local target_layout=$(get_target_layout "$window_class")

        if [[ -n "$target_layout" && "$current_layout" != "$target_layout" ]]; then
            switch_keyboard_layout "$target_layout"
            echo "$(date '+%Y-%m-%d %H:%M:%S'): переключено на $target_layout для $window_class" >> "$LOG_FILE"
        fi

        sleep 0.5
    done
}

main
Obezyan
()
Ответ на: комментарий от vazgen05

Я предложил нейронке написать поток чтения файла, поток декодирования кусочков gzip, поток декодирования csv, дабы это хоть как-то распараллелить.

Давайте свой пример более детально. Проверим.

Obezyan
()
Ответ на: комментарий от Obezyan

Вот я читаю это и прям вспоминаю как сам возился. И получал буквально те же ответы. За это время видно, что они стали умнее горпаздо. Они вообще быстро развиваются. Но, например, он сделал несколько ошибок, увеличил сильно нагрузку на систему. Полностью проигнорировал управление скриптом, а оно у меня в двух вариантах сделано - запуском файла с аргументами и через хоткеи.

Но уже вижу прогресс. Они учатся.

LightDiver ★★★★★
()
Ответ на: комментарий от alysnix

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

necromant ★★
()
Ответ на: комментарий от LightDiver

Но уже вижу прогресс. Они учатся.

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

Obezyan
()
Ответ на: комментарий от Obezyan

Да куда уже подробнее? В оригинале был нижеприведенный код и мысль по-быстрому ускорить его через c++ плагин к ноде, который бы написала нейронка. Без потоков там тривиально, но оно работает медленне чем нода.

const stream = fs
    .createReadStream(filename)
    .pipe(zlib.createGunzip())
    .pipe(CSV());

const result: ISomeResult[] = [];
stream.on("data", (chunk) => {
    // some processing
    result.push(data);
});
stream.on("end", () => {
    resolve(result);
});

vazgen05 ★★★
()
Ответ на: комментарий от vazgen05

Вот пример многопоточного парсера CSV.GZ на C++:

#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <thread>
#include <mutex>
#include <zlib.h>

struct ISomeResult {
    // Определите структуру данных, которую вы хотите получить в результате
};

std::vector<ISomeResult> result;
std::mutex resultMutex;

void processChunk(const std::string& chunk) {
    std::istringstream iss(chunk);
    std::string line;

    while (std::getline(iss, line)) {
        // Обработка каждой строки
        ISomeResult data;
        // Заполните структуру данных data

        std::lock_guard<std::mutex> lock(resultMutex);
        result.push_back(data);
    }
}

void parseCSV(const std::string& filename) {
    gzFile file = gzopen(filename.c_str(), "rb");
    if (!file) {
        std::cerr << "Ошибка открытия файла: " << filename << std::endl;
        return;
    }

    const int chunkSize = 1024 * 1024; // Размер чанка (1 МБ)
    char buffer[chunkSize];
    std::vector<std::thread> threads;

    while (true) {
        int bytesRead = gzread(file, buffer, chunkSize);
        if (bytesRead <= 0) {
            break;
        }

        std::string chunk(buffer, bytesRead);
        threads.emplace_back(processChunk, chunk);
    }

    gzclose(file);

    for (auto& thread : threads) {
        thread.join();
    }
}

int main() {
    std::string filename = "data.csv.gz";
    parseCSV(filename);

    // Выведите результаты
    for (const auto& data : result) {
        // Выведите данные
    }

    return 0;
}

В этом примере мы используем библиотеку zlib для чтения и распаковки gzip-файла. Мы разбиваем файл на чанки и обрабатываем каждый чанк в отдельном потоке. Результаты записываются в общий вектор result, защитой мьютексом resultMutex.

Обратите внимание, что вам нужно будет определить структуру ISomeResult и заполнить ее соответствующими данными в функции processChunk.

Obezyan
()
Ответ на: комментарий от Obezyan

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

LightDiver ★★★★★
()
Ответ на: комментарий от Obezyan

Вторым шагом поиск неточностей, оптимизация и пример заполнения структуры ISomeResult:

#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <thread>
#include <mutex>
#include <zlib.h>

// Пример структуры результата
struct ISomeResult {
    std::vector<std::string> fields;
};

// Глобальный результат и мьютекс
std::vector<ISomeResult> result;
std::mutex resultMutex;

// Функция для обработки чанка строк
void processChunk(const std::vector<std::string>& lines) {
    std::vector<ISomeResult> localResults;
    for (const auto& line : lines) {
        if (line.empty()) continue;
        ISomeResult data;
        std::istringstream ss(line);
        std::string field;
        while (std::getline(ss, field, ',')) {
            data.fields.push_back(field);
        }
        localResults.push_back(std::move(data));
    }
    // Копируем локальный результат в общий вектор
    std::lock_guard<std::mutex> lock(resultMutex);
    result.insert(result.end(), localResults.begin(), localResults.end());
}

void parseCSV(const std::string& filename) {
    gzFile file = gzopen(filename.c_str(), "rb");
    if (!file) {
        std::cerr << "Ошибка открытия файла: " << filename << std::endl;
        return;
    }

    const int bufferSize = 1024 * 1024; // 1 MB
    std::string buffer;
    buffer.reserve(bufferSize * 2);
    char* temp = new char[bufferSize];

    std::vector<std::thread> threads;
    std::vector<std::string> lines;
    size_t maxLinesPerThread = 10000; // настраиваемое значение

    while (true) {
        int bytesRead = gzread(file, temp, bufferSize);
        if (bytesRead <= 0) break;
        buffer.append(temp, bytesRead);

        size_t pos = 0, prev = 0;
        while ((pos = buffer.find('\n', prev)) != std::string::npos) {
            std::string line = buffer.substr(prev, pos - prev);
            lines.push_back(std::move(line));
            prev = pos + 1;
            if (lines.size() >= maxLinesPerThread) {
                // Передаём копию lines в поток
                threads.emplace_back(processChunk, std::move(lines));
                lines.clear();
            }
        }
        // Оставшиеся данные (частичная строка) остаются в буфере
        buffer = buffer.substr(prev);
    }
    // Обработка оставшихся строк
    if (!buffer.empty()) {
        lines.push_back(std::move(buffer));
    }
    if (!lines.empty()) {
        threads.emplace_back(processChunk, std::move(lines));
    }

    gzclose(file);
    delete[] temp;

    for (auto& thread : threads) {
        thread.join();
    }
}

int main() {
    std::string filename = "data.csv.gz";
    parseCSV(filename);

    // Вывод результатов
    for (const auto& data : result) {
        for (size_t i = 0; i < data.fields.size(); ++i) {
            std::cout << data.fields[i];
            if (i + 1 < data.fields.size()) std::cout << ",";
        }
        std::cout << std::endl;
    }

    return 0;
}
Obezyan
()
Ответ на: комментарий от LightDiver

Qwen вполне себе неплох, использую его как базу для некоторых дистиллятов. Остальное ощутимо слабее в сложных задачах. А простые задачки они все +/- одинаково щелкают.

Obezyan
()
Ответ на: комментарий от necromant

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

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

alysnix ★★★
()
Ответ на: комментарий от Obezyan

Докладываю - в отличии от grok и cursor оно действительно работает и быстрее однопотока.
К сожалению все еще медленнее самой ноды, но тут видимо переброс больших массивов между js и плагином сам по себе слишком медленный, попробую что-нибудь придумать на этот счет.

vazgen05 ★★★
()
Ответ на: комментарий от LightDiver

В openrc нужно не только bash знать, но и библиотеки со множеством функций, которые для этого самого openrc написаны. И тут как везде, если знаешь инструмент, то всё пишется за пять минут. Если не знаешь, то кури маны.

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

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

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

shell-script ★★★★★
()
Ответ на: комментарий от unDEFER

У меня работает. Не знаю почему у вас не работает.

Потому что оно работает не так.

Никаких "знаний" не существует. Рекомендую почитать как работают NLP, ML и как устроены LLM внутри, а потом уже что-то утверждать. (=

mord0d ★★★★★
()
Ответ на: комментарий от shell-script

Я начал практически с нуля сам два года назад без каких то обучений с простенького скрипта луа (тогда он мне казался очень сложным) мне его показал LINUX.ORG.RU:

#! /bin/env lua
print ("fdsa");
local signal_file_name = '.coffee'
local signal_file = os.getenv('HOME')..'/'..signal_file_name;
local file = io.open(signal_file);

if(file) then
    local stat = file:read('*all');
    file:close();
    if stat == 'working' then
       file = io.open(signal_file,'w');
       file:write('stop');
       return 0;
    else
       file = io.open(signal_file,'w');
       file:write('working');
       file:close();
       stat="working";
    end
    local timer = 540;
    -- получаум ID прогессбара
    local qpopen = io.popen('kdialog --progressbar "Кофе" '..timer..' ',"r");
    local qprogress_id    = qpopen:read("*l");
    local play_sound = true;
    -- теперь мы крутим цикл не вечно, но оставляем его
    while(stat=="working") do
            -- заводим цикл отправки сообщений прогрессбару
            for coffee=0, timer ,1 do
                -- теперь проверяем стастус в цикле 
                -- отправки счётчика прогрессбару
                file = io.open(signal_file,'r');
                stat = file:read('*all');
                file:close();
                -- если повторно нажать хоткей
                -- значением поменяется на стоп
                -- выходим из цикла прогрессбара
                -- и задаём оснанов для основного цикла
                if stat == "stop" then 
                    play_sound=false; 
                    stat="stop"
                    break; 
                end
                --шлём счётчик прогрессбару
                local qdbus = 'qdbus '..qprogress_id..' Set "" value '..tostring(coffee)..' >/dev/null';
                os.execute(qdbus);
                os.execute("sleep 1")
            end
            -- проигрываем музыку тогда и только тогда когда завешилось естественно
            -- если прервали играть не надо ибо зачем, а главное ****я
            if play_sound == true then 
               -- если музыка не просто тилинь тилинь короткая, а целая песня 
               -- то будет играть до победного и только тогда всё завершится корректно
               -- если тут музыка длинная то надо делать детекст нажатия в окне
               -- прогресс бара кнопочки "закрыть" и в фоне грохать музыку
               -- для этого уже надо завести отдельный поток который будет это делать
               -- музыка просто тилинь-тилинь недолгая
               os.execute("mpv --force-window=no /home/diver/Загрузки/Музыка/12/coffee.mp3");
               os.execute("killall kdialog_progress_helper");
               file = io.open(signal_file,'w');
               file:write('stop');
               file:close();
               break;
            end
            -- всегда грохаем прогресс бар после достижения таймером финала
            os.execute("qdbus "..qprogress_id.." org.kde.kdialog.ProgressDialog.close");
            -- после того как в любом случае завершился прогресс бар 
            -- посылаем сигнал сами себе что мы всё. 
            file = io.open(signal_file,'w');
            file:write('stop');
        end
    end

Максимум 2 года АСУ, да и те 20 лет назад. За последние два года практически 24/7 кодил (луа, раст, иногда немножко си, но он мне не дается вообще никак, питон). ИИ с удивлением открыл с выходом дипсика. И сейчас ИИ переделывают мой код лучше, чем написал бы когда либо его я. Или же я бы на переделку такую потратил бы еще года два. У них каждый раз есть что доделать: там я крайние случаи упущу, плохо комментирую, дублирую лишнее итд итп.

Вообще для меня в одно слились два невероятных открытия: я понял ООП и узнал про дипсика. Оба сравнимы для меня с открытием интернета в свое время. Нереально ускоряют разработку.

А уж если надо запутанный длинный алгоритм проработать, где хрен охватишь все сознанием - тут они вообще бесценны. Они то это просчитывают мгновенно. Главное дать основу и все перепроверить трижды и протестировать.

Плюс они хорошо знают математику - формулы, которые я и в школе то не особо учил, а что учил - забыл. А такой вот краткой формулой часто можно сделать больше, чем 100 строками кода без формул.

Ну и как то так теперь: https://github.com/Vladgobelen/

Понимаю, что с точки зрения профессионала это выглядит как то иначе.

LightDiver ★★★★★
()
Последнее исправление: LightDiver (всего исправлений: 10)
Ответ на: комментарий от LightDiver

А зачем тебе временный файл для проверки статуса, который ты ещё и дёргаешь раз в секунду(причём не просто открыв и отслеживая изменения, а ещё и переоткрываешь/закрываешь)? Есть какие-то параллельные процессы, которые могут в него писать и менять статус?

На баше именно этот пример будет выглядеть примерно так же. И не менее читабельно. ;) Но это уже дело вкуса, что использовать. Здесь самое сложное - это разобраться, как работать с kdialog и qdbus - остальное хелловорд. Но задумка прикольная. :)

shell-script ★★★★★
()
Ответ на: комментарий от shell-script

Ну, так сделал в свое время LINUX.ORG.RU. Я не переделывал, но понял тогда концепцию флагов, сам алгоритм. И понеслася. Дальше я уже файл делал в озу и вообще менял многое.

Просто это тот скрипт, который мне подкинули и с которого я начал.

LightDiver ★★★★★
()
Ответ на: комментарий от LightDiver

Ясно. Просто я бы на ревью код с дёрганьем файла раз в секунду для проверки статуса не пропустил бы при таких вводных. Вот тут как раз мы и приходим к тому, что чатбот может подсказать тебе какие-то особенности синтаксиса. А вот с алгоритмами у него всё плохо, если ему отдельно не сказать об этом. Но в реальной работе как раз самое сложное - это придумать нормальную логику - закодить это на уже мелочи. Я вот сейчас, наверное, второй раз в жизни видел код на lua, но легко понял всё, что там у тебя происходит. ;) Хотя, конечно, если ты не кодил никогда в жизни, может быть оно и полезно. Просто мы обычно без знания языков, которые используем, людей не нанимаем. И я не программист, если что.

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

shell-script ★★★★★
()
Ответ на: комментарий от shell-script

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

А вот попробовал я го через них. Да, я объясню алгоритм. Да, они сделают рабочий код на какую то попытку. Но я не изучаю го, как оказалось. Тут очень важная своя ручная работа - прописывание руками каждого оператора, каждой скобки раз за разом. Наработка мышечной памяти.

Поэтому я не очень завидую тем, кто с нуля будет пользоваться ИИ для «обучения». Хер они чему научатся так. А если научатся, это займет в десятки раз больше времени.

Вот и получается, что с одной стороны они мгновенно дают доступ к любым НУЖНЫМ тебе знаниям, а с другой лишают механической наработки кода руками.

LightDiver ★★★★★
()

Я добровольно-принудительно использовал чатгопоту, jetbrains ai, Junie и cursor. Лучше всего последний, но только для строго типизированных компилируемых языков (конкретно для жабы), только если хорошо определена структура проекта и только если у тебя есть дохрена дел и ты тупо аутсорсишь одно из них пока сам пишешь другие части. Ну или если писать дохрена и ты можешь чётко сформулировать чего хочешь и как этого достигнуть. И если ты способен провалидировать результат. Если тебе баш и ты хочешь смотреть как «машина пишет за тебя» - пиши сам.

И дело не в модели, а в подходе, например в итерациях по косякам, поиске связанных файлов и прочему. Модель почти везде claude sonnet

Ну и это прилично бьёт по психике, у тебя по сути есть 1-2-3 «джуна» за которыми надо постоянно следить и направлять их поток сознания в нужное русло.

upcFrost ★★★★★
()
Последнее исправление: upcFrost (всего исправлений: 4)

Ни одна нейросеть неспособна нормально написать что-то большее, чем пример «как юзать Х» или какой-нибудь консольный калькулятор. Да и то, этот самый калькулятор, скорее всего, крашнется, если юзер введёт не число, а что-то иное.

MrCookie ★★★★
()