LINUX.ORG.RU

Сообщения thunar

 

pip+cmake

В продолжение этой темы. Потихоньку готовлю к публикации свой велосипед. В качестве системы сборки таки выбрал cmake и все завимисости тяну им же через FetchContent (кроме самого пайтона с хедерами). Встал вопрос, как теперь это правильно опакетить? Я попытался что-то изобразить с setup.py — ну он нормально вызывает cmake всё компилирует, создаёт egg, а дальше пока затык. Не совсем понимаю а куда потом это всё копировать/инсталлировать? Собственно, конечная цель что бы при наличии в системе компилятора и пайтона можно было установить простым pip3 install передав ему директорию или ссылку на гитхаб.

Таким образом, вопросы:

1. Какие пути надо прописать в cmake (или в setup.py). В моём случае скомпилированный проект представляет из себя две so-библиотеки + некоторое количество полезных python-снипплетов.

2. После старта, основной бинарник библиотеки динамически подгружает числодробильный бекенд. Мне не совсем понятно как правильно задать путь по которому искать бекенд, если он отличается от текущего $PWD. Я так понимаю, в моём случае лучше всё содержимое лучше держать в директории, обернув __init__.py. Но, тогда я так понимаю, при инициализации модуля библиотеки ей надо будет передать путь по которому она находится, или?

3. Есть ли истории успеха перехода с pybind11 на nanobind? Очень хочется всё таки дёргать только Py_LIMITED_API. Эта привязка к версии пайтона совсем не хорошо.

 , ,

thunar
()

Странная ошибка c шаблоном (или я идиот, или одно из двух)

#include <cfloat>
#include <cstdint>
#include <cstddef>
#include <complex>

typedef uint8_t                u8;
typedef float                  f32;

template<u8 nd>
struct grid_t {

	struct node_t {

		template<u8 order>
		u8 get_form (f32 *form, u32 *ptidx, f32 *ptpos) const {
			u8 flag{0};
			return flag;
		}
	};

	node_t operator [] (u32 k) const {
		return {};
	}
};

template<u8 nd, u8 order>
void run_ppush
(const grid_t<nd> &grid) {
		auto node   = grid[0];
		u8 flag{node.get_form <order> (nullptr, nullptr, nullptr)};
// error: invalid operands of types ‘<unresolved overloaded function type>’ and ‘unsigned char’ to binary ‘operator<’
// 38 |                 u8 flag{node.get_form <order> (nullptr, nullptr, nullptr)}; 
//WAT...
}

void ppush1_1_fn
(const grid_t<1> &grid) {
	return run_ppush<1, 0>(grid);
}

 , ,

thunar
()

MetaPost — есть ли для него хороший сборник примеров?

В своё время, matplotlib привлёк меня своей богатой библиотекой примеров. Есть ли что ни будь подобное для metapost? Официальный мануал что то не радует и напоминет скорее справочник... $cast Evgueni

 

thunar
()

ipython и автодополнение

Ipython умеет в автодополнение аттрибутов стандартных классов. Как добиться такого поведения для любого класса, особенно для тех, где переопределён __getattr__?

 

thunar
()

anaconda: боль и унижение

По ряду причин, имеет место машина с древним центосом, где нет возможности обновить это или как то сделать комфортней. Ну ок, безуспешно пытаюсь заставить код хотя бы собраться на этой машине. Загнал все зависимости в FetchContent, ок, выкачивает, хоть чуть чуть легче. Но вот пайтон всё равно приходится иметь внешний — и это боль... Ok, создаём окружение:

conda create -n build_ltp python=3.10
Устанавливаем всё что нужно
conda install -c conda-forge cmake gxx gcc python-devtools
И конечно вручную прописываем переменные окружения, потому что автоматически подхватить то что нужно это не достаточно инновационно
export CMAKE_C_COMPILER=gcc && export CMAKE_CXX_COMPILER=g++ && export CMAKE_MAKE_PROGRAM=/usr/bin/make
ага, и мейк в придачу, ага, потмоу что по умолчанию там будет какой то кривой gmake. Ну и конечно, по итогу коптелятор не найдёт хедеров:
Could NOT find Python3 (missing: Development Development.Module Development.Embed)
А почему?
anaconda3/envs/ltp_build/include/python3.10/python3.10
Ага, два раза, BECAUSE REASONS.

Посему вопрос, если ли какие ни будь альтернативы, которые <<просто работают>>. Без всей вот этой мутотни, что бы был просто более-менее современный компилтор, хедеры где надо и даже не пыталось лезть и использовать что то из системы?

$cast AntonI

 , , , ,

thunar
()

clang, линкер напрочь отказывается линковаться с openmp

clang++-14 -std=c++20 -fPIC -O3 -Wall -Wpedantic -fvisibility=hidden -fopenmp=libomp -shared libcpu.o cpu_porder.o cpu_pcheck.o cpu_ppush.o cpu_ppost.o cpu_remap.o cpu_pmcsim.o cpu_utils_poisson_eq.o  -o libcpu.so
/usr/bin/ld: cannot find -lomp: No such file or directory
clang: error: linker command failed with exit code 1 (use -v to see invocation)

subj. Собственно, в чём беда? g++ на абсолютно той же системе (убунта 22.04) отрабатывает вооще без проблем линкует. Гуглёж выдал только какие то совсем протухшие темы аж от 18го года.

 , ,

thunar
()

pydoc → html, подсветка синтаксиса?

subj. Хочу сделать автоматическую генерацию html-документации к своему велосипеду. В документации присутствуют фрагменты кода с примерами испольования, которые хотелось бы подсветить. Какие есть способы это сделать?

 , , ,

thunar
()

Линакс в 2024 (SLOR)

https://stoplinux.org.ru/none/linux-v-2024-godu-mertv-ili-zhiv.html

В Linux существует три «касты» пользователей Linux:
1. Фанатики красной шапочки (которые поддерживают во всем решения Red Hat)
2. Нейтралы
3. Ярые борцы за Патрика.

...

Что же можно сказать по итогу? Можно сэкономить кучу времени, взяв кредитную карту какого-нибудь банка, заплатить за Windows или купить какой-нибудь Mac и не знать этого всего и этой статьи. В жизни есть много более интересных дел, нежели чем разбираться в болоте озлобленных и обиженных на весь мир людей, который их не понимает.

 

thunar
()

Никак не могу напиать конструктор статично полиморфного класса.

Например, есть базовый шаблонный класс в котором содеражатся настройки:

template<int nd>
struct config_t<nd> {};
Есть класс, содержащий данные, который дожен инициироваться с помощью config_t:
template<typename tp>
struct data_t {};
Эти классы упакованы в варианты:
typedef std::variant<config_t<1>, config_t<2>, ...> сonfig_var;
typedef std::variant<data_t<float>, data_t<double>, ...> data_var;
Эти варианты хранятся в холдере где для них делается выделение памяти, инициализация и пр:
struct config_holder : config_var {
	struct {
		// stuff
	} control;
	
	config_holder (int nd, ...); // nd -> config_t<nd>
};

struct data_holder : data_var {
	struct {
		// memory management & stuff
	} control;
	
	data_holder (std::string &&type, const config_var &cfg, ...) { // data_holder -> data_t<type>
		// What to do in the Kathmandu?..
	}
};

Смысл конструкции в том, что config_holder кодирует некоторые операции, а data_holder хранит данные (над которыми проводятся эти операции) и иницируется строкой задающей тип и конфигом. Базовые шаблонные типы (которые с *_t) потом передаются в числодробильный бэкэнд. А *_holder это интерфейсы, с которыми взаимодействует пользователь.

И вот тут я застрял. Следуя совету intelfx, у меня получилось написать конструктор для config_holder, но с data_holder не понимаю как подступиться...

Следуя той же идеологии, я могу иницировать data_holder для каждого допустимого типа, переданного строкой, но не понимаю, как дальше сконфигурировать его c помощью config_holder... Пробовал делать хелпер, который для каждого заданного строкой типа вызывет свой визитор и из него возвращать значения, но не срабатывает. Как такое всё таки реализовать, или как переписать что бы работало?

$Cast AntonI; $Cast mittorn;

 ,

thunar
()

Как правильно унаследоваться от std::variant?

Хочется сделать контейнер, что-то вроде такого:

template <int n>
struct foo {
	float v[n];
};

struct foo_holder : std::variant<foo<1>, foo<2>> {
	
	struct {/* some stuff */} info;
	
	foo_holder (int nd) {
		if (nd==1) /* foo<1> */;
		if (nd==2) /* foo<2> */;
	}
};
Где хранимый тип определяется параметрами конструктора. Никак не пойму как такое сделать правильно. Или как тут лучше быть?

 ,

thunar
()

ПОГРОМИРОВЫВАЙ

 

thunar
()

Странный варнинг c++.

Есть вот такая структура, типы с py:: — из pybind11-неймспейса.

struct csection_set_cfg {
	typedef mprog_t::opc_t opcode;
	
	std::vector<std::string>      ptinfo, bginfo;
	float                         max_energy;
	std::vector<mprog_t>          progs;
	std::vector<float>            cffts, points, cstabs, rates, tabs;
	std::map<uint16_t, py::tuple> dset;
	uint8_t                       tsize, ntype; 
	uint8_t                       ncsect, nprog;
	
	csection_set_cfg
	(py::str, py::str, std::vector<py::dict>, float, py::dict);
};
Компилирую и вылезает такое:
./g++ -std=c++20 -fPIC -O3 -Wall -Wpedantic -fopenmp -Waggressive-loop-optimizations -c def_csections.cxx -I. -I./fmt/include 
In file included from def_csections.cxx:1:
def_csections.hxx:21:8: warning: ‘csection_set_cfg’ declared with greater visibility than the type of its field ‘csection_set_cfg::dset’ [-Wattributes]
   21 | struct csection_set_cfg {
      |        ^~~~~~~~~~~~~~~~
WAT. Причём на остальные члены класса ему пофиг, а на этот конкретный ругаетс хоть тресни. ЧЯДНТ?

 ,

thunar
()

cudatext, как его заставить работать?

This command requires Python engine. Set proper value of «pylib__linux» in the user.json.

ок, добавляю в user.json

{
  "font_name__linux": "Fira Code",
  "font_size__linux": 16,
  "ui_font_name__linux": "Fira Code",
  "ui_font_size__linux": 12,
  "pylib__linux": "/usr/lib/x86_64-linux-gnu/libpython3.10.so"
}

И, получаю всё ту же ошибку. ЧЯДНТ? Сudatext взял из flathub io.github.cudatext.CudaText-Qt.

 cudatext

thunar
()

История появления null-терминированных строк

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

 , ,

thunar
()

Текстовый (tex/latex) редактор с совместным редактированием по сети?

subj. Есть ли такое?

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

 , ,

thunar
()

скобочка ломает парсер ссылок

subj:

https://foo%29bar

Перемещено shell-script из linux-org-ru

Перемещено shell-script из development

 

thunar
()

latex: chemformula + babel — Command \ch already defined.

В который раз натыкаюсь, \ch из русскоязычного babel конфликтует с \ch из chemformula, и никак не могу вспомнить хак, как это забарывал. Минимальный пример

\documentclass[10pt]{article}
\usepackage[T1,T2A]{fontenc}
\usepackage[utf8]{inputenc}

\usepackage[russian,english]{babel}

\let\ch\relax % <<=== не работает ЧЯДНТ!?
\usepackage{chemformula}


\begin{document}

\ch{H2O}
\end{document}
Command \ch already defined. \begin{document}

 , chemformula,

thunar
()

geeqie okular plugin

subj. geeqie умеет показывать превью pdf-файлов, что весьма удобно если нужно разбирать большое количество материала. Но очено не хватает возможности открыть этот файл в okular. Есть опции для gimp, для imagemagic. В меню плагинов okular есть, но в состоянии hidden. При этом никакой галочки что бы его анхайдить нет. В документации сказано что за это отвечают опции NoDisplay и Hidden в .desktop-файле. Но их явное указание не дают ни какого эффекта. ЧЯДНТ и ДОКОЛЕ?

 ,

thunar
()

Какую систему сборки выбрать для c++-библиотеки для пайтона.

В продолжение этой темы.

Вообщем, потихонечку финализирую и готовлю к публикации свой pet-project. Но возник вопрос какую выбрать приличную сборочную систему, т.к. сейчас я использую абсолютно непортабельный Makefile с кучей костылей — и выносить такое на публику не хочу.

Собственно subj. Проект — библиотека для python, написанная на c++ с использованием pybind11.

Фактически, библиотека состоит из двух частей, которые шарят между собой некоторые хедеры:

  • frontend взаимодействующий с python-кодом, содержащий биндинги для всех классов и функций;
  • backend (которых, в перспективе будет несколько, но пока один) — динамически загружаемая библиотека, содержащая сами расчётные функции.

Подводные камни, с которыми не понимаю как правильно быть:

  • зависимости (которые я сейчас просто скриптм сгружаю с гибхаба и кладу в отдельную директорию и симлинкаю в директории с исходниками):
  • на этапе сборки backend скриптом из python делается немного кодогенерации что бы проинстанцировать все комбинации шаблонных параметров.
  • разнцые опции компилятора при сборке front- и backend, в дальнейшем и разные компиляторы (т.к. буду использовать hip и cuda)
  • как-то хочется что бы оно минимально зависело от версии интерпретатора и избегать подобного:
    ImportError: Python version mismatch: module was compiled for Python 3.10, but the interpreter version is incompatible: 3.11.4 (main, Jul  5 2023, 14:15:25) [GCC 11.2.0].
    (upd: избежать не получится)

Соответственно, хочется что бы всё это это собиралось как-то максимально безболезненно, желательно прямо в python-пакет, который можно будет впоследствии установить pip-ом. Вероятно, мне нужна какая-то python-центричная сборочная система.

Так-как сам я не программист, то спрашиваю советов и best-practice для моего случая.

 , ,

thunar
()

Генерация многомерной случайной величины по заданной плотности вероятности.

subj. Для одномерной всё понятно: интегрирую плотность верятности f(x) что бы получить cumulative distribution function F(x). Дальше элементарно нахожу обратную функцию F^{-1}: x(R∈0..1) и получаю интересующие сэмплы подставляя в обратную функцию равномерное распределение, отыскивая конкретную точку бинарным поиском. Как такое же проделывается для многомерного распределения?

 , ,

thunar
()

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