LINUX.ORG.RU

Сообщения papin-aziat

 

Хочу говорить про Bash

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

Решил попробовать написать программку, которая удаляет дубликаты строк из .bash_history (там более 7000 строк у меня). Мне это показалось достойной задачкой для начинающего башиста, хотя и (может быть) довольно бесполезной. Кстати, есть такая программа shell-history-cleaner (кажется на расте написана, давно себе собрал, работает, но видимо заброшена автором), я пользуюсь, но попробовать свои силы надо было.

В результате мне удалось сделать задуманное, но хочется поговорить и о «неудачных» вариантах, которые может быть были бы более удачными, если бы я больше знал о bash и linux вообще, так что категорически приветствуется критика и подсказки более правильных решений или каких-нибудь хитростей командной строки.

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

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

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

file=$1
mapfile -t list < <(grep -v '^$' $file)
while ((${#list[*]})); do
    line=${list[-1]}
    unset list[-1\]
    for i in ${!list[*]}; do
        [[ $line == "${list[i]}" ]] &&
            unset list[i\]
    done
    final+=("$line")
done
printf '%s\n' "${final[@]}" | tac > $file

Для таких же любителей как я поясню идею кода. На его краткость отлично повлиял тот факт, что в истории командной строки надо сохранять последние уникальные строки, то есть работать надо с конца файла, а у индексированных массивов как раз есть стабильная ссылка на последний индекс: array[-1]. То есть не надо ничего переворачивать.

Как я понимаю, самое тугое место в скрипте — сравнение строк, и что-то более быстрых вариантов походу нет. Далее надо думать о многопоточности, но я пока до этого не дозрел.

Поскольку на данном этапе я застрял и вроде бы ясно, что тема с массивами как-то всё усложняет, то решил написать скриптик в стиле unix-way, и искренне полагал, что это будет правильным решением задачки, ведь утилиты все написаны суровыми дядьками на Си, и там всё без дураков — быстро и надёжно. Пришла идея отбросить всю эту возню с поиском и удалением, а просто взять всё — и отфильтровать.

file=$1
list=$(tac $file | grep -v '^$')
while [[ $list ]]; do
    read -r line <<< $list
    list=$(grep -Fxv "$line" <<< $list)
    echo "$line"
done | tac > $file

Чтобы уважаемый лорчанин не хельпал ключи -F -x, напомню: F — читает regex буквально, а x — помещает выражение между ^$, иначе пришлось бы использовать ключ -P (perlre) и выражение выглядело бы как говно: "^\Q$line\E$", а работало бы ещё медленней, возможно, но это не точно. (кстати, я был весьма разочарован узнать, что с sed такое вообще не провернуть — никак не заставить подстановку читать буквально).

Итак, на короткой дистанции (разумеется, у меня был короткий вариант файла для тестов) этот скрипт почти в два раза обогнал предыдущий, но — что было для меня полнейшим разочарованием! — он совершенно заткнулся даже на средней дистанции (нагружая процессор на четверть, но размазано по потокам), то есть я его тупо прервал на какой-то там 10-ой минуте, так что о проверке на полном файле речи уже не шло. Как это понимать — не знаю, поясните. 1000 строк он смолол где-то за секунду с небольшим, а 3000 — уже застрял.

Ладно, пока не было новых идей, прочитал главу про ассоциативные массивы и сразу почуял, что это походу то, что мне надо, но я не ожидал, что настолько! Свойство хеша не дублировать индексы как будто специально создано для решения этой задачки. Быстро стало понятно, что надо просто переложить строки из обыкновенного массива в индексы хеша, а в значения хеша — номера индексов строк из обыкновенного массива.

file=$1
mapfile -t list < <(grep -v '^$' $file)
declare -A hash
for i in ${!list[*]}; do
    hash[${list[i]}]=$i
done
for i in "${!hash[@]}"; do
    final[${hash[$i]}]="$i"
done
printf '%s\n' "${final[@]}" > $file

Это было круто! Нет смысла даже говорить о времени выполнения этой программы, она работает почти мгновенно, менее двух десятых секунды.

Получается на bash таки можно что-то программировать и оно может работать быстро.


UPD

Наконец подсказали, что во втором скрипте у меня ошибка: read -r очищает строку от пробельных символов по краям, поэтому grep её не находит и получается бесконечный цикл. Спасибо @mky: Хочу говорить про Bash (комментарий)
Теперь этот скрипт переваривает тот же файл за 15-16 секунд!

file=$1
list=$(tac $file | grep -v '^$')
while [[ $list ]]; do
    IFS=$'\n' read -r line <<< $list
    list=$(grep -Fxve "$line" <<< $list)
    echo "$line"
done | tac > $file

UPD2

Спасибо анону, подкинул идею отфильтровать хешем в один проход: Хочу говорить про Bash (комментарий)

file=$1
mapfile -t list < <(tac $file | grep -v '^$')
declare -A hash
for i in "${list[@]}"; do
    [[ ${hash[$i]} ]] && continue
    hash[$i]=added
    final+=("$i")
done
printf '%s\n' "${final[@]}" | tac > $file

UPD3

Продолжаю благодарить анона, что замотивировал таки раскурить sort. Итак, почти самый шустрый вариант:

file=$1
list=$(< $file \
    grep -vn '^$' |
    tac |
    sort -t: -k2 -u |
    sort -t: -k1,1n |
    cut -d: -f2-)
echo "$list" > $file

На моём компе меньше трёх сотых секунды!


UPD4

Дошли руки до AWK и это походу победитель на скорость в стиле unix-way (анон давал такой рецепт в треде).

file=$1
list=$(tac $file |
    grep -v '^$' |
    awk '!added[$0]++')
tac <<< $list > $file

На моём компе — девять тысячных секунды!

 

papin-aziat
()

Килограмм Солнца

Семихатов тут выдал, что типа килограмм Солнца (и руками так показал как будто килограмм картошки) даёт меньше тепла, чем килограмм преющих листьев в лесу, а такое горячее оно потому, что масса у него большая.

Объясните дураку, это что ж получается, если навалить листьев как следует, то они будут светить на всю вселенную?

 

papin-aziat
()

Firefox похоже деградирует

Для тестов взял всратый сайт market.yandex.ru, чтоб сразу была понятна разница.

Итак, поскольку меня интересовала плавность скроллинга, то я тупо крутил страничку вниз без остановки.

Google-chrome отлично справляется и грузит процессор условно на 100% (один из потоков), ну и там плюс-минус, фигня, зато стабильно, комфортно.

Firefox ESR-115 — то же самое, примерно так же грузит проц и почти так же хорошо справляется со всем остальным.

Firefox ESR-128 местами плывёт фпс, почему-то не успевает прогружать ленту и затыкается, грузит проц на 200%, комп начинает пыхтеть.

Версии фокса настроены одинаково, один и тот же user.js.

Может быть кто-то знает, что можно отключить или включить в новом ESR, чтобы он стал как раньше, очень надо!

Последнюю версию фокса пробовал. Улучшений не заметил. Что-то в этот раз сломали капитально.

 , зоркий-глаз

papin-aziat
()

Гномеры допрыгались...

Ну чё, посоны, допрыгались гномеры, довыёживались, почуяли свой монополизьм, и вот — получите!

Начиная с Федоры 42 спин с кедами перестаёт быть левым спином и становится в один ряд с гномом, то есть теперь это будет ещё один официальный Fedora Workstation.

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

Короче, помяните моё слово, неспроста это. Значит где-то в высоких кабинетах Шапки кого-то они уже начинают таки доставать, и вот пожалуйста, первый пошёл…

Пруф: https://pagure.io/Fedora-Council/tickets/issue/504

 , , ,

papin-aziat
()

Старый кот опять забанился

В чём драма? Я только это нашёл: https://www.linux.org.ru/forum/linux-org-ru/17779756?lastmod=17779786

 

papin-aziat
()

Ну и кто тут говорил, что AlmaLinux не нужен?

Некто Генри Ян, сотрудник Майкрософт пишет:

AlmaLinux доступен в Azure Marketplace уже более трёх лет, и мы рады объявить, что теперь он является официально поддерживаемым дистрибутивом Linux в Azure. <...> AlmaLinux используется широким кругом клиентов в Azure и становится все более популярным выбором для пользователей CentOS Linux, которые ищут альтернативы после завершения его поддержки. Одобрение AlmaLinux в Azure является свидетельством его надежности, безопасности и производительности.

пруф: https://techcommunity.microsoft.com/t5/linux-and-open-source-blog/announcing-availability-of-almalinux-as-an-endorsed-linux/ba-p/4282201

Вот так-то, там дяди солидные, они с кем попало делов не имеют!

 

papin-aziat
()

Ну вот, до́жили...

Сижу, читаю новость про Kitten в блоге AlmaLinux, а там пишут:

Our upstream decided to remove packaged versions of Firefox and Thunderbird RPM packages from CentOS Stream 10 and RHEL10 in favor of using Flatpak versions of them.

Фига, в десятой шапке получается не будет фокса в репах? 😱

 , , , ,

papin-aziat
()

Наблюдаю странный паттерн

Всё чаще оказываюсь в ситуации, когда пишу коммент на ЛОРе и, нажимая кнопу «отправить», вижу красное сообщение, что тема удалена.

Это что-то объективное или с этим к психоаналитику?

 

papin-aziat
()

Centos Stream: сборки с разными DE

На опеннете выложили новость про некую сборку MIN якобы от разрабов стрима, но это от SIGs. Ладно, неважно.

Короче, оказывается есть целая куча лайв-сборок с разными DE на центоси, вот такой набор:

  • CINNAMON
  • GNOME
  • KDE
  • MATE
  • XFCE
  • MAX (весь набор)
  • MIN (без гуёв совсем)

Все лайв-сборки можно установить, даже которая MIN (там есть утилита install_to_hard_drive).

Обновляются каждые 3 месяца.

Брать здесь: https://mirror.stream.centos.org/SIGs/9-stream/altimages/images/live/

Кто-нибудь пробовал?

 , , , ,

papin-aziat
()

Плеер для lossless (.cue)

Иногда надо найти хорошее исполнение конкретного опуса и я качаю всякие flac+cue и ape+cue.

Точно знаю, что открывать, разбивать на треки и играть .cue умеет Deadbeef.

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

 , ,

papin-aziat
()

Знатокам телефонов

Заказали телефон. Из магазина звонят, бла-бла-бла про доставку и предлагают проверку на скрытые дефекты за 500 рублей, мол тогда 99.999% телефон будет без проблем. Мол там какое-то крутое оборудование и они 40 минут тестируют на всякие проблемы телефон. Я отказался, так как я должен был бы по сути поверить на слово, что они это делали… Зря отказался? Нужны такие проверки? Мне попался тупой менеджер, который не смог объяснить нормально?

 

papin-aziat
()

Телефон и двухэтапная аутентификация в гугл.

Надо было сбросить телефон к заводским настройкам (долго объяснять). Перед этим действием всё, что можно было, забекаплено в гугл. На «пустом» телефоне пытаешься авторизоваться в гугл, а там двухэтапная аутентификация, занавес.

Хорошо, под рукой был комп, где можно было от того пользователя зайти в профиль гугла и выключить эту дрянь, и что меня поразило, что это можно было выключить без этой самой аутентификации (Слава Аллаху).

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

 

papin-aziat
()

Ханна Монтана

Кто-нибудь уже поинтересовался творчеством?

 

papin-aziat
()

Объясните, что это такое?

Вчера внезапно перестал нормально работать сайт musescore.com — какая-то капча (cloudflare или как-то так) вылезает, толком ничего не работает, если разлогинился, то уже не залогиниться и тд.

Из самой программы (MuseScore 3.6) тоже доступа нет, но помогло почистить кэш, заново залогиниться и заработало.

А вот из браузера никак (Firefox ESR [115]). Из гугл-хрома — норм, из ФФ-125 — тоже.

В результате поменял user agent в ESR на Linux Firefox 124 и — заработало всё как надо. Это что за хреновина, там здоровые люди? Есть какой-то высший смысл в этом всём?

 

papin-aziat
()

Flathub: Failed to parse...

Давно не использовал flatpak, но вот решил одну прогу потестить…

Делаю

dnf install -y flatpak
flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo

На всякий случай перезагружаюсь (помню, что надо было зачем-то)

И…

$ flatpak search denemo
F: Failed to parse /var/lib/flatpak/appstream/flathub/x86_64/active/appstream.xml.gz file: Error on line 4065 char 29: <p> already set '
      Organic Maps is a free Android & iOS offline maps app for travelers,
      tourists, hikers, drivers and cyclists.
      It uses crowd-sourced OpenStreetMap data and is developed with love by
      ' and tried to replace with ' ('
No matches found

Иду в гуголь.

Проблему пообсуждали почти год назад: https://github.com/flatpak/flatpak/issues/5434

Типа у кого старые версии флатпака, тот в пролёте, а это — шапка 8 (про 9 не знаю), убунта (какая-то LTS, у них так много цифер…), демьян 11, и это только то, что мне на глаза попалось при чтении.

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

Можно как-то починить?

У них там всё в порядке с душевным здоровьем?

 ,

papin-aziat
()

Прокрутка в браузерах

Давно заметил такую фигню: когда окно браузера теряет фокус, а потом получает назад, то первый щелчок (речь о прокрутке, а не кнопке) колеса мыши игнорируется и страница начинает скроллиться только на втором щелчке.

У всех так? Как починить (хотя бы в фоксе)?

 , ,

papin-aziat
()

Поменять местами клавиши в виртуальной консоли

В гноме с помощью gnome-tweaks я переставил клавиши CTRL на место клавиш ALT, и теперь ко́нтролы рядом с пробелом (что очень удобно), а а́льты рассовал как получилось – левую рядом с ко́нтролом, а правую в самый конец справа.

Получилось вот так:

[win][ALT][CTRL][SPACE][CTRL][fn][menu][ALT]

И ещё поменял местами CAPS_LOCK и ESC (что тоже крайне удобно оказалось).

Иногда бывает надо зайти в виртуальную консоль (это бывает крайне редко и в этом проблема) и починить иксы или гном, или что-то ещё, что не даёт загрузиться в DE, и наступает борьба с привычкой к вышеназванным расположениям клавиш , и если в баше ещё терпимо, то в виме становится совсем грустно…

Есть ли возможность поменять местами вышеназванные клавиши? Какие вообще есть варианты?

Предлагайте также всякие альтернативы и рассказывайте о своих фишках на эту тему, – это всё интересно!

 

papin-aziat
()

Объясните как настроить бекапы Анки

Гуглил, читал, но просветление как-то не наступило.

Закладка с настройками бекапов выглядит так: https://i.ibb.co/ySNR1DJ/2024-02-20-21-41.png

Пишут что

Anki periodically backs up your collection. After backups are more than 2 days old, Anki will start removing some of them to free up disk space.

Далее можно указать

  • Minutes between automatic backups
  • Daily backups to keep
  • Weekly backups to keep
  • Monthly backups to keep

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

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

 ,

papin-aziat
()

Посоветуйте блок питания

Сгорел блок питания вчера… Как же это печально, когда ломается компьютер!

Был OCZ ModXStream-Pro 600W – тихий, работал долго, даже не помню сколько, сейчас такой наверное тыщь 5 стоил бы.

В общем нужна адекватная замена.

Пожелания: тихий и не самый дорогой (я не жадничаю, просто нет смысла тратиться на что-то топовое для моих хотелок).

В железках уже давно не разбираюсь, компу много лет, поэтому совсем отстал от жизни в этом отношении.

600W теперь для меня наверное слишком много, так как дискретную видеокарту использовать не собираюсь от слова совсем. Сейчас процессор i3-4330 3.50GHz два ядра, четыре потока со встройкой HD 4600 (HSW GT2), пару модулей памяти по 4 гига, два SSD, клава, мышка и принтер.

Посоветуйте сколько мне надо – 600W, 500W или ещё меньше, с учётом того, что возможно через несколько лет я поменяю связку мамка+проц+память на что-то посвежее. Впрочем, наверное, только поломка меня на такое сподвигнет…

 ,

papin-aziat
()

Гении и аутсайдеры

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

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

Один человек вот вроде бы умный и красивый, но как-то всё никак, а другой какой-то подглуповатый и нескладный, но как-то всё путём.

 ,

papin-aziat
()

RSS подписка на новые темы