LINUX.ORG.RU

Избранные сообщения Imker

Смартфон AQphone M11 на базе Ред ОС М доступен в продаже

Новости — PDA
Смартфон AQphone M11 на базе Ред ОС М доступен в продаже
Группа PDA

Мобильная операционная система РЕД ОС М основана на Android Open Source project (AOSP), но имеет возможность запускать настольные приложения из репозитория РедОС.

В мобильной части Google Mobile Services заменены на отечественные аналоги. В качестве магазина мобильных приложений используется RuStore. Ряд компонентов доработаны под отечественные сервисы, в том числе WebView, NTP, DNS. Вся инфраструктура для поддержки ОС развернута на территории РФ.

В Настольном режиме можно устанавливать приложения из пакетов rpm, в репозитории РЕД ОС доступны более 50 тысяч приложений. К сожалению, телефон не поддерживает подключение монитора по USB, поэтому выводить изображение предполагается через WiFi (Miracast). Подключение клавиатуры и мыши при этом возможно по USB или Bluetooth.

( читать дальше... )

Смартфон доступен в официальном магазине отечественного производителя HighScreen по цене 18 990 ₽ на момент публикации.

>>> Фирменный магазин HighScreen

 , highscreen, , ред ос м

Aceler
()

Вернул к жизни драйвер NVIDIA 340.108 под Ubuntu 24.04 + ядро 6.11

Форум — Linux-hardware

Всем привет! Я хочу поделиться результатом большой и трудной работы, которая, уверен, будет полезна многим, кто всё ещё использует старые, но надёжные видеокарты NVIDIA с драйвером 340.108.

🔥 Предыстория Я — обычный пользователь. У меня старенький ноутбук с NVIDIA GeForce G 210M, и я очень хотел использовать свежую Ubuntu 24.04 (Noble) с новым ядром 6.11, но столкнулся с ожидаемой проблемой:

Официальный драйвер nvidia-340xx больше не собирается и не работает на новых ядрах.

Я не сдался. Сначала было много ошибок: зависимостей, падений DKMS, отсутствие яркости, отсутствие nvidia-settings, конфликты с Wayland и т.д. Я собрал всё воедино, разобрал весь пакет до винтика, добавил нужные зависимости, и в итоге:

✅ Что получилось

Я создал полноценный PPA в нём:

🧩 Полный драйвер NVIDIA 340.108, собранный с поддержкой ядра 6.11 (и 6.8 тоже)

🛠 DKMS-модуль, который автоматически пересобирается под новое ядро

⚙️ nvidia-support, nvidia-installer-cleanup, gcc-13, dkms — всё включено

💡 Фикс яркости через acpi_backlight=vendor — автоматом добавляется в GRUB

🖥 nvidia-settings тоже автоматически устанавливается

📦 Meta-пакет nvidia340 — ставит всё одной командой!

Установка (максимально просто)

sudo add-apt-repository ppa:kda2210/nvidia340

sudo apt update

sudo apt install nvidia340

💡 После установки просто перезагрузите систему.

⚠️ Важно Wayland не поддерживается (используйте X11 — по умолчанию в Kubuntu всё ок)

Если по какой-то причине GRUB не обновился — вручную добавьте acpi_backlight=vendor в /etc/default/grub и сделайте sudo update-grub

🤝 Что это даст вам Не нужно вручную качать .run-инсталлер от NVIDIA

Не нужно патчить uvm, dkms и gcc — всё уже собрано

Можно жить спокойно: обновил ядро — DKMS сам пересоберёт модуль

🙏 Особая благодарность Андреасу Бекманну, чье имя появилось в журнале изменений от апреля 2025 года. Это последнее обновление nvidia-graphics-drivers-legacy-340xx_340.108 стало искрой, которая помогла мне поверить, что это все еще возможно.

 , , ,

kda2210
()

Nerdlog: быстрый TUI-просмотрщик логов с удалённых хостов с таймлайном

Новости — Open Source
Nerdlog: быстрый TUI-просмотрщик логов с удалённых хостов с таймлайном
Группа Open Source

Терминальное приложение Nerdlog позволяет удобно просматривать логи с одного или сразу нескольких серверов Linux и FreeBSD. Поддерживает как обычные текстовые лог-файлы (например, /var/log/messages или /var/log/syslog), так и вывод journalctl.

Визуально отображает активность в виде интерактивной псевдографической таймлайн-гистограммы, аналогично таким инструментам, как Graylog, Kibana или Splunk.

( читать дальше... )

>>> GitHub проекта

 , , ,

dimonomid
()

Запуск sberbankPDF2Excel.py в Linux: благодарность micronekodesu и ещё раз о Питоне

Форум — Desktop

Привет, ЛОР.

С некоторых пор Сбербанк-онлайн выпилил «физикам» возможность сохранения выписок в структурированных форматах, оставил только PDF. Разработчик, публикующийся на Гитхабе под именем Ev2geny, создал программу на Питоне, конвертирующую этот PDF в форматы xlsx и csv. К сожалению, внятную сборку он сделал только для Windows, а инструкция по запуску под линуксом у меня не заработала.

К счастью, @micronekodesu откликнулся на мою проблему и написал мини-инструкцию по запуску sberbankPDF2Excel.py в виртуальном окружении. Я её протестировал – работает, в CSV сохраняет.

Однако на вопрос по ссылке (заданный в контексте дискуссии о лучшем способе распространения программ на Питоне)

просто из-за того что я питоняша у меня не возникает проблем?

Мой ответ – «видимо, да». Я бы без инструкции долго блуждал в трёх соснах. И мне кажется, что сишную программу, запакованную в AppImage, запустить реально проще, чем вот это вот. Не только для «простого пользователя», но и для продвинутого.

Ещё раз спасибо @micronekodesu! Ну и автору программы, конечно, хотя я не уверен, что он читает ЛОР.

P.S. Та тема уже в архиве и отвечать там нельзя. Иначе я бы просто оставил там комментарий. С другой стороны, я уверен, что я не единственный линуксоид, пользующийся Сбербанком, поэтому дополнительный пиар способу обхода его закидонов :) не помешает.

P.P.S Под firefox Сбербанк-онлайн создаёт битые PDF. Под chromium всё прекрасно работает. Это замечание, конечно, уже не по тематике нашего форума, хотя… как мы радовались когда-то, что монополии IE пришёл конец… Эхъ…

 , ,

hobbit
()

Многие любят ругать cmd.exe, но…

Форум — General

У него есть киллер-фича, которая лежит буквально на самой поверхности!

https://pic4a.ru/110/T42.png

Которые из линуксовых эмуляторов терминала такое умеют: выводить выполняющуюся сейчас команду в заголовок? Мы встречали от силы, как такое костылями прикрутить ко внутренней переключалке окон tmux. Может, так умеет ZSH? https://github.com/trystan2k/zsh-tab-title — повод перейти наконец на него с Bash, хехе.

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

И заодно — есть под онтопик максимально совместимый аналог dfhl.exe? (А то гонять для этого машину с оффтопиком как-то некузяво, хоть и нагружать основную тоже.) Чтобы автоматически находил дубликаты и сливал их в хардлинки к одному файлу. Желательно даже, чтобы умел сравнивать не все файлы со всеми подряд, что долго и Нам не нужно — а просто zip-ать попарно дерево директорий с деревом директорий, они в целом одинаковые. Проще самим написать, по ходу.

 , , , ,

mertvoprog
()

Новая статья: «Эволюция Lua, продолжение»

Форум — Development

Вышла вторая статья посвящённая эволюции развития языка Lua.

Анонс

Первая часть - 2007

Вторая часть - 2025

Я ещё не читал, кому интересно, почитайте :)

---- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
(function(v) local f f = function(v) print(v) return f end return f(v)  end)
----------------------------------------------------------------------------
                                "Lua"
                                "Это"
                               "Весело!"
                              "Полезно!"
                             "Интересно!"
----------------------------------------------------------------------------
                  string.format("%s","hello world!")
---- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

Всем бобра. Досвиданья.

Перемещено hobbit из general

 , , ,

LINUX-ORG-RU
()

как выбрать базу знаний

Форум — General

Изучаю различные программы (Excel, 1с, и др) смотрю короткие ролики на ютубе как что сделать, читаю статьи, и конечно на следующий день забываю как я сделала что то программе. Надо бы записывать полученные знания, но куда? Бумажные носители не подходят, заметки типа ноушен так же. Нужна четкая структура и входящие/ исходящие ссылки, попробовала обсидиан, но он скорее для творчества, для размышления. А мне нужно кратко записать инструкцию как сделать, куда нажать чтобы получить определенный результат, желательно чтобы с использованием скриншотов, гиф-ок. Подскажите пожалуйста, какая программа для записи таких лайфхаков

 , ,

mashix
()

Какие в Линуксе есть средства поиска/ремапа бэдов на винтах?

Форум — Admin

Надеюсь здесь найдётся пруфлинк с описанием этой операции.
Можно конечно качнуть флэшку с виндой и Викторией. Но неужели это не исполнимо в Линукс? Или местные адепты начну топырить пальцы: «Если на винте попался бэд - ф памойку такой винт»?

P.S. Резюмирую, после пальцетопырчатого срача от «крутых» пацанов, благодаря комментариям порядочных гуру - решил проблему просто:

Для начала собрал список «битых» файлов:

find ./ -type f -exec cat '{}' \; |pv|dd of=/dev/null

Список файлов получил на консоль и скопировал в лог, выделив и скопипастив.
Предлагаю попробовать другой вариант:
find ./ -type f -exec cat '{}' \; >/dev/null 2>Errors.log

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

Далее сделал список плохих секторов командой:
badblocks -o badblocks.log /dev/sdX

В этом файле - плохие блоки были сериями. Для каждой серии сначала проверил:
badblocks -o 01set.log /dev/sdX <LastBlock> <FirstBlock>

Получал список блоков этого диапазона.
Далее затирал эти блоки нулями:
badblocks -f -w /dev/sdX <LastBlock> <FirstBlock>

Снова проверял:
badblocks -o 01set.log /dev/sdX <LastBlock> <FirstBlock>
Получал пустой список - т.е. блоки исправились.

Теперь запустил:
smartctl -t long и по его результатам допишу.

НИКАКОГО РЕМАПА! Просто перезаписал данные в нечитаемые сектора!
Ну и опять прогоню рекурсивное чтение файлов, данные конечно неправильные, но ошибок быть не должно.
И на этом диске zfs, посмотрю что скажет: zpool scrub

P.P.S. Результаты -t long:
SMART Self-test log structure revision number 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Extended offline    Completed: read failure       40%     39752         3352487288

Проверяем:
badblocks -o 07-sdd-badblocks.log /dev/sdd 3352488289 3352487288

Но! Факир был пьян! SMART и BADBLOCKS видимо оперируют разными размерами сектора!
# badblocks -o 07-sdd-badblocks.log /dev/sdd 3352488289 3352487288
badblocks: Недопустимый аргумент during seek
badblocks: Недопустимый аргумент during seek
badblocks: Недопустимый аргумент during seek
badblocks: Недопустимый аргумент during seek
badblocks: Недопустимый аргумент during seek
badblocks: Недопустимый аргумент during seek
badblocks: Недопустимый аргумент during seek
badblocks: Недопустимый аргумент during seek
badblocks: Недопустимый аргумент during seek
badblocks: Недопустимый аргумент during seek
badblocks: Недопустимый аргумент during seek
badblocks: Недопустимый аргумент during seek
badblocks: Недопустимый аргумент during seek
badblocks: Недопустимый аргумент during seek
badblocks: Недопустимый аргумент during seek
badblocks: Недопустимый аргумент during seek

Придётся повторить badblocks и посмотреть его видение!

 , ,

n0mad
()

Быстрый HTTPS для сайта с помощью angie (форк nginx)

Статьи — Администрирование

Ниже описан достаточно лёгкий способ получить обратный прокси с SSL-сертификатом.

Веб-сервер Angie позволяет получать SSL-сертификаты от LetsEncrypt без использования сторонних средств (таких как CertBot).

Установка Angie тривиальна. Документация (на русском языке!) написана понятно и лаконично.

В дополнение к официальной документации, привожу минимально необходимые дополнения к стандартному конфигу, позволяющие автоматически получить и установить SSL для домена example.org, который размещён на веб-сервере с IP-адресом 192.168.2.2.

# cat /etc/angie/http.d/LetsEncrypt.conf

# This part must be included only once into http section (for all sites)
resolver 8.8.8.8;
acme_client letsencrypt https://acme-v02.api.letsencrypt.org/directory;
# cat /etc/angie/http.d/example.org.conf

server {
    listen 80;
    server_name example.org;

    # Redirect all HTTP to HTTPS
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name example.org;

    # Obtain and use certificate from LetsEncrypt
    acme letsencrypt;
    ssl_certificate $acme_cert_letsencrypt;
    ssl_certificate_key $acme_cert_key_letsencrypt;

    location / {
        proxy_pass http://192.168.2.2;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

После создания данных конфигов, следует проверить конфигурацию на отсутствие ошибок:

sudo angie -t

и перезапустить веб-сервер

sudo angie -s reload

Желаю успехов!

 agnie, , , ,

Harliff
()

Как закалялся шакал: а где можно download more ram?

Статьи — Администрирование

Вступление

Данная статья написана с целью концентрации знаний о сжатии данных оперативной памяти.

Я использую gentoo, поэтому имена пакетов будут приводиться в формате этого дистрибутива.

Подразумевается, что читающий имеет желание и возможность (одно из):

  • произвести конфигурацию и/или сборку ядра;
  • в случае отсутствия искомой функциональности в «ванильном» - найти и использовать ядро, в котором уже всё есть.

( читать дальше... )

 , , ,

Bfgeshka
()

DNS-Over-QUIC для блокировки рекламы и не только

Статьи — Администрирование
DNS-Over-QUIC для блокировки рекламы и не только

Протокол QUIC, в отличие от UDP поддерживает шифрование и работает быстрее чем TCP, который часто используется для шифрованных DNS-запросов. Данная инструкция актуальная, так как Google все-таки начал удаление поддержки блокировщиков рекламы из своего браузера. Кроме того, она пригодится тем, кто хочет скрыть свое пребывание в Интернете от тотальной слежки.

( читать дальше... )

 , , ,

rtxtxtrx
()

Программы для работы со звуком

Форум — Multimedia

Базовая система коммутации звуковых потоков:

  • Jack Audio Connection Kit - необходимый элемент системы для соединения разных звуковых устройств, музыкальных инструментов, микрофонов, программ для обработки звука.
  • QjackCtl - графический интерфейс для JACK на Qt4
  • Patchage - удобный графический инструмент для коммутации звуковых потоков и устройств, в частности MIDI.
  • KXStudio: Cadence - набор приложений для коммутации аудиопотоков и устройств, управления Jack-сервером, замера уровня сигнала...
  • KXStudio: Carla - хост аудиоплагинов, поддерживает LADSPA (включая LRDF), DSSI, LV2, VST2/3 и AU форматы плагинов,также поддерживаются файлы GIG, SF2 и SFZ. Работает с Jack и ALSA.

Программы для звукозаписи и обработки звука:

  • Audacity - достаточно простой, но удобный инструмент для записи и обработки звука.
  • Ardour - профессиональный инструмент для многоканальной, многодорожечной записи звука, поддерживает несколько разных источников.
  • Qtractor - многодорожечный аудио/MIDI секвенсор.

Гитарные процессоры:

  • Rakarrack - набор гитарных эффектов реального времени, комбиков, кабинетов, усилителей, множество предустановленных вариантов и возможность «накрутить» собственные
  • Guitarix - ещё один набор гитарных эффектов реального времени, комбиков, кабинетов, усилителей, множество предустановленных вариантов и возможность «накрутить» собственные.

Синтезаторы:

  • Amsynth - набор синтезаторов с множеством настроек и предустановок. Ввод нот осуществляется с MIDI-клавиатуры, которую удобно подключить при помощи Patchage
  • LMMS - мультимедийная студия с синтезаторами, секвенсорами, кольцами и эффектами.
  • ZynAddSubFX - набор синтезаторов: реального времени, полифонический, мультитембральный, микротональный. Также набор эффектов для обработки звука. Работает с Jack, поддерживает MIDI, в том числе и подключение MIDI-контроллеров.
  • Yoshimi - форк ZynAddSubFX с усовершенствованиями в направлении работы с Jack и MIDI.

Инструменты для создания трекерной музыки:

  • MilkyTracker - инструмент для создания трекерной музыки.
  • Schism Tracker - инструмент для создания трекерной музыки, основанный на модифицированной версии Modplug - OpenMPT

Драм-машины:

  • Hydrogen - удобная графическая драм-машина.
  • DrumGizmo - драм-машина в виде самостоятельно приложения, также и в виде плагина.

Наборы эффектов для обработки звука:

  • Linux Audio Developer's Simple Plugin API (LADSPA) - классический набор эффектов и алгоритмов для обработки звука, также язык для разработи музыкальных программ.
  • LV2 - следующее поколение LADSPA
  • Calf studio gear - набор эффектов и алгоримов для обработки звука.

Нотные редакторы:

  • TuxGuitar - графический нотный MIDI-редактор, есть возможность вбивать ноты на «гитарном грифе» и «пианино».
  • LilyPond - крайне минималистичный, но очень мощный текстовый «нотный компилятор», часть проекта GNU.
  • Frescobaldi - продвинутый графический интерфейс для LilyPond, удобен возможность работы с мышью
  • Denemo - ещё один продвинутый графический интерфейс для LilyPond
  • Rosegarden - графический нотный редактор и MIDI-секвенсор.
  • FluidSynth - MIDI-синтезатор реального времени без графического интерфейса, работающий по спецификациям SoundFont 2.
  • Qsynth - графический интерфейс для FluidSynth.
  • MidiEditor - простой MIDI-редактор.
  • Musescore - нотный MIDI-редактор с графическим интерфейсом.
  • MusE - MIDI-секвенсор.

Статья на LOR Wiki

 , , , ,

toney
()

Забьют, ведь.

Форум — Desktop

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

###
### file vars.inc
###

EC='\e[36m' # enable color
DC='\e[0m'  # disable color
maxdb=4 # максимально допустимое количество дуплей (в игре на 4-х не может быть меньше 2)
maxeq=5 # максимально допустимое количество одинаковых (в игре на 4-х не может быть меньше 3)
dbfish=true   # закрывший рыбу дуплем не считается.
dbzerox=true  # один дупль пусто считается за 10
bazar=false # игра с базаром
vii=7 # раздается по семь камней
hundred=50 # игра ведется до 101 или до 51
xiii=13 # минимальная несгораемая сумма (забор)
domino=(00 01 02 03 04 05 06 11 12 13 14 15 16 22 23 24 25 26 33 34 35 36 44 45 46 55 56 66)
score=(0 0)
fence=(0 0)
eggs=0
gamer=('user' 'noob' 'fool' 'pro ') # имена игроков
mover='' # чей ход
super='' # ставщик (кто зашел первым)
state='' # состояние игры (NULL - игра, true - игрок закончил, false - рыба)
snake=() # массив камней на столе
played=() # поставленые камни игроков

###
### file msgs.inc
###

msg_mix="Мешаю..."
msg_ihave="У меня"
msg_yhave="У вас"
msg_bemix="Камни будут перемешаны."
msg_qbmix="Перемешать камни? (y/n)"
msg_maxdb=('0 дуплей' '1 дупль' '2 дупля' '3 дупля.' '4 дупля.' '5 дуплей.' '6 дуплей.' '7 дуплей.')
msg_maxeq=('голых.' 'азов.' 'двоек.' 'троек.' 'четверок.' 'пятерок.' 'шестерок.' 'голых.' 'аза.' 'двойки.' 'тройки.' 'четверки.' 'пятерки.' 'шестерки.')
msg_any_key="Нажмите любую клавишу для продолжения..."
msg_try_again="Попробуйте еще раз"
msg_skip="Проехал."
msg_finish="Закончил."
msg_fish="Рыба."
msg_dbfish="Рыба с отходом."
msg_onfence="на заборе."
msg_score="счёт"
msg_fenсe="забор"
msg_eggs="яйца"
msg_total_score="Общий счет:"

###
### file func.inc
###

f_mixer(){
  
  echo "${msg_mix}"
  echo '----------'

  domino=(00 01 02 03 04 05 06 11 12 13 14 15 16 22 23 24 25 26 33 34 35 36 44 45 46 55 56 66)

  for ((k=0; k<80; ++k)); do
    for i in ${!domino[@]}; do
      r=$((RANDOM % 28))
      t=${domino[$i]}
      domino[$i]=${domino[$r]}
      domino[$r]=${t}
    done
  done

  for ((i=0; i<${#gamer[@]}; ++i)); do # проверка на 5 дуплей
    r=0
    for ((k=i*vii; k<i*vii+vii; ++k)); do
      [[ "${domino[$k]:0:1}" == "${domino[$k]:1:1}" ]] && ((r++))
    done
    [[ ${r} -gt ${maxdb} ]] && break
  done

  if [[ "${i}" -lt "${#gamer[@]}" ]]; then
    echo "${gamer[$i]}: ${domino[@]:${i}*7:7}"
    if [[ "${i}" -ne 0 ]]; then
      echo "${msg_ihave} ${msg_maxdb[$r]} ${msg_bemix}"
      read -rsn1 -p "${msg_any_key}"
      echo -e '\n----------'
      f_mixer
      return
    else
      echo -n "${msg_yhave} ${msg_maxdb[$r]} ${msg_qbmix}"
      while true; do
        read -r -p ":"
        case ${REPLY} in
          [Yy])
            echo '----------'
            f_mixer
            return
            ;;
          [Nn])
            echo '----------'
            break
            ;;
          *) echo -n "${msg_try_again}" ;;
        esac
      done
    fi
  fi

  for ((i=0; i<${#gamer[@]}; ++i)); do # проверка на 6 одинаковых
    for (( t=0; t<7; ++t )); do # азы, двойки, тройки итд
      r=0
      for (( k=i*vii; k<i*vii+vii; ++k)); do
        [[ "${domino[k]:0:1}" == "${t}" ]] && ((++r))
        if [[ "${domino[k]:0:1}" != "${domino[k]:1:1}" ]]; then
          [[ "${domino[k]:1:1}" == "${t}" ]] && ((++r))
        fi
      done
      [[ "${r}" -gt "${maxeq}" ]] && break 2
    done
  done

  if [[ "${i}" -lt "${#gamer[@]}" ]]; then
    [[ "${r}" -lt 5 ]] && (( t+=7 )) # локализация
    echo "${gamer[i]}: ${domino[@]:i*7:7}"
    [[ "${i}" -ne 0 ]] && echo -n "${msg_ihave} " || echo -n "${msg_yhave} "
    echo "${r} ${msg_maxeq[t]} ${msg_bemix}"
    read -rsn1 -p "${msg_any_key}"
    echo -e '\n----------'
    f_mixer
    return
  fi
}

f_0ut(){
  echo -e "${gamer[$mover]}: ${snake[@]}"
}

f_round(){

  local i
  i=${domino[@]:$mover*7:7}
  if [[ -z "${i}" ]]; then
    echo "${gamer[$mover]}: ${msg_finish}"
    state="true"
    return
  fi

  if [[ "${snake[-1]:1:1}" == "${snake[0]:0:1}" ]]; then
    for i in ${domino[@]}; do
      [[ "${snake[-1]:1:1}" == "${i:0:1}" ]] && return
      [[ "${snake[-1]:1:1}" == "${i:1:1}" ]] && return
    done

    state="false"

    if ${dbfish}; then
      if [[ "${snake[-1]:0:1}" == "${snake[-1]:1:1}" ]] || [[ "${snake[0]:0:1}" == "${snake[0]:1:1}" ]]; then
        for (( i=1; i < ${#gamer[@]}; ++i )); do
          if [[ "${played[mover-i]:(-1):1}" ==  "${snake[-1]:1:1}" ]]; then
            (( mover -= i ))
            [[ "${mover}" -lt 0 ]] && (( mover += ${#gamer[@]} )) # избавляемся от минуса
            break
          fi
        done
        echo "${msg_dbfish}"
        return
      fi
    fi

    echo "${msg_fish}"
    return
  fi
}

f_choice(){

  for ((i = 7*mover; i < 7*mover+7; i++)); do
    if [[ ${snake[-1]:1:1} == ${domino[$i]:0:1} ]]; then
      snake+=( "${EC}${domino[$i]}${DC}" )
      played[mover]+=" ${snake[0]:0:1}${domino[$i]}"
      f_0ut
      snake[-1]="${domino[$i]}"
      domino[$i]=''
      break
    elif [[ ${snake[0]:0:1} == ${domino[$i]:0:1} ]]; then
      domino[$i]="${domino[$i]:1:1}${domino[$i]:0:1}"
      snake=( "${EC}${domino[$i]}${DC}" "${snake[@]}" )
      played[mover]+=" ${snake[-1]:1:1}${domino[$i]}"
      f_0ut
      snake[0]="${domino[$i]}"
      domino[$i]=''
      break
    elif [[ ${snake[-1]:1:1} == ${domino[$i]:1:1} ]]; then
      domino[$i]="${domino[$i]:1:1}${domino[$i]:0:1}"
      snake+=( "${EC}${domino[$i]}${DC}" )
      played[mover]+=" ${snake[0]:0:1}${domino[$i]}"
      f_0ut
      snake[-1]="${domino[$i]}"
      domino[$i]=''
      break
    elif [[ ${snake[0]:0:1} == ${domino[$i]:1:1} ]]; then
      snake=( "${EC}${domino[$i]}${DC}" "${snake[@]}" )
      played[mover]+=" ${snake[-1]:1:1}${domino[$i]}"
      f_0ut
      snake[0]="${domino[$i]}"
      domino[$i]=''
      break
    fi
  done
  if [[ ${i} -eq ${mover}*7+7 ]]; then
    echo "${gamer[$mover]}: ${msg_skip}"
    played[mover]+=" ${snake[0]:0:1}${snake[-1]:1:1}-"
  fi
}

###
### file domino.bash
###

#!/bin/bash
 
. vars.inc
. msgs.inc
. func.inc

echo -en "\ec" # очистка терминала
clear

gamer[0]=${USER}

while true; do

  played=()
  snake=()
  state=''

  f_mixer

  (( score[0] + score[1] )) || mover=''

  case ${mover} in #################################################### первый ход
    '')
      for i in ${!domino[@]}; do
        if [[ ${domino[$i]} == 11 ]]; then
          mover=$(( i / 7 ))
          break
        fi
      done
      ;;
    0)
      echo -n ${domino[@]:${mover}*7:7}
      while true; do
        read -r -p ":"
          case $REPLY in
            [0-6][0-6])
              for ((i=0; i<7; i++)); do
                if [[ "${REPLY}" == "${domino[$i]}" ]] || [[ "${REPLY:1:1}${REPLY:0:1}" == "${domino[$i]}" ]]; then
                  domino[$i]="${REPLY}"
                  break 2
                fi
              done
              ;&
            *) echo -n "${msg_try_again}" ;;
          esac
      done
      echo '----------'
      ;;
    [1-3]) i=$((RANDOM % 7 + 7 * mover)) ;;
  esac

  snake+=( "${EC}${domino[$i]}${DC}" )
  played[mover]+=" ${domino[$i]}"
  f_0ut
  snake[-1]="${domino[i]}"
  domino[$i]=''
  super="${mover}"

  while true; do #################################################### игра

    (( ++mover ))
    for (( ; mover < ${#gamer[@]}; ++mover )); do
      f_choice
      f_round
      [[ "${state}" ]] && break 2
    done

    mover=0
    echo '----------'
    echo -n ${domino[@]:mover*vii:vii}

    while true; do
      read -r -p ':'
      case $REPLY in
        [0-6][0-6])
          for ((i=0; i<vii; i++)); do
            if [[ "${REPLY}" == "${domino[$i]}" ]] || [[ "${REPLY:1:1}${REPLY:0:1}" == "${domino[$i]}" ]]; then
              if [[ ${snake[-1]:1:1} == ${REPLY:0:1} ]]; then
                domino[$i]="${REPLY}"
                snake+=( "${EC}${domino[$i]}${DC}" )
                played[mover]+=" ${snake[0]:0:1}${domino[$i]}"
                echo '----------'
                f_0ut
                snake[-1]="${domino[$i]}"
                domino[$i]=''
                break 2
              elif [[ ${snake[0]:0:1} == ${REPLY:0:1} ]]; then
                domino[$i]="${REPLY:1:1}${REPLY:0:1}"
                snake=( "${EC}${domino[$i]}${DC}" "${snake[@]}" )
                played[mover]+=" ${snake[-1]:1:1}${domino[$i]}"
                echo '----------'
                f_0ut
                snake[0]="${domino[$i]}"
                domino[$i]=''
                break 2
              elif [[ ${snake[-1]:1:1} == ${REPLY:1:1} ]]; then
                domino[$i]="${REPLY:1:1}${REPLY:0:1}"
                snake+=( "${EC}${domino[$i]}${DC}" )
                played[mover]+=" ${snake[0]:0:1}${domino[$i]}"
                echo '----------'
                f_0ut
                snake[-1]="${domino[$i]}"
                domino[$i]=''
                break 2
              elif [[ ${snake[0]:0:1} == ${REPLY:1:1} ]]; then
                domino[$i]="${REPLY}"
                snake=( "${EC}${domino[$i]}${DC}" "${snake[@]}" )
                played[mover]+=" ${snake[-1]:1:1}${domino[$i]}"
                echo '----------'
                f_0ut
                snake[0]="${domino[$i]}"
                domino[$i]=''
                break 2
              fi
            fi
          done
          ;;&
        '')
          for ((i=0; i<vii; ++i)); do
            [[ "${snake[-1]:1:1}" == "${domino[$i]:0:1}" ]] && break
            [[ "${snake[0]:0:1}" == "${domino[$i]:0:1}" ]] && break
            [[ "${snake[-1]:1:1}" == "${domino[$i]:1:1}" ]] && break
            [[ "${snake[0]:0:1}" == "${domino[$i]:1:1}" ]] && break
          done
          if [[ "${i}" -eq "${vii}" ]]; then
            echo '----------'
            echo "${gamer[$mover]}: ${msg_skip}"
            played[mover]+=" ${snake[0]:0:1}${snake[-1]:1:1}-"
            break
          fi
          ;&
        *) echo -n "${msg_try_again}" ;;
      esac        
    done

    f_round
    [[ "${state}" ]] && break

  done #################################################### считаем

  played=(0 0 0 0) # сначала считаем всех

  for ((i=0; i<4; i++)); do
    for ((k=0; k<7; k++)); do
      played[$i]=$(( ${domino[7*i+k]:0:1} + ${domino[7*i+k]:1:1} + played[i] ))
    done
  done

  if ${dbzerox}; then
    for ((i=0; i<4; i++)); do
     [[ ${played[i]} -eq 0 ]] && played[$i]=10
    done
  fi

  if ${state}; then # если игрок закончил обнуляем очки
    played[mover-0]=0
    played[mover-2]=0
  else
    echo "${gamer[mover]}:" ${domino[@]:7*(mover-0):7} # если рыба, выводим камни
  fi

  echo "${gamer[mover-2]}:" ${domino[@]:7*(mover-2):7} # выводим всех остальных
  echo "${gamer[mover-1]}:" ${domino[@]:7*(mover-1):7}
  echo "${gamer[mover-3]}:" ${domino[@]:7*(mover-3):7}
  
  if (( (played[0] + played[2]) == (played[1] + played[3]) )); then
    (( eggs+=(played[0] + played[2])*2 ))
    continue
  fi

  (( i = (played[0] + played[2]) > (played[1] + played[3]) ? 0 : 1 )) # индекс пары, набравшей большее кол-во очков

  echo -n "${gamer[i]} + ${gamer[i+2]} = " # вывод проигравшей пары
  
  [[ ${score[i]} -ne 0 ]] && echo -n "${score[i]} + " # выводим, если есть, счет

  [[ ${fence[i]} -ne 0 ]] && echo -n "${fence[i]} + " # вывод забора, если есть

  echo -n "${played[i]} + ${played[i+2]} " # набранные очки

  if [[ ${score[i]} -eq 0 ]] && (( (played[i] + played[i+2]) < xiii )); then # если нет записи и набрали меньше xiii

    (( fence[i] += played[i] + played[i+2] )) # считаем результат на забор

    echo "= ${fence[i]} ${msg_onfence}" # окончательный вывод забора

  else # если есть запись или если нет записи и набрали больше 13, то пишем в счет

    [[ "${eggs}" -ne 0 ]] && echo -n "+ ${eggs}(${msg_eggs}) " # выводим, если есть, яйца

    (( score[i] += played[i] + played[i+2] + fence[i]  + eggs )) # считаем результат

    echo "= ${score[i]}" # выводим окончательный результат

    fence[!i]=0 # и забор противника сгорает
    eggs=0
  
  fi

  echo "${msg_total_score} ${score[0]} : ${score[1]}"

  if [[ ${score[$i]} -gt ${hundred} ]]; then
    [[ ${i} -eq 0 ]] && echo "Вы козёл :-)" || echo "Вам просто повезло."
    break
  fi

  echo '----------'

done

exit 0

 ,

sudoapter
()

Docker сожрал диск

Форум — Admin

Собственно, сабж

root@maumyrtille:~# du -shc /var/lib/docker/*
116K	/var/lib/docker/buildkit
5.4G	/var/lib/docker/containers
4.0K	/var/lib/docker/engine-id
27M	/var/lib/docker/image
236K	/var/lib/docker/network
6.9G	/var/lib/docker/overlay2
469M	/var/lib/docker/plugins
4.0K	/var/lib/docker/runtimes
4.0K	/var/lib/docker/swarm
8.0K	/var/lib/docker/tmp
554M	/var/lib/docker/volumes
14G	total
root@maumyrtille:~# docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          22        21        2.842GB   236.8MB (8%)
Containers      25        24        1.212MB   0B (0%)
Local Volumes   19        16        564.3MB   0B (0%)
Build Cache     0         0         0B        0B
root@maumyrtille:~# docker system prune
WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all dangling images
  - unused build cache

Are you sure you want to continue? [y/N] y
Total reclaimed space: 0B

Чем занято более 10 ГБ?

 ,

KivApple
()

Переезжаем на Fish

Статьи — Администрирование
Переезжаем на Fish

Fish — это современный командный интерпретатор, недавно переписанный на Rust, который не требует особой настройки, поддерживая из коробки автодополнение и подсветку синтаксиса. Является лучшим Unix SHELL по версии Slant.

( читать дальше... )

 , ,

rtxtxtrx
()

Какие есть альтернативы pip, чтобы каждый venv не весил гигабайты?

Форум — General

Я устал от этого:

$ du -hs _venv*
7.3G	_venv.llm
7.4G	_venv.owui
7.2G	_venv.sd

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

В идеале чтобы оно было в репозиториях Debian 12. Ну или хотя бы умело самообновляться.


Решето
Решено

 ,

mord0d
()

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

Статьи — Desktop

Почему не VPN

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

Суть решения

Дело в том, что мне нравятся Google Chrome и Microsoft Edge, но вот беда, нормально работать с прокси они не умеют. Поэтому, проведя некоторые изыскания, я смог создать рабочий конфиг на основе privoxy и плагина для упомянутых браузеров Proxy SwitchyOmega.

privoxy обеспечивает socks5-соединение, а Proxy SwitchyOmega даёт возможность менять параметры подключения в любой момент, в том числе – автоматически по выбранному шаблону, при этом может работать с несколькими внешними прокси.

( читать дальше... )

 , , , ,

unclestephen
()

Easy Switcher - переключатель раскладки клавиатуры

Форум — Desktop

Лет 10 у меня на компе жил и работал gxneur. Еще на Ubuntu 20.04 он кое-как работал в ручном режиме, но после недавнего перехода на 22.04 (да, затянул), завести мне его уже не удалось. Пару недель я страдал без переключателя, и в итоге решил написать свой, вот, решил поделиться:

Скачать: https://sourceforge.net/projects/easy-switcher/files/

Реализованы следующие функции:

  • переключение раскладки клавиатуры с корректировкой уже введенного текста.

  • 2 режима корректировки:

      - при нажатии Break корректируется последнее введенное слово.
      - при нажатии Shift + Break корректируется последняя введенная фраза.
    
  • режим настройки.

  • режим отладки.

Программа устанавливается как демон и управляется systemctl. В отличие от xneur, работает не через xkb, а читает устройство ввода с ядра, и поэтому не зависит от графического сервера и рабочего окружения. В теории должна работать на любых ОС с ядром linux, и не будет глючить с выходом обновлений ОС и ДЕ. (время покажет, пока это предположение)

Как работает? Программа ловит нажатия клавиш, а при нажатии Break стирает написанное, меняет раскладку, и пишет заново. Смена раскладки происходит эмуляцией нажатия клавиши, которую нужно прописать в конфиге. Если для смены раскладки вы используете комбинацию клавиш, то нужно в настройках ОС добавить дополнительную клавишу смены раскладки (в kde это можно сделать нативно, а в gnome - например с помощью gnome tweak tool). В моей системе для смены раскладки используется клавиша Win.

Проверялось на Ubuntu 22.04, релиз будем считать альфа, возможны баги.

Устанавливаем пакет, затем:

easy-switcher --configure
easy-switcher --install
systemctl enable easy-switcher
systemctl start easy-switcher

ЗЫ: конфиг лежит здесь: /etc/easy-switcher/default.conf. Пояснения имеются. (первоначально лучше заполнить его с помощью команды easy-switcher –configure)

 ,

freemind
()

Что за тип HASH у пароля из shadow $5hWbgtJAD42g?

Форум — General

Привет

У роутера в shadow файле вот такакой пароль
root:$5hWbgtJAD42g:12571:0:99999:7:::

Что это за тип такой? Согласно мануалу $5 это sha256, но там должно быть $5$.... и значительно длинее...

Это что-то кастомное?

 ,

Spider55
()

Долго сканируется домашняя директория

Форум — Desktop

Здравствуйте!

После того, как я насоздавал много мелких файлов в хомяке (миллион), потом я их конечно удалил, но теперь долго сканируется домашняя директория.

Вывод tune2fs:

Filesystem volume name:   <none>
Last mounted on:          /home
Filesystem UUID:          73c415e9-aa30-417f-9433-6de5b4a8445b
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super large_file huge_file dir_nlink extra_isize metadata_csum
Filesystem flags:         signed_directory_hash 
Default mount options:    user_xattr acl
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              65847296
Block count:              263370752
Reserved block count:     13168537
Overhead clusters:        4413151
Free blocks:              33788135
Free inodes:              61602633
First block:              0
Block size:               4096
Fragment size:            4096
Reserved GDT blocks:      961
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         8192
Inode blocks per group:   512
Flex block group size:    16
Filesystem created:       Sat Nov  5 14:21:49 2022
Last mount time:          Mon Jan 27 08:42:02 2025
Last write time:          Mon Jan 27 10:42:37 2025
Mount count:              2
Maximum mount count:      -1
Last checked:             Sun Jan 26 08:26:02 2025
Check interval:           0 (<none>)
Lifetime writes:          7930 GB
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:               256
Required extra isize:     32
Desired extra isize:      32
Journal inode:            8
First orphan inode:       59568643
Default directory hash:   half_md4
Directory Hash Seed:      3e157277-011c-4847-beec-74ba303676ec
Journal backup:           inode blocks
Checksum type:            crc32c
Checksum:                 0x692d4d48

Вывод ls -l в хомяке:

итого 113484
drwxr-x---  365 dmitriys dmitriys 116183040 янв 27 10:58 dmitriys
drwx------.   2 root     root         16384 ноя  5  2022 lost+found
drwx------   37 dmitriys dmitriys      4096 янв 25 19:45 user

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

 

dmitriys
()