LINUX.ORG.RU

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

Как найти утечку?

Форум — Security

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

Что именно произошло? Было два случая.

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

  2. Мы собираемся поехать бухать в Териберку. Зафоткать северное сияние, и вообще делать нам нечего, по всей видимости. Мы вели небольшую часть обсужений в чате ТГ и на приватном инстансе nextcloud. Через несколько дней мне позвонили гиды по Териберке. С таким уверенным голосом, как будто мне это 100% нужно.

Что самое любопытное, во всех обсуждениях я наблюдатель, т.е. не писал лично ничего.

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

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

 ,

Pierre_Dolle
()

Как у вас, программистов, зарождаются проекты?

Форум — Development

Все, что меня интересует это какие идеи вами двигают, автоматические считалки или основательные программные продукты такие как Microsoft office.

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

 , ,

saufesma
()

Nginx + Lua вернуть JSON, как?

Форум — Development

Добрый день Подскажите пожалуйста, как вернуть JSON в response? Есть сам JSON

{"1_sign_level":"0200200","2_sign_level":"0200300"}
Пробовал ngx.say и cjson.encodeНо ничего не получается. Помогите, пожалуйста, с кодом.

 ,

darksmoke
()

Инкрементальное и дифференциальное резервное копирование виртуальной машины QEMU/KVM

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

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

Статья является «конспектом» документации QEMU. Я потратил некоторое время на изучение этого вопроса и проверки. Выкладываю – может кому-нибудь пригодится.

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

 , , ,

smola0609
()

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
()