hypot
hypot(x, y)
создан, что бы не звать sqrt(x*x + y*y)
Подробности:
- man 3 hypot
- http://en.wikipedia.org/wiki/Hypot
hypot(x, y)
создан, что бы не звать sqrt(x*x + y*y)
Подробности:
http://freetype.sourceforge.net/david/reliable-c.html
UPD 2014-06-09: сменил ссылку, прошлая убилась
http://publib.boulder.ibm.com/infocenter/iseries/v5r3/index.jsp?topic=%2Frzahg%2Frzahgicprog2.htm - iSeries Information Center, версия 5, выпуск 3
В разделе есть примеры кода, достаточно много про сокеты написано (в том числе и мультикаст и SSL).
find_package(Boost REQUIRED COMPONENTS system)
undefined reference to 'boost::tss_cleanup_implemented()'
?thread
, а в случае windows (и кроскомпиляции): thread_win32
, т.е. необходимо писать что-то вроде такого кода:
set(BOOST_COMPONENTS
program_options
system)
# Boost thread library is different on Win/Linux
if(WIN32)
set(BOOST_COMPONENTS ${BOOST_COMPONENTS} thread_win32)
else()
set(BOOST_COMPONENTS ${BOOST_COMPONENTS} thread)
endif()
...
find_package(Boost COMPONENTS ${BOOST_COMPONENTS} REQUIRED)
add_definitions(-DBOOST_THREAD_USE_LIB=1)
namespace boost {
void tss_cleanup_implemented() { }
}
Если коротко: функиця заполняет структуру типа in_addr
, преобразуя сведения о хосте из строкового представления.
У winsock2 нет такой функции. Есть более продвинутый аналог inet_pton, в POSIX он тоже есть, да вот только mingw про неё в windows не знает. Пичалька.
Поэтому делаем примерно следующее:
#ifdef WIN32
static int inet_aton(const char *cp, struct in_addr *inp)
{
if (cp == 0 || inp == 0)
{
return -1;
}
unsigned long addr = inet_addr(cp);
if (addr == INADDR_NONE || addr == INADDR_ANY)
{
return -1;
}
inp->s_addr = addr;
}
#endif
не верх совершенства и корректности, но для моих целей работало.
По сути парочка дополнений для этой статьи: http://mingw-cross.sourceforge.net/cross_debug.html
Задача: есть win32 приложение, собранное путём кросс-компиляции при помощи cmake и mingw32, нужно запустить его в отладчике и поймать на чём оно падает.
Необходимый инстументарий:
Бинарную версию нужно будет распаковать, например в ~/bin/mingw32-gdb-win32/. В директорию ~/bin/mingw32-gdb-win32/bin/ при этом следует сделать следующие симлинки:
cd ~/bin/mingw32-gdb-win32/bin/
ln -s /usr/i486-mingw32/bin/libexpat-1.dll .
ln -s /usr/i486-mingw32/bin/libiconv-2.dll .
ln -s /usr/i486-mingw32/bin/libintl-8.dll .
Всё. Впринципе всё готово для отладки.
1. Запускаем клиент gdb:```bash
i486-mingw32-gdb test-app.exe
unsigned long arg = 1;
ioctlsocket(sockfd, FIONBIO, &arg);
в Linux:
int arg = fcntl(sockfd, F_GETFL, NULL);
arg |= O_NONBLOCK;
fcntl(sockfd, F_SETFL, arg);
или универсальная функция:
void setSockNonblock(int sockfd)
{
#ifdef WIN32
unsigned long arg = 1;
ioctlsocket(sockfd, FIONBIO, &arg);
#else
int arg = fcntl(sockfd, F_GETFL, NULL);
arg |= O_NONBLOCK;
fcntl(sockfd, F_SETFL, arg);
#endif
}
Занимаясь разработкой небольшой программы, использующей сокеты, потоки и не использующей фреймворков, типа Qt, столкнулся с необходимостью собрать это дело для Windows. Подводных камней оказалось много, как результат познакомился с такими милыми сущностями, как Boost.Thread и Boost.Asio.
Но тут вспомнилось, как мне уже приходилось собирать под Windows окружение, для компиляции исходников, использующих Boost и стало грустно. Грустно настолько, что оказалось проще сделать бинарники путём кросс-компиляции. И вот, когда дело было сделано, натыкаюсь на этот ресурс:
http://nuwen.net/mingw.html
Стефан (автор этого поделия) предоставляет сборку MinGW включающую сам компилятор, набор полезных библиотек (включая Boost 1.47.0!) и некоторых полезных утилит. Пакет не требует установки, просто распаковываем в c:
mingw и пользуемся.
Так что на будущее, буду пробовать.
Внезапно, правда? :)
Но волей судеб нужно было портировать программку, в которой использовался nanosleep(2). И…
Для внезапно стало откровением: В WINDOWS НЕТ ТАЙМЕРОВ ВЫСОКОГО РАЗРЕШЕНИЯ. А есть только по сути хаки и вызов Sleep, с минимальным промежутком в 10мс.
Наиболее часто рекомендуемый вариант:
void sleep_nsec(int64_t interval)
{
int64_t time1 = 0, time2 = 0, sysFreq = 0;
QueryPerformanceCounter((LARGE_INTEGER *) &time1);
QueryPerformanceFrequency((LARGE_INTEGER *) &sysFreq);
do
{
QueryPerformanceCounter((LARGE_INTEGER *) &time2);
} while(((time2-time1)*1000.0*1000.0/(double)(sysFreq)) < interval);
}
Но тут мы упираем процессор в полку. Есть вариант с использованием select, но, по отзывам, он так же может ждать не менее 10мс.
Т.е., по сути, это единственный вариант для Windows, да ещё и не лишённый глюков: почти все процессоры уже умеют автоматическое понижение частоты… Чуете? Пока работает цикл, значение sysFreq может измениться (поправьте меня, если я не прав) и время потекло.
Кроме того, наткнулся на статью:
http://www.codeproject.com/KB/system/timers_intro.aspx - Timers Tutorial
Описываются различные вариант таймеров: стандартные win32, мультимедийные, Waitable Timers (не знаю как лучше перевести на русский язык), Queue Timers. Но опять таки, все периоды - миллисекунды.
Сегодня пролетело в рассылке:
Hi,
Qt Creator master has recently got a feature, which has been requested a few times, for Doxygen blocks generation. If you type
/**
or/*!
and press enter/return before a declaration, you’ll get something like:/*! * * <br/>param data * <br/>param options * <br/>return */ QString generate(const Data &data, const Options &options);
You can also opt whether or not you want an additional
<br/>brief
command and leading asterisks for comment continuation (when breaking lines). The options are in Text Editor->Completion->Documentation Comments.Notice that the style is identified from the comment beginning. If you start it with
/*!
then the Qt style is used. Otherwise, the Java style with the@
prefix for the commands is picked.Cheers, Leandro
Проверил - работает, удобно :)
Шаг 1. Взять sqlite-jdbc отсюда: http://www.xerial.org/trac/Xerial/wiki/SQLiteJDBC или при помощи Maven (описание по той же ссылке)
Шаг 2. Положить у себя в проект класс SQLiteDialect, взятый отсюда: http://arnoraps.tweakblogs.net/blog/3146/hibernate-with-sqlite.html или из архива отсюда: http://code.google.com/p/hibernate-sqlite/ (HibernateSQLite.zip)
Шаг 3. В конфигурацию Hibernate добавить примерно следующее: ```xml
…
На правах заметки:
Подробности подкатом
Отличный, по моему мнению, туториал по Hibernate:
особенно хорошо показаны построения отношений между таблицами.
В последней Java6 не включена tzdata с информацией о том, что в России, сейчас нет перехода на зимнее время. Дальнейшие пояснения излишни.
Как фиксить? Обновить tzdata при помощи предлагаемой ораклом утилиты:
После очередного обновления, заметил, что Опера перестала стартовать. При запуске из терминала, вываливает следующее:
$ opera
(opera:13093): Gtk-CRITICAL **: IA__gtk_widget_unrealize: assertion `GTK_IS_WIDGET (widget)' failed
(opera:13093): Gtk-CRITICAL **: IA__gtk_widget_is_toplevel: assertion `GTK_IS_WIDGET (widget)' failed
opera [crash logging]: CRASH!!
/usr/lib/opera/opera got signal SIGSEGV at address B6B26E77
Log was created here:
/var/tmp/crash20111110210615.txt
Убито
Для столкнувшихся с этой же проблемой в ArchLinux: