Pull to refresh
64
0
Павел @RPG

User

Send message

А, всё правильно. Он в отдельной ветке SDF, плюс я не успел новый класс внутрь fontrender-а засунуть.


Резервный шрифт устанавливает операционная система. Надо либо делать свой движок рендеринга ttf, что довольно хлопотно, либо поискать как в ОС поменять резервный Arial на какой-то другой (в linux, например, за это fontconfig отвечает).

Не стоит также игнорировать экспорт кернинг-пар — в экзотических шрифтах отсутствие кернинга ой как заметно.


Минутку, в UBFG ведь есть встроенный Distance Field!
Да, есть. Но результат получается заметно хуже. Возможно в обновлениях авторы UBFG это поправят.

Странно. Раньше в алгоритме были ошибки и приближенное вычисление SDF, но в последнем коммите я пытался поправить SDF-генератор и вроде бы он не уступает по качеству BruteForce (см. тест, PSNR > 70 дБ).

Реализация PHP слишком хитрая — там читерство с потоками и она запутаннее, чем js. Найдётся умелец, который перепаяет js на потоки и расстановка сил снова изменится. А вообще в тесте соревнуются в скорости pcre-движков, только и всего, и учитывая что многие используют libpcre — разница Python, PHP и C++ должна быть минимальна. Аналогично, там есть тест с числом пи, где по сути сравнивают производительность очень оптимизированной библиотеки gmp саму с собой, которая написана, к слову, на Си и ассемблере.


Но делать такие далеко идущие выводы на основе самого сомнительного бенчмарка (там ключевое слово — game)...


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

Попробуйте ещё yad — это форк Zenity, но более продвинутый и устраняет многие недостатки Zenity. Но главное — можно делать практически произвольные формы.

Для проверки качества пароля используйте cracklib-check, она умеет сообщать вид «слабости» пароля, используется в стандартном PAM:

$ cracklib-check <<< 123
123: it is WAY too short

Для отправки уведомлений можно использовать notify-send, там багов таких нет.
Разработчики Transmission уже выпустили патч, удаляющий червяка. Ещё пару дней назад. Ну и регулярные бекапы + подписка на oss-security сделают вашу жизнь чуть более скучной:) Присоединяюсь к предыдущему вопросу о пути проникновения червя в подписанный инсталлятор на офф. сайт разработчика.
Выглядит очень интересно, хотя я и привык к shutil и простой обертке над subprocess, но никогда не писал на питоне то, для чего шелл подошёл бы лучше. Из статьи непонятно, умеет ли библиотека делать конвейер? Ведь шелл-простыни зачастую намного сложнее, что-то вроде такого:

while read a b c; do
  grep $(sed s/1/2/ <<< $a) ... && some_command || error_handler
done <(find ... | grep ... | tr ... | sort -u)

В "нормальных" языках как раз часто не хватает главной фичи юникс-вея — конвейеров и всех тех непонятных штук, которые знакомы администраторам 50-го уровня:).

P. S. Интересно, кто-нибудь подсчитывал, сколько в приведённых трёх строчках шелла строк кода на Си (ну ладно, хотя бы на Питоне). Естественно, если делать по-честному, не прибегая к вызову system.
Результаты этого теста:

Xeon E5-2680
Bitslice(7)            2493617 us; cnt = 32500610
Bitslice(24)           2209648 us; cnt = 32500610
Lauradoux              1224743 us; cnt = 32500610
SSE2 8-bit              773552 us; cnt = 32500610
SSE2 16-bit             746455 us; cnt = 32500610
SSE2 32-bit             906400 us; cnt = 32500610
SSSE3                   500734 us; cnt = 32500610
16-bit LUT             1180070 us; cnt = 32500610
8-bit LUT              1233562 us; cnt = 32500610
gcc popcount            298926 us; cnt = 32500610
gcc popcountll          171961 us; cnt = 32500610
FreeBSD version 1      2614572 us; cnt = 32500610
FreeBSD version 2      1890065 us; cnt = 32500610
Wikipedia #2           1290699 us; cnt = 32500610
Wikipedia #3            882481 us; cnt = 32500610
HAKMEM 169/X11         2994177 us; cnt = 32500610
naive                 19328131 us; cnt = 32500610
Wegner/Kernigan       13590515 us; cnt = 32500610
Anderson               5804584 us; cnt = 32500610
8x shift and add      12111373 us; cnt = 32500610
32x shift and add     14550016 us; cnt = 32500610
OpenMP Bitslice(7)            5874879 us; cnt = 32500610
OpenMP Bitslice(24)             83787 us; cnt = 32500610
OpenMP Lauradoux                54328 us; cnt = 32500610
OpenMP SSE2 8-bit               37482 us; cnt = 32500610
OpenMP SSE2 16-bit              39181 us; cnt = 32500610
OpenMP SSE2 32-bit              43241 us; cnt = 32500610
OpenMP SSSE3                    31971 us; cnt = 32500610
OpenMP 16-bit LUT               70153 us; cnt = 32500610
OpenMP 8-bit LUT              7236100 us; cnt = 32500610
OpenMP gcc popcount             34359 us; cnt = 32500610
OpenMP gcc popcountll           35332 us; cnt = 32500610
OpenMP FreeBSD version 1       281157 us; cnt = 32500610
OpenMP FreeBSD version 2       198496 us; cnt = 32500610
OpenMP Wikipedia #2            156282 us; cnt = 32500610
OpenMP Wikipedia #3            114159 us; cnt = 32500610
OpenMP HAKMEM 169/X11          230414 us; cnt = 32500610
OpenMP naive                  1674378 us; cnt = 32500610
OpenMP Wegner/Kernigan         654721 us; cnt = 32500610
OpenMP Anderson                960991 us; cnt = 32500610
OpenMP 8x shift and add       1583529 us; cnt = 32500610
OpenMP 32x shift and add       957853 us; cnt = 32500610


Core i7-3770
Bitslice(7)             620813 us; cnt = 32500610
Bitslice(24)            588943 us; cnt = 32500610
Lauradoux               343854 us; cnt = 32500610
SSE2 8-bit              258616 us; cnt = 32500610
SSE2 16-bit             263849 us; cnt = 32500610
SSE2 32-bit             301500 us; cnt = 32500610
SSSE3                   177150 us; cnt = 32500610
16-bit LUT              604952 us; cnt = 32500610
8-bit LUT               857176 us; cnt = 32500610
gcc popcount            234420 us; cnt = 32500610
gcc popcountll          151301 us; cnt = 32500610
FreeBSD version 1      1581670 us; cnt = 32500610
FreeBSD version 2      1112433 us; cnt = 32500610
Wikipedia #2            675289 us; cnt = 32500610
Wikipedia #3            532715 us; cnt = 32500610
HAKMEM 169/X11         1568815 us; cnt = 32500610
naive                 12706907 us; cnt = 32500610
Wegner/Kernigan        9730186 us; cnt = 32500610
Anderson               3546174 us; cnt = 32500610
8x shift and add       8769728 us; cnt = 32500610
32x shift and add     10844191 us; cnt = 32500610
OpenMP Bitslice(7)             917011 us; cnt = 32500610
OpenMP Bitslice(24)            721363 us; cnt = 32500610
OpenMP Lauradoux               883048 us; cnt = 32500610
OpenMP SSE2 8-bit              230228 us; cnt = 32500610
OpenMP SSE2 16-bit             117210 us; cnt = 32500610
OpenMP SSE2 32-bit             131941 us; cnt = 32500610
OpenMP SSSE3                   248196 us; cnt = 32500610
OpenMP 16-bit LUT              486344 us; cnt = 32500610
OpenMP 8-bit LUT               380845 us; cnt = 32500610
OpenMP gcc popcount            266826 us; cnt = 32500610
OpenMP gcc popcountll          108274 us; cnt = 32500610
OpenMP FreeBSD version 1       839581 us; cnt = 32500610
OpenMP FreeBSD version 2       906064 us; cnt = 32500610
OpenMP Wikipedia #2            918286 us; cnt = 32500610
OpenMP Wikipedia #3            593741 us; cnt = 32500610
OpenMP HAKMEM 169/X11         1054673 us; cnt = 32500610
OpenMP naive                  3531085 us; cnt = 32500610
OpenMP Wegner/Kernigan        2340468 us; cnt = 32500610
OpenMP Anderson               1557932 us; cnt = 32500610
OpenMP 8x shift and add       3044832 us; cnt = 32500610
OpenMP 32x shift and add      3624641 us; cnt = 32500610


POWER
Bitslice(7)            1360812 us; cnt = 32500610
Bitslice(24)           1271885 us; cnt = 32500610
Lauradoux               447454 us; cnt = 32500610
16-bit LUT             1249726 us; cnt = 32500610
8-bit LUT              2103832 us; cnt = 32500610
gcc popcount            431113 us; cnt = 32500610
gcc popcountll          220803 us; cnt = 32500610
Wikipedia #2            982466 us; cnt = 32500610
Wikipedia #3            763969 us; cnt = 32500610
HAKMEM 169/X11         2067571 us; cnt = 32500610
naive                 24156131 us; cnt = 32500610
Wegner/Kernigan       22806373 us; cnt = 32500610
Anderson               3879566 us; cnt = 32500610
OpenMP Bitslice(7)             814847 us; cnt = 32500610
OpenMP Bitslice(24)            112392 us; cnt = 32500610
OpenMP Lauradoux               131094 us; cnt = 32500610
OpenMP 16-bit LUT              120421 us; cnt = 32500610
OpenMP 8-bit LUT               109915 us; cnt = 32500610
OpenMP gcc popcount            142351 us; cnt = 32500610
OpenMP gcc popcountll          154243 us; cnt = 32500610
OpenMP FreeBSD version 1       126954 us; cnt = 32500610
OpenMP FreeBSD version 2       126668 us; cnt = 32500610
OpenMP Wikipedia #2            113159 us; cnt = 32500610
OpenMP Wikipedia #3            122584 us; cnt = 32500610
OpenMP HAKMEM 169/X11          134424 us; cnt = 32500610
OpenMP naive                   747296 us; cnt = 32500610
OpenMP Wegner/Kernigan         409483 us; cnt = 32500610
OpenMP Anderson                216775 us; cnt = 32500610

Осталось дождаться, когда Microsoft сделает Windows для power:)
Померил для 32битного int — popcnt быстрее самого быстрого варианта с таблицей на 64К в 2 с небольшим раза (на core i5). Всё подряд предлагаемое прогнать нереально:) Ждём когда автор доберётся до гитхаба. Или найти в гугле готовые тесты… Например, вот этот: http://www.dalkescientific.com/writings/diary/archive/2011/11/02/faster_popcount_update.html
Пользуясь случаем, сообщу, что runexe по ссылке мертва, а ещё меня терзают смутные сомнения, что я смогу повторить запуск этих тестов, например, на power.
Я немного не об этом. Нельзя загрузить этот код, выполнить make и получить такую же табличку, верно? У меня есть возможность протестировать код на совершенно разных машинах, но нет времени его детально изучать. Но по крайней мере я выяснил, что ваш код считает время пустого цикла:) Быстрый взгляд показывает, что в программе не хватает интерфейса чтобы прогнать все тесты разом.

Именно поэтому код следует выложить на GitHub, так как его ещё дорабатывать и дорабатывать. Чтобы не считать время пустого цикла я использовал разворот цикла на 8, после чего время, затрачиваемое на перебор значений, стало ничтожно мало.

> гарантированно пройдя по всем значениям

А почему цикл от 0 до N не пройдёт гарантированно все значения?

> чтобы компилятор вообще не удалил цикл за ненадобностью

есть volatile.

Но хабр не для Pull Requesto-в. А про гитхаб уже сказали.
POPCNT не будет использоваться, если не указать флаг -msse4.2, что означает либо компиляцию под определённую платформу либо шаманство с weak-функциями и потеря производительности на вызове функции. Если это узкое место, то нужно отдельно компилячить кучу версий — одну для sse4.2, одну для sse4.1… и так до sse2 который гарантированно поддерживается для 64-разрядной архитектуры.

К сожалению представленные на ЯД исходники не позволяют мне проверить все варианты, так как я не понял, что с ними нужно делать. Могу сказать только, что на i5 __builtin_popcount выдаёт 0.1 сек для 100000000 итераций с типом int для sse4.2 и 0.3 сек без него. На Xeon паршивый результат даже с sse4.2 — 0.25, без sse — 2 секунды. На core i7 лучший результат — 0.08 сек. На power хоть и есть инструкция popcntw, но её результат тоже не впечатляет — 0.3 сек.
А учитывалось ли в Java-тестах то, что на Intel она использует JIT-компилятор, который по понятным причинам не поддерживает платформу Эльбрус? Тогда стократная разница — это нормальная разница интерпретатора и JIT. На эльбрусах Java будет не быстрее питона:)
Всё в порядке, уязвимость присутствует. Вообще баг не относится к какому-то конкретному браузеру — утекают изображения из офиса, просмотрщиков изображений и прочее, прочее.
hotfix: перед вставкой кода напечатать ( или `.
Проверил на разных машинах. В драйвере 358 пофикшено, в 352 ещё не пофикшено (с помощью этой программы можно получить остаточные буферы памяти). В драйверах Intel и VESA проблемы нет.
Если я правильно понял, то эта оптимизация имеет отношение к блоку clearMemory, но не readpixels, к тому же автор оставил блок clearMemory опциональным. Мне же было интересно сохранить весь дамп VRAM для последующего изучения. Есть вероятность что драйвер «оптимизировал» также и чтение из только что аллоцированного пустого блока. Наверное, стоит попробовать рисовать небольшой прямоугольник поверх этого буфера, чтобы драйвер пометил его как «грязный». Попробую ещё потестить с разными драйверами.
Разве непривилегированное приложение может слить дамп ОЗУ на современных ОС? Тут же речь о том, что любой Вася может даже под другим юзером запустить эту программу и увидеть содержимое вкладок браузера другого пользователя или ещё чего интересное. Вот здесь более развёрнуто.
В современных операционных системах принято занулять память перед тем как отдать её приложению. Это это очень хорошо, так как при выполнении malloc «мусор» в буфере окажется мусором освобождённой памяти текущего приложения, а не какого-то другого. Зануление при освобождении, как правило, не происходит (в угоду производительности) и используется на параноидальных сборках ядра Linux с патчами PAX/Grsecurity.

Я на скорую руку переписал тест автора бага на Си: github.com/scriptum/vmem_test (go активно отказывался компилироваться). Проверил на двух драйверах под Linux: nouveau и nvidia 358.16. В драйвере nouveau эффект присутствует (да какой — данные сохраняются даже после перезагрузки), в случае же с последним актуальным проприетарным драйвером nvidia 358.16 — возвращается чёрный экран.

Достаточно обратиться к /dev/mem по известному из вывода утилиты «lspci» офсету.

Это очень плохая «фича». Я очень рад, что моя система запрещает обращаться к /dev/mem не только кому попало, но и руту. Так, на всякий случай.

Проблема в том, что непривилегированный процесс, используя штатные механизмы (в данном случае — запрос видеобуфера из памяти через OpenGL), может получить данные, которые ему не принадлежат.
С фигурными можно такие финты проделывать:

[[ $a == $b ]] && { echo "error" >&2; exit -1; }

Тогда if не нужен. Ну и пользователи не-bash, скорее всего, будут ругаться.

Или даже такие:

{(
	sleep 15
)& disown;} 2>/dev/null
THREAD=$!

Information

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