#ifndef __fast_inv_sqrt_h__
#define __fast_inv_sqrt_h__
#include <cassert>
#include <stdint.h>
/**
* Fast approximation of the inverse square root
* (http://en.wikipedia.org/wiki/Fast_inverse_square_root)
*
* @param x
* 32-bit floating point (IEEE 754-2008)
* @return the approximated inverse square root of x
*/
inline float InvSqrt(float x) {
assert( sizeof(x) == 4 );
assert( x >= 0 );
union {
uint32_t i;
float y;
};
y = x;
i = 0x5f375a86 - (i >> 1);
/* Approximation step */
return y * (1.5f - 0.5f * x * y * y);
/* One step more of the Newton's method */
}
#endif /*_fast_inv_sqrt_h__*/
Мнения, высказанные здесь, отражают мои личные взгляды. И мнения и взгляды со временем могут меняться.
вторник, 27 июля 2010 г.
Алгоритм приближённого вычисления квадратного корня
Об уязвимостях в приложениях
Виды уязвимостей приложений:
- Уязвимости в правах доступа к приложению
- Уязвимости в коде форматирования строк
- Уязвимости при работе с общими ресурсами
- Ошибки при вычислении размеров буферов
- Ошибки в работе приложения при исчерпании внешних ресурсов или динамической памяти
- Ошибки в работе приложения с внешними ресурсами или динамической памятью
Факторы усиливающие уязвимости:
- Фиксированное расположение (layout) программы в памяти
- Избыточные права доступа у приложения
Цели атак:
- Внедрение новой функции в приложение
- Нарушение работы приложения
- Получение информации из приложения
- Атака или подготовка атаки на иное приложение
Как правило, чтобы получить управление в коде приложения:
- Перезаписывают стек
- Перезаписывают управляющие секции
суббота, 24 июля 2010 г.
Требования к системному языку программирования
(навеяно http://apenwarr.ca/log/?m=201007#21)
- Реализация любой идеи на новом языке должна быть не сложнее её реализации на языке C
- Должная быть возможность напрямую вызывать подпрограммы на C и ASM
- Должны быть детерминированные конструкторы и деструкторы (RAII)
- Нужна поддержка таблиц виртуальных методов
- Не должно быть отдельных заголовочных файлах (import вместо include)
- Не должно быть динамической типизации
- Не должно быть встроенного в язык сборщика мусора
Не должно быть встроенной в язык системы нитей исполнения- Не должно быть намертво встроенной в язык стандартной библиотеки
- Исключения: либо управляемые, либо отсутствуют
- Сложные типы должны всегда передоваться внутрь функции по ссылке
- Синтаксис работы с указателями должен быть таким же как и синтаксис работы со ссылками
- Нужна поддержка преобразований типов (type casting) определяемых пользователями
- Нужна поддержка обобщенных типов
- Нужна поддержка анонимных функций
- Нужна поддержка перегрузки операторов
понедельник, 19 июля 2010 г.
О сочетаниях цветов
Код на jscript для проверки сочетания цветов на ``читабельность'':
function color_brightness(red, green, blue) {
return 0.299 * red + 0.587 * green + 0.114 * blue;
}
function color_is_good(bg_red, bg_green, bg_blue,
fg_red, fg_green, fg_blue) {
var brightness_diff = Math.abs(
color_brightness(bg_red, bg_green, bg_blue) -
color_brightness(fg_red, fg_green, fg_blue));
var color_dirr =
Math.abs(bg_red - fg_red) +
Math.abs(bg_green - fg_green) +
Math.abs(bg_blue - fg_blue);
return (brightness_diff > 0.490 && color_dirr > 1.961);
}
четверг, 1 июля 2010 г.
Задача на "правильную" запись
Дано множество:-\not{O})
и определена функция:
\quad|\quad{h\in{H}}\wedge{i\in{h}}\}\rightarrow\mathbb{R})
Определим следующее множество:
\geq\pi(j,h_2)\})
Для того, чтобы на этом множестве выполнялось следующее условие:

необходимо и достаточно, чтобы
\geq\pi(j,h_2))
Предполагается, что если эти утверждения переписать "правильно", то можно увидеть что-то!
и определена функция:
Определим следующее множество:
Для того, чтобы на этом множестве выполнялось следующее условие:
необходимо и достаточно, чтобы
Предполагается, что если эти утверждения переписать "правильно", то можно увидеть что-то!
пятница, 18 июня 2010 г.
Установка vim в ubuntu
После установки следующих пакетов у меня заработал vim в ubuntu:
vim vim-scripts vim-doc vim-latexsuite vim-gui-common vim-gnome
vim vim-scripts vim-doc vim-latexsuite vim-gui-common vim-gnome
Классификация нестандартных ситуаций
1. Является ли ситуация допустимой?
Обнаружение недопустимой ситуации, в понимании автора, говорит об ошибках целостности программы или данных. Как правило такие ошибки означают нарушение интерфейса между отдельными частями программы, реже -- об аппаратных проблемах.
Пример, в нормальных условиях следующее предположение верно:
assert( 2+2 == 4 );
Другой пример, если подпрограмма, считающая для любой квадратной матрицы обратную, получит на вход сингулярную матрицу, такая ситуация будет нестандартной, но вполне ожидаемой (допустимой).
2. Возможен ли преодолеть нестандартную ситуацию?
Для некоторых нестандартных ситуаций возможен возврат к нормальной работе программы. Одна и та же нестандартная ситуация может быть как преодолимой, так и непреодолимой на разных уровнях абстракции.
Пример. При работе с контроллером гибких дисков через BIOS существует правило: если операция ввода/вывода завершилась с ошибкой, то прежде чем сообщать об ошибке, нужно сделать ещё две попытки выполнить эту же операцию. Если ошибка будет однократной, то её можно считать преодолимой. Если эта же ошибка повторится много раз, то на уровне конкретного вызова BIOS она непреодолима.
Ещё пример, если на уровне операций с файлами программа обнаружила непреодолимую ошибку, то на другом уровне программа может отключить функцию работы с файлами и продолжить работу.
Если нестандартная ситуация преодолима, то её обработчик должен восстанавливать нормальную работу программы. Если ситуация непреодолима, то, как правило, обработчик должен вернуть программу к состоянию предшествующему последней операции (переведшей к ошибке) и передаёт обработку состояния следующему уровню абстракции.
Обнаружение недопустимой ситуации, в понимании автора, говорит об ошибках целостности программы или данных. Как правило такие ошибки означают нарушение интерфейса между отдельными частями программы, реже -- об аппаратных проблемах.
Пример, в нормальных условиях следующее предположение верно:
assert( 2+2 == 4 );
Другой пример, если подпрограмма, считающая для любой квадратной матрицы обратную, получит на вход сингулярную матрицу, такая ситуация будет нестандартной, но вполне ожидаемой (допустимой).
2. Возможен ли преодолеть нестандартную ситуацию?
Для некоторых нестандартных ситуаций возможен возврат к нормальной работе программы. Одна и та же нестандартная ситуация может быть как преодолимой, так и непреодолимой на разных уровнях абстракции.
Пример. При работе с контроллером гибких дисков через BIOS существует правило: если операция ввода/вывода завершилась с ошибкой, то прежде чем сообщать об ошибке, нужно сделать ещё две попытки выполнить эту же операцию. Если ошибка будет однократной, то её можно считать преодолимой. Если эта же ошибка повторится много раз, то на уровне конкретного вызова BIOS она непреодолима.
Ещё пример, если на уровне операций с файлами программа обнаружила непреодолимую ошибку, то на другом уровне программа может отключить функцию работы с файлами и продолжить работу.
Если нестандартная ситуация преодолима, то её обработчик должен восстанавливать нормальную работу программы. Если ситуация непреодолима, то, как правило, обработчик должен вернуть программу к состоянию предшествующему последней операции (переведшей к ошибке) и передаёт обработку состояния следующему уровню абстракции.
Подписаться на:
Сообщения (Atom)