All streams
Search
Write a publication
Pull to refresh
64
0
Павел @RPG

User

Send message
И чего такого сложного в настройке PS1?
Заголовок спойлера
export AA_P="export PVE=\"\\033[m\\033[38;5;2m\"\$(( \`sed -n \"s/MemFree:[\\t ]\\+\\([0-9]\\+\\) kB/\\1/p\" /proc/meminfo\` / 1024 ))\"\\033[38;5;22m/\"\$((\`sed -n \"s/MemTotal:[\\t ]\\+\\([0-9]\\+\\) kB/\\1/p\" /proc/meminfo\`/ 1024 ))MB\"\\t\\033[m\\033[38;5;55m\$(< /proc/loadavg)\\033[m\";echo -en \"\"" \
export PROMPT_COMMAND="history -a;((\$SECONDS % 10==0 ))&&eval \"\$AA_P\";echo -en \"\$PVE\";" \
export PS1="\\[\\e[m\\n\\e[1;30m\\][\$\$:\$PPID \\j:\\!\\[\\e[1;30m\\]]\\[\\e[0;36m\\] \\T \\d \\[\\e[1;30m\\][\\[\\e[1;34m\\]\\u@\\H\\[\\e[1;30m\\]:\\[\\e[0;37m\\]\${SSH_TTY} \\[\\e[0;32m\\]+\${SHLVL}\\[\\e[1;30m\\]] \\[\\e[1;37m\\]\\w\\[\\e[0;37m\\] \\n(\$SHLVL:\\!)\\\$ " \
export PVE="\\033[m\\033[38;5;2m813\\033[38;5;22m/1024MB\\t\\033[m\\033[38;5;55m0.25 0.22 0.18 1/66 26820\\033[m" && eval $AA_P

Ладно, пошутили и хватит. Вот нормальный (цвета по вкусу):
Заголовок спойлера
function __prompt_command_generator() {
	PS1=""
	PS1+='$(__LAST_EXIT="$?";'        # This needs to be first

	local TXTRED='\[\e[0;31m\]'       # red
	local TXTGRN='\[\e[0;32m\]'       # green
	local TXTYLW='\[\e[0;33m\]'       # yellow
	local TXTBLU='\[\e[0;34m\]'       # blue
	local TXTPUR='\[\e[0;35m\]'       # purple
	local TXTCYN='\[\e[0;36m\]'       # cyan
	local TXTWHT='\[\e[0;37m\]'       # white
	local BLDRED='\[\e[1;31m\]'       # red    - Bold
	local BLDGRN='\[\e[1;32m\]'       # green
	local BLDYLW='\[\e[1;33m\]'       # yellow
	local BLDBLU='\[\e[1;34m\]'       # blue
	local BLDPUR='\[\e[1;35m\]'       # purple
	local BLDCYN='\[\e[1;36m\]'       # cyan
	local BLDWHT='\[\e[1;37m\]'       # white
	local TXTRST='\[\e[0m\]'          # Text reset

	#mark root as red
	PS1+='[[ $UID -eq 0 ]] && echo -n "'$TXTRED'" || echo -n "'$TXTCYN'";'
	PS1+='echo -n "\u'$TXTRST'";'

	#hide host name if we are on a local machine
	if [[ -n "$SSH_CLIENT" || -n "$SSH_TTY" ]]; then
		PS1+='echo -n "@'$TXTYLW'\h'$TXTRST'";'
	fi

	#append current path
	PS1+='echo -n " '$BLDBLU'\W";'

	#append git branch
	if type -p git>/dev/null; then
		PS1+='__GIT_BRANCH=$(git rev-parse --abbrev-ref HEAD 2> /dev/null);'
		PS1+='[[ -n "$__GIT_BRANCH" ]] && echo -n "'$TXTBLU'(${__GIT_BRANCH})";'
		PS1+='unset __GIT_BRANCH;'
	fi

	#show exit code
	PS1+='[[ $__LAST_EXIT -eq 0 ]] && echo -n "'$BLDGRN'" || echo -n "'$BLDRED'";';
	PS1+='unset __LAST_EXIT)'

	PS1+="\\\$ $TXTRST"
}

#do not use this in e.g. scp
if [ -z "$SSH_CLIENT" ] || [ -n "$SSH_TTY" ]; then
	__prompt_command_generator
fi
unset __prompt_command_generator


С радостью увижу шейдер (а еще лучше скомпилированный экзешник) с инстансингом (quadbillboard) и vfetch миллиона партиклов с FPS на GeForce 550 Ti в 110 (при реализации с FL9.3 у меня вышло 59 FPS).

mrdoob.com/lab/javascript/webgl/particles/particles_zz85_2m.html

И т.п. — гугл в помощь. 59 фпс — очень похоже на vsync (в webgl скорее всего тоже около 60 фпс покажет).
Было бы неплохо увидеть туториал именно на OpenGL, а для исходных текстов есть GitHub.

нужна видеокарта с поддержкой DX10

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

Так вот как ты выглядишь, движок Яндекса.

Пробовал я как-то запустить резолвер на несколько тыс. доменов в многопоточном режиме — роутер повесился намертво.
Можно так:

int volume(params_s in) { 
    return in. length * in.width * in.height ; 
}
#define volume(...) \ 
    volume((params_s){.length=1, .width=1, .height=1 , __VA_ARGS__})

Препроцессор работает один раз, поэтому подстановки будут осуществляться как положено, зато область видимости не захламляем. Не забываем о том, что в современных IDE автодополнение, основанное на заголовончных файлах проекта, и там будут мешаться эти volume_f и пр.

Идея интересная, главное не переборщить как в libCello. Иногда читая код, перегруженный макросами, появляется непреодолимое желание застрелить автора.
# самое простое
find -name ... -delete
# удалять файлы в 4 потока по 8 штук за раз
find -type f -name ... -print0 | xargs -0 -P$(nproc) -n8 rm

Насчёт параллельного запуска да и самого xargs можно было и побольше примеров придумать:

# нехитрый способ конвертировать все mp3 в ogg
find -name '*.mp3' -print0 | xargs -0 -n1 -P$(nproc) sh -c 'ffmpeg -v quiet -y -i "$0" -vn -codec vorbis -aq 2 "${0%mp3}ogg"'
# поиск несмердженных веток Git
git branch -r --no-merged | grep -v HEAD | xargs -L1 git --no-pager log --pretty=tformat:'%Cgreen%d%Creset - %h by %an (%Cblue%ar%Creset)' -1
# wget в 8 потоков (список ссылок для загрузки лежит в файле .list)
< .list xargs -I{} -P8 sh -c 'echo {}; wget -q {}'
# универсальный скрипт - функция _worker выполнится для каждого подкаталога в текущем каталоге (в несколько потоков, разумеется)
_worker() {
    cd "$1"
    # ...что-то делаем
}
export -f _worker
find . -maxdepth 1 -mindepth 1 -type d | xargs -P$(nproc) -I{} bash -c '_worker {}'

find, xargs и nproc выручают меня постоянно, особенно когда речь идёт о серверах с кучей ядер. В статье как-то скудновато описано.
Может в яндексе всплыть, а может и на сайте челябинского краеведческого музея.
Билайн — результат отрицательный. Но шпионаж присутствует 100% (стоит погуглить телевизор — сразу всплывает реклама телевизоров), скорее всего это одна из, но далеко не единственная система. Надо написать скрипт, который будет в фоновом режиме генерировать «мусорные» запросы:)

P.S. Надо попробовать на досуге… wget со случайным таймаутом должен подойти.
Пожалейте батарейки на мобильных устройствах — браузеры и так жрут все ресурсы, до которых дотянутся. Хром в демке и вовсе на 130% грузит.
А что если взять конкретный нужный нам скрипт, который использует jQuery, слить всё в один файл, скормить это дело в Google Closure, сжать gzip-oм и положить на сайт?

Лет 5-6 назад, когда jQuery был уже толстым, а Google Closure ещё не родился, я делал простенькую обертку над скриптами, которая компилировала все скрипты на странице в один сжатый gz-файлик и отдавала браузеру один раз. Сервер контролировал кэш, соответственно нормальные браузеры этот скрипт загружали и компилировали только 1 раз. Для браузеров без поддержки gzip (сейчас такие поискать надо) отдавалась просто минимизированная версия скриптов.
Ну если перспектива вылететь за границы массива вас не пугает — то да.

Напомню, что конкретно делает эту ошибку «роковой» с точки зрения защиты:

1. Цикл начинается с конца массива groups.
2. Из-за ошибки программиста первая итерация цикла начинается за границей массива groups.
3. По счастливой случайности там оказывается ноль. Да, это работает «корректно» до тех пор, пока на стеке мусор, но ведь всякое бывает.
4. Ноль — это ID рута.
5. Так как функция проверяет на принадлежность пользователя определённой группе, из-за этой ошибки пользователь получает группу рута.

glibc и так в общем-то не подарок, а мне приходится потом искать причину глюков с собаками дебаггером.

На мой взгляд баг возник не из-за невнимательности, а именно из-за привычки программистов вкрючивать инкремент в самые неожиданные места. Не может не радовать, что тенденция писать в таком стиле постепенно сходит на нет.
Для меня khash до сих пор является непревзойдённым контрпримером использования макросов:)
Можно ли libCello использовать на практике? У меня сложилось впечатление, что программа, написанная на Python, будет быстрее, чем написанная на Си+libCello. Интересный проект, но не более того.
Я этот баг искал два дня не меньше, выражалось это в том, что у пользователя всегда оставалась группа рута (подробности не помню, боюсь соврать). На первый взгляд проблем нет, но по факту оказывалось следующее: из-за того что внутри массива постфиксный декремент, из-за чего границы массива оказались не те, которые ожидал программист. Подробнее: sourceware.org/bugzilla/show_bug.cgi?id=11701

Вот наглядно, к чему это приводит:

#include <stdio.h>
int main(int argc, char **argv)
{
	int i;
	int n = 10;
	int groups[n];
	for(i = 0; i < n; i++)
	{
		groups[i] = i;
	}
	while (n >= 0)
		printf("%d\n", groups[n--]);
}
$ ./test
4195728
9
8
7
6
5
4
3
2
1
0

Здесь не UB, просто излишне «хакерский» стиль программирования привёл к тому, что никто, включая автора, не понимает, как этот цикл работает. Согласитесь, это опасный стиль программирования для кода, который работает с правами доступа. Хорошо, это не привело к уязвимости — в ядре код проверки на группы более адекватный и не содержит таких ошибок. Пользователь через функцию access получал утвердительный результат, но когда пытался обратиться к файле через системный вызов open — получал уже от ворот поворот.
Вообще, если мне не изменяет память, x++ внутри аргумента функции может привести к UB, так что лучше отучить себя вообще запихивать инкремент в аргументы, массивы и т. п.

Это частая проблема и тут даже не в макросах дело. Особенно не могут не радовать конструкции вида:

a[i++] = i;

Или вот пример из уважаемой библиотеки glibc:

 while (n >= 0)
   if (groups[n--] == gid)

Не надо так.
Я на тёмной стороне, я пишу на Си.
Когда будете собирать через mock — будут сыпаться постоянно ошибки из-за неустановленных зависимостей. Их и нужно будет прописать в BuildRequires. В Requires нужно прописывать пакеты, которые нужны для работы. Но в вашем случае уже есть готовый пакет со спеком: mirror.yandex.ru/fedora/linux/development/rawhide/source/SRPMS/z/ Да и вообще в большинстве случаев в котле федоры есть уже опакетированные программы.
Эти бы слова, да разработчикам Android…

Не знаком с платформой, но если в качестве компилятора используется gcc, можно тюнить параметры компилятора прямо в сходном коде. В частности, всякие pragma optimize и атрибуты функций. Возможно там и так стоит -Os, но данным способом можно для некоторых «горячих точек» скорости добавить или наоборот.
Qt5 опенсорсный — надо просто посмотреть как там рендерится шрифт. Впрочем, даже если вы построите SDF по вектору напрямую, это не избавит вас от артефактов, свойственных для SDF, так как в конечном итоге всё равно придётся хранить растр. Можно увеличить битность карты (16 бит на канал), качество должно стать получше, хотя и за счёт потери совместимости.
Эта ссылка — оригинальные методы 4SED и 8SED 1992 года. Я нашёл оптимизированный, но неправильный метод. Ещё полезно почитать статью где все алгоритмы собраны — там вроде бы всё правильно и присутствует сравнение, исходя из которого я сделал вывод что 8SED самый быстрый и ленивый из методов, дающих мизерную ошибку (с дейкстрой и графами уж точно не захочется заморачиваться).

Проверил, если не кэшировать дистанцию, время выполнения функции GenerateSDF увеличивается почти в 2 раза. И это я ещё не считаю того, что в конце нужно извлечь корень из дистанции, без кэша это ещё две допполнительные операции умножения. На 4к изображении разница уж очень велика: 0.22 сек против 0.4 сек (не считая копирования в Qt текстуру).

Вот текущий немного кривой код: gist.github.com/scriptum/e5a5961e71465bc67181

Information

Rating
Does not participate
Location
Москва, Москва и Московская обл., Россия
Date of birth
Registered
Activity