LINUX.ORG.RU

Сообщения LightDiver

 

kdialog --progressbar в КДЕ6, qdbus и генту (калька).

При последнем обновлении из системы выкинули qdbus, как теперь передавать состояние кдиалогу на прогрессбар? Поспрашивал ИИ, погуглил - пусто. Какие теперь особенности работы, кто в курсе?

p.s.

В пень кдиаг, самое время уходить от инструментов КДЕ. Напишу свое. Всем спасибо.

 , ,

LightDiver
()

Луа5.1 и параноидальная оптимизация

local sub, gsub, random = string.sub, string.gsub, math.random
local SendAddonMessage = SendAddonMessage

-- Таблица смещений
local STR_OFFSETS = {}
for i = 1, 100 do
    STR_OFFSETS[i] = (i-1)*3 + 1
end

function time100_Server(channel, text, sender, prefix)
    if prefix ~= "time100" then return end

    local objFull = mFldS:getStaticStr(sender, 1) or ""
    local hpFull = mFldS:getStaticStr(sender, 2) or ""

    local rezT, rezF = {}, {}
    local obj_char, hp_val, formattedHp

    for i = 1, 100 do
        local offset = STR_OFFSETS[i]
        if offset + 2 > #objFull then break end

        obj_char = sub(objFull, offset, offset + 2)
        hp_val = en10(sub(hpFull, offset, offset + 2) or "000")

        if obj_char == "00f" then
            if hp_val < 999 then
                formattedHp = sub("   "..en85(hp_val + 1), -3)
                rezF[#rezF+1] = formattedHp
                mFldS:addStaticStr(sender, 2, i, formattedHp)
            else
                mFldS:addStaticStr(sender, 1, i, "00t")
                mFldS:addStaticStr(sender, 2, i, en85(999))
                rezT[#rezT+1] = "999"
            end
        elseif obj_char == "00t" then
            if hp_val < 999 then
                hp_val = hp_val + 1
            elseif hp_val >= 999 and random(10) == 1 then
                hp_val = hp_val + 1
            end
            formattedHp = sub("   "..en85(hp_val), -3)
            rezT[#rezT+1] = formattedHp
            mFldS:addStaticStr(sender, 2, i, formattedHp)
        end
    end

    if text == "1" then
        local function sendChunked(base, data)
            if #data == 0 then return end
            data = gsub(data, " ", "%0")
            --SendAddonMessage(base.." "..sender, sub(data, 1, 150), "GUILD")
            if #data > 150 then
                --SendAddonMessage(base.."_2 "..sender, sub(data, 151), "GUILD")
            end
        end
        sendChunked("time100_00t", table.concat(rezT))
        sendChunked("time100_00f", table.concat(rezF))
    end
end

Допустим есть такой вот код на луа. Тут мы получаем строку с «объектами». Строка всегда 300 символов, каждый объект всегда 3 символа. Если находим два нужных объекта, итерируем им «здоровье». Записываем изменения в базу и при необходимости отправляем об этом общее уведомление в эфир.

Чтение и изменение строки происходит самописными методами:

-- Добавление или обновление строки
function NsDb:addStaticStr(nik, nStr, nArg, message)
    self.input_table[nik] = self.input_table[nik] or {}

    if not nArg then
        self.input_table[nik][nStr] = message
        return
    end

    -- Обновляем строку
    local currentStr = self.input_table[nik][nStr]
    self.input_table[nik][nStr] = currentStr:sub(1, (nArg - 1) * 3)
                                .. ("   " .. message):sub(-3)
                                .. currentStr:sub(nArg * 3 + 1)
end

function NsDb:getStaticStr(nik, nStr, nArg)
    local str = self.input_table 
              and self.input_table[nik] 
              and self.input_table[nik][nStr]
    
    return str and (nArg and str_sub(str, (nArg-1)*3 + 1, nArg*3) or str)
end

И вот на 10000 проходов задержка где то на секунду и отжор памяти метров на 15.

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

А можно ли еще что то тут такое придумать, чтобы одновременно снизить скорость прохода и локальное потребление памяти?

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

Может можно еще что нибудь, что я сейас не вижу?

OBJECT_POSITION_PATTERNS = {}
for i = 1, 100 do  -- Важно: цикл до 100, а не 10!
    OBJECT_POSITION_PATTERNS[i] = "^" .. string.rep("...", i - 1) .. "(...)"
end

Например, я пробовал вот так обращаться к объектам. Но вроде это не лучше.

Короче, решено: самая оптимальная работа на луа со строками через саб. Быстрее и дешевле нет ничего. Прямое обращение саб к подстроке и все. Без локальных переменных и кэширований.

 

LightDiver
()

Сборка раст-проекта под винду из генты или как же я ненавижу винду

https://github.com/Vladgobelen/NSQCu/tree/main/RUST/nightwatch-updater

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

ИИ в расте полные нули. Спрашивал у всех доступных идеи - они бесполезны. Они даже базовых понятий раста не понимают.

Сутки уже бьюсь. С mingw доходит компиляция до последнего шага и замирает навсегда. С кросскомпиляцией компилится. Но не работает.

Куда хоть копать вообще?

Решение: собрал гитхабом

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

 , , ,

LightDiver
()

Перевод из n-ной системы счисления в 10-ную

Луа позволяет преобразовать до 36ной системы счисления в 10ю включительно, а понимает кто нибудь как сделать больше? Алгоритм, суть преобразования.

Вот есть у меня функция:

function numCod(num)
    if num == 0 then
        return '0'
    end
    local neg = false
    if num < 0 then
        neg = true
        num = num * -1
    end
    local hexstr = "0123456789ABCDEFGHIJKLMNOPQRSTUVWZYZabcdefghijklmnopqrstuvwxyzАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЭЮЯабвгдеёж"
    local result = ""
    while num > 0 do
        local n = math.fmod(num, 100)
        result = string.utf8sub(hexstr, n + 1, n + 1) .. result
        num = math.floor(num / 100)
    end
    if neg then
        result = '-' .. result
    end
    return result
end

А как теперь расшифровать? Сделать обратное преобразование.

 ,

LightDiver
()

Питон и как он вообще работает?

Написал простенький скриптик для обновления:

import urllib.request
import shutil
import os
import zipfile
import subprocess
from subprocess import Popen, PIPE
import os.path
import shlex
import time

if os.path.isfile('signalS'):
	os.remove('signalS')
	exit()
else:
	open('signalS', "w").close()

while True:
	if os.path.isfile('signalS'):
		f = int(urllib.request.urlopen('https://raw.githubusercontent.com/Vladgobelen/NSQC/main/vers').read().decode('utf-8').strip())
		f1 = int(urllib.request.urlopen('https://raw.githubusercontent.com/Vladgobelen/NSQC/main/versad').read().decode('utf-8').strip())
		file = open('Interface/AddOns/NSQC/vers', 'r')
		file1 = open('Interface/AddOns/NSQC/versad', 'r')
		print(f,f1)
		if f != int(file.readline().strip()) or f1 != int(file1.readline().strip()):
			if os.path.isdir('temp'):
				shutil.rmtree('temp/')
			urllib.request.urlretrieve("https://github.com/Vladgobelen/NSQC/archive/refs/heads/main.zip", "main.zip")
			archive = 'main.zip'
			with zipfile.ZipFile(archive, 'r') as zip_file:
				zip_file.extractall("temp")
			file_source = 'temp/NSQC-main/'
			file_destination = 'Interface/AddOns/NSQC/'
			if not os.path.exists(file_destination):
				os.mkdir(file_destination)
			get_files = os.listdir(file_source)
			shutil.copytree(file_source, file_destination,dirs_exist_ok=True)
			if os.path.isfile('main.zip'):
				os.remove('main.zip')
			if os.path.isdir('temp'):
				shutil.rmtree('temp/')

		del f
		del f1
		time.sleep(10)
	else:
		break

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

Из интересного. Если изменить скрипт как угодно, например вписать или удалить принт - он тут же один раз сработает и штатно обновит все. Дальше продолжит работать вхолостую. Что за ересь?

Короче, сам нащупал рабочий вариант:

https://github.com/Vladgobelen/NSQCu/blob/main/run.py

Вместо роу, который кэшируется, я беру общую страницу:

f = urllib.request.urlopen(‘https://github.com/Vladgobelen/NSQC/blob/main/vers’).read().decode(‘utf-8’).strip()

И просто сравниваю ее с нужной мне строкой в файле. Если строка есть - все нормально, если строки нет, обновляем. Всем спасибо.

 

LightDiver
()

Firefox-118.0.1

Смотрите какая прелесть:

https://cdn.discordapp.com/attachments/811217303378329643/1158251119059935373/Screenshot_20231002_105548.png

Обновился ночью фаерфокс. Ну и как это назвать, а?

 

LightDiver
()

Установка экспериментального клиента Telegram и питон

Ставлю какой то новы экспериментальный тг-клиент, и вот он выдает:

Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/home/diver/sources/tdesktop/Telegram/build/docker/centos_env/gen_dockerfile.py", line 10, in main
    print(Environment(loader=FileSystemLoader(dirname(__file__))).get_template("Dockerfile").render(
BrokenPipeError: [Errno 32] Broken pipe

Собственно вот эта строка:

poetry run gen_dockerfile | DOCKER_BUILDKIT=1 docker build -t tdesktop:centos_env -

Чего ему от меня надо? Поетри я поставил, докеры какие нашел поставил: app-containers/docker-24.0.5::gentoo dev-python/docker

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

 ,

LightDiver
()

python3.8 и вайн

diver ~/Скрипты/NSQCu % env DXVK_HUD=fps,info WINEDEBUG=-all WINEPREFIX=/home/diver/WP7python/PF STAGING_SHARED_MEMORY=1 DXVK_STATE_CACHE=1 STAGING_WRITECOPY=1 /home/diver/WP7python/bin/wine /home/diver/WP7python/PF/drive_c/Program\ Files\ \(x86\)/Python38-32/python.exe 'python -m pip install --upgrade pip'
wineserver: using server-side synchronization.
wine: RLIMIT_NICE is <= 20, unable to use setpriority safely
C:\Program Files (x86)\Python38-32\python.exe: can't open file 'python -m pip install --upgrade pip'
: [Errno 2] No such file or directory


Вот что я делаю не так? На 3.7 и 3.9 работало же.

 , ,

LightDiver
()

Вызов sh скрипта из крона

Есть такой скрипт в кроне:

#!/bin/sh
git add .
git commit -m "добавление линка на таблицы игры"
git push git@github.com:Vladgobelen/configs.git
date > /home/diver/Документы/configs/date

Дату он создает исправно, а вот команды гита игнорирует. Это он чего? Как исправить, чтобы отправлял?

Если запустить вручную - все работает как надо.

РЕШЕНИЕ:

Вызов sh скрипта из крона (комментарий)

 , ,

LightDiver
()

pipewire и пш-пш-пш. Calculate linux (gentoo)

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

Сейас же он пшпш начинается СО СТАРТА! С лядского старта системы! Сразу! И рестарт не помогает. Убиваешь - тут же пшпш начинается.

Что с этим можно сделать?

http://pastebin.calculate-linux.ru/ru/show/270435

Вот версии.

Перебрался пока на alsa. Какой же каеф - чистый звук. Как же мало иногда надо для счастья.

Решение проблемы:

pipewire и пш-пш-пш. Calculate linux (gentoo) (комментарий)

 , , ,

LightDiver
()

Модуль keyboard в питон, где же он?

Калька, она же гента.

(venv) calculate diver # python -m pip show keyboard
Name: keyboard
Version: 0.13.5
Summary: Hook and simulate keyboard events on Windows and Linux
Home-page: https://github.com/boppreh/keyboard
Author: BoppreH
Author-email: boppreh@gmail.com
License: MIT
Location: /path/to/venv/lib/python3.11/site-packages
Requires: 
Required-by: 
(venv) calculate diver # 

Установил модуль keyboard, прописал в скрипте import keyboard. Иии.. Его нет:

diver ~/Скрипты % python l22.py                                                         [1] 0:08:11
Traceback (most recent call last):
  File "/home/diver/Скрипты/l22.py", line 7, in <module>
    import keyboard
ModuleNotFoundError: No module named 'keyboard'

Это он чего?

 , , ,

LightDiver
()

Очередное нытье о багах КДЕ(плазмоид буфер обмена).

Один баг чинится, новый появляется, это правило разработчиками КДЕ соблюдается неукоснительно. Смотрите какая прелесть вот уже последние этак..мм.. месяца 3-4.

https://cdn.discordapp.com/attachments/811217303378329643/1132332699844100156/bugKDE1.png

https://cdn.discordapp.com/attachments/811217303378329643/1132332718013825174/bugKDE2.png

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

 , ,

LightDiver
()

Луа, регулярные выражения и переменные

имею например такой блок кода:

q3nik1 = "Лепрогнома-работника,"
if string.find (message, q3nik1:sub(1, -2)) then
    print("ТипаБорто")
end

Условие не срабатывает. Я подозреваю. что это из за тирэ в переменной… А как в этом случае быть то?

Блок кода тестовый, ник я получаю автоматически обычно и нужно это отлавливать автоматически.

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

 , , ,

LightDiver
()

Gentoo(calculate) и crossdev

calculate diver # cat /var/log/portage/cross-x86_64-w64-mingw32-binutils.log

Local copy of remote index is up-to-date and will be used.

Local copy of remote index is up-to-date and will be used.
Calculating dependencies  ... * Missing digest for '/var/calculate/repos/custom/cross-x86_64-w64-mingw32/binutils/binutils-9999.ebuild'
 * Missing digest for '/var/calculate/repos/custom/cross-x86_64-w64-mingw32/binutils/binutils-2.40-r5.ebuild'
 * Missing digest for '/var/calculate/repos/custom/cross-x86_64-w64-mingw32/binutils/binutils-2.39-r5.ebuild'
 * Missing digest for '/var/calculate/repos/custom/cross-x86_64-w64-mingw32/binutils/binutils-2.38-r2.ebuild'
 * Missing digest for '/var/calculate/repos/custom/cross-x86_64-w64-mingw32/binutils/binutils-2.37_p1-r2.ebuild'
 * Missing digest for '/var/calculate/repos/custom/cross-x86_64-w64-mingw32/binutils/binutils-2.36.1-r2.ebuild'
 * Missing digest for '/var/calculate/repos/custom/cross-x86_64-w64-mingw32/binutils/binutils-2.35.2.ebuild'
 * Missing digest for '/var/calculate/repos/custom/cross-x86_64-w64-mingw32/binutils/binutils-2.34-r2.ebuild'
 * Missing digest for '/var/calculate/repos/custom/cross-x86_64-w64-mingw32/binutils/binutils-2.33.1-r1.ebuild'
 * Missing digest for '/var/calculate/repos/custom/cross-x86_64-w64-mingw32/binutils/binutils-2.32-r2.ebuild'
... done!
Dependency resolution took 4.45 s.


!!! All ebuilds that could satisfy "cross-x86_64-w64-mingw32/binutils" have been masked.
!!! One of the following masked packages is required to complete your request:
- cross-x86_64-w64-mingw32/binutils-9999::custom (masked by: corruption)
- cross-x86_64-w64-mingw32/binutils-2.40-r5::custom (masked by: corruption)
- cross-x86_64-w64-mingw32/binutils-2.39-r5::custom (masked by: corruption)
- cross-x86_64-w64-mingw32/binutils-2.38-r2::custom (masked by: corruption)
- cross-x86_64-w64-mingw32/binutils-2.37_p1-r2::custom (masked by: corruption)
- cross-x86_64-w64-mingw32/binutils-2.36.1-r2::custom (masked by: corruption)
- cross-x86_64-w64-mingw32/binutils-2.35.2::custom (masked by: corruption)
- cross-x86_64-w64-mingw32/binutils-2.34-r2::custom (masked by: corruption)
- cross-x86_64-w64-mingw32/binutils-2.33.1-r1::custom (masked by: corruption)
- cross-x86_64-w64-mingw32/binutils-2.32-r2::custom (masked by: corruption)

For more information, see the MASKED PACKAGES section in the emerge
man page or refer to the Gentoo Handbook.

В файле package.keywords добавлена строка:

=cross-x86_64-w64-mingw32/binutils-2.40-r5 ~amd64

Чего ему нужно, собаке?

 , ,

LightDiver
()

imagemagick и наименования выходных файлов

Во всех манах пишется вот что о наименовании файлов:

Another method of referring to other image files is by embedding a formatting character in the filename with a scene range. Consider the filename image-%d.jpg[1-5].

Однако вот:

https://cdn.discordapp.com/attachments/811217303378329643/1123495340084039720/fdsfdsafdsafdsaf.png

И тут у меня встал вопрос: а как тогда начать наименования файлов не с нуля, а с единицы, если стандартные инструкции не работают?

 

LightDiver
()

Динамическость скорости курсора мыши

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

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

Мышь вот эта (тоже то еще говно, кстати)

И возник у меня вопрос: А нельзя ли как нибудь зафиксировать скорость курсора в линуксе так, чтобы эта скорость всегда была одинакова независимо от настроек мыши и прочего?

 , , ,

LightDiver
()

КДЕ, квин и управление настройками «на лету».

Чего не хватает КДЕ в плане управления окнами? Есть стандартный режим «как в виндоус», если тайлинг (не пробовал), есть псевдотайлинг в виде жестко заданных параметров окон. И вот именно третий вариант я использую. Но чего не хватает именно этому третьему варианту - псевдотайлингу?

Правильно, не хватает схем на разные случаи. И тут у меня встал вопрос: а вдруг возможно как то скриптом менять параметры окон без ручной настройки и перезагрузки КДЕ? Например есть конфиг файл КДЕ, где прописаны параметры фф, тг, мпв. Мне нужно подменить его скриптом на другой, где прописаны иные параметры.

Никто не в курсе как бы это реализовать?

 ,

LightDiver
()

Предсказуемость математики и луа

function hashStr (nome)
	hours, minutes = GetGameTime()
	count1=hours* 3,1415926535
	count2=minutes* 3,1415926535
	count3=count1*count2
	count3=string.sub(count3, 1, 3)
	count3=string.format("%03d",count3)
	hNik=string.byte(nome,1)
	hNik2=string.byte(nome,2)
	hNome=hNik*hNik2
	hNome=string.sub(hNome, 1, 3)
	hNome=string.format("%03d",hNome)
	r1=string.sub(count3, 1, 1)
	r2=string.sub(hNome, 1, 1)
	r3=string.sub(count3, 2, 2)
	r4=string.sub(hNome, 2, 2)
	r5=string.sub(count3, 3, 3)
	r6=string.sub(hNome, 3, 3)
	r=r1 .. r2 .. r3 .. r4 .. r5 .. r6
	return r
end

hours, minutes = GetGameTime() получает текущие час и минуту в формате: 01 22

Скармливаем слово на одном компе - получаем предсказуемо одинаковый результат. Скармливаем на другом компе получаем тоже предсказуемо одинаковый результат, но не такой, как на предыдущем компе. Это как вообще? Данные одинаковые. Ник один и тот же. Время одно и то же. Результат всегда разный. Это вообще законно?! Время возвращается серверное - одинаковое и там и там.

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

 ,

LightDiver
()

Меня послали и я пришел

Имеется линуксовое приложение, запакованное как .AppImage

Это ланчер, загружающий и обновляющий клиент игры. У некоторого малого процента игроков он иногда выдает ошибку:

Ошибка получения списка файлов. Следующая попытка через 1 минуту. Error: read ECONNRESET

Если его распаковать и запустить из консоли:

[17:50:38.781] [info] -> Dir check started
[17:50:40.015] [error] Error: read ECONNRESET
    at TCP.onStreamRead (internal/stream_base_commons.js:209:20)

Официальная техподдержка сказала: «Гребитесь как хотите, если найдете в чем проблема - молодцы, а к нам не лезьте».

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

Кстати, иногда - это например днями и неделями такая ошибка. Как у меня уже третий день.

 

LightDiver
()

LOR в ирке

Напомните мне, может в курсе кто, куда с фринода перебрался канал #lor где то год назад?

 ,

LightDiver
()

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