1. Является ли ситуация допустимой?
Обнаружение недопустимой ситуации, в понимании автора, говорит об ошибках целостности программы или данных. Как правило такие ошибки означают нарушение интерфейса между отдельными частями программы, реже -- об аппаратных проблемах.
Пример, в нормальных условиях следующее предположение верно:
assert( 2+2 == 4 );
Другой пример, если подпрограмма, считающая для любой квадратной матрицы обратную, получит на вход сингулярную матрицу, такая ситуация будет нестандартной, но вполне ожидаемой (допустимой).
2. Возможен ли преодолеть нестандартную ситуацию?
Для некоторых нестандартных ситуаций возможен возврат к нормальной работе программы. Одна и та же нестандартная ситуация может быть как преодолимой, так и непреодолимой на разных уровнях абстракции.
Пример. При работе с контроллером гибких дисков через BIOS существует правило: если операция ввода/вывода завершилась с ошибкой, то прежде чем сообщать об ошибке, нужно сделать ещё две попытки выполнить эту же операцию. Если ошибка будет однократной, то её можно считать преодолимой. Если эта же ошибка повторится много раз, то на уровне конкретного вызова BIOS она непреодолима.
Ещё пример, если на уровне операций с файлами программа обнаружила непреодолимую ошибку, то на другом уровне программа может отключить функцию работы с файлами и продолжить работу.
Если нестандартная ситуация преодолима, то её обработчик должен восстанавливать нормальную работу программы. Если ситуация непреодолима, то, как правило, обработчик должен вернуть программу к состоянию предшествующему последней операции (переведшей к ошибке) и передаёт обработку состояния следующему уровню абстракции.
Мнения, высказанные здесь, отражают мои личные взгляды. И мнения и взгляды со временем могут меняться.
пятница, 18 июня 2010 г.
четверг, 26 ноября 2009 г.
Manpages для системных вызовов
Потребовалась документация для системных вызовов в linux. Вспомнил, что встречал подходящую коллекцию man-страниц. Соответствующий пакет: manpages-dev
среда, 25 ноября 2009 г.
Отключение русскоязычного интерфейса в git-gui
Сложности в отображении текста для Linux не в новинку. Видимо чтобы в приложении корректно отображался, например, русский язык, нужно учесть множество моментов. И тот или иной момент всегда упускают.
Так оказалось, что в ubuntu 9.10 имеются проблемы с отображением русских букв в интерфейсе git-gui. Поскольку для меня английский язык является техническим, и соответственно англоязычный интерфейс во многих случаях оказывается более удобным, то выбор пути решения оказался очевиден -- отключить русскоязычный интерфейс.
Самым простым способом сделать это, оказалось удалить файл:
Буду благодарен, если кто-нибудь подскажет более верный путь.
UPD: Для gitk изменения аналогичные.
Так оказалось, что в ubuntu 9.10 имеются проблемы с отображением русских букв в интерфейсе git-gui. Поскольку для меня английский язык является техническим, и соответственно англоязычный интерфейс во многих случаях оказывается более удобным, то выбор пути решения оказался очевиден -- отключить русскоязычный интерфейс.
Самым простым способом сделать это, оказалось удалить файл:
/usr/share/git-gui/lib/msgs/ru.msg
Буду благодарен, если кто-нибудь подскажет более верный путь.
UPD: Для gitk изменения аналогичные.
пятница, 20 ноября 2009 г.
Покорение GnuPlot
Возникла задача изобразить график с информацией о работе транспортного протокола. Вначале я хотел воспользоваться привычным AdvanceGrapher'ом, но у него обнаружилось ограничение на размер исходных данных. Поэтому пришлось искать альтернативу.
Потратив некоторое время на поиски и изучение, я пришёл к следующему скрипту для GnuPlot который делает почти то, что мне нужно:
Потратив некоторое время на поиски и изучение, я пришёл к следующему скрипту для GnuPlot который делает почти то, что мне нужно:
set sample 1000
set output "output.svg"
set terminal svg size 800,600 font "Helvetica, 10"
set xtics axis 5 scale 0.5
set ytics axis 10 scale 0.5
set mxtics 2
set mytics 2
set key below nobox vertical
set border 3
plot \
"bw.txt" using ($1):($2 / 1024) \
title 'bandwidth (KB)' \
with lines \
lc rgbcolor 'dark-green', \
"mw.txt" using ($1):($2 / 1024) \
title 'max_window (KB)' \
with lines \
lc rgbcolor 'dark-blue', \
"rto.txt" using ($1):($2 * 10) \
title 'rtt_timout (0.1s)' \
with lines \
lc rgbcolor 'red', \
"tout.txt" using ($1):(110) \
title 'timeouts' \
with impulses \
lc rgbcolor 'light-gray'
четверг, 27 августа 2009 г.
Приближённое вычисление функции arctg(x)
Не стал бы публиковать данное сообщение в блоге, если бы не один забавный факт.
Оказывается не для всех метрик приближение с использованием сплайнов даёт лучший результат. Например, приближение функции арктангенс на отрезке [0, 1] одним отрезком спалайна оказалось менее оптимальным, чем приближение некоторым другим многочленом третьей степени. Один из таких многочленов используется в следующем примере.
Когда мы приближаем данную функцию многочленом третьей степени, то погрешность такого приближения можно найти аналитически.
UPD:
UPD2: Математическая запись тех же формул.
Оказывается не для всех метрик приближение с использованием сплайнов даёт лучший результат. Например, приближение функции арктангенс на отрезке [0, 1] одним отрезком спалайна оказалось менее оптимальным, чем приближение некоторым другим многочленом третьей степени. Один из таких многочленов используется в следующем примере.
Когда мы приближаем данную функцию многочленом третьей степени, то погрешность такого приближения можно найти аналитически.
/**
* Реализация функции arctg(x)
* (погрешность на отрезке [0, 1] не более .00652- радиана)
*/
double atanImpl(double x)
{
return (((-0.076413) * x + (-0.13167)) * x + 1) * x;
}
/**
* Реализация функции atan2
*/
double atan2(double y, double x)
{
if (y >= 0.0) {
if (x >= 0.0) {
if (x >= y) {
return atanImpl(y / x);
} else {
return ONE_HALF_PI - atanImpl(x / y);
} else {
x = -x;
if (x < y) {
return ONE_HALF_PI + atanImpl(x / y);
} else {
return PI - atanImpl(y / x);
}
} else {
if (x <= 0.0) {
if (x <= y) {
return - PI + atanImpl(y / x);
} else {
return - ONE_HALF_PI - atanImpl(x / y);
}
} else {
x = -x;
if (x > y) {
return - ONE_HALF_PI + atanImpl(x / y);
} else {
return - atanImpl(y / x);
}
}
}
}
}
UPD:
/**
* Реализация функции arctg(x)
* (погрешность на отрезке [0, 1] не более .0049- радиана)
* http://www.autex.spb.ru/download/...
* .../dsp/dspa/dspa2006/t1/1-42.pdf
*/
double atanImpl(double x)
{
return (32 * x) / (32 + 9 * x * x);
}
UPD2: Математическая запись тех же формул.
среда, 8 июля 2009 г.
Трудно искать чёрную кошку в тёмной комнате, особенно если её там нет
Несколько дней пытался придумать способ, как эффективно организовать произвольный доступ к коллекции, поверх inputIterator'ов. И это всё в stateLess окружении.
воскресенье, 14 июня 2009 г.
И прошёл год
Вот и прошёл очередной год. Даже больше. Поступив в аспирантуру, в этом году я не смог организовать очередной турнир программ. И турнир прошёл без меня. И знаете, я этому рад. Это значит, что я далеко не последний энтузиаст в этой области.
Но дневник я всё таки попробую вести.
Подписаться на:
Сообщения (Atom)