LINUX.ORG.RU

Сообщения dimgel

 

Помогите найти старый плач в частном бложике, во что превратилось программирование

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

 

dimgel
()

Ошибка «database is locked» не пропадает даже когда выхожу из второго приложения.

В моём приложении создаю коннекты и prepared statements по запросу, и в описываемом сценарии считаем что кеширую их вечно. Все обновления базы – внутри транзакций.

Во время работы приложения в консоли запускаю sqlite3 mydb и там что-нибудь модифицирую (create table aaa(id int);, drop table aaa;) в auto-commit режиме. После чего моё приложение естественно начинает ругаться «database is locked» (SQLITE_BUSY). (А может и не естественно, если консоль в auto-commit отпускает лок после каждой команды.)

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

Причём там непонятная хрень какая-то творится. Prepared statements, которые были созданы ПОСЛЕ того, как я вышел из консоли, работают. Решил убедиться, запустил консоль, сделал create/drop table, а потом, НЕ выходя из консоли, запустил приложение – всё работает. Но стоит ещё раз повторить в этой же консоли create/drop table – начинает ругаться.

SQLite 3.43.2, база на локальной ФС, режим журналирования WAL, по коннекту на поток, sqlite3_open_v2(...SQLITE_OPEN_NOMUTEX...), pragma locking_mode = normal.

Куда копать, кроме постгреса и кладбища? Ну и кроме очевидного, но чересчур грубого pragma locking_mode = exclusive. Что там вообще происходит?

 ,

dimgel
()

Найти следующий/предыдущий text node за заданным в порядке документа.

Т.е. независимо от того, сколько между ними разновсяческих открывающих и закрывающих тегов. Надо на голом js, покомпактнее и побыстрее; рекурсивно сканировать DOM я и сам догадаюсь.

Например, в <p><b>Hello</b> <i>world</i>!</p> – следующий текстовый узел после «Hello» – пробел, а после пробела – «world».

 ,

dimgel
()

Всем хороша разработка снизу вверх:

И архитектура красивая и минималистичная (не надо подгонять свои высокоуровневые фантазии под – surprise! – совершенно по-другому работающие базовые технологии), и с самого начала тестируешь-дебажишь всю логику настоящую с самого низу (а не заглушки, заменив которые вдруг обнаруживаешь, что работает оно через раз, и тестировать всё надо снова), и писать много лишнего соответственно не приходится, но…

…Но сука пишешь-пишешь, пишешь-пишешь, пишешь-пишешь, ПИШЕШЬ-ПИШЕШЬ – и конца-края мать его не видно!!! Тошнит уже. :(

Хотя тут конечно фактор новизны ещё. Если последние 10 лет сидел на JVM, а плюсы последний раз ещё в яслях видел, то нарабатывать себе тулзы под практически новую для меня платформу – и libtooling изучать (и фасады под свой cake к нему клепать – многопоточность чтобы, и хелперы всякие, в т.ч. обход багов), и nginx (в котором для проксирования до хрена всего, а для бакенда – нихрена), и весь квадриллион граблей пока соберёшь

 

dimgel
()

pragma optimize: почему рекомендуют вызывать в конце а не в начале? а если из отдельного коннекта?

Здрасьти.

Имеем сайт, т.е. приложение с очень большим аптаймом. База – SQLite. Нужно чтобы всё работало быстро, и стартовало / завершалось тоже.

Если вызывать pragma optimize при закрытии каждого соединения, как рекомендуют по ссылке выше, то есть шанс, что рано или поздно – и как положено, в самый неподходящий момент – оно задумается. А вместе с ним и админ: с чего это вдруг nginx не хочет завершаться? kill -9 его.

Понятно, что перед pragma optimize я ещё выдам pragma analysis_limit = 1000, чтобы оно совсем уж неприлично не задумывалось. Но внутренний перфекционист всё равно недоволен.

Для долгоиграющих приложений, по первой ссылке рекомендуют запускать pragma optimize раз в несколько часов. Делать это в рабочих коннектах – нехорошо, юзеры также будут время от времени ни с того ни с сего задумываться.

Отсюда вопросы:

  • Много ли выгоды я потеряю, если буду вызывать optimize из-под отдельного коннекта в фоновом потоке? Не спроста ж они рекомендуют вызывать его перед закрытием коннектов – небось накопленную коннектом статистику используют. Впрочем, бит 8 в MASK я в любом случае буду отключать – ещё блин какая-то сраная железка за меня не решала, какие индексы ей нужны. Но хотя бы тупой analyze-то отработает?

  • Если я буду запускать optimize в фоновом потоке при старте, и оно решит задуматься, оно не заблокирует DML в других коннектах? Если нет, то это был бы идеальный вариант: шустрая работа сайта с первых секунд, даже если админ кильнул предыдущую оптимизацию, задумавшуюся при завершении. Ну а дальше также фоном раз в несколько часов, а оптимизации при закрытии коннектов тогда с гораздо большей вероятностью отработают мгновенно.

 ,

dimgel
()

ОС «Стрелец» получила сертификат соответствия Минобороны

Тыц. Мне пофиг, но может кому-то интересно.

 , ,

dimgel
()

Нужен лёгкий fulltext search engine: для C++ приложения, чтобы умел в en/ru, бесплатный.

Посоветуйте сабж?

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

Я в курсе, что индустриальный стандарт де факто - elasticsearch, но это чёртова зверюга.

Lucene тоже на жаве. Жаву тащить в дистрибутив приложения категорически не хочется.

 

dimgel
()

Как сказать ядру удалить shm, если ВСЕ замапившие его процессы сдохли (SIGKILL)?

…причём сдохли ДО того как вызвали shm_unlink(). В этом случае мне нужно чтобы вновь запущенная куча процессов получила новую чистую память, а не старое состояние.

НЯП вызывать shm_unlink() сразу после mmap() нельзя: если после shm_unlink() другой процесс вызовет shm_open() с этим же именем, он получит другую область памяти.

Пишут, что в старом API (shmget(), …) это делается через shmctl(). Причём по дефолту там как раз нужное мне поведение, что есть правильно с т.з. защиты от race: SIGKILL может прилететь до shmctl(). …Хотя как-то мутно, в соседнем же каменте пишут наоборот, а по man shmctl вообще ни хрена не понятно.

А в новом API походу никак?

 ,

dimgel
()

Смарите какой шик. :)

Захотелось мне проверить, будет ли вызываться memcmp() для невыровненных адресов. Или может оно там какой-нибудь instrinsic впаяет. Сижу ржу:

https://godbolt.org/z/6dWbP687e

Первый раз tail call optimization на сях-плюсях вижу, и как-то не задумывался, что оно не только к рекурсии применимо.

 , ,

dimgel
()

Кто-нить тестил, насколько Эльбрусы медленнее обращаются по невыровненным адресам?

То, что обращение в принципе возможно, я нагуглил. Интересует просад по скорости при чтении/записи 64-битных слов. У amd64 он исчезающе мал, так что вопрос «упаковывать данные или нет» вообще не стоИт.

 

dimgel
()

Чё ей надо?

#include <functional>

struct R {};
template<class... PP> void f(std::function<R(PP...)>) {}

struct P {};

int main() {
	// No matching function for call to 'f'.
	// Candidate template ignored: could not match 'std::function<R (PP...)>' against '(lambda at ...)'
	f([&](P) { return R{}; });

	// То же самое.
	// UPD: Впрочем, не совсем: тут could not match 'std::function<R (P, PP...)>'. Бред какой-то.
	f<P>([&](P) -> R { return R{}; });
}

 ,

dimgel
()

Ищу протокол и C-либы к нему: как UDP но с пакетами произвольного размера.

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

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

Есть чё?

 , ,

dimgel
()

SPA (Single Page Application) с точки зрения юзера: голосуем реакциями!

Поскольку голосовалку если и подтвердят, то как обычно лет через 300, голосуем «палец вверх» / «палец вниз» своё отношение к SPA – КАК ЮЗЕРА (т.е. с т.з. usability), а не как программиста, SEO-шника, безопасника и т.п. – ПРИ ПРОЧИХ РАВНЫХ, в т.ч. при одинаковой нагрузке, прямоте рук программиста, размеру страниц (измеряемому количеством букв и картинок) и т.п.

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

Погнали. :)

 ,

dimgel
()

C with C++, static non-const, void* casts, segfault

А есть ли какие-нибудь отличия в поведении C и C++ при кастовании char* в void* и обратно?

А то я тут пишу плюсявый плагин к сявой софтине: из неё вызывается мой плюсявый callback f():

extern "C" void f() {
    static const char msg[] = "xxx";  
    g(msg, sizeof(msg) - 1);
}

void g(const char* data, size_t size) {
     сявая_структура x;
     x.data = data;
     x.size = size;
     сявый_вызов(x);
}

Если я уберу const с объявления msg внутри f(), и объявлю параметр data функции g() как const void*, а внутри напишу x.data = (char*)data, то всё сегфолтится. Почему?

 , ,

dimgel
()

Один `make install` имеет ли право создавать несколько /lib/pkgconfig/*.pc?

Есть у меня проектик X, в котором собирается две либы: libX-buildtime.so и libX-runtime.so. Как понятно из названий, они линкуются в непересекающихся случаях, поэтому писать для них общий pkgconfig с общей строкой:

Libs = -L${prefix}/lib -l:libX-buildtime.so -l:libX-runtime.so

коряво и глупо. Да и зависимости у buildtime и runtime тоже разные, так что строка Requires.private тоже должна различаться.

Отсюда сабжевый вопрос: насколько это корректно/коряво с точки зрения дистро-мейнтейнеров, если при установке ОДНОГО пакета, в /lib/pkgconfig создаётся ДВА файла: X-buildtime.pc и X-runtime.pc?

К слову, в этом же проекте собираются ещё buildtime-утилиты, которые линкуют libX-buildtime.so, но это пофиг: в .pc-файле они не фигурируют.

 ,

dimgel
()

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

Возьмём например 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
()

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

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

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

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

 

dimgel
()

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

Здрасьти.

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

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

 ,

dimgel
()

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

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