LINUX.ORG.RU

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

Протестировал Text generation web UI

Галерея — Скриншоты

Text generation web UI — это программа, предназначенная для создания текстов с использованием нейросетей. Написана на питоне. При использовании c использованием Model loader «ctransformers» и модели «tinyllama-1.1b-chat-v0.3.Q2_K.gguf» показала себя хорошо, результат получался через несколько секунд. Текст немного не соответствует персонажу, но считаю, что для наименьшей модели это хороший результат.

Для установки надо зайти на гитхаб, выбрать в релизах последнюю версию, распаковать и там запустить start_linux.sh (./start_linux.sh). Это скачает все необходимые зависимости, какие-то пакеты устанавливать и собирать не понадобится.

После этого следует:

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

Затем надо выбрать персонажа. Я нашел расширение «CAI Tools» для firefox и просто скачал с помощью этого расширения персонажа прямо с https://beta.character.ai/

После этого загрузил этого персонажа и выбрал в настройках. Затем зашел на вкладку «Чат», создал новый чат и начал общаться с персонажем. Гитхаб.

Модель которую я использовал.

И для сравнения. . Та же модель, но максимальная версия. Отличия только в том что я переместил все слои на GPU и выбрал пресет космического пришельца.

 , ,

vbcnthfkmnth123
()

В OpenZFS выявлена ошибка, которая может привести к повреждению файлов

Форум — Talks
Доступен промежуточный выпуск проекта OpenZFS 2.2.1, развивающего реализацию файловой системы ZFS для Linux и FreeBSD. Выпуск примечателен добавлением поддержки ядра Linux 6.6 и попыткой устранения проблемы, приводящей к повреждению данных (обнулению части блоков) в файлах после их копирования.

Изначально предполагалось, что проблема проявляется только в ветке 2.2.x и вызвана ошибкой во включённом в OpenZFS 2.2.0 механизме клонирования блоков, позволяющем создать копию файла или его части без дублирования данных, используя во второй копии ссылки на уже существующие блоки данных исходного файла без их фактического копирования. В версии OpenZFS 2.2.1 для блокирования проблемы механизм клонирования блоков был отключён по умолчанию, а для возвращения поддержки данного режима добавлена настройка zfs_bclone_enabled.

Позднее разработчики заявили о воспроизведении проблемы и в конфигурациях с веткой OpenZFS 2.1.x. Не подтвердились и предположения, что проблема проявляется на системах со старыми выпусками пакета coreutils - ошибку удалось воспроизвести во FreeBSD и в Linux-дистрибутивах со свежим выпуском coreutils 9.4.

Повреждение файлов проявляется при достаточно редком стечении обстоятельств, например, выполнение в Gentoo команды "emerge -1 dev-lang/go" приводит к установке инструментария для языка Go с повреждением файлов в каталоге /usr/lib/go/pkg/tool/linux_amd64/compile. Предполагается, что ошибка начала проявляться после выставления по умолчанию параметра "zfs_dmu_offset_next_sync=1" в версии openzfs 2.1.4. Источник ошибки пока не выявлен. В качестве рекомендованного обходного пути блокирования ошибки предложено выставить в 0 параметр "/sys/module/zfs/parameters/zfs_dmu_offset_next_sync". 

https://www.opennet.ru/opennews/art.shtml?num=60167

EXT4-БОЯРЕ НА МЕСТЕ?

 , , ,

MoldAndLimeHoney
()

Отключить в масштабирование для определенного окна или workspace

Форум — Desktop

Постепенно перехожу на wayland(в лице hyprland) и по факту осталась одна серьезная проблема. Суть в следующем:

Мой экран:

monitor=DP-3,3840x2160,auto,1.75,bitdepth,10

Мне для работы нужно подключение по rdp, а xfreerdp довольно глючен. Нашел следующие способы как-то работать:

0. Ничего не делать. xfreerdp мерцает, wlfreerdp(и sdl-freerdp) мылят.

1. Выставить XWAYLAND_NO_GLAMOR=1, xfreerdp работает отлично, но не запускается steam(поиграть после работы). Приходится для стима менять сессию после работы.

2. Поставить масштаб 1.0, вместо 1.75. Тогда wlfreerdp работает хорошо, но всё остальное мелко.

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

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

Может кто подскажет насколько это реально? Или время писать фичреквесты в hyprland и/или засылать баг в xfreerdp(тут они очень не шустрые по issues, судя по багтрекеру)?

Вот нашел что-то в багтрекере xfreerdp, но либо я ничего не понял, либо в моем случае не помогает, либо они просто отписку написали.

https://github.com/FreeRDP/FreeRDP/issues/7608

PS: Кстати, bitdepth,10 в настройках экрана, это чтобы с невидией шаринг экрана работал. С большим трудом нагуглил решение, вдруг кому понадобится.

 , , ,

Loki13
()

argparse 3.0

Новости — Разработка
argparse 3.0
Группа Разработка

Состоялся выпуск 3.0 C++ (стандарт C++17) header-only библиотеки парсинга аргументов командной строки argparse, распространяемой по лицензии MIT.

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

>>> Подробности

 , , , ,

dataman
()

NoteCAD - онлайн САПР

Форум — Science & Engineering

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

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

Что реализовано на данный момент:

  • Работа в браузере - открываем url и попадаем сразу в программу, минуя ненужные шаги по регистрации, скачиванию и установке. В теории, работает под любую ОС, где имеется достаточно современный браузер и достаточно современное железо. Размер скачиваемой информации при загрузке программы через сайт - всего 10 Мегабайт!

  • Продвинутая 2D чертилка, поддерживающая стандартный функционал редактирования (создание геометрии, размерных ограничений, копирование-вставка, сохранение-загрузка в понятный формат XML, undo-redo и т. д. и т.п.). Поддерживается геометрия, заданная произвольными функциями, например, можно построить цепную линию, спираль Корню, да что уж там, можно и циклоиду и эвольвенту. При этом можно работать с такими примитивами, как с обычными - линией, окружностью и т. д.

  • Быстрый и очень функциональный решатель геометрических ограничений, по многим параметрам рвущий в клочья конкурентов. OpenSource, естественно, но буду благодарен, если вы сравните с промышленными CAD системами. На мой взгляд, SolidWorks, например, проигрывает со свистом. Поддерживаются очень сложные ограничения включая произвольные уравнения, уравнения с условиями, позволяющие строить сложные функции, заданные различными функциями на интервалах (кусочно). Решатель позволяет анализировать кинематику механизмов, поскольку поведение объектов с наложенными ограничениями близко к физическому поведению. Этого, кстати, нельзя даже в промышленных САПР - при перетаскивании, например, в SolidWorks, чертеж ведет себя отвратительно. С помощью такого анализа я помогал моделировать кинематику парового двигателя для парового мотоцикла Лёхи Романтика. Файл здесь.

  • Начальные возможности по созданию 3Д объектов - выдавливание, вращение с шагом (для создания резьбы)

  • Импорт и Экспорт в некоторые форматы, список будет пополнен

  • Редактирование STL. Можно импортировать STL и работать с ним - что-то отрезать, что-то залепить, изменить размер, просверлить отверстие. Работают те же функции, что применимы к 3д объектам, созданным в NoteCAD.

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

Что сделано в новой версии:

  • Изменен шрифт на ГОСТ
  • Добавлена геометрия смещения (offset)
  • Улучшена производительность решателя (в несколько раз)
  • Добавлена производная для if(condition, then, else), так что стало возможно создавать функции, заданные кусочно, и накладывать на них ограничения. Например, годится для создания кулачкового профиля сложной формы (безударный кулачок)

Что планируется в ближайшее время:

  • Перевод на русский
  • Упрощенная версия для школьников и студентов (черчение.online)
  • Хотелось бы сделать нативные билды под Линукс и засунуть их в какой-нибудь репозиторий, но в этом я слабо разбираюсь, поэтому нужна помощь

Программу NoteCAD можно протестировать здесь:

 

EvilSpirit
()

Осваиваем STM32 снизу: часть 4

Статьи — Разработка

Часть 1 Часть 2 Часть 3 Часть 4 Часть 5 Часть 6 Часть 7 Часть 8 Часть 9

Часть 4: Начинаем работать с C

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

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

 ,

vbr
()

Сколько каких реакций поставили под вашими сообщениями? (+юзерскрипт)

Форум — Linux-org-ru
// ==UserScript==
// @name        LOR count-reactions
// @match       https://www.linux.org.ru/notifications?filter=reaction
// @version     1.2
// @author      CrX
// @description Show reaction count on reactions notifications page
// @grant		    GM_xmlhttpRequest
// ==/UserScript==

var res = {"🤡": 0, "👍": 0, "👎":0, "🤦": 0, "🔥": 0, "😊": 0, "🤔": 0, "😱":0, "☕☕":0, "🪗": 0};
let newdiv = document.createElement("div");
newdiv.setAttribute("id", "scriptedReactions");
h1 = document.getElementsByTagName("h1")[0];
h1.parentNode.insertBefore(newdiv, h1.nextSibling);

function countReactions(pageDom) {
  Array.from(pageDom.getElementsByClassName('reaction')).forEach((e) => {
    for (var r in res) {
      if (e.innerText.search(r) != -1) { res[r]++; }
    }
  });
  let reacttext = "| ";
  var items = Object.keys(res).map(function(key) {
    return [key, res[key]];
  });
  items.sort(function(first, second) { return second[1] - first[1];});
  for (var r in items) {
    reacttext += items[r][0] + ": " + items[r][1] + " | ";
  }
  document.getElementById("scriptedReactions").innerHTML = reacttext;
}

function scrapePage(pageurl) {
  GM_xmlhttpRequest({
    method: "GET",
    url: pageurl,
    onload: function(response) {
      var parser      = new DOMParser ();
      var responseDoc = parser.parseFromString(response.responseText, "text/html");
      countReactions(responseDoc)
      let nextlink = responseDoc.querySelector('a[rel="next"]');
      if (nextlink) {scrapePage(nextlink);}
    }
  });
}

countReactions(document);
scrapePage(document.querySelector('a[rel="next"]'));

(upd: скрипт обновлён, исправлены неверные результаты, если в настройках количество уведомлений отлично от 100)

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

Можно копипастить сюда, у кого что.

Топ клоунов — это хорошо, но там только «лучшие из лучших». А что у вас? А баянов кто-нибудь уже успел насобирать?

Моё на момент написания сообщения: | 🤡: 31 | 👍: 322 | 👎: 16 | 🤦: 11 | 🔥: 62 | 😊: 61 | 🤔: 9 | 😱: 13 | ☕☕: 157 | 🪗: 0 |

 , , violentmonkey, ,

CrX
()

Как вы нормализуете громкость диалогов при просмотре фильмов?

Форум — Desktop

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

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

В документации для mpv нашел релевантные параметры --audio-channels=stereo и --audio-normalize-downmix=yes. Еще нагуглилось lavfi='dynaudnorm'.

Кто сталкивался с такой проблемой? Как вы это решили?

 ,

aquadon
()

Кастомизация QT

Форум — Desktop

Я использую hyprland, и для стилизованния использую qt5ct и kvantum с темой catppuccin. Но все ещё не всё правильно работает(Например плеер vlc кастомизируется правильно, а окно выбора монитора в xdg desktop portal hyprland с дефолтной белой темой, также и с polkit kde), я запускаю qt5ct прописав переменную окружения в конфиге hyprland как написано к доках. А Квантум я просто скачал и установил тему. Прошу обьяснить какая в них разница, и что нужно сделать чтобы все работало как нужно.

 , , ,

d1en25
()

Postgres в контейнере с ограничением по памяти

Форум — Admin

Помогите найти внятную информацию, как настроить постгрес для работы в контейнере, чтобы укладывался в целевые показатели по ограничению памяти. К примеру сейчас запустил постгрес, он скушал 90 МБ. Далее в течение нескольких дней, исходя из опыта, его потребление вырастет примерно до 2 GB. При этом он вообще-то и сейчас нормально работает и было бы неплохо его ограничить, скажем, 100 МБ. Но если я просто поставлю лимит, то его грохнет OOM Killer через несколько часов.

В конфиге я вижу следующее (значения не по умолчанию):

listen_addresses = '*'
max_connections = 1000			# (change requires restart)
shared_buffers = 128MB			# min 128kB
dynamic_shared_memory_type = posix	# the default is usually the first option
max_wal_size = 1GB
min_wal_size = 80MB

Число соединений к базе со временем не растёт, с ней работает один сервис через одно соединение.

Насколько я понял, потребляется 128 MB на весь сервер + work_mem (4MB) на каждое соединение + temp_buffers (8 MB) иногда. Ещё может быть maintenance_work_mem (64 MB). Откуда тут гигабайты набегают - непонятно.

 ,

vbr
()

Готовим NVIDIA PRIME + Optimus для pre-Turing GPU

Статьи — Desktop

Статья основана на моих оригинальных англоязычных записях тут (polter.gitlab.io) и тут (polter.gitlab.io).

Приветствую, несчастные владельцы ноутбуков с технологией с NVIDIA Optimus, а именно те, кому посчастливилось иметь зелёную GPU до поколения Turing (GTX 1650 и выше). Список поколений микроархитектур NVIDIA можно найти на википедии. Как известно, начиная с версии 435.xx в проприетарном драйвере появилась нормальная поддержка энергосбережения для этих архитектур, так что если у вас NVIDIA GTX 1650 и выше, всё должно работать из коробки и простыню ниже можно не читать.

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

 , , ,

POLTER
()

Порекомендуйте замену Thunderbird

Форум — General

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

 

X-Quark
()

В ядре нашли костыль, заточенный под процессы Xorg

Форум — Talks

Костыль простой: смотрит, на какую букву начинается имя процесса, и если с икса - то считает процесс относящимся к Xorg и что-то там отключает для него.

https://linux.slashdot.org/story/22/11/08/2211244/the-linux-kernel-has-been-forcing-different-behavior-for-processes-starting-with-x

Дискасс!

 , , ,

alex1101
()

Не стартует xdg-desktop-portal-hyprland

Форум — Desktop

Пытаюсь настроить скриншоты и скриншаринг для hyprland. В их вики есть https://wiki.hyprland.org/Useful-Utilities/Hyprland-desktop-portal/ статья Поставил сразу xdg-desktop-portal-hyprland, как они и рекомендовали. Запустил скрипт

#!/bin/bash
sleep 1
killall xdg-desktop-portal-hyprland
killall xdg-desktop-portal-wlr
killall xdg-desktop-portal
/usr/lib/xdg-desktop-portal-hyprland &
sleep 2
/usr/lib/xdg-desktop-portal &

Но systemctl --user status xdg-desktop-portal-hyprland вывел:

○ xdg-desktop-portal-hyprland.service - Portal service (Hyprland implementation)
     Loaded: loaded (/usr/lib/systemd/user/xdg-desktop-portal-hyprland.service; static)
     Active: inactive (dead)

на journalctl --user -xeu xdg-desktop-portal-hyprland.service вывел:

-- No entries --

для /usr/lib/xdg-desktop-portal -vr & /usr/lib/xdg-desktop-portal-hyprland -l DEBUG 2>&1 | teexdpw.log вывел: https://pastebin.com/Ypy2UZh4

для systemctl --user status pipewire вывело:

● pipewire.service - PipeWire Multimedia Service
     Loaded: loaded (/usr/lib/systemd/user/pipewire.service; disabled; preset: enabled)
     Active: active (running) since Fri 2023-04-07 09:40:57 MSK; 44min ago
TriggeredBy: ● pipewire.socket
   Main PID: 785 (pipewire)
      Tasks: 2 (limit: 38288)
     Memory: 19.4M
        CPU: 1min 27.975s
     CGroup: /user.slice/user-1000.slice/user@1000.service/session.slice/pipewire.service
             └─785 /usr/bin/pipewire

апр 07 09:40:57 Mars pipewire[785]: mod.rt: Can't find org.freedesktop.portal.Desktop. Is xd>
апр 07 09:40:57 Mars pipewire[785]: mod.rt: found session bus but no portal

для systemctl --user status pipewire.socket вывело:

pipewire.socket - PipeWire Multimedia System Socket
     Loaded: loaded (/usr/lib/systemd/user/pipewire.socket; enabled; preset: enabled)
     Active: active (running) since Fri 2023-04-07 09:40:52 MSK; 47min ago
   Triggers: ● pipewire.service
     Listen: /run/user/1000/pipewire-0 (Stream)
     CGroup: /user.slice/user-1000.slice/user@1000.service/app.slice/pipewire.socket

Не могу понять в чем проблема, куда стоит копать дальше?

 

Mars36
()

zswap — новые параметры по-умолчанию: zsmalloc, zstd (linux >= 6.3; archlinux)

Форум — General
CONFIG_ZSWAP_ZPOOL_DEFAULT="zsmalloc"
CONFIG_ZSWAP_COMPRESSOR_DEFAULT="zstd"

https://wiki.archlinux.org/title/zswap

Это только в Arch Linux?

Вот что показал zswap-monitor2.py:

pool: 138.8 MiB (3.6% MemTotal) | stored: 886.2 MiB (98.3% SwapUsed) | compr_ratio: 6.4

А вот здесь Zram vs Zswap. Часть 1: практика @kirill_rrr пишет

«zsmalloc должен максимально компактно располагать сжатые страницы в памяти… и не сбрасывать их на диск!»

Может в ядрах >= 6.3 другое поведение?

Ну и ещё вопрос:

Сейчас swapon показывет сжатые страницы в zswap так, как будто они занимают место на swap device.

$ swapon
NAME      TYPE SIZE   USED PRIO
/swapfile file   4G 901,5M   -2

А как на самом деле?

 ,

greenman
()

Ядро 6.4, amdpstate=guided

Форум — Talks

В Федоре обновилось ядро, теперь 6.4.4. И конечно я решил попробовать режим guided для amdpstate.

Наконец-то заработал турбо буст, до этого он у меня никак не включался. Причем он 4.66, что странно, потому что по спецификациям у меня турбо буст должен быть 4.2.

Минимальная частота стала 2.58 вместо 0.4 как раньше. Впрочем, на температуре это не отразилось.

Ожидал, что он будет включаться гораздо чаще, его приходится прям ЖДАТЬ :)

Такие дела.

Ryzen 5 4650g.

sudo cpupower frequency-info
analyzing CPU 4:
  driver: amd-pstate
  CPUs which run at the same hardware frequency: 4
  CPUs which need to have their frequency coordinated by software: 4
  maximum transition latency: 20.0 us
  hardware limits: 400 MHz - 4.66 GHz
  available cpufreq governors: conservative ondemand userspace powersave performance schedutil
  current policy: frequency should be within 400 MHz and 4.66 GHz.
                  The governor "schedutil" may decide which speed to use
                  within this range.
  current CPU frequency: Unable to call hardware
  current CPU frequency: 4.00 GHz (asserted by call to kernel)
  boost state support:
    Supported: yes
    Active: yes
    AMD PSTATE Highest Performance: 255. Maximum Frequency: 4.66 GHz.
    AMD PSTATE Nominal Performance: 219. Nominal Frequency: 4.00 GHz.
    AMD PSTATE Lowest Non-linear Performance: 141. Lowest Non-linear Frequency: 2.57 GHz.
    AMD PSTATE Lowest Performance: 24. Lowest Frequency: 400 MHz.

 ,

MoldAndLimeHoney
()

Качалка COUB для вашего ПеКа

Форум — Talks

Драсти опять я к вам со своим lua говнокодом. Товарищ @superuser скоромно сбросил в толксы свою качалку на баше. Не будем скромничать код по ссылке Coub закрывается (комментарий) Более того он ещё патчи исправления скидывает, похвала. Я взял смелость и переписал на lua немножко расширив список возможностей и теперь у нас конкурирующий бизънес! :D Вот вы хихи да хаха, а люди за скачивание даже платят, пруфов не дам :o) Скрипт качалка ниже совместим с версией от @superuser по части хранения coub`ов.

Как пользоваться.

  • В качестве входных параметров может выступать

    • ссылка на coub https://coub.com/view/2ppitj
    • идентификатор на coub 2dnd59
    • название уже скачанного coub Дело_говорит_Симпсоны
    • путь ~/COUB/Дело_говорит_Симпсоны
    • комбинация идентификатора, ссылки, пути и имени
    • 14ns7i,https://coub.com/view/2djrec,Дело_говорит_Симпсоны,2cljbw
    • список файлов должен идти в конце параметров и разделятся запятыми (впритык!)
    • список можно прочитать из файла cat mycoubs.txt | coub - или через ls из каталога
    • в файле разделять можно запятыми или переводом строки
  • Ключ -l задаёт количество повторений inf бесконечность

    • если задана последовательность coub то каждый из них проиграется столько раз сколько
      задано ключом -l если для последовательности coub’ов задан -l inf то каждый из ниж будет проигрываться вечно, при это наглядевшись на один нужно руками закрыть окно плеера откроется следующее видео и также будет по кругу идти, это удобно так как coub’ы часто смотрят по многу раз.
  • Ключ -d говорит о том что нужно просто скачать один или несколько coub’ов, проигрываться ничего не будет

Скрипт не ищет на coub по названиям типа Дело_говорит_Симпсоны этот запрос к программе для поиска локального файла.

Коубы указанные идентификатором или ссылкой всегда скачиваются, нет проверки был ли уже скачан коуб. Для уже скачанных используйте названия из ~/home/$USER/COUB .

Обработка параметров идёт через жъёпу! В начале ключи потом ссылки/id/имена или -. Значения разделены от ключей пробелом -l 3, урлы,id,имена запятыми без пробелов

Зависимости apt install lua wget лол


#! /bin/env lua
local coub = {} -- initial table for export like module
---------------------------------------------------------
coub.config =
{   -- coub save location, you can play from this dir
    storages = '/home/'..os.getenv('USER')..'/COUB';
    -- mp3, mp4 donwnload location, maybe userfull
    download = '/home/'..os.getenv('USER')..'/COUB/DATA';
}
---------------------------------------------------------
function coub.msg(text)
    print("\x1b[32m"..text.."\x1b[39m")
end

function coub.err(text)
    print("\x1b[31m"..text.."\x1b[39m")
end
---------------------------------------------------------
function coub.usage()
help = [[
Use: coub [-h] [-l Num] source

Options:
    -h  - Help and exit;
    -l  - Repeat audio Num times or inf for infinity;
    -d  - Download only
    -   - Read coub or coub list from stdin
    you can use full url or coub id
    source - url | id | file.mp4

Examples:
    # play single coub
    coub https://coub.com/view/38yafx
    # play single coub from storage
    coub ~/COUB/Don_t_be_egoistic
    # play single looped coub
    coub -l inf 38yafx
    # download single coub, no play this
    coub -d https://coub.com/view/38yafx
    # download multiply coubs with separated
    coub -d 38yafx,https://coub.com/view/38yafx
    coub -d 38yafx[newline]https://coub.com/view/38yafx
    cat mycoubs.txt | coub -d -
    # download and play multiply coubs (no looped)
    coub -d 38yafx,38yafx
    # play multiply coubs from file id list
    cat mycoubs | coub -
    ]]
    print(help)
end
-----------------------------------------------------------
local function filter_get_between(body,a,b)
    local s , e = 1 , 1;
    local out = ""
        s,e = body:find(a,1,true);
        if s == nil or e == nil then return end
        local ss,ee = body:find(b,s,true);
        if ss == nil or ee == nil then return end
        out = out .. body:sub(e+1,ss-1);
        body = body:sub(ee,#body)

    return out;
end
-----------------------------------------------------------
function coub:run()
    -- stupid handle va_args
    for k,v in ipairs(arg) do
        if self.xoop then self.loop = v; self.xoop = nil; end
        if v == '-h' then self.usage();     end
        if v == '-l' then self.xoop = 1;    end
        if v == '-d' then self.dl_only = 1; end
        self.resource = v
    end
    if not self.loop then
        self.loop = 0;
    elseif self.loop == 'inf' then
        -- do nothing
    else
        self.loop = tonumber(self.loop);
        if self.loop > 0 then
           self.loop = self.loop - 1;
        end
    end

    -- decrement loop value becouse loop value =  N+1
    -- mpv --loop=0 is once play and --loop=1 twoo play


    if not self.resource then
        coub.err("Bad coub: no have input");
        coub.usage()
    end

    -- read input from stdin
    local cnt = 1;
    if self.resource == '-' then
       self.resource = io.read("*all");
    end
    -- check is resource contains data
    -- min 2 symbol coub id (yea?)
    if #self.resource < 2 then
        coub.err('Bad data: Input source is empty');
        return; 
    end
    -- tokenization play lists, and concat to URL
    -- тут ещё нужно проверить может нужные коубы уже скачаны
    self.playlist = {}
    for resource in string.gmatch(self.resource, '([^,\n]+)') do
        if resource:find('https',1,true) then
            self.playlist[cnt] = resource;
        elseif resource:find('/',1,true) or resource:find('.',1,true) then
            self.playlist[cnt] = resource;
        else
            self.playlist[cnt] = 'https://coub.com/view/'..resource;
        end
        cnt = cnt + 1;
    end
    -- always make needed directory
    assert(os.execute('mkdir -p '..self.config.storages),"Storage no writable");
    assert(os.execute('mkdir -p '..self.config.download),"Storage no writable");
    -- download coubs & play coubs --------------------------------------------
    for i,v in ipairs(self.playlist) do

        local exec = io.popen('wget -q -O- '..v);
        local html = exec:read('*all'); exec:close();
        -- wget 
        if  html:match('%a+') then
            local json = filter_get_between(html,"<script id='coubPageCoubJson' type='text/json'>",'</script>');
            local url_video = filter_get_between(json,'"video":{"higher":{"url":',',');
            -- some video no have higher resulution
            -- try get lowless
            if not url_video then
                 url_video = filter_get_between(json,'"video":{"high":{"url":',',');
            end
            local url_audio = filter_get_between(json,'"audio":{"high":{"url":',',');
            local coubtitle = filter_get_between(json,'"title":"','",');
            coubtitle = coubtitle:gsub('[%p+%s+]','_');
            local coubid    = v:gsub('https://coub.com/view/','');
            coub.msg('Download:['..i..'] '..v..' | '..coubtitle)
            -- check file format befor try handle data
            if url_video and url_video:find('.mp4',1,true) and url_audio and url_audio:find('.mp3',1,true) then
               local file_to_save = self.config.download..'/'..coubid;
               os.execute('wget -q -Y off -c -O '..file_to_save..'.mp4 '..url_video);
               os.execute('wget -q -Y off -c -O '..file_to_save..'.mp3 '..url_audio);
               os.execute('ln -s '..file_to_save..'.mp4 '..self.config.storages..'/'..coubtitle..' 2>/dev/null');

               -- do not play if need just download video
               if not self.dl_only then
                   -- play audio in background with infinity loop
                   os.execute('( mpv --loop=inf '..file_to_save..'.mp3 ) 1> /dev/null  & '..
                              -- play video, after video ends we kill previos mpv 
                              -- stdout to /dev/null becouse kill broke terminal stdin
                              -- maybe becouse mpv use '\r' for output info about playing
                              ' mpv --loop='..self.loop..' '..file_to_save..'.mp4 1> /dev/null ; kill -INT $! ');
               end
            else
                coub.err('Bad coub:['..i..'] file formats no mp3 and mp4 '..v);
            end
        else
            if v:find('~',1,true) then
                v = v:gsub('~',os.getenv('HOME'))
            else 
                v = self.config.storages..'/'..v:gsub('https://coub.com/view/','');
            end
            local justplay = io.open(v,'r');
            if justplay then
               justplay:close();
                  if not self.dl_only then 
                    coub.msg('PlayFile:['..i..'] '..v)
                    local link = io.popen(' readlink -e '..v);
                    local file = link:read('*all'); link:close();
                    os.execute('( mpv --loop=inf '..file:gsub('mp4','mp3')..' ) 1>/dev/null  & '..
                          ' mpv --loop='..self.loop..' '..file..' 1>/dev/null ; kill -INT $! ');
                  else
                    coub.msg('Ignore..:['..i..'] coub '..v..' is downloaded')
                  end
            else 
                coub.err('Bad coub:['..i..'] coub not found '..v);
                coub.err('Bad coub:['..i..'] coub not found https://coub.com/view/'..
                        v:gsub(os.getenv('HOME')..self.config.storages,''));
            end
        end
    end
end

coub:run()

- Баги косяки, тупак, есть?
- Да. 
- Исправлять будешь? 
- Нет. 
- А почему? 
- Ну модет потом... 
- А нахера всё это? 
- А тебе не пофиг?
- Пофиг
- Ну и всё
- Ну и ладно
- Ненужно!
- Согласен
- А зачем тогда?
- Потому что.
- Потому что что?
- Потому что понедельник!
- Ой всё.
- Вот и я о том.

Подборочка

coub yaik,s08ov,8ek0p,7aenz,bslpw,5g1j9,wm3bk,14zilh,7l1rdrfc,2b5izx,2aatx2,29jdfr,29k4yq
coub 29n55n,29j3j1,10a9jk,297dvo,280v0q,29adcz,29aon6,29gzt6,1qrxao,334db,15egdcy8,lvd3c

Фъъсьооо!

 coub, , , ,

LINUX-ORG-RU
()

посоветуйте софт для ЭЦП и УЦ для участия в торгах по банкротству

Форум — Admin

Нужна наиболее универсальная схема организации рабочего места,

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

Например, там ещё жив Internet Explorer 8 ещё жив.

 , ,

Ilya-S-Zharskiy
()

Неправомерно удалили топик

Форум — Linux-org-ru

Тред полушуточный. Не надо его воспринимать в 100% серьезности. Это разборки среди своих :)

Не нужно защищать модераторов. Верните топик! :) https://www.linux.org.ru/forum/talks/17225863?cid=17225877

Завуалировано назвать дебилом, потом как не в чём не бывало спрыгнуть с батла. И потом свои же подчищают следы. Требуюъ разбирательства :)

Предлагаю такие меры присечения:

  1. Погасить звезды
  2. Снять модератора
  3. Гласное принятие статуса данным человеком
  4. Донат в suckless.org $10 с комментарием «Боже, храни dwm!»

Последний пункт для DE’шника - это хуже, чем три первых пункта вместе взятые :)

 

serg002
()

Вы можете заставить свой мозг думать что кубик впуклый?

Форум — Talks

Кубик где невидимые рёбра отмечены пунктиром https://vt-s3-files.s3.amazonaws.com/uploads/problem_question_image/image/1346/Cube__PSF_.png

Убираем эти невидимые рёбра https://cdn5.vectorstock.com/i/1000x1000/35/59/cube-line-icon-simple-minimal-96x96-pictogram-vector-20073559.jpg

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

 

bga_
()