LINUX.ORG.RU

Избранные сообщения thunar

асинхронная дефрагментация массива

Форум — Development

Например, имеются массивы data[N], hole[M], N≥M. В data хранятся данные, а в hole — в порядке возрастания, индексы, отмечающие пустые точки. Нужно дефрагментировать этот массив, т.е. обменять элементы так что бы данные лежали непрерывно. При этом, порядок в котором они они пишутся не важен. Что-то вроде:

8 holes:
	3 5 6 16 22 23 25 26
in:
	00 01 02 -- 04 -- -- 07 08 09 10 11 12 13 14 15 -- 17 18 19 20 21 -- -- 24 -- -- 27 28 29
out:
	00 01 02 29 04 28 27 07 08 09 10 11 12 13 14 15 24 17 18 19 20 21 -- -- -- -- -- -- -- --
Как называется этот алгоритм и как реализовать его параллельный вариант для произвольного количества тредов?

В наивной последовательной реализации (набросал на python)

id_hole = len(hole)-1
id_tail = len(data)-1
for j in range(0,len(hole)):
	dst = hole[j]
	while(id_hole>=j):
		if hole[id_hole] >= id_tail:
			#skip
			id_tail = id_tail-1 #atomic
			id_hole = id_hole-1 #atomic
		else:
			#move
			data[dst],data[id_tail] = data[id_tail],data[dst]
			id_tail = id_tail-1 #atomic
			break
получается две шаренные переменные, т.е. если параллелить цикл по j, то на каждый шаг будет не менее двух атомарных операций, что нехорошо. Как тут можно переделать?

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

 , , ,

thunar
()

bibtex

Форум — General

А нет ли пакета/стиля, который в результирующем pdf при наведении на цитату показывал бы всплывающую подсказку с названием/авторами цитируемой статьи?

 ,

thunar
()

Бинарный формат для обмена данными между c++-библиотекой и python-кодом?

Форум — Development

Ищу header-only библиотеку для бинарного-формата, поддерживающего хранение многомерных массивов, скляров и строк которые можно писать/читать из c++ и читать/писать из numpy-массивов. Оценочный размер файлов от единиц-мегабайт, до десятков гигабайт — поэтому, нужна воможность считав заголовок файла, найти нужные смещения, а данные грузить уже по необходимости. Что для этого лучше использовать? Подходит-ли для моих задач hdf5?

 , , ,

thunar
()

странное поведение imagemagic

Форум — Desktop
/tmp convert --version
Version: ImageMagick 6.8.9-9 Q16 x86_64 2018-09-28 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2014 ImageMagick Studio LLC
Features: DPC Modules OpenMP
Delegates: bzlib cairo djvu fftw fontconfig freetype jbig jng jpeg lcms lqr ltdl lzma openexr pangocairo png rsvg tiff wmf x xml zlib

/tmp convert out.pdf out.png 
convert: not authorized `out.pdf' @ error/constitute.c/ReadImage/412.
convert: no images defined `out.png' @ error/convert.c/ConvertImageCommand/3210.

и так со всеми pdf

Это я идиот, или?

 

thunar
()

Визуализация данных

Форум — Development

Привет всем. Как лучше визуализировать очень-очень большой двумерный (обычный в котором 2 оси x и y) график, без всяких многомерных проекций? Чтобы был понятен масштаб - скажем он начинается от полутора миллиона точек до 20-30 миллионов, значения тоже колеблются нехило (десятки миллиардов типичные значения). Хочется на него глазками посмотреть, есть ли в нём какие-то закономерности, вроде синусоиды и так далее, при том я не знаю масштабов на которых они будут видны (теоретически обязаны быть, но на практике...) Так что хочется чего-то, что можно маштабировать. Желательно из кода на Python-е. matplotlib навевает на меня тоску, он с более маленькими объёмами тонет в производительности, надо самому ручками выбирать тогда какие точки рисовать, ну и никакого масштабирования, а хочется чего-то умного, что не будет лишние точки рисовать.

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

Матплотлиб работает, да, но хочется про альтернативы послушать.

 , ,

peregrine
()

Задачка на подумать (диагональный сдвиг по Z-кривой Мортона)

Форум — Development

Есть такая замечательная штука как Z-кривая Мортона, очень удобна для всяких рекурсий и многомерных массивов с хорошей локальностью данных.

Нужно зная сдвиг ячейки от начала D-мерного массива найти сдвиг ее ближайшего соседа по диагонали (вперед-вверх).

Я знаю только такое решение

const uint64_t zmasks[16]={
  0xffffffffffffffff, 0x5555555555555555, 0x9249249249249249, 0x1111111111111111,
  0x1084210842108421, 0x1041041041041041, 0x8102040810204081, 0x0101010101010101,
  0x8040201008040201, 0x1004010040100401, 0x0080100200400801, 0x1001001001001001,
  0x0010008004002001, 0x0100040010004001, 0x1000200040008001, 0x0001000100010001 
};

template <int D, typename T> T zoff_diag_shift(T offset){  
  for(int i=0; i<D; i++){
    T omask = zmasks[D-1]<<i, imask = ~omask, fix = offset&imask;
    offset = (((offset|imask)+1)&omask)|fix;
  }
  return offset;
}

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

 

AntonI
()

NVIDIA Prime на не-Ubuntu

Форум — Linux-hardware

Эта инфа есть в Gentoo Wiki и Arch Wiki, но всё равно тема с завидной регулярностью поднимается на ЛОРе. Поэтому я решил написать об этом здесь. Красивой переключалки не будет: только правкой конфигов.

Практическая часть

Убедитесь что версия вашего ядра Linux ≥ 3.13, X-Server ≥ 1.13, xrandr ≥ 1.4, драйвера NVIDIA ≥ 319.xx. Версию ядра Linux, минимально необходимую для NVIDIA Prime, подняли в драйвере 364.xx: раньше была 3.9.

Создайте /etc/X11/xorg.conf со следующим содержимым:

Section "ServerLayout"
    Identifier "layout"
    Screen 0 "nvidia"
    Inactive "intel"
EndSection

Section "Device"
    Identifier "intel"
    Driver     "modesetting"
    Option     "AccelMethod" "none"
    BusID      "PCI:0:2:0"
EndSection

Section "Screen"
    Identifier "intel"
    Device "intel"
EndSection

Section "Device"
    Identifier "nvidia"
    Driver "nvidia"
    BusID  "1:0:0"
    Option "AllowEmptyInitialConfiguration"
EndSection

Section "Screen"
    Identifier "nvidia"
    Device     "nvidia"
    Option     "UseDisplayDevice" "none"
EndSection

Вместо PCI:1:0:0 и PCI:0:2:0 подставьте свои значения, узнав их с помощью lspci. Чаще всего, значения именно эти.

Добавьте в конфиг-файл своего графического менеджера входа в систему эти команды:

xrandr --setprovideroutputsource modesetting NVIDIA-0
xrandr --auto

GDM:

Файл /etc/X11/gdm/Init/Default, просто добавьте в конец, перед «exit 0»

KDM:

Файл /usr/share/config/kdm/Xsetup, просто добавьте в конец.

LightDM:

Создайте файл /etc/lightdm/display_setup.sh со следующим содержимым:

#!/bin/sh
xrandr --setprovideroutputsource modesetting NVIDIA-0
xrandr --auto

Выполните chmod +x /etc/lightdm/display_setup.sh.
В файле /etc/lightdm/lightdm.conf найдите секцию [Seat:*], а в нём display-setup-script=. Добавьте/раскомментируйте эту строку, затем приведите к виду:

[Seat:*]
display-setup-script=/etc/lightdm/display_setup.sh

Остальные графические менеджеры входа в систему

https://wiki.gentoo.org/wiki/NVIDIA/Optimus#Display_manager_configuration,
https://wiki.archlinux.org/index.php/NVIDIA_Optimus#Display_Managers

Решение бага с обрезанным экраном в Minecraft

В Minecraft, при нажатии клавиши F11, включается полноэкранный режим. С приведённым мной конфигом, вы увидите прямоугольник 640x480, и чёрный экран на остальной площади. С другими полноэкранными играми такого бага нет.

Я нашёл решение проблемы, когда читал Xorg.0.log. Виртуальный экран стартует с разрешением 640x480, затем пробрасывается на Intel, затем меняет размер на реальный. Нужно сделать так, чтобы виртуальный экран создался сразу с нужным разрешением.

В xorg.conf в секцию «„Screen“, Identifier „nvidia“», добавьте это (поменяв моё разрешение на ваше):

    SubSection "Display"
        Virtual     1600 900
    EndSubSection

Теоретическая часть

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

Что почитать?

http://ru.download.nvidia.com/XFree86/Linux-x86_64/384.69/README/randr14.html
https://github.com/Bumblebee-Project/Bumblebee/wiki/History-of-the-project
https://devtalk.nvidia.com/default/topic/957814/linux/prime-and-prime-synchronization/post/4964506/#4964506 Важная информация
https://wiki.gentoo.org/wiki/NVIDIA/Optimus
https://wiki.archlinux.org/index.php/NVIDIA_Optimus

 , , ,

ZenitharChampion
()

беговые дорожки

Форум — Talks

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

Линакс тут при том, перед дорожкой повешу монитор, на который mpv из онтопика выводит видео с поездами.

 

thunar
()

Эффективная оптимизация. Что такое Cython.

Форум — Development

За последнюю неделю почему-то часто всплывал этот вопрос, поэтому распишу всё сразу в одном месте. Описывать буду на примере питона, но общие принципы применимы ко многим языкам. Итак.

Часть первая. Правила эффективной оптимизация

  1. Не думайте об оптимизации пока код не дописан. Вообще! Думайте, как написать код проще и понятнее. А про оптимизацию даже не вспоминайте, пока не запустите код. Когда код запустится, проверьте насколько быстро он отрабатывает. Если он достаточно быстр — задача решена, ничего делать не нужно. Точка. И только если код отрабатывает медленнее, чем требуют условия задачи — начинайте думать об оптимизации.
  2. Попробуйте JIT, например PyPy, если условия это позволяют (apt-get install pypy && pypy yourprogram.py). Когда не хватает совсем немного производительности — JIT ускорит в несколько раз, и этого может быть достаточно. И тогда всё, задача решена. Только если это не сработало, переходите к фактической оптимизации кода.
  3. Пройдитесь профайлером. python -m cProfile yourprogram.py Никогда не оптимизируйте код без профилирования. По профилю определите самые медленные куски кода. Если код слишком большой — разбейте на функции. Не нужно бросаться переписывать всё подряд. Изолируйте наиболее прожорливые куски кода, и работайте только с ними.
  4. Выполните высокоуровневую оптимизацию найденных медленных кусков кода. Используйте более быстрые библиотеки: gmpy2 вместо встроенной длинной арифметики, python-regex вместо встроенного re, numpy для матричных вычислений, и т.д. Замените dict на list. Вынесите все возможные вычисления за циклы. Наконец, оптимизируйте алгоритм, или попробуйте найти ему более быстрый аналог. Если что-то получилось — goto 2.
  5. Cython. Расставьте типы, пройдитесь профайлером, посмотрите annotate cython-а, какой код сгенерирован, какие куски можно ускорить (он их расцвечивает)... Ещё раз подчёркиваю, низкоуровневая оптимизация — это последний этап, когда другие варианты исчерпаны.

Часть вторая. Cython

Если мы всё-таки дошли до cython-а, то... что же он такое?

Cython - это транслятор из питона в Си. Всё. Он просто генерирует код на си.

Если в файле mymodule.py написать:

def somefunc(x):
    y = x*42
    return y
и запустить cython mymodule.py то он том же каталоге сгенерирует mymodule.c, в котором будет что-то вроде:
static PyObject *__pyx_pf_8mymodule_somefunc(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_x) {
  PyObject *__pyx_v_y = NULL, *__pyx_r = NULL, *__pyx_t_1 = NULL;

  __pyx_t_1 = PyNumber_Multiply(__pyx_v_x, __pyx_int_42);
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_y = __pyx_t_1;
  __pyx_t_1 = 0;

  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_y);
  __pyx_r = __pyx_v_y;

  __Pyx_XDECREF(__pyx_v_y);
  __Pyx_XGIVEREF(__pyx_r);
  return __pyx_r;
}
И, хотя это редко делают вручную, этот код можно собрать обычным компилятором: gcc -shared -O3 -o mymodule.so mymodule.c `python-config --cflags --ldflags`. Нигде в остальном коде ничего менять не надо. Обычный «import mymodule» загрузит бинарный module.so так же, как загрузил бы питоновый mymodule.py.

Да, cython позволяет скомпилировать питонокод. Но никаких глубоких интеллектуальных оптимизаций cython не делает. Он просто вызывает из libpython.so питоновые функции, такие как PyNumber_Multiply(). Без питона этот код работать не будет. (в принципе, его можно собрать статически, но обычно это не имеет смысла — реальная программа всё равно будет использовать кучу внешних либ, и ещё одна библиотека роли не сыграет)

Так как все вызовы питоновых функций остались, то просто сборка cython-ом большого ускорения не даст, может, раза в два. Но! Cython-у можно указать, где использовать сишные типы вместо питоновых! В примере выше, если расставить типы:

cdef double somefunc(double x):
    cdef double y = x*42
    return y
то cython mymodule.pyx сгенерирует в mymodule.c код:
static double __pyx_f_8mymodule_somefunc(double __pyx_v_x) {
  double __pyx_v_y, __pyx_r;

  __pyx_v_y = (__pyx_v_x * 42.0);

  __pyx_r = __pyx_v_y;

  return __pyx_r;
}
По сути, это чистый код на си. Быстрее некуда. А с параметром --annotate cython -a mymodule.pyx дополнительно сгенерирует «mymodule.html», в котором раскрасит код цветами. По нему легко смотреть, какие части кода ещё стоит оптимизировать. Но так как после расстановки типов обычным питоном такой код уже не запустится, его традиционно сохраняют в файле с расширением .pyx вместо .py.

Вот так, не написав ни одной строчки на си, а просто расставив типы, медленный питоновый код превращается в быстрый сишный.

В целом, это всё.

PS: Это не все возможности cython-а. В нём можно использовать плюсовые типы, например std::vector. Причём можно даже писать: cdef vector[double] sqrs = [x*x for x in somelist] и всё преобразование из питоновых типов в плюсовые и обратно cython возмёт на себя. Можно вызывать и внешний код на си (cdef extern from).

Есть и более тонкие оптимизации, например мелким функциям можно расставлять inline (хотя с этим и gcc обычно справляется). А ещё код, не использующий питоновые объекты, не блокирует GIL! А значит отлично подходит для многопоточных вычислений. В cython-е есть и модули для параллельных вычислений.

Да и сами .pyx файлы обычно компилируются не руками, а как часть скрипта distutils/setuptool. А в отладочных целях import pyximport; pyximport.install() и после этого обычный import mymodule сможет импортировать не только .py, но и .pyx файлы.

Полезные ссылки

Итого: Оптимизировать надо только когда иначе нельзя, и только то, что необходимо. Низкоуровневая оптимизация делается в последнюю очередь. Но если мы её таки делаем, то cython позволяет сделать её максимально легко — просто расставив типы.

PPS: Питон в этом не уникален. Почти во всех языки есть возможности низкоуровневой оптимизации, расширения на си через FFI/JNI/и т.д. Есть unsafe код в rust и c#. Даже в паскале и си есть ассемблерные вставки. Не удивительно, что кто-то придумал аналог и для питона. Так что эти же принципы оптимизации применимы и к другим языкам.

 , , , ,

pynonymous
()

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

Форум — Science & Engineering

Например, есть серия снимков 2х-мерного поля, что-то вроде http://pix.academ.info/images/img/2017/09/22/b076b89071c0a68e7cbbe2cc1e08daed.... Каим математическим методом вытащить оттуда скорость волны и её направление? Пока думаю перевести всё фурье-пространство (в вертикальном направлении) и сравнивать разность фаз между кадрами. Правда, так можно поймать только вертикальную скорость; как поймать угол — не понятно.

В правильном-ли направлении я мозгую?

 ,

thunar
()

вопрос локали

Форум — General

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

 ,

thunar
()

latex hyperref как показать ссылку в месте курсора?

Форум — General

Использую hyperref

\usepackage{color} \definecolor{darkgreen}{rgb}{0,.5,0}
\usepackage[colorlinks,filecolor=blue,citecolor=darkgreen,unicode]{hyperref}
Ссылки на формулы красные, на цитируемую литературу зеленые. При наведении курсора на номер ссылки, например [3], появляется дополнительное окошко с информацией «перейти к странице 14». Если кликнуть, то перейдешь на страницу 14 с этой ссылкой. Очень удобно, постоянно пользуюсь, но вопрос - зачем бегать туда и обратно? Можно ли сделать так, чтобы при наведении курсора на номер ссылки в окошке появлялась сама ссылка? Или в теховском формате или уже как часть pdf. В описании к hyperref такой возможности нет, но может все-таки как-то можно?

 

rustamych
()

обработка видео в python

Форум — Multimedia

Подскажите, нет ли python-библиотеки, которая позволяет представить видео в виде итератора по кадрам?

 ,

thunar
()

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

Форум — Science & Engineering

Имеется набор угловых значений [φₒ..φₙ], хочу определить среднее и разброс. Что бы не было проблем с 0..2π, использую формулу Эйлера и среднее определяю обычным способом от [exp(iφₒ)..exp(iφₙ)]. Как посчитать разброс? Среднеквадратичное отклонение тут не годится, так как длины чисел одинаковы.

 ,

thunar
()

Не догоняю по частичной специализации шаблонов

Форум — Development

Например, есть шаблон для многомерного массива:

template <typename t, size_t dim>
struct carray_base{
	carray_base<t, dim>(t* data, size_t* shape,  size_t* offset):
	data(data), shape(shape), offset(offset) {}
/*...*/
	template <typename num>
	inline carray_base<t, dim-1> operator [] (num i){
		return carray_base<t, dim-1>(data + (size_t)i*offset[0], shape+1, offset+1);
	}
/*...*/
	t*      data;
	size_t* shape;
	size_t* offset;
};
Соответственно, необходима частичная специализация на случай dim=1:
template <typename t>
struct carray_base<t, 1>{
/*...*/
	template <typename num>
	inline t& operator[](num i){
		return data[(size_t)i];
	}
/*...*/
};
Специализация отличается только одной функцией, можно ли избавиться от дублирования кода в её теле?

 ,

thunar
()

GNU make — разные варианты сборки

Форум — Development

Например, у меня есть несколько вариантов сборки, которые отличаются LD-флагами, архитектурой и объектными файлами:

#common x68-64 with plplots
ARCH = x86-64
LDFLAGS = -I/usr/include/plplot -lplplotcxxd
OBJ = $(XOBJ) plots.o
USER_DEFINES = -DWITH_PLPLOT
и
#static x86-64 w/o plplots
ARCH = x86-64
LDFLAGS = -static -static-libgcc -static-libstdc++
OBJ = $(XOBJ)
USER_DEFINES =
Как написать цели сборки и зависимости, что бы по «make common» собрать первый вариант, а по «make static» второй?

 

thunar
()

Самодельные стол и стул

Галерея — Рабочие места

Вот и моё «Рабочее место высокого дрища».

Высокий рост приводит к тому, что за стандартной мебелью мне можно сделать: 1) удобно спине: низкий стул и относительно высокий стол. При этом ноги подвёрнуты под стул, страдают колени; 2) удобно ногами: высокий стул, относительно низкий стол. Скрючена спина. *) можно распрямлять ноги, вытягивая их вперёд, но тогда пояснице становится вообще худо, а это место - ахилессова пята всех, кто работает сидя.

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

Стол настраивается по высоте и можно сделать настройку по глубине (сейчас не востребована). Г-образные шурупы, вкрученные в горизонтальные балки, входят в отверстия рейки. Дальше столешница > болт с кольцом > соединительное звено цепи > цепь > анкер с крючком.

Стул. Из говна и палок (дерева) копировал одну из моделей «анатомического стула», которая оказалась неудобной, а дерево как конструкционный материал не слишком позволяло менять конструкцию. Потом понял, что смысл такого стула это настраиваемость, и сварил из квадратного профиля «коленный стул» собственной конструкции. В нём регулируются по высоте и наклону сиденье и упор для коленей, также меняется расстояние между «тумбами». Металл ржавый и некрашеный, красить не буду - лень.

Стул оправдывает себя: пояснице на нём легче, чем на обычном. (Если кто не в курсе: низ человеческого туловища, поясничный позвоночник и таз, не приспособлены природой к тому положению, что принимают в позе сидя. Таз при этом поворачивается вверх по оси тангажа, диски поясничного отдела позвоночника деформируются. Если у вас крепкое телосложение, возможно, на вас это не повлияет, иначе вы рано или поздно схватитесь за спину. Природным является такое положение костей таза и позвоночника, когда человек стоит. Коленный стул позволяет опустить ноги, что приближает позу к стоячей, а упор для коленей тормозит соскальзывание с сиденья. В общем, это компромисс между стоячей позой, которая даёт варикоз, и сидячей, которая портит поясницу.) Но за 10 лет неправильного сидения я настолько похерил себе спину, что без упражнений и частой смены поз не могу долго сидеть даже на таком, «удобном» стуле.

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

* * *

Слева от клавиатуры оборудование для самопальной установки лазерного шоу. Под батареей ящик от цветов с водой для увлажнения воздуха. На стене мотивирующие картинки.

p.s. Фото плохого качества, но то, что нужно, на них видно.

p.p.s. На работе похожий колхоз, там тоже есть над чем поугарать. Если заинтересует, сфотографирую.

Фото 2, где чуть подробнее виден стул.

Фото 3: вид сверху

 

An12
()

centos, идиотизм с терминалами

Форум — Desktop

в centos6.* по умолчанию в терминале неадекватно работают клавиши ins/home/del/end. как это поправить?

 ,

thunar
()

udisks2 монтирование в /media

Форум — General

udisks2 по умолчанию автомонтирует в /media/$username/ можно ли в настройках вернуть обычное монтировапние в /media?

 ,

thunar
()

шаблон для цепочки операций с массивом, или как имплементировать ленивость?

Форум — Development

Пускай есть некоторый шаблонный класс для представления массива. И есть члены шаблонного класса, например A, B, C, D, .. совпадающие по количеству элементов. В шаблоне реализованы арифметические операции +=, -=, *=, /= для операций с парами (массив, массив) и (массив,скаляр) внутри они представляют из себя обычные циклы (в общем случае распараллеленные), а так же оператор присваивания и конструктор копирования.

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

Например, A = C+B*(D/2.0f). Если считать влоб, то получается 4 цикла и 3 выделения памяти, в то же время, если как-то реализовать ленивость, то достаточно собрать цепочку вычислений элемента и посчитать всё внутри одного цикла. Как такое правильно сделать?

 , ,

thunar
()