Написанием модульных тестов можно не только повысить скорость разработки за счет экономии времени на отладке, но и повысить качество. Также написание тестов позволяет критично взглянуть на интерфейсы классов и функций, что выливается в создание простых и логичных интерфейсов. Но разработка с применением тестов может не принести ощутимых плодов из-за сложности написания тестов, что выльется в слабое покрытие кода тестами. Поэтому инструмент для тестирования должен быть максимально простым, написание тестов должно происходить с приложением минимального количества усилий. Я пользовался фреймворком для написания тестов UnitTest++ – это очень хороший и удобный инструмент и если вы не используете Boost, я бы порекомендовал обратить на него пристальное внимание. Но в данной заметке речь пойдет не о нем, а о фреймворке Boost Test.
CMake и Boost
В этой заметке я хочу рассмотреть тему сборки проектов использующих библиотеки Boost. Мы рассмотрим проект из исполняемого файла использующего Boost Thread и двух библиотек использующих Boost Unit Test Framework.
Первым делом необходимо установить значения переменных отвечающих за тип линковки библиотек (статическая или динамическая):
set (Boost_USE_STATIC_LIBS ON)
И использование многопоточности библиотеками:
set (Boost_USE_MULTITHREADED ON)
После этого можно выполнить уже знакомую по заметке о CMake и QT команду find_package:
find_package (Boost COMPONENTS список_нужных_модулей REQUIRED)
Дополнительно можно указать необходимую версию Boost:
find_package (Boost 1.35.0 COMPONENTS список_нужных_модулей REQUIRED)
В случае если Boost корректно установлен, результатом работы команды будет создание переменных содержащих директории с заголовочными файлами Boost и пути к необходимым библиотекам:
include_directories(${Boost_INCLUDE_DIRS}) ... target_link_libraries (${PROJECT} ${Boost_LIBRARIES})
CMake и Qt
В заметке представлен способ сборки программ использующих библиотеку Qt. Рассмотрены вопросы локализации приложения и подключения ресурсов, например изображений.
Помимо файлов с примерами есть файл с шаблоном приложения, используя который можно быстро создать достаточно сложный проект.
Сборка проектов с CMake. Введение
Для автоматизации сборки проектов традиционно используют системы сборки, такие как make на Unix подобных системах и nmake для компилятора Microsoft. Также традиционно написание файлов для сборки проекта под эти системы является задачей нетривиальной. Конечно в пользуясь только Mictosoft Visual Studio можно даже не подозревать о существовании этих файлов, так как интегрированная среда разработки достаточно удобно скрывает всю кухню, оставляя снаружи несколько диалоговых окон и кнопку Build. Но для сложных проектов использующих массу сторонних библиотек и кроссплатформенных проектов такой подход часто оказывается неприемлемым.
Кратко говоря make-файл представляет из себя описания последовательности действий необходимых для того чтобы достичь какой либо цели, например скомпилировать программу. На псевдокоде это может выглядеть примерно так:
Что нужно сделать?
Собрать программу hello_world.
Как ее делать?
Взять файлы hello_world.h и hello_world.cpp и запустить компилятор передав их в качестве параметров.
Что делать когда компилятор закончит работать?
Взять получившийся в результате работы компилятора объектный файлы hello_world.o и запустить линковщик передав ему этот файл.
Все.
Причем каждый подпроект может иметь свой файл сборки, а главный make-файл сможет пройти рекурсивно по подпроектам, выполнив его файл сборки, а потом собрать проект из этих компонентов.
Выглядит все просто, проблемы возникают дальше и проблем несколько:
- Разрешение зависимостей возникающих между частями проекта
- Синтаксическая сложность и неоднозначность классических make-файлов
- Привязка к конкретной утилите автоматической сборки и как следствие непереносимость на другие платформы
Для решения части этих проблем или всех сразу были созданы следующие инструменты: Automake (http://sourceware.org/automake/) , CMake (http://www.cmake.org/), SCons (http://www.scons.org/). Список далеко не полный.
Я предлагаю рассмотреть CMake, как простой для изучения, понятный, мощный и кроссплатформенный инструмент, который решает сразу все три проблемы. Подробности ниже.
Работа с ветвями в SVN
От основной ветки разработки можно отделить ветвь являющуюся ее копией на данный момент времени. Этим решаются следующие задачи:
- Фиксация состояния разработки (например выпуск новой версии) к которому можно будет вернуться в любой момент.
- Разработка независимо от основной ветви — актуально когда над проектом работают несколько разработчиков.
В этой заметке будут рассмотрены эти возможности, а также подводные камни работы с ветками и о том как их избежать.
Публикация кода online
Иногда бывает нужно проверить немного кода, а компилятора под рукой нет. Или возникает необходимость обсудить что-либо с человеком доступным в данный момент только через сеть. В этом случае здорово выручит замечательный сайт Codepad. Без регистрации, быстро и удобно можно скомпилировать программу, посмотреть вывод, получить короткую ссылку которой можно поделиться с людьми и даже устроить небольшое обсуждение (вот для этого правда придется зарегистрироваться).
Поддерживаются языки: C, C++, D, Haskell, Lua, OCaml, PHP, Perl, Python, Ruby, Scheme, Tcl.
Немного погонял на C++ — ключевые слова подсвечиваются, сообщения об ошибках адекватные, можно даже использовать Boost! Резюмирую — отличный ресурс!
Повторяю ссылку: codepad.org
WordPress, myStat и проблемы с RSS
Сегодня прикручивая к блогу подписку по RSS обнаружил, что записи не проходят валидацию. Валидатор ругался на следующий кусок:
<img style='margin:0;padding:0;border:0;' width='1px' height='1px' src="http://www.devexp.ru/.../plugins/mystat/mystat.php?act=time_load&id=123&rnd=123456789" />
Из чего несложно догадаться, что виновником является плагин myStat. Поиск решения в интернете успехом не увенчался, не удалось связаться и с автором — Смышляевым Евгением, так как на его сайте к сожалению нет ни адреса электронной почты, ни другой контактной информации. Но мы так просто не отступаем и я полез в код. Очевидно, что приведенный фрагмент отвечает за работу счетчика, пользователю показывают невидимую картинку, тем самым накапливая статистику, что в рассылке совершенно не требуется, а значит от этого там можно безболезненно избавиться. Сходу удалось найти место где формируется данный HTML код — это функция myStat_footer() в файле mystat.php:
1 2 3 4 5 | function myStat_footer(){ global $cmn; if($cmn->getParam("myStat_debug")==1){$cmn->setDebug('FOOTER LOAD');}; echo "<img style='margin:0;padding:0;border:0;' width='1px' height='1px' src=\"".WP_PLUGIN_URL."/".dirname(plugin_basename(__FILE__))."/mystat.php"."?act=time_load&id=".$GLOBALS['myStat_id']."&rnd=".rand()."\" />"; } |
Небольшие исправления:
1 2 3 4 5 6 7 | function myStat_footer(){ if(!is_feed()){ global $cmn; if($cmn->getParam("myStat_debug")==1){$cmn->setDebug('FOOTER LOAD');}; echo "<img style='margin:0;padding:0;border:0;' width='1px' height='1px' src=\"".WP_PLUGIN_URL."/".dirname(plugin_basename(__FILE__))."/mystat.php"."?act=time_load&id=".$GLOBALS['myStat_id']."&rnd=".rand()."\" />"; } } |
И проблема решена.
Как хранить проекты в хранилище кода?
Проект состоит как из своего кода, так и из библиотек сторонних разработчиков. Естественно возникает вопрос как хранить это добро. На этот вопрос я попытаюсь дать рекомендации на основании собственного опыта.
Основные требования:
- Разработчик должен быстро приступить к работе не забивая голову установкой десятка библиотек.
- Библиотеки должны быть доступны из разных проектов, при этом необходимо избежать дублирования кода в репозиториях.
- Должна быть возможность сохранять определенные состояния проекта: новые версии, номерные сборки для тестеров и т.д.
Системы управления версиями на примере Subversion. Введение
До моей первой работы в качестве программиста, я решительно ничего не знал о системах управления версиями, даже данный термин был для меня пустым звуком. Объяснить что это такое и для чего оно вообще нужно, никто не посчитал нужным, поэтому пришлось выяснять это самому. Да, на некоторое время я просто возненавидел сам процесс комита, когда мне говорили, что нужно файлы добавить в таг, я бледнел, а уж когда CVS мне сообщала о конфликте в коде, я просто паниковал. На самом деле это просто еще один полезный инструмент, просто нужно понять для чего он и показать пару приемов. Собственно заметка об этом.
Заводим блог
Собственно первая заметка, по горячим следам, пока не забыл. Посвящена установке и настройке блога. Сразу предупреждаю, что опыта в этом у меня решительно нет, но сложностей не возникло и за пару вечеров удалось разобраться и запустить сайт, что говорит том, настроить свой блог задача для программиста более чем посильная.
Что для этого нужно?
- Хостинг
- Движок
- Все настроить
- Настройка движка
- Установка темы
- Плагины
