Как стать автором
Обновить
  • по релевантности
  • по времени
  • по рейтингу

Создаём парсер для ini-файлов на C++

C++ *
В данной статье я расскажу как написать свой парсер ini-файлов на C++. За основу возьмём контекстно-свободную грамматику, построенную в моей предыдущей статье. Для построения парсера будет использоваться библиотека Boost Spirit, которая позволяет строить свои собственные парсеры комбинируя готовые примитивные парсеры при помощи парсерных комбинаторов.

Важно: в данной статье предполагается, что читатель знаком с основами C++ (в том числе будет активно использоваться STL). Если вы не очень в себе уверены, то я советую сначала прочитать пару статей для новичков по С++ и по STL.
Читать дальше →
Всего голосов 68: ↑58 и ↓10 +48
Просмотры 33K
Комментарии 43

Открытие Boost.Filesystem

Чулан
Сегодня в очередной раз почувствовал себя идиотом.

В проекте, которым я сейчас занимаюсь мне потребовалось реализовать небольшую подпрограмку, которая бы занималась тем, что мониторила определённую папку (upload) и в случае появления там нового файла оповещала об этом удалённую систему по RPC. (Непосредственно мониторинг я реализовал при помощи inotify)

Так как я люблю ООП и не люблю процедурное программирование системных вызовов opendir и readdir мне показалось мало и я реализовал небольшой набор классов для работы с файловой системой по всем канонам ООП: абстрактный класс FSItem (с методами getName, getPath, с чисто виртуальными методами isFile, isDir) от которого наследуются Directory (с методом append) и RegularFile. Хотя скорее эти классы не служат для работы с файловой системой, а больше для хранения структуры какой-то директории в вот такой модели.

Так вот… Всё это уже реализовано в Boost.Filesystem.

Мораль: надо бы книжку купить по boost, хоть на английском языке (на русском похоже нету). Читать полную документацию по boost на работе правда некогда. (Зато есть время писать в блог… Мда.) А так перед сном можно пару страничек просмотреть и уже умнее стану.
Всего голосов 12: ↑6 и ↓6 0
Просмотры 2.3K
Комментарии 12

Итератор по кортежу (boost)

Чулан
Итератор по кортежу И так, нам нам нужно огранизованно пройтись по всем членам кортежа. Мне это понадобилось для сохранения в xml — файл конструкций типа std::vector<boost::tuple<...>>. Кстати, пишу я это в Qt.

Ну да ладно, к делу.
Читать дальше →
Всего голосов 25: ↑5 и ↓20 -15
Просмотры 497
Комментарии 3

Вышел ReSharper 4.5.1 и первые Nightly билды ReSharper 5.0 for VS 2010

.NET *
image
Это Maintenance release, который является бесплатным апдейтом на 4.x-тую версию.
Список изменений
Новые «Short ReSharper demos»
Сам релиз
Читать дальше →
Всего голосов 14: ↑6 и ↓8 -2
Просмотры 487
Комментарии 10

Boost это просто. Часть 2. Boost.Date_time

C++ *
Как вы уже поняли, в данной статье речь пойдет о библиотеке Boost.Date_Time. Библиотеке по работе со временем.
 
 
 

В статье мы рассмотрим следующие части библиотеки:

  • Gregorian
  • Posix Time
  • Local Time


Читать дальше →
Всего голосов 37: ↑34 и ↓3 +31
Просмотры 32K
Комментарии 16

вышел boost 1.40.0

Чулан
Как-то незаметно еще в конце августа вышла новая версия библиотеки boost.
Исправлено большое количество багов а также обновлена документация.

www.boost.org/users/download/version_1_40_0
Всего голосов 10: ↑6 и ↓4 +2
Просмотры 265
Комментарии 3

DSL для boost::MPL, превращаем f(x) в f<x>::type

C++ *
Краткое содержание статьи (для тех кто знаком с boost::mpl), typename опущены для ясности:
a = b;				==>		typedef b a;
f(x)				==>		f<x>::type
f(x) { return x*; }		==>		template<typename x> struct x { typedef x* type; };
f()(x)				==>		f::apply<x>::type
a[x]				==>		mpl::at<a, x>::type
(x ? y : z)			==>		mpl::if_<x, y, z>::type
switch (if_<x, y, z>)		==>		*Уфф*, общая (default) и частичные специализации
{
	case if_<bool_<false>, y, z>: return y;
	default: return z;
}

Под хабракатом есть немного пояснений :)
Читать дальше →
Всего голосов 27: ↑22 и ↓5 +17
Просмотры 3.1K
Комментарии 14

Практическое использование Boost.Spirit

C++ *
Я заметил, у разработчиков совершенно полярное отношение к библиотеке Boost.Spirit: либо она им жутко не нравится, либо они фанатеют от нее. Конечно, описывать грамматику на C++ – занятие на любителя. Таким любителем оказался и я, когда познакомился со Спиритом. Хочу показать, как с помощью Спирита можно довольно просто решать повседневные задачи разбора текста.

Простая задача – как два пальца


На Спирите очень удобно писать маленькие парсеры «не отходя от кассы» – прямо в C++ коде. Вот например, как вы поступите если нужно распарсить строку вида «число-число», которая задает диапазон страниц для печати? На Спирите – одна строчка:

bool ok = parse(First, Last, (uint_ >> L"-" >> uint_), MinMax) && (First == Last);


Посложнее…


Более того – можно ненамного сложнее создавать и парсеры побольше. В качестве примера рассмотрю парсер мини-языка, который я делал для API Яндекс.Бара. Задача была такова: для облегчения загрузки плагинов в баре используется XML, который довольно избыточный сам по себе. Но зато XML легче грузить из JavaScript-а, чем парсить произвольный формат (на JS пишутся расширения под FireFox, в том числе и Я.Бар).

Итак, что мне было нужно – имея на входе обычную инфиксную нотацию:
Читать дальше →
Всего голосов 53: ↑48 и ↓5 +43
Просмотры 27K
Комментарии 31

Планирование задач в сервере при помощи boost.task

C++ *
Недавно на профильном ресурсе один программист задал вопрос: «Что использовать в сервере ММО для работы с потоками?». Программист склонялся к Intel TBB, но даже не к базовым примитивам, а к кастомному планированию задач (task scheduling). Ну нравится TBB — ну и ладно. А немного позже я увидел исходники сервера ММО другого программиста, который недавно начал переписываться его с нуля для улучшения архитектуры. И там было очень много велосипедов, которые писались самим программистом вместо того что бы использовать сторонние компоненты такие как boost (к примеру класы обертки над pthread-ом, и это в 2010 году, когда boost.thread уже почти в стандарте). Была там реализована и поддержка пула потоков с планировщиком задач. Тема эта мне очень интересна и я начал копать информацию о готовых решениях планировки задач (как в TBB) и нашел boost.task, про что и решил написать.
Читать дальше →
Всего голосов 42: ↑39 и ↓3 +36
Просмотры 8.4K
Комментарии 29

[C++] Сравнение структур по набору полей

Чулан

Вступление


Вероятно, всякий сталкивался с ситуацией, когда нужно написать operator== или operator< для своей структуры. Раньше я делал это как-то так:
struct data
{
	unsigned int a_ ;
	int b_ ;
	int c_ ;
	int d_ ;
} ;

bool operator<(const data & a1, const data & a2)
{
	// Сравнение по a_, b_ и d_
	if (a1.a_ != a2.a_)
		return a1.a_ < a2.a_ ;
	if (a1.b_ != a2.b_)
		return a1.b_ < a2.b_ ;
	return a1.d_ < a2.b_ ;
}

Копипаст меня удручал, но придумать ничего путного я не мог.
Читать дальше →
Всего голосов 29: ↑26 и ↓3 +23
Просмотры 3K
Комментарии 36

speedtest.net via C++

C++ *
Весь нижеприведенный код — выдержка из одного моего недавнего проекта, в рамках которого было необходимо определять скорость download и upload. Изобретать велосипед было неохота, посему возникло желание воспользоваться сервисом www.speedtest.net, как наиболее уважаемым и работоспособным из сервисов такого типа. Впрочем, как показала практика, он оказался вполне недружелюбным и некий велосипед таки пришлось изобрести.

Итак, добро пожаловать под кат.
Всего голосов 32: ↑26 и ↓6 +20
Просмотры 5.6K
Комментарии 17

Использование boost::variant для описания состояний модели

C++ *
В моделях данных очень часто требуется хранить некоторые переключаемые состояния. Классический способ в С++ для этого — использование перечислимых типов enum.

Например, если у вас в программе пользователь может переключаться между двумя экранами, вы заводите enum screen { screen_one, screen_two }; и переменную screen cur_screen_. Отрисовщик должен получить у модели «текущий выбранный экран», и затем отрисовать его, запрашивая у модели дополнительные данные, относящиеся именно к этому экрану. Что-то вроде:

switch (model.cur_screen())
{
case screen_one:
  model.get_screen_one_elements();
  ...
case screen_two:
  model.get_screen_two_elements();
  ...
}


При использовании такой модели, программист может запрашивать данные, которые для текущего состояния совершенно не актуальны. Например, вызвать метод get_screen_two_elements() для получения списка элементов второго экрана, когда текущий экран — первый. Хорошей практикой является использование ассертов вида ASSERT(cur_screen_ == screen_one) в методах, зависимых от конкретного экрана. Это обеспечивает некоторый контроль времени выполнения.

Но есть способ обеспечить контроль времени компиляции и более явное разделение состояний с помощью boost::variant.

Читать дальше →
Всего голосов 24: ↑22 и ↓2 +20
Просмотры 8.2K
Комментарии 17

Городской портал Большого Сочи на Drupal

Drupal *
Добрый день, друзья!

В октябре сего года увидел свет Макс Портал. Этот проект задуман как городской портал Большого Сочи. На данный момент там есть новости (в том числе фоторепортажи и видеосюжеты) и каталог предприятий — «желтые страницы» города с привязкой к карте. В планах — множество полезных разделов: погода, афиша, веб-камеры, онлайн-приемные чиновников, поиск работы, недвижимость, туризм и т.д. Запуск раздела «Погода» запланирован на январь.

В работе сайта задействованы следующие модули: Quicktabs, Panels, Mini Panels, Workflow, Boost, Chaos Tools, Date, Calendar, Drupal Wiki, Modal Frame, Nodequeue, Taxonomy Filter, Taxonomy Image, Vote Up/Down, Yandex Map и так далее.

Будем признательны за ваши комментарии, советы и пожелания!
Всего голосов 14: ↑8 и ↓6 +2
Просмотры 4K
Комментарии 18

Пути к файлам

C++ *
Казалось бы — что может быть проще, чем работа с файлами в C++. Но отдельные личности поражают своей находчивостью в поиске наихудшего подхода.
Не стоит делать так:

std::string filepath("C:\\тест");
std::ofstream file(filepath.c_str());


Почему?
Всего голосов 63: ↑52 и ↓11 +41
Просмотры 57K
Комментарии 49

Производительность shared_ptr и C++11: почему я не верю библиотекам

C++ *
Здравствуйте!

Оптимизировал я однажды критический участок кода, и был там boost::shared_ptr… И понял я: не верю я библиотекам, хоть и пишут их дядьки умные.

Детали под катом.
Читать дальше →
Всего голосов 84: ↑72 и ↓12 +60
Просмотры 24K
Комментарии 49

[asio::udp] Не кроссплатформенное поведение

C++ *
Из песочницы
Итак, представьте ситуацию: у нас есть кроссплатформенный сервер который должен получать данные по UDP. Вооружившись Asio вы создаете сокет, создаете буфер для принимаемых данных и начинаете слушать.

udp::socket receiver(ios, udp::endpoint(udp::v4(), port));
char read_buf[buf_len];
udp::endpoint sender_point;
receiver.receive_from(buffer(read_buf, sizeof(read_buf)), sender_point);


Что произойдет если в полученной дейтаграмме будет больше данных, чем вы выделили для буфера?
Читать дальше →
Всего голосов 37: ↑31 и ↓6 +25
Просмотры 2.7K
Комментарии 16

Интеграция Python и C++

Блог компании PENXY Python *C++ *
Всем доброго времени суток!

Недавно при прототипировании одной из частей разрабатываемого нами продукта возникла одна интересная задача: нужно было проверить склейку Python и C++. Связано это было с тем, что основной код был написан на плюсах, и необходимо было подключить внешнюю библиотеку Websockets, написанную на Python (на тот момент не было соответствующей библиотеки на C++). Схема взаимодействия при такой задаче достаточно простая. Из C++ вызывается функция подключения к серверу (на python), в качестве параметра передается его адрес. Соответственно, при получении сообщния Python передавает его обратно в метод C++.
Читать дальше →
Всего голосов 24: ↑23 и ↓1 +22
Просмотры 45K
Комментарии 13

Практика работы со временем в разных часовых поясах в unix-like системах

C++ *
Из песочницы
Если ваше приложение зависит не только от локального времени, но и от его представлении в других часовых поясах, вы наверняка сталкивались со сложностью представления времени в разных временных зонах. Не сталкивались? Значит вы не портировали своё приложение в мир Unix.

Действительно, в ОС Windows для работы с временными зонами программисту предоставляется удобный набор специализированных функций WinAPI. Примером могут служить структура TIME_ZONE_INFORMATION и функция GetTimeZoneInformation к ней в придачу.

Но что делать, если вам необходимо знать смещение относительно UTC+0, правила перехода на «летнее время», учитывать при этом високосные годы с високосными секундами и прочую специфическую информацию для какого-нибудь региона, да всё это в unix-подобных операционных системах? Статья посвящена практике работы со всем этим барахлом на языке C/C++.
Читать дальше →
Всего голосов 20: ↑18 и ↓2 +16
Просмотры 3.1K
Комментарии 1

Portable Components, кроссплатформенная библиотека для C++

C++ *
Из песочницы
«Система должна быть спроектирована так,
чтобы оставаться как можно проще
после серии внесенных в нее изменений»

Бьярне Строуструп – программист, автор языка C++

Преамбула


В данной статье мне бы хотелось бы рассказать о довольно популярной, но так редко освещаемой на Хабре библиотеке Portable Components (сокр. POCO). Она будет полезна как разработчикам бизнес-логики программного продукта, так и в решении большинства прикладных задач. При всем изобилии кроссплатформенных библиотек для C++ всё больше людей сталкиваются с POCO лицом к лицу и не знают с чего начать. В данной статье я постараюсь описать технологии, заложенные в библиотеке и дать простейшие примеры решения некоторых задач. Также хотелось бы отметить, что за плечами библиотеки множество успешных как Open Source, так и коммерческих проектов.
Читать дальше →
Всего голосов 80: ↑80 и ↓0 +80
Просмотры 23K
Комментарии 40