Помню пытался добиться от нейронки того, в чём был пробел и в документации – не осилило оно.
все «нейронки» разные. я вот даже уверен, что хорошие нейронки, тренированные на нужные задачи, всем не показывают, а используют для цели извлечения частной выгоды и государственных интересов.
Что конкретно написать вместо XXX, чтобы версия пакета бралась из переменной окружения $AI_IS_DUMMY_VERSION?
Поддерживается ли подобный синтаксис в tool.uv.index.url?
А в каких ещё ключах из pyproject.toml поддерживается этот expansion?
Не нужно быть PhD чтобы ответить на эти вопросы, человеку достаточно потратить времени на гугление, почитать комменты, почитать код – любой справится. А ИИ 99.9% не сможет, и ты заранее не знаешь сможет ли.
ну, если у вас медленные и печальные парсеры чисел разделенных запятыми, то конечно надо брать многопоток, многопроцесс, и даже купить кластер суперкомпьютеров.
но это уже не будет называться «парсером» файла тривиального формата. а какой-нить задачей медленной и печальной обработки данных записанных в файл.
зы.
задачку такого рода надо скорей решать однотредовым парсером, запуливающим распарсенные данные на треды-воркеры - где и производится сама их обработка, если она длительная
#!/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
Ну блин, если уже готовый скормить, конечно он переделывает. Я с нуля естественным языком пытался. А переводит из языка в язык оно более менее сносно.
Но проверить стоит. Редко когда с первого раза работает. Обычно после перевода на другой язык надо дорабатывать.
Ну вот тебе, смотри:
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 %
Тут даже с готовым промтом и структурой еще доработай попробуй это все.
Чем хорош мой вариант на расте, я избавился от всех зависимостей, переписал утилиту работы с клавиатурой и раскладкой с си на раст, все инструменты дописал, короче. Все в одном бинарнике.
Вы кажется не поняли сути, разбирать числа разделенные запятой нужно параллельно с декодером gzip. Иначе получается чтение файла в буфер, довольно долгое декодирование в текст, затем парсинг csv, затем уже какая-то финальная обработка. Все это в многоядерной системе будет висеть на 1 ядре и работать довольно паршиво. Я предложил нейронке написать поток чтения файла, поток декодирования кусочков gzip, поток декодирования csv, дабы это хоть как-то распараллелить.
Ну блин, если уже готовый скормить, конечно он переделывает. Я с нуля естественным языком пытался. А переводит из языка в язык оно более менее сносно.
Для теста взял ваш код, попросил по-русски описать что он делает. Результат на русском закинул в другую сеть и попросил написать код по этому описанию. Она еще раз попросила использовать утилиты и выдала такой же код с небольшими отличиями.
Тут даже с готовым промтом и структурой еще доработай попробуй это все.
Я запостил только код, а не весь выхлоп сети. Сеть сразу сказала что на чистом bash это не написать, нужно использовать сторонние программы, привела список и попросила разрешения использовать их. Я разрешил, она выдала вот этот код и попросила проверить что все эти утилиты установлены в системе.
Ах да, похвастаюсь своим вариантом еще - заметь, тебе он сделал через таймер. 0.5 секунд задержки. Я тоже сначала так делал. Но потом повесил триггер на событие иксов. Мгновенное переключение без нагрузки на цпу. Кто молодец, а?
Не справится ИИ с этим на баше даже за 10 промтов. Нужно долго пробовать, искать варианты.
А инструментов много разных. Можно сделать это разными путями. Мои первоначальные варианты использовали сторонние софтины. Включая программу на си https://github.com/nonpop/xkblayout-state например.
Он хорош, что расскажет какие инструменты есть, но он не знает про актуальные версии. Выдает устаревшую инфу и нерабочие варианты использования. Все не так просто.
А я показал результат работы скрипта) И там вопрос далеко не только в том, что не установлены нужные зависимости, но и в том, что он неправильно использует уже установленные. То есть - нужны доработки. Не знает он баш.
Не, точнее может баш он в какой то мере и знает, ок. Но не разбирается в инструментах. Путается в показаниях.
В чем проблема баш скриптов? Мало знать сам синтаксис. Он сам по себе тебе ничего не даст. Нужно использовать сторонние утилиты. А значит у нас уже две пробелмы. Поэтому я ушел с баша на питон, луа и раст - там хотя бы одна проблема частично решается. Там можно действовать в рамках одного языка с его собственными утилитами, иногда подключая сторонние.
Получается, вы тоже не знаете баш, тк сами писали выше о том что сначала шли по тому же пути что и сеть, те не с первого раза все написали. Странно было бы ожидать этого от нее. Никто не говорит что сети лучше людей знают 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
}
Добавьте обработку сигналов для корректного завершения скрипта:
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
Вот я читаю это и прям вспоминаю как сам возился. И получал буквально те же ответы. За это время видно, что они стали умнее горпаздо. Они вообще быстро развиваются. Но, например, он сделал несколько ошибок, увеличил сильно нагрузку на систему. Полностью проигнорировал управление скриптом, а оно у меня в двух вариантах сделано - запуском файла с аргументами и через хоткеи.
Уже лучше, а теперь следующий этап - у вас не просто последовательный перебор записей, а читатели требующие случайный доступ к данным, которые не поместятся в память.
Да куда уже подробнее? В оригинале был нижеприведенный код и мысль по-быстрому ускорить его через 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.
Ну, я пользуюсь стандартными китайцами: дипсик, квен, минимакс. Остальное для меня неюзабельно. Свое заводить нет железа, обходить туда, где меня не ждут как то лениво. Кучи платных шараг типа «купи следшие пять промтов» вообще не воспринимаю.
Qwen вполне себе неплох, использую его как базу для некоторых дистиллятов. Остальное ощутимо слабее в сложных задачах. А простые задачки они все +/- одинаково щелкают.
а последовательный перебор был принципиальным. читатели, что лазят в произвольное место в файле, в абы какой файл не залезут.
как минимум им нужно уметь вычислять позицию. а значит это скорей всего файл с записями фиксированного размера. И они понимают, какую запись им нужно выбрать. То есть это существенно не файл последовательного доступа, где позиция не вычисляется аналитически. Короче это не тот вопрос.
Докладываю - в отличии от grok и cursor оно действительно работает и быстрее однопотока. К сожалению все еще медленнее самой ноды, но тут видимо переброс больших массивов между js и плагином сам по себе слишком медленный, попробую что-нибудь придумать на этот счет.
В openrc нужно не только bash знать, но и библиотеки со множеством функций, которые для этого самого openrc написаны. И тут как везде, если знаешь инструмент, то всё пишется за пять минут. Если не знаешь, то кури маны.
Можно, конечно, извернуться и использовать самый минимум, но тогда и результат будет соответствующий.
И чатботу скормить такую задачу без долгого и нудного обучения со специально обученным инженером нереально. Впрочем это касается любых задач сложнее хелловорда.
У меня на работе есть коллега, который тоже пытался делегировать. Берёт задачу, кучу времени бьётся, восторженно рассказывает как чатбот ему помогает, когда(если) дело доходит до ревью, всё отправляется на полную переделку. А чаще всего и до ревью не доходило, так как на техтолках внутри отдела успевали объяснить ему, что не в ту сторону копает. Хорошо, что у него это прошло и теперь сразу пишет сам(с нашими подсказками, а не чатбота - благо у нас в команде все друг-другу помогают без проблем) и нормально.
Я начал практически с нуля сам два года назад без каких то обучений с простенького скрипта луа (тогда он мне казался очень сложным) мне его показал 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 строками кода без формул.
А зачем тебе временный файл для проверки статуса, который ты ещё и дёргаешь раз в секунду(причём не просто открыв и отслеживая изменения, а ещё и переоткрываешь/закрываешь)? Есть какие-то параллельные процессы, которые могут в него писать и менять статус?
На баше именно этот пример будет выглядеть примерно так же. И не менее читабельно. ;) Но это уже дело вкуса, что использовать. Здесь самое сложное - это разобраться, как работать с kdialog и qdbus - остальное хелловорд. Но задумка прикольная. :)
Ну, так сделал в свое время LINUX.ORG.RU. Я не переделывал, но понял тогда концепцию флагов, сам алгоритм. И понеслася. Дальше я уже файл делал в озу и вообще менял многое.
Просто это тот скрипт, который мне подкинули и с которого я начал.
Ясно. Просто я бы на ревью код с дёрганьем файла раз в секунду для проверки статуса не пропустил бы при таких вводных. Вот тут как раз мы и приходим к тому, что чатбот может подсказать тебе какие-то особенности синтаксиса. А вот с алгоритмами у него всё плохо, если ему отдельно не сказать об этом. Но в реальной работе как раз самое сложное - это придумать нормальную логику - закодить это на уже мелочи. Я вот сейчас, наверное, второй раз в жизни видел код на lua, но легко понял всё, что там у тебя происходит. ;) Хотя, конечно, если ты не кодил никогда в жизни, может быть оно и полезно. Просто мы обычно без знания языков, которые используем, людей не нанимаем. И я не программист, если что.
Там выше писали, что чатботов для обучения можно использовать. Вот это похоже как раз тот случай.
Для обучения тут двояко очень. Я то вручную все это колупал два года. Работал с таблицами, сам формировал базы данных себе, все вручную искал. Разрабатывал алгоритмы, технологии как что делать. И вот для меня его подсказки стали в итоге открытием - очень легкий доступ к знаниями. Но мне то его знания стали дополнением к тому, что я уже сам нашел.
А вот попробовал я го через них. Да, я объясню алгоритм. Да, они сделают рабочий код на какую то попытку. Но я не изучаю го, как оказалось. Тут очень важная своя ручная работа - прописывание руками каждого оператора, каждой скобки раз за разом. Наработка мышечной памяти.
Поэтому я не очень завидую тем, кто с нуля будет пользоваться ИИ для «обучения». Хер они чему научатся так. А если научатся, это займет в десятки раз больше времени.
Вот и получается, что с одной стороны они мгновенно дают доступ к любым НУЖНЫМ тебе знаниям, а с другой лишают механической наработки кода руками.
Я добровольно-принудительно использовал чатгопоту, jetbrains ai, Junie и cursor. Лучше всего последний, но только для строго типизированных компилируемых языков (конкретно для жабы), только если хорошо определена структура проекта и только если у тебя есть дохрена дел и ты тупо аутсорсишь одно из них пока сам пишешь другие части. Ну или если писать дохрена и ты можешь чётко сформулировать чего хочешь и как этого достигнуть. И если ты способен провалидировать результат. Если тебе баш и ты хочешь смотреть как «машина пишет за тебя» - пиши сам.
И дело не в модели, а в подходе, например в итерациях по косякам, поиске связанных файлов и прочему. Модель почти везде claude sonnet
Ну и это прилично бьёт по психике, у тебя по сути есть 1-2-3 «джуна» за которыми надо постоянно следить и направлять их поток сознания в нужное русло.
Ни одна нейросеть неспособна нормально написать что-то большее, чем пример «как юзать Х» или какой-нибудь консольный калькулятор. Да и то, этот самый калькулятор, скорее всего, крашнется, если юзер введёт не число, а что-то иное.