LINUX.ORG.RU

Избранные сообщения Vlad-76

OpenVZ7, исчезло место в контейнере.

Форум — Admin
/# du -sch /*
11M     /bin
4.0K    /boot
20K     /dev
16M     /etc
356K    /home
43M     /lib
4.0K    /lib64
16K     /lost+found
4.0K    /media
4.0K    /mnt
4.0K    /opt
0       /proc
23G     /root
1.2M    /run
5.7M    /sbin
4.0K    /srv
0       /sys
52K     /tmp
5.7G    /usr
926M    /var
30G     total

Пишет что 23G в root. Проверяем

# du -sch /root/*
90M     /root/1
90M     total
из хоста
# df -k
Filesystem             1K-blocks       Used Available Use% Mounted on
/dev/ploop11307p1       30830500   30495960         0 100% /vz/root/243
# du -cms /* | sort -rn
29739   total
22996   /root
5742    /usr
926     /var
43      /lib
16      /etc
11      /bin
6       /sbin
2       /run
1       /tmp
1       /srv
1       /opt
1       /mnt
1       /media
1       /lost+found
1       /lib64
1       /home
1       /dev
1       /boot
0       /sys
0       /proc
# du -cms /root/* | sort -rn
90      total
90      /root/1
Компилил вчера go в виртуалке. Не дождался, лег спать, а сутра такое. )) и go недокомпилился, ругалось на нехватку места на диске
В норме обычно занято не более 22-25%.
Виртуалку ребутал
почему /root занял, если компилил в /usr/local/src
«vacuum» для ploop диска нужен?

 ,

Vlad-76
()

Как измерять системные показатели в реальном времени?

Форум — Admin

Ммм… не знаю как назвать эту функцию. Как сделать так, чтобы данные, например, в htop (и всех программах для отслеживания состояния системы), обновлялись в реальном времени, а не раз в несколько секунд?

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

Например, диспетчер задач в винде тоже не все показатели обновляет в реальном времени, на моей памяти только wireshark в реальном времени показывает данные. Ещё в разных измерительных программах для отслеживания железа на винде есть такая штука как «частота опроса».

 , ,

Reptile
()

Как в системе CentOS 6.9 обновить компилятор gcc?

Форум — Development

Хотел обновить софт, а его разработчики переехали на новое окружение разработки, в т.ч. на новый компилятор и их софт со старым компилятором стал не совместим
https://bird.network.cz/pipermail/bird-users/2019-August/013642.html

Система установлена полностью из репов
в подключенных репах видно вот такой компилятор
mingw64-gcc-c++.x86_64 4.9.2-1.el6 epel
это эквивалент установленного gcc-4.4.7-18.el6.x86_64 ?
Как выйти из ситуации чтобы малой кровью решить задачу компиляции софта новым компилятором.
В системе есть еще модули, которые собирались нормально со старым компилятором и ломать это не нужно.

ядро в системе 4.12.0-1.el6.elrepo.x86_64

 ,

Vlad-76
()

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

Форум — Web-development

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

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

Просто интересно, был ли у вас опыт и как справиться со всем этим, может есть годные советы.

 , ,

nixbrain
()

Не завалялось ли у кого-то неужаренной RTX 3090?

Форум — Linux-hardware

Облазил авито, убедился, что это помойка с кучей фейковых объявлений.

Делал 2 попытки купить у «надёжных» продавцов, 2 раза платформа блокировала сделку.

Карт которые на авито не выглядят подозрительно (не из под майнинга) вообще нет.

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

В общем Linux тут при том, что NVIDIA выпускает под него блобы.

 

unclestephen
()

Новая статья: «Эволюция 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
()

Программирование 2025. Полный Вкат.

Форум — Development

Продублирую свой вопрос на форуме.

Так какие книги на данный момент самые лучшие для полного вката в программирование?

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

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

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

вайбик: https://www.youtube.com/watch?v=WmnDcLGnYck

 

NeoX
()

Скачивание видео с ютуб, через yt_dlp + прокси

Форум — Desktop

Ubunto

Установил shadowsocks-libev, конфиг

{
    "server": "0.0.0.0",     
    "server_port": 8388,
    "local_address": "127.0.0.1",
    "local_port": 1080,
    "password": "your_password",
    "method": "chacha20-ietf-poly1305",
    "timeout": 300
}
curl -v --proxy socks5://root:your_password@92.63.***.***:8388 https://www.google.com
*   Trying 92.63.***.***:8388...
* Connected to 92.63.***.** (92.63.***.***) port 8388

Соединение зависает

 nc -vz 92.63.***.*** 8388
Connection to 92.63.***.*** 8388 port [tcp/*] succeeded!

Вероятно дело в авторизации, попробовал еще один вариант

wget -e use_proxy=yes -e http_proxy=socks5h://root:your_password@92.63.***.***:8388 https://www.google.com

Он сработал, скачал index гугл страницы. Ок

Далее, необходимо через yt_dlp, скачать видео. Написал скрипт, закинул на сервер

ydl_opts = {
    'format': 'bv+ba/best',  # Лучшее видео + лучший звук
    'outtmpl': "/var/rJNBGqiBI7s",  # Путь сохранения
    'merge_output_format': 'mp4',  # Объединение видео и аудио
    'postprocessors': [{
        'key': 'FFmpegVideoConvertor',
        'preferedformat': 'mp4',  # Конвертация в MP4
    }]
}

# Скачивание
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
    ydl.download(["https://www.youtube.com/watch?v=rJNBGqiBI7s"])

Ок, видео загружено. Подитожим

Есть сервер, запуская скрипт на нем, возможно скачать видео. Далее на этом сервере, установил shadowsocks. Открыл порт, из вне доступен. Через CURL, зависает соединение. Через wget, соединение есть. Страницу получаем

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

wget -e use_proxy=yes -e http_proxy=socks5h://root:your_password@92.63.***.***:8388 https://www.google.com

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

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

Мой вариант

import sys, yt_dlp

# Настройки загрузки
print(sys.argv[1])
ydl_opts = {
    'proxy': 'socks5h://root:your_password@92.63.***.***:8388',
    'format': 'bv+ba/best',  # Лучшее видео + лучший звук
    'outtmpl': "/var/rJNBGqiBI7s",  # Путь сохранения
    'merge_output_format': 'mp4',  # Объединение видео и аудио
    'postprocessors': [{
        'key': 'FFmpegVideoConvertor',
        'preferedformat': 'mp4',  # Конвертация в MP4
    }]
}

# Скачивание
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
    ydl.download(["https://www.youtube.com/watch?v=rJNBGqiBI7s"])
[youtube] Extracting URL: https://www.youtube.com/watch?v=rJNBGqiBI7s
[youtube] rJNBGqiBI7s: Downloading webpage
WARNING: [youtube] Unable to download webpage: timed out
[youtube] rJNBGqiBI7s: Downloading tv client config

Подскажите, как верно настроить прокси, так чтобы возможно было скачать видео через yt_dlp. Кажется все варианты и форумы перелазал… Только на вас надежда…

 ,

Zuldek
()

Логиниться только после завершения пользовательского сервиса

Форум — Admin

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

Обустроил для своих целей systemd ваншот сервис:

# cat /usr/lib/systemd/system/muser.service
[Unit]
  Description=mydeal
 
[Service]
  ExecStart="не очень быстрые вещи"
  Type=oneshot
 
[Install]
  WantedBy=multi-user.target

Он запускается, делает всё, что нужно, завершается. Всё ок.

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

В systemd-logind.service в секции [Unit] пробовую «Requires=muser.service», «After=muser.service», «Wants=muser.service» - всё без толку: логин появляется, когда muser ещё шуршит.

Помогите разобраться. Спасибо за внимание.

 

piyavking
()

Использование UUIDv7 в качестве токена авторизации

Форум — Development

UUID v4 не рекомендуется использовать в качестве токенов авторизации: https://security.stackexchange.com/questions/157270/using-v4-uuid-for-authent...

Do not assume that UUIDs are hard to guess; they should not be used as security capabilities (identifiers whose mere possession grants access), for example. A predictable random number source will exacerbate the situation.

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

Но тем не менее я даже UUID v4 не хочу использовать, не то что криптостойкий рандом в качестве токена авторизации - я буду хранить токены в Postgres, а Postgres, поговаривают, плохо работает с UNIQUE колонками со случайными данными - B-дерево распухает.

Хочу использовать в качестве токенов авторизации UUID v7 - они должны быть по заверению авторов дружелюбны к индексам баз данных. Но беда в том, что их ещё проще угадать, ибо там половина бит даже не рандом неизвестного качества, а вообще метка времени.

Но что если в БД хранить UUID, а юзеру отдавать и от юзера принимать JWT, где UUID хранить в JTI (ну и срок жизни токена, если надо, в exp зашить, stateless фичами JWT мы пользоваться всё равно не будем, нам от него по сути только цифровая подпись токена нужна).

Теперь злоумышленнику мало угадать UUID, ему ещё надо его подписать секретом приложения, который он не знает (в качестве небольшого бонуса - если утечёт дамп БД - без конфига приложения он всё равно не позволит угнать сессии). И наоборот, если утёк секрет JWT, чтобы увести сессию надо ещё угадать UUID (что не невозможно, но всё равно требует усилий). С другой стороны, приложение выборку из БД делает по jti, который UUID v7, который хорошо дружит с индексами БД.

Что думаете о такой схеме?

 ,

KivApple
()

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

Форум — Development
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
()

Бэкапы

Форум — Admin

Напишите, кто чем пользуется и какие фишки есть у используемого. Несущественные моменты: шифрование, сжатие, удалённое хранение - это мне не нужно. Что интересует: эффективность работы(не инкрементальные сразу минус) и надёжность(чем проще тем лучше, проще разбираться).

Если что-то небольшое самописное, а не готовое - тоже интересно. Про фс снапшоты можете написать, кто пользуется. Особенно про то, насколько беспроблемно/удобно можно восстановить что-то удалённое или испорченное.

Просто tar -g не подходит - по этим архивам нельзя сказать удалён ли некоторый файл(и когда удалён) или просто не менялся. Обрезать историю тоже не особо удобно.

Закинуть в гит не пробовал, думаю там довольно медленно будет. Объём данных - несколько десятков гигабайт. Если кто пользуется на схожих или больших объёмах - тоже напишите. Лучше сразу время на git add -A замерить со сброшенным фкешем.

 

qweururu
()

Фрагментация памяти

Форум — Talks

Кто-нибудь проводил исследования, какие современные языки (компиляторы, рантаймы и пр.) в большей мере страдают от этого? Например, запустили программу, которая обрабатывает массив данных на диске мелкими порциями (0,1-10М для определённости), она приступила, через сутки отъела 2Г памяти и упала. Не потому что кривая, а потому что такой у рантайма такой менеджер памяти. Или не через сутки, а через неделю. Но упадёт гарантировано.

 ,

question4
()

Что нужно прикрутить к сайту, чтобы на нем осуществлялась авторизация (вход) по ЭЦП,которую выдает налоговая?

Форум — Development

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

Спасибо.

 

Vlad-76
()

Слетает выравнивание для строк с русскими символами. Unicode в Си.

Форум — Development

Всех приветствую!

Все таки решил создать новую тему.

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

Проблема вот в чем: если в printf-е мы ставим «%30s», то у нас выводится сначало 30-length(str) пробелов, потом наша строка str длиной length(str).

Но это не работает, если в строке есть не англ. символы.

Чтобы проверить какое будет поведение под Windows и Linux, а также с char* и wchar_t*, набросал программку:



#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#include <locale.h>
#include <wchar.h>
#include <uchar.h> // for char16_t


char *str_dup(char const *in)
{
    size_t len = strlen(in);
    char *out = malloc(len+1);
    strncpy(out, in, len+1);
    return out;
}

wchar_t *wstr_dup(wchar_t const *in)
{
    size_t len = wcslen(in);
    wchar_t *out = malloc((len+1)* sizeof(wchar_t));
    wcsncpy(out, in, (len+1) );
    return out;
}

wchar_t* convert_to_wstr(const char* cstr)
{
    mbstate_t state;
    memset(&state, 0, sizeof(state) );
    size_t out_sz = 1 + mbsrtowcs(NULL, &cstr, 0, &state);
    
    wchar_t* ws = malloc(out_sz*sizeof(wchar_t) );
    mbstowcs(ws, cstr, out_sz);
    return ws;
}

char* convert_to_cstr(const wchar_t* wstr)
{
    mbstate_t state;
    memset(&state, 0, sizeof(state) );
    size_t out_sz = 1 + wcsrtombs(NULL, &wstr, 0, &state);
    
    char* cs = malloc(out_sz*sizeof(char) );
    wcstombs(cs, wstr, out_sz);
    return cs;
}

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
typedef struct CSTRUCT
{
	char* data_only_engl; // только англ. буквы
        char* data_from_file; // строка из файла
        char* data_from_prog; // строка в программе
} CSTRUCT;

CSTRUCT* cs_create(const char* cstr)
{
	CSTRUCT* cs = malloc(sizeof(CSTRUCT));

	cs->data_only_engl = str_dup("Hello Friend");
	cs->data_from_prog = str_dup(cstr);

	FILE *input = fopen("text.txt", "r");
    char buff[128];
    memset(buff, '\0', 128);
    fgets(buff, 128, input);
    	cs->data_from_file = str_dup(buff);
	return cs;
}

void cs_print(CSTRUCT* cs)
{
	fprintf(stdout,"------------------------------|\n");
	const char FMT[] = "%30s| %2ld\n";
	fprintf(stdout, FMT, cs->data_only_engl, strlen(cs->data_only_engl) );
	fprintf(stdout, FMT, cs->data_from_prog, strlen(cs->data_from_prog) );
	fprintf(stdout, FMT, cs->data_from_file, strlen(cs->data_from_file) );
	fprintf(stdout,"123456789012345678901234567890|\n"); // ровно 30 символов
}

void cs_free(CSTRUCT** cs)
{
	free( (*cs)->data_from_prog);
	free( (*cs)->data_from_file);
	free( (*cs)->data_only_engl);
	free(*cs);
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/



typedef struct WSTRUCT
{
	wchar_t* data_only_engl;
        wchar_t* data_from_file;
        wchar_t* data_from_prog;
} WSTRUCT;


WSTRUCT* ws_create(const char* str)
{
	WSTRUCT* ws = malloc(sizeof(WSTRUCT));
	ws->data_only_engl = wstr_dup(L"Hello Friend");
	ws->data_from_prog = convert_to_wstr(str);

	FILE *input = fopen("text.txt", "r");
    char buff[128];
    memset(buff, '\0', 128);
    fgets(buff, 128, input);
    
	ws->data_from_file = convert_to_wstr(buff);
	return ws;
}

void ws_print(WSTRUCT* ws)
{
	fprintf(stdout,"------------------------------|\n");
	const char FMT[] = "%30ls| %2ld\n";
	fprintf(stdout, FMT, ws->data_only_engl, wcslen(ws->data_only_engl) );
	fprintf(stdout, FMT, ws->data_from_prog, wcslen(ws->data_from_prog) );
	fprintf(stdout, FMT, ws->data_from_file, wcslen(ws->data_from_file) );
	fprintf(stdout,"123456789012345678901234567890|\n");
}

void ws_free(WSTRUCT** ws)
{
	free( (*ws)->data_from_prog);
	free( (*ws)->data_from_file);
	free( (*ws)->data_only_engl);
	free(*ws);
}



int main(int argc, char const *argv[])
{
	
#if defined (_WIN32)
	setlocale(LC_ALL, "ru_RU");
#else
	setlocale(LC_ALL, "ru_RU.utf8");
#endif

	printf("sizeof(char)    = %ld\n", sizeof(char) );
	printf("sizeof(char16_t)= %ld\n", sizeof(char16_t) );
	printf("sizeof(wchar_t) = %ld\n", sizeof(wchar_t) );
	printf("\n");


	CSTRUCT* cs = cs_create("Hello! Друг");
	cs_print(cs);
	cs_free(&cs);

	WSTRUCT* ws = ws_create("Hello! Друг");
	ws_print(ws);
	ws_free(&ws);


	return EXIT_SUCCESS;
}

Кратко: есть две структуры одна хранит строки в char*, другая - wchar_t*.

Обе хранят три строки: с чисто англ. символами, со строкой инициализируемой в программе и строкой считываемой из файла:

text.txt

Привет friend из файла!

В итоге под Linux получаю

sizeof(char)    = 1
sizeof(char16_t)= 2
sizeof(wchar_t) = 4

------------------------------|
                  Hello Friend| 12
               Hello! Друг| 15
Привет friend из файла!
| 37
123456789012345678901234567890|
------------------------------|
                  Hello Friend| 12
               Hello! Друг| 11
Привет friend из файла!
| 24
123456789012345678901234567890|

Видно, что выравнивание сработало для строки только с англ. символами.

А хотелось бы:

------------------------------|
                  Hello Friend| 12
                   Hello! Друг| 11
       Привет friend из файла!| 23
123456789012345678901234567890|

Соответственно под Windows имею:

sizeof(char)    = 1
sizeof(char16_t)= 2
sizeof(wchar_t) = 2

------------------------------|
                  Hello Friend| 12
               Hello! Друг| 15
Привет friend из файла!
| 37
123456789012345678901234567890|
------------------------------|
                  Hello Friend| 12
               Hello! Друг| 15
Привет friend из файла!
| 37
123456789012345678901234567890|

Как сделать кроссплатф. вывод на экран с правильным выравниваем?

 , , , ,

Gyros
()

Ищутся ГУРУ zfs. Поломал zfs, осваиваю насколько оно починябельное.

Форум — Admin

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

  pool: T4T3S
 state: DEGRADED
status: One or more devices has experienced an error resulting in data
        corruption.  Applications may be affected.
action: Restore the file in question if possible.  Otherwise restore the
        entire pool from backup.
   see: https://openzfs.github.io/openzfs-docs/msg/ZFS-8000-8A
  scan: scrub repaired 464K in 06:48:46 with 8 errors on Sun Feb  9 07:12:55 202
5
config:

        NAME         STATE     READ WRITE CKSUM
        T4T3S        DEGRADED     0     0     0
          T4T3STORE  DEGRADED     0     0 41.7K  too many errors

errors: Permanent errors have been detected in the following files:

        T4T3S/:Backup:<0x50700>
        /zfs/=T4T3S/:Backup/Hosts/HGST-750/Backup-241127=330(172)Gb/p8-zz750/zz-s64root/usr/share/doc/gcc-6-base/libstdc++/user/a09413.html


Естественно битые файлы - пустые.
Подумал что для начала надо их удалить.
Сделал список из файлов и произвёл над ними gzip -m
Всё как бы замечательно, но вот конструкции типа:
T4T3S/:Backup:<0x50700> - остались как ошибочные, при этом другими средствами они не видны.
Как бы удалить эти конструкции?
И что надо сделать после их удаления?
scrub?
а потом убрать флаг ошибки? Или как это делается?
Теоретически конечно я уже сделал рсинк на другой винт и можно этот переразметить и рсинкнут назад, но хочется освоить другой метод, да и рсинк 1.94T упакованных до 1.84T взад - опять будет идти 40+ часов. Можно конечно отрубить упаковку (Выигрыш всего 100G). Но всё же...

(250225-2300)P.S. Последовательность действий:
1. zpool status -v|tee errors.log
2. С помощью гугла нашел команды для преобразования полученного списка в список файлов с ошибками (errors.lst). По ходу удалив строки вида: T4T3S/:Backup:<0x2e2802> - ибо они не являются файлами
3. Если не путаю (память шалит) #zip -m badfiles.zip -@ <errors.lst и все битые файлы были упакованы в архив и удалены на разделе.
4. zpool status <POOL> -v|tee errors.log - Дал только строки вида: T4T3S/:Backup:<0x50700>
5. zpool scrub <POOL> - через 6 часов - 0 ошибок.
6. zpool clear <POOL>
Всё:
# zpool status T4T3S
  pool: T4T3S
 state: ONLINE
  scan: scrub repaired 16K in 06:01:52 with 0 errors on Tue Feb 25 21:27:33 2025
config:

	NAME         STATE     READ WRITE CKSUM
	T4T3S        ONLINE       0     0     0
	  T4T3STORE  ONLINE       0     0     0

errors: No known data errors


В файле badfiles.zip - список файлов которые надо восстановить из других источников.

Спасибо unC0Rr и undef которые советовали по сути, а не «учили» меня «как надо».

Отмечаю тред решенным!

 ,

n0mad
()

Как восстановить удаленный диск виртуальной машины в proxmox?

Форум — Linux-hardware

Есть машина с debian, на ней строит Рroxmox + Proxmox Backup Server - используется 2 зеркала одно для PBS и еще такое же для работы виртуалок.

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

Была когда схожая ситуация при потере дисков в ESXI, возможно ли тут как то найти расположение этих виртуалок на диске и восстановить?

 , ,

tr3ton
()

Рост количества потерь пакетов со временем.

Форум — Development

Я пишу udp с гарантией доставки, сейчас в программе нет нормального контроля перегрузки, но у меня есть буфер из 64 пакетов размером 1460 байт и переменная - число, которая отвечает за то, сколько пакетов можно положить в буфер, с начала она = 1. Я отправляю все пакеты из буфера, одновременно проверяя приходящие подтверждения. Если без потерь проходит весь текущий размер буфера, то я + 1. Если произходит потеря, то таймер заканчивается и все не подтверждённые пакеты отправляются заново. Ещё есть переменная которая увеличивается на 1 каждый раз когда заканчивается таймер и все пакеты приходится отправлять заново. 100 000 это количество пакетов которое надо передать через wifi.

ПРОБЛЕМА: я запускаю программу, скажем раз 10, потом открываю какие нибудь сайты и т.д. youtube например. И через некоторое время ~ 30 минут количество потерь в секунду резко увеличивается. Я делаю ifconfig wlp4s0 down && ifconfig wlp4s0 up и всё становиться сново нормально, причём с открытыми сайтами. Объясните мне почему так.

./cctest c 100000
client
Window  1 Speed    1 Error   1 ~ 1.4 KByte ~ 11.6 KBit
Window  4 Speed  279 Error  18 ~ 395.1 KByte ~ 3.2 MBit
Window  3 Speed  168 Error  18 ~ 237.9 KByte ~ 1.9 MBit
Window  1 Speed  936 Error  14 ~ 1.3 MByte ~ 10.9 MBit
Window  2 Speed  163 Error  18 ~ 230.8 KByte ~ 1.9 MBit
Window  1 Speed  453 Error  16 ~ 641.5 KByte ~ 5.3 MBit
Window  1 Speed  139 Error  18 ~ 196.8 KByte ~ 1.6 MBit
Window 14 Speed  536 Error  16 ~ 759.0 KByte ~ 6.2 MBit
ifconfig wlp4s0 down && ifconfig wlp4s0 up
./cctest c 100000
client
Window  1 Speed    1 Error   1 ~ 1.4 KByte ~ 11.6 KBit
Window 52 Speed 2666 Error   3 ~ 3.7 MByte ~ 30.9 MBit
Window 51 Speed 2532 Error   4 ~ 3.5 MByte ~ 29.4 MBit
Window 25 Speed 2517 Error   5 ~ 3.5 MByte ~ 29.2 MBit
Window 25 Speed 2525 Error   4 ~ 3.5 MByte ~ 29.3 MBit
Window 25 Speed 2528 Error   4 ~ 3.5 MByte ~ 29.3 MBit
Window 17 Speed 2680 Error   5 ~ 3.7 MByte ~ 31.1 MBit
Window 16 Speed 2454 Error   4 ~ 3.4 MByte ~ 28.5 MBit
Window 22 Speed 2702 Error   4 ~ 3.7 MByte ~ 31.3 MBit
Window 26 Speed 2722 Error   4 ~ 3.8 MByte ~ 31.6 MBit

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

 , ,

Ingvar2145
()

Дёргание SOшки из Love файла - обходной путь.

Форум — Development

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

В чём суть, вы например написали программу/игру на Love2D и вам вдруг ну очень хочется добавить к ней вашу библиотеку типа libcool.so в которой что-то делается и вы эту библиотеку вызываете из вашего lua кода, только вот беда. Если вы создали love файл mycoolgame.love и положили в него libcool.so ваш код не сможет загрузить библиотеку libcool.so ибо mycoolgame.love это zip архив. Ну, не получится и всё тут. Но если очень хочется то есть черезжопный метод, мы внутри нашего love файла создадим архив с нашей библиотекой и возможно дополнительными файлами, при запуске, мы монтируем этот архив и распаковываем в каталог игры и автоматически добавляем пути до распакованных файлов в cpath и path.

Например вот наша библиотека которую мы хотим распространять вместе с нашей игрой прямо в love файле.

#include <stdio.h>

#ifdef LUAJIT
#include <luajit-2.1/lua.h>
#include <luajit-2.1/lualib.h>
#include <luajit-2.1/lauxlib.h>
#else
#include <lua5.1/lua.h>
#include <lua5.1/lualib.h>
#include <lua5.1/lauxlib.h>
#endif

int example_c_function(lua_State* L)
{
    int a = lua_tointeger(L,1);
    a+=a;
    lua_pushnumber(L,a);
    lua_pushstring(L,"hello from c");
    return 2;
}

int luaopen_lib(lua_State* L)
{
    static const struct luaL_Reg nativeFuncLib [] =
    {
         {"example_c_function", example_c_function},
         {NULL, NULL}
    };
    luaL_register(L, "lib", nativeFuncLib);
    return 1;
}

Соберём её

gcc -DLUAJIT=1 main.c `pkg-config --libs --cflags luajit` --shared -o lib.so

Аахивируем её

mkdir libs
cp lib.so libs/lib.so
zip -r9 libs.zip libs

А вот собственно сама суть и сам механизм распаковки и импорта путей.

function autoreq(zip)
    if not zip then
       print("[autoreq] failed get zip archive for unpack, argument is 'nil'")
       return false;
    end
    local function unpack(dirname,mount_point,base)
        local items = love.filesystem.getDirectoryItems(mount_point)
        if items then
            for _,val in pairs(items) do
                local path = dirname..'/'..val;
                local path_mount = mount_point..'/'..val;
                if love.filesystem.getInfo(path_mount,'directory') then
                   package.path  = package.path  ..';'..base..'/'..path..'/?.lua;';
                   package.cpath = package.cpath ..';'..base..'/'..path..'/?.so;';
                   love.filesystem.createDirectory(path)
                   unpack(path,path_mount,base)
                 elseif love.filesystem.getInfo(path_mount,'file')then
                        print("[autoreq] unpack -> "..val)
                        love.filesystem.write(path,love.filesystem.read(path_mount));
                else
                   print("[autoreq] ok -> "..val)
                end
            end
        end
    end
    local base = love.filesystem.getSaveDirectory();
    print("[autoreq] check depends in '"..base.."'")
    local dirname = "libs"
    local mount_point = "_autoreq_libs_"
    local dir = love.filesystem.createDirectory(dirname)
    local dir = love.filesystem.createDirectory(mount_point)
    data, err = love.filesystem.newFileData(zip)
    if not data then
       print("[autoreq] failed get zip archive for unpack -> '"..zip.."'")
       return false;
    end
    local success,msg = love.filesystem.mount(data,mount_point)
    unpack(dirname,mount_point,base);
    love.filesystem.setRequirePath ( package.path  );
    love.filesystem.setCRequirePath( package.cpath );
    local success,msg = love.filesystem.unmount(data);
    love.filesystem.remove(mount_point);
    print("[autoreq] all done okey")
    return true;
end

autoreq("libs.zip"); -- вызываем распаковку архива с библиотекой и импорта путей
require('lib'); -- вызываем нашу библиотеку

function love.load()
print(lib.example_c_function()) -- вызываем функцию из неё
end

Создаём love файл с нашей программой и её зависимостями

zip -r9 coolgame.love  main.lua libs.zip

Запускаем

love coolgame.love 
[autoreq] check depends in '/home/dron/.local/share/love/coolgame'
[autoreq] unpack -> lib.so
[autoreq] all done okey
0	hello from c

Всё работает, наша soшка может распространяться в обычном love файле. Будет создана такая структура каталогов. В автоматическом каталоге игры.

dron@gnu:~/.local/share/love$ tree 
.
└── coolgame
    └── libs
        └── libs
            └── lib.so

4 directories, 1 file
dron@gnu:~/.local/share/love$ 

Ну вот собственно и всё. На деле можно в lib.zip насовать произвольные файлы, с произвольными каталогами, например выполнить сборку openssl/luasec/luasocket

luarocks --tree `pwd`/luasec install openssl
luarocks --tree `pwd`/luasec install luasec
zip -9 -r libs.zip luasec -x 'luasec/lib/luarocks*'

И получившийся libs.zip просто добавить в свой love файл тем самым получив всё что нужно для работы с https в вашей программе. Я так и сделал в своей проверялке новостей например. Работать будет всё абсолютно прозрачно, ничего в коде учитывать и менять не надо. В том и прелесть. Ну разве что один раз вызвать autoreq('libs.zip') и всё.

Да, теряется смысл в переносимости love файлов ведь теперь там платформоспецифичные библиотеки таскаются. Но это просто вариант таскания с собой soшки если уж надо, но без всяких appimage упаковок и прочего, по иному дёрнуть внешнюю библиотеку из своей поставки из архива, просто никак нельзя. Но порой вот надо бывает. Я голову ломал довольно долго если честно пока не допёрло. Может кому пригодится.

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

 , , , ,

LINUX-ORG-RU
()

Проблема при сборке библиотеки: ключ -fPIC

Форум — Development

Всех приветствую!

Знает ли кто-нибудь решение такой проблемы:

собираю библиотеку (lib)xlsxio,но для нее нужна minizip-ng:

действую

cmake -S . -B build -D MZ_BUILD_TESTS=ON

~/minizip-ng$ cmake -S . -B build -D MZ_BUILD_TESTS=ON
-- Using CMake version 3.16.3
-- Using ZLIB 1.3.1
-- BZip2 library not found
-- Checking for module 'liblzma'
--   No package 'liblzma' found
-- Using LZMA 5.2.4
-- Checking for module 'libzstd'
--   No package 'libzstd' found
-- ZSTD library not found
-- Using OpenSSL 3.2.2
-- Using Iconv
-- The following features have been enabled:

 * MZ_COMPAT, Enables compatibility layer
 * MZ_ZLIB, Enables ZLIB compression
 * MZ_LZMA, Enables LZMA & XZ compression
 * MZ_PKCRYPT, Enables PKWARE traditional encryption
 * MZ_WZAES, Enables WinZIP AES encryption
 * MZ_OPENSSL, Enables OpenSSL for encryption
 * MZ_LIBBSD, Builds with libbsd crypto random
 * MZ_ICONV, Enables iconv string encoding conversion library
 * MZ_BUILD_TESTS, Builds minizip test executable

-- The following features have been disabled:

 * MZ_BZIP2, Enables BZIP2 compression
 * MZ_ZSTD, Enables ZSTD compression
 * MZ_LIBCOMP, Enables Apple compression
 * MZ_FETCH_LIBS, Enables fetching third-party libraries if not found
 * MZ_FORCE_FETCH_LIBS, Enables fetching third-party libraries always
 * MZ_COMPRESS_ONLY, Only support compression
 * MZ_DECOMPRESS_ONLY, Only support decompression
 * MZ_FILE32_API, Builds using posix 32-bit file api
 * MZ_BUILD_UNIT_TESTS, Builds minizip unit test project
 * MZ_BUILD_FUZZ_TESTS, Builds minizip fuzzer executables
 * MZ_CODE_COVERAGE, Builds with code coverage flags

-- Configuring done
-- Generating done
-- Build files have been written to: /home/bark/minizip-ng/build

Потом

cmake –build build

~/minizip-ng$ cmake --build build
make[1]: Entering directory '/home/bark/minizip-ng/build'
make[2]: Entering directory '/home/bark/minizip-ng/build'
make[2]: Leaving directory '/home/bark/minizip-ng/build'
make[2]: Entering directory '/home/bark/minizip-ng/build'
[  4%] Building C object CMakeFiles/minizip.dir/mz_crypt.c.o
[  8%] Building C object CMakeFiles/minizip.dir/mz_os.c.o
[ 13%] Building C object CMakeFiles/minizip.dir/mz_strm.c.o
[ 17%] Building C object CMakeFiles/minizip.dir/mz_strm_buf.c.o
[ 21%] Building C object CMakeFiles/minizip.dir/mz_strm_mem.c.o
[ 26%] Building C object CMakeFiles/minizip.dir/mz_strm_split.c.o
[ 30%] Building C object CMakeFiles/minizip.dir/mz_zip.c.o
[ 34%] Building C object CMakeFiles/minizip.dir/mz_zip_rw.c.o
[ 39%] Building C object CMakeFiles/minizip.dir/mz_strm_zlib.c.o
[ 43%] Building C object CMakeFiles/minizip.dir/mz_strm_lzma.c.o
[ 47%] Building C object CMakeFiles/minizip.dir/mz_crypt_openssl.c.o
[ 52%] Building C object CMakeFiles/minizip.dir/mz_os_posix.c.o
[ 56%] Building C object CMakeFiles/minizip.dir/mz_strm_os_posix.c.o
[ 60%] Building C object CMakeFiles/minizip.dir/mz_strm_pkcrypt.c.o
[ 65%] Building C object CMakeFiles/minizip.dir/mz_strm_wzaes.c.o
[ 69%] Building C object CMakeFiles/minizip.dir/compat/ioapi.c.o
[ 73%] Building C object CMakeFiles/minizip.dir/compat/unzip.c.o
[ 78%] Building C object CMakeFiles/minizip.dir/compat/zip.c.o
[ 82%] Linking C static library libminizip.a
make[2]: Leaving directory '/home/bark/minizip-ng/build'
[ 82%] Built target minizip
make[2]: Entering directory '/home/bark/minizip-ng/build'
make[2]: Leaving directory '/home/bark/minizip-ng/build'
make[2]: Entering directory '/home/bark/minizip-ng/build'
[ 86%] Building C object CMakeFiles/minizip_cli.dir/minizip.c.o
[ 91%] Linking C executable minizip
make[2]: Leaving directory '/home/bark/minizip-ng/build'
[ 91%] Built target minizip_cli
make[2]: Entering directory '/home/bark/minizip-ng/build'
make[2]: Leaving directory '/home/bark/minizip-ng/build'
make[2]: Entering directory '/home/bark/minizip-ng/build'
[ 95%] Building C object CMakeFiles/minigzip_cli.dir/minigzip.c.o
[100%] Linking C executable minigzip
make[2]: Leaving directory '/home/bark/minizip-ng/build'
[100%] Built target minigzip_cli
make[1]: Leaving directory '/home/bark/minizip-ng/build'

Потом устанавливаю в usr/local sudo make install

Теперь собираю xlsxio:


~/xlsxio$ cmake -G"Unix Makefiles"
CMake Warning:
  No source or binary directory provided.  Both will be assumed to be the
  same as the current working directory, but note that this warning will
  become a fatal error in future CMake releases.


-- XLSX I/O library version: 0.2.35
-- Configuring done
-- Generating done
-- Build files have been written to: /home/bark/xlsxio
bark@zuzu:~/xlsxio$ make
make[1]: Entering directory '/home/bark/xlsxio'
make[2]: Entering directory '/home/bark/xlsxio'
make[2]: Leaving directory '/home/bark/xlsxio'
make[2]: Entering directory '/home/bark/xlsxio'
[  4%] Building C object CMakeFiles/xlsxio_read_SHARED.dir/lib/xlsxio_read.c.o
[  8%] Building C object CMakeFiles/xlsxio_read_SHARED.dir/lib/xlsxio_read_sharedstrings.c.o
[ 13%] Linking C shared library libxlsxio_read.so
/usr/bin/ld: /usr/local/lib/libminizip.a(mz_strm.c.o): relocation R_X86_64_PC32 against symbol `mz_stream_write' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: bad value
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/xlsxio_read_SHARED.dir/build.make:102: libxlsxio_read.so] Error 1
make[2]: Leaving directory '/home/bark/xlsxio'
make[1]: *** [CMakeFiles/Makefile2:150: CMakeFiles/xlsxio_read_SHARED.dir/all] Error 2
make[1]: Leaving directory '/home/bark/xlsxio'
make: *** [Makefile:130: all] Error 2

Проблема тут

relocation R_X86_64_PC32 against symbol `mz_stream_write’ can not be used when making a shared object; recompile with -fPIC

Тогда ставлю в minizip-ng/CMakeLists.txt

на СЛЕДУЮЩЕЙ строке после комментария

# Set compiler options

строчку SET(CMAKE_SHARED_LIBRARY_C_FLAGS «-fpic»)

Потом, пересобираю, устанавливаю minixip-ng

Возвращаюсь к xlsxio:

результат такой же, тот же выхлоп в консоль, опять не может прилинковать

[ 13%] Linking C shared library libxlsxio_read.so

Linking C shared library libxlsxio_read.so
/usr/bin/ld: /usr/local/lib/libminizip.a(mz_strm.c.o): relocation R_X86_64_PC32 against symbol `mz_stream_write' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: bad value

Пока не ясно в чем проблема.

Странно, что разработчики в соих инструкциях по сборке никак момент с -fPIC не упомянули.

Видимо это считается тривиальным моментом..

 , ,

Gyros
()