LINUX.ORG.RU

Сообщения dimgel

 
Форум — Development

Выгрузка из памяти ненужных ресурсов / глобальных переменных.

Возьмём например Qt. Там есть xml-файл ресурсов resources.qrc, в который можно например картинки добавлять:

<RCC>
    <qresource prefix="/">
        <file>icons/hello.png</file>
        ...
    </qresource>
</RCC>

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

static const unsigned char qt_resource_data[] = {                                                                                                                                           
  // /blablabla/icons/hello.png                                                                                                                     
  0x0,0x0,0xb,0x5b, ...                                                                                                                                                                 
  ...
};
...

Что печалит: вот допустим загрузил я картинку в память (в объект QImage) из ресурсов – и больше мне эти ресурсы не нужны. Но они продолжают сидеть в памяти, фактически задвоение данных картинки. А если там не картинка (которая во-первых маленькая, а во-вторых в теории может и не копировать эти данные, а тупо хранить ссылку на них с флагом owner=false), а чего пообъёмнее?

Понятно, что можно тупо хранить ресурсы в отдельном файле и грузить его вручную. Но не хочется файлы плодить. Вдруг есть какая-нибудь фича в плане сабжа? Смутно помню, что винда умеет красиво в ресурсы в PE-файлах, но мне бы под лялих.

 , ,

dimgel
()
Форум — Development

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

$ cat makefile
b: a
        cp a b
a:
        # noop

$ rm -f a; touch b; make
# noop
cp a b
cp: cannot stat 'a': No such file or directory
make: *** [makefile:2: b] Error 1

По правилу a понятно: target file не существует – выполняем команды. Что команд нет – не наши проблемы.

А по правилу b не понятно ни черта. Оба правила не .PHONY, файл b существует, a не существует – и правило тем не менее выполняется.

Либо make после отработки правила a вообще не считывает mtime(a) повторно, а тупо берёт текущее время – но это крайне дурацкое кроилово для тулзы, которая на каждый чих в шел форкается. Собственно, я тут вообще глупость написал: что mtime, что текущее время – один syscall.

Либо же явно закодировано: если файл-зависимость не существует после выполнения правила-зависимости, то выполняем зависимое как будто его mtime < mtime зависимости. А нахрена?

 ,

dimgel
()
Форум — Development

QtCreator: add existing files/directory — как сделать чтобы не добавляло автоматом путь в .includes?

Сабж. Задрало в конец. Это generic project если что.

 

dimgel
()
Форум — Development

WebAssembly: юзать/нет? Отключение js браузерами/noscript/umatrix синхронно действует и на wasm?

Здрасьти.

// Вводная: я люблю SPA, так что без JS моё поделие работать один хрен не будет.

Я тут прикидываю, что кое-какую логику можно перенести из JS в WebAssembly с целью снижения трафика. Но без понятия насчёт сабжа: каким боком это вылезет? Расскажите кто на какие косяки нарывался (как разраб или юзер)?

 ,

dimgel
()
Форум — Development

GNU make: не работает ':='

Имеется makefile:

all: bin lib

X := BIN
bin:
        @echo 'Hello $(X)'

X := LIB
lib:
        @echo 'Hello $(X)'

Вывод:

Hello LIB   <--- а мечтался BIN
Hello LIB

ЧЯДНТ?

Проблему поймал когда попытался заюзать временные переменные внутри define ... endef, который потом подавался на вход $(eval $(call ...)). Т.е. исходный вопрос на самом деле ещё замороченнее: как юзать временные переменные внутри таких вот самодельных «функций»?

 , ,

dimgel
()
Форум — Development

А знаете как деплоить C++20 modules с библиотекой?

А никак.

В доках GCC (ссылку не дам, уже потерял) прямым текстом сказано, что CMI (Compiled Module Interface) – формат не портабельный и может использоваться только для кеширования в процессе сборки. Он может меняться даже в зависимости от версии компилятора и целевой архитектуры, его смысл и scope примерно тот же что у precompiler headers. Что в общем естественно: компилятор сериализует туда свои внутренние структуры.

Следовательно, деплоить интерфейс модуля можно исключительно исходником. Т.е. если раньше было .h + .cpp, то теперь вместо .h у нас будет какой-нибудь .cppm – интерфейс модуля, который тоже надо деплоить вместе с либой, а в сорцах опять два исходника на модуль: .cppm + .cpp. Что поменялось? Расширение интерфейсного файла. Который теперь ещё и замусорен новыми кейвордами export и import.

Никаких намёков на попытки разработчиков компиляторов договориться о портабельном формате CMI и о расположении CMI-файлов внутри .a-архивов – не нагуглилось. Есть разве что вот такой пропозал в т.ч. про стандартный маппинг имён модулей на имена файлов, но читать его печально. Ну, может моим правнукам, работающим в поле пока светло, голубиная почта принесёт добрые вести.

Тьфу. Ни одну фичу не могут сразу нормально и ДО КОНЦА проработать.

 ,

dimgel
()
Форум — Development

Есть ли задержки между write и read в unix domain sockets?

Т.е. открыл я /run/my-socket, сишу слушаю, акцептю, пишу-читаю, всё non-blocking (select(2)).

  1. Полагаю, внутри ядра такое accepted connection для локального unix domain socket – реализовано как обычный pipe?

  2. Когда одна сторона пишет, мгновенно ли другой стороне прилетают данные (non-blocking просыпается из select(), клиентский blocking read() возвращает управление), или там может буферизация какая или ещё какая дичь?

 ,

dimgel
()
Форум — Development

Печалит меня отсутствие в firefox поддержки DecompressionStream.

@MozillaFirefox, чёзафигня?

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

А вот в хроме и edge всё есть. Особенно дико выглядит описание API на MDN: описание есть, а самого API нет.

 ,

dimgel
()
Форум — Development

Как читать буфер памяти посимвольно в заданной кодировке?

Здрасьти.

Хочу что-то такое:

uint8_t* buf = { open(argv[1]); бинарный read(); close(); buf[filesize] = 0; }
чтото_типа_set_charset_for_getc(argv[2]);
while ((int c = чтото_типа_getc(buf)) != 0) {
    блаблабла мистер Фримен;
}

Можно конечно тупо сконвертнуть весь буфер в wstring и потом работать с ним как белый человек. Но мой внутренний байтодрочер ужасается от sizeof(wchar_t) и подозревает, что посимвольно читать буфер будет быстрее.


SOLVED:

(1) тыц (linux.org.ru), тыц (linux.org.ru).

(2) Для парсинга сорцов это всё не нужно, по крайней мере поначалу.

 , ,

dimgel
()
Форум — Talks

Хочу залить на гитхаб опен-сорц с русскими каментами/доками/README.

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

Отговорите.

Кстати 1: а разрабы Astra Linux (или что там у нас для госорганов сертифицировано) в своём коде по-английски каментят?

Кстати 2, чтобы 2 раза не вставать: а внутри РФ вообще имеют смысл такие слова как GPL? В т.ч. с точки зрения суда.

 ,

dimgel
()
Форум — Desktop

wine 7 белый плоский GUI

Обновил wine 6.22 на 7.7. (Долго тянул т.к. глючная дрянь этот ваш wine.) Вид всех контролов в прогах (дочерних окон в MDI, кнопок, таблиц и т.п.) стал отвратительным: бьющим по глазам ярко белым и плоским. Весь гуй превратился в равномерно-ярко-белое пятно. В т.ч. в самом winecfg: тут не вполне белый, но светло-серый и тоже плоский (e.g. кнопки того же цвета что фон окна). Как вернуть взад?

 , ,

dimgel
()
Форум — Talks

Вышел QtCreator 7, в котором clangd включён по дефолту.

Конец тормозам. УРА ТОВАРИЩИ!!!

 ,

dimgel
()
Форум — Admin

mount bind + mount tmpfs на поддиректорию.

fstab:
tmpfs  /a/b  tmpfs  size=1M  0 0
/a1  /a  auto  bind  0 0
/a2  /a  auto  bind  0 0

Независимо от того, монтирую я /a/b до или после /a1 и /a2, оно не видно в /a1/b и /a2/b/. Т.е. делаю touch /a/b/xxx – и xxx не виден в /a1/b и /a2/b. А хочется чтобы был виден, т.е. чтобы /a/b, /a1/b и /a2/b ссылались на один и тот же tmpfs. Можно ли как-нибудь вылечить?

 

dimgel
()
Форум — Development

Хочу gcc warning если во внутреннем scope есть переменная с тем же именем, что и во внешнем.

Можно ли как-нибудь gcc заставить это делать?

class C {
    int x;
    void f(int x) {   // хочу тут warning: x уже есть в scope, объявлен в такой-то строке
        if (...) {
            int x   // и тут тоже
        }
    }
}

 , ,

dimgel
()
Форум — Desktop

А что, mpv / smplayer не умеют в DVD menu?

Сабж. В smplayer жму «Open / Disk / Play DVD from folder» – и оно запускает первый chapter, меню не открывает вообще.

 , ,

dimgel
()
Форум — Desktop

VLC виснет без интернета

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

Версия 3.0.16.

Галка «Allow Metadata Network Access» в настройках снята.

Инет запрещён через iptables: -A OUTPUT -m owner --uid-owner 1000 -j DROP

Чё делать?

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

 ,

dimgel
()
Форум — Development

Почему operator<=>() не генерирует operator==()?

struct X {
    std::string s;
    inline auto operator <=>(const X& x) const { return s <=> x.s; }
};

https://godbolt.org/z/E8Y5Y3bs5

В итоге определены все операции сравнения кроме ==. (Во, теперь ещё и != неопределён. Только что ж пробовал.) Наличие constructor/assignment не влияет.

И самое смешное, в точно такой же структуре (с конструкторами, объявлена внутри namespace dimgel и по-другому называется) в моём проекте не определён ещё и operator<(). Что это за долбаная магия?

 

dimgel
()
Форум — Desktop

Обновился pipewire* 1:0.3.43-5 -> 1:0.3.44-1, ругается что нет прав для nice -11

И звука, соответственно, нет. Откатился – прекрасненько висят процессы под nice -11, что нихрена не удивительно: я в группе realtime, для которой в /etc/security выставлен этот лимит.

Что ни обновление – то досвидос. Зато эти черти в ченжлоге новой версии гордо заявили что что-то там соптимизировали с латентностью. Молодцы.

 ,

dimgel
()
Форум — Desktop

Обновился firefox 96.0.2-1 -> 96.0.3-1, отвалилось почти всё видео на reddit, ЯП и т.п.: кодеков говорит нет.

Кто виноват и что делать?

Ютуб работает.

 ,

dimgel
()
Форум — General

И чего этот VoidLinux хвалят?..

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

И команды, и опции – менее интуитивные, чем в pacman. Примеры: (1) automatic вместо dependency; (2) для поиска какому пакету принадлежит файл вызываем xlocate, который ищет не конкретный файл (я ему между прочим абсолютный путь подсовываю), а всё сколько-нибудь похожее; других способов не гуглится.

Ну там ещё по мелочам, например параллельной скачки нет, но она и в pacman по слухам не так давно появилась. Фигня конечно. Но в целом не покидало ощущение чего-то сырого, не то чтобы корявого но скорее некомфортного, и непонятно на кой чёрт нужного.

И главное. Дистр – бинарный. Инфраструктура xbps-src интегрируется в систему отнюдь не бесшовно: (1) обновление пакетов, собранных из сорцов (с другими билд-опциями, иначе какой смысл?), требует дополнительных приседаний; (2) а самих этих билд-опций – кот наплакал, в большинстве пакетов их нет вообще, т.е. почти всё собрано с рекомендованными апстримом настройками; (3) так что если нужно что-то более гибкое gentoo-style, то добро пожаловать в копирование/редактирование template, т.е. в создание своего пакета; после чего поддержание его актуальности становится обыкновенным мейнтейнерским гимором.

Т.е. это бинарный дистр с выставленной на всеобщее обозрение и задокументированной системой сборки пакетов. Не более того. И это – современная-правильная-без-легаси «лучше чем гента»? Я таки вас умоляю.

Товарищи эстеты, чё вы в этом void вообще находите?

 ,

dimgel
()

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