SlideShare a Scribd company logo
1 of 8
Download to read offline
Изучение проблемы: перенос Си++
библиотек для работы с облаками
точек итриангулированными сетками
на 64-битную платформу
Автор: Евгений Рыжков

Дата: 15.01.2009


Аннотация
Итальянская компания E.G.S. S.r.l. занимается разработкой решений в области моделирования
трехмерных объектов на базе триангулированных сеток.


Введение
Итальянская компания E.G.S. S.r.l. занимается разработкой решений в области моделирования
трехмерных объектов на базе триангулированных сеток.




Для этой цели она использует собственную библиотеку компонентов Leios Components. Когда
компании E.G.S. S.r.l. понадобилось выпустить 64-битную версию своих компонентов, она
обратилась к ООО "СиПроВер" как к компании, специализирующейся на разработке анализаторов
кода для 64-битных и параллельных приложений.
Библиотека компонентов Leios Components




Библиотека компонентов Leios Components представляет собой набор различных библиотек:

   1. Программный интерфейс для работы с облаками точек и триангулированными сетками.
   2. Библиотека подгонки поверхностей.
   3. Библиотека для обработки граней и ребер.

Общий объем исходного кода составляет 13 мегабайт (440 000 строк кода), решение состоит из
нескольких десятков проектов. Очевидно, что перенос такого объема кода на 64-битную систему
вручную представляется затруднительным, особенно учитывая сложность математических
алгоритмов.

Для того чтобы представить себе тип кода, который содержится в библиотеке, достаточно
посмотреть основные возможности трех указанных компонентов.


Программный интерфейс для работы с облаками точек и
триангулированными сетками
   •   Библиотека содержит процедуры импорта/экспорта облаков точек и триангулированных
       поверхностей (форматы ASCII, STL, PLY, OBJ, VRML и собственный формат Leios RVE).
   •   Сбор данных о сетки
   •   Элементарные операции редактирования сетки.
   •   Операции выбора облаков точек и триангулированных поверхностей.
   •   Фильтрация облаков точек, подавление шума, сглаживание, офсет.
•   Триангуляция облаков точек.
•   Восстановление триангулированной сетки, заполнение отверстий, сглаживание.




•   Прореживание и перестройка триангулированной сетки.
•   Построение сечений и разбиение триангулированной поверхности с использование
    плоскости.
•   Создание плоских, цилиндрических или сферических поверхностей из частей сетки.




•   Соединение нескольких облаков точек или триангулированных сеток в единый объект.
•   Визуализация облака точек и триангулированной поверхности с помощью библиотеки
    OpenGL.
•   Регистрация триангулированных поверхностей или облаков точек.




•   Процедуры псевдо трехмерной триангуляции (2.5D).
•   Триангуляция облаков точек внутри заданного внешнего контура.
•   Использование временных файлов для осуществления редактирования больших облаков
       точек в 32 битной среде.
   •   Триангуляция между двумя ломаными линиями.
   •   Процедура пластической деформации самопересечений сетки.
   •   Процедура пластической деформации пересечения ломаных линий двух сеток.
   •   Процедура сглаживания ломаных линий и уменьшения размера.
   •   Процедура пластической деформации поперечного сечения сетки через две точки на
       сетке.
   •   Процедуры импорта-экспорта с поддержкой координат центра масс с двойной точностью.
   •   Процедура автоматического объединения объектов.


Библиотека подгонки деталей
Это расширение библиотеки для управления необработанными NURBS поверхностями при
использовании подгонки.

   •   Спецификация четырехгранных конфигураций на триангулированной сетке.
   •   Автоматическая подгонка поверхностей с автоматической коррекцией NURBS кривыми.
Библиотека обработки граней и ребер
Эта библиотека расширения осуществляет:

   •   Автоматическое выделение линий скруглений (кривых граней, центральной кривой сетки,
       кривых ребер).
   •   Разбиение сетки на участки без участия скруглений, которые могут быть подогнаны к
       необработанным NURBS поверхностям.
Необходимость миграции библиотеки компонентов на 64-битную
платформу
Компания E.G.S. S.r.l. занимается разработкой своих решений с 2002 года, когда в Италии был
открыт ее офис. С самых ранних этапов разработки компании были ориентированы на
высокопроизводительные настольные системы.

Минимальный компьютер, на котором работает решение E.G.S. S.r.l. имеет следующую
конфигурацию (по данным на начало 2008 года):

   •   Процессор: Intel Core Duo T2300 or higher, AMD X2 3800+ or higher.
   •   Оперативная память: 2GB
   •   Графическая карта: Nvidia Quadro / 6x series or higher, ATI/AMD "x" series / FireGL or higher.
   •   Операционная система: Windows XP Professional SP2 or higher, Windows Vista

В связи с ростом обрабатываемых объемов данных, разумеется, ограничения на оперативную
память 32-битной версии (не более 3 гигабайт) оказались недостаточными для серьезных
проектов. Поэтому необходимость выпуска 64-битной версии не вызывала вопросов у
руководства E.G.S. S.r.l.. Однако под вопросом была возможность быстрого выпуска подобной
версии. Вручную просмотреть указанный объем кода практически невозможно.


Участие компании ООО "СиПроВер" в миграции библиотеки
компонентов
На помощь пришли специалисты компании ООО "СиПроВер", которые использовали для
миграции кода на 64-битную платформу анализатор кода Viva64.

Программный продукт Viva64 обеспечивает диагностику ошибок, специфичных для 64-битных
Windows-приложений. Viva64 представляет собой lint-подобный статический анализатор Си/Си++
кода. Области применения Viva64: проверка новых 64-битных программных решений, помощь в
переносе 32-битного программного кода на 64-битную систему, оптимизация кода с учетом
особенностей 64-битной архитектуры.

Используя Viva64 специалисты ООО "СиПроВер" обеспечили быструю миграцию библиотеки
компонентов, обнаружив и исправив проблемные места в исходном коде библиотеки. В
результате в процессе миграции такой большой и сложной библиотеки были задействованы всего
лишь несколько человек.

Миграция кода с использованием Viva64 позволила сэкономить много времени, которое бы
пришлось затратить на ручной просмотр кода. А главное не допустить новых программных
ошибок, которые возможны в процессе миграции на новую платформу.

Основные проблемные моменты, выявленные в процессе анализа кода:

   •   особенности вычислительных алгоритмов при обработке больших объемов данных;
   •   работа с файлами большого размера;
   •   обработка 3d-моделей, содержащих большое количество треугольников (чем больше
       треугольников, тем точнее модели);
   •   работа подсистемы лицензирования;

Все обнаруженные с помощью анализатора Viva64 проблемы были исправлены, в результате чего
64-битная версия Leios Studio была выпущена в срок с высоким качеством.

E.G.S. S.r.l. - частная компания, миссией которой является разработка программ и решений для
развитой обработки результатов 3D сканирования. Офисы компании были открыты в Италии и в
Москве в 2002 году. Сайт: http://www.egsolutions.com.

More Related Content

Similar to Изучение проблемы: перенос Си++ библиотек для работы с облаками точек итриангулированными сетками на 64-битную платформу

What's new in Visual Studio 2012
What's new in Visual Studio 2012What's new in Visual Studio 2012
What's new in Visual Studio 2012
InTRUEdeR
 
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Ontico
 
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
Ontico
 
Javascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только одинJavascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только один
Sergey Xek
 
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Ontico
 
Программный комплекс "НейроКС"
Программный комплекс "НейроКС"Программный комплекс "НейроКС"
Программный комплекс "НейроКС"
kulibin
 
Cовременный станок верстальщика
Cовременный станок верстальщикаCовременный станок верстальщика
Cовременный станок верстальщика
mcslayer
 
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
HappyDev
 

Similar to Изучение проблемы: перенос Си++ библиотек для работы с облаками точек итриангулированными сетками на 64-битную платформу (20)

What's new in Visual Studio 2012
What's new in Visual Studio 2012What's new in Visual Studio 2012
What's new in Visual Studio 2012
 
Паттерны 64-битных ошибок в играх
Паттерны 64-битных ошибок в играхПаттерны 64-битных ошибок в играх
Паттерны 64-битных ошибок в играх
 
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
 
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
 
How to cook a blockchain and not get burned
How to cook a blockchain and not get burned How to cook a blockchain and not get burned
How to cook a blockchain and not get burned
 
Javascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только одинJavascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только один
 
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
 
PVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложенийPVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложений
 
Программный комплекс "НейроКС"
Программный комплекс "НейроКС"Программный комплекс "НейроКС"
Программный комплекс "НейроКС"
 
Урок 27. Особенности создания инсталляторов для 64-битного окружения
Урок 27. Особенности создания инсталляторов для 64-битного окруженияУрок 27. Особенности создания инсталляторов для 64-битного окружения
Урок 27. Особенности создания инсталляторов для 64-битного окружения
 
Фламп на спидах или ка релизить каждый день
Фламп на спидах или ка релизить каждый деньФламп на спидах или ка релизить каждый день
Фламп на спидах или ка релизить каждый день
 
Cовременный станок верстальщика
Cовременный станок верстальщикаCовременный станок верстальщика
Cовременный станок верстальщика
 
Евгений Батовский, Николай Птущук "Современный станок верстальщика"
Евгений Батовский, Николай Птущук "Современный станок верстальщика"Евгений Батовский, Николай Птущук "Современный станок верстальщика"
Евгений Батовский, Николай Птущук "Современный станок верстальщика"
 
Как команда PVS-Studio может улучшить код операционной системы Tizen
Как команда PVS-Studio может улучшить код операционной системы TizenКак команда PVS-Studio может улучшить код операционной системы Tizen
Как команда PVS-Studio может улучшить код операционной системы Tizen
 
Сравнение диагностических возможностей анализаторов при проверке 64-битного кода
Сравнение диагностических возможностей анализаторов при проверке 64-битного кодаСравнение диагностических возможностей анализаторов при проверке 64-битного кода
Сравнение диагностических возможностей анализаторов при проверке 64-битного кода
 
7 шагов по переносу программы на 64-битную систему
7 шагов по переносу программы на 64-битную систему7 шагов по переносу программы на 64-битную систему
7 шагов по переносу программы на 64-битную систему
 
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
 
OTUS Infrastructure as Code
OTUS Infrastructure as CodeOTUS Infrastructure as Code
OTUS Infrastructure as Code
 
Евгений Лазин. Неизменяемая структура данных HAMT для создания БД в памяти
Евгений Лазин. Неизменяемая структура данных HAMT для создания БД в памятиЕвгений Лазин. Неизменяемая структура данных HAMT для создания БД в памяти
Евгений Лазин. Неизменяемая структура данных HAMT для создания БД в памяти
 
Purely practical data structures
Purely practical data structuresPurely practical data structures
Purely practical data structures
 

More from Tatyanazaxarova

More from Tatyanazaxarova (20)

Урок 26. Оптимизация 64-битных программ
Урок 26. Оптимизация 64-битных программУрок 26. Оптимизация 64-битных программ
Урок 26. Оптимизация 64-битных программ
 
Урок 25. Практическое знакомство с паттернами 64-битных ошибок
Урок 25. Практическое знакомство с паттернами 64-битных ошибокУрок 25. Практическое знакомство с паттернами 64-битных ошибок
Урок 25. Практическое знакомство с паттернами 64-битных ошибок
 
Урок 24. Фантомные ошибки
Урок 24. Фантомные ошибкиУрок 24. Фантомные ошибки
Урок 24. Фантомные ошибки
 
Урок 23. Паттерн 15. Рост размеров структур
Урок 23. Паттерн 15. Рост размеров структурУрок 23. Паттерн 15. Рост размеров структур
Урок 23. Паттерн 15. Рост размеров структур
 
Урок 21. Паттерн 13. Выравнивание данных
Урок 21. Паттерн 13. Выравнивание данныхУрок 21. Паттерн 13. Выравнивание данных
Урок 21. Паттерн 13. Выравнивание данных
 
Урок 20. Паттерн 12. Исключения
Урок 20. Паттерн 12. ИсключенияУрок 20. Паттерн 12. Исключения
Урок 20. Паттерн 12. Исключения
 
Урок 19. Паттерн 11. Сериализация и обмен данными
Урок 19. Паттерн 11. Сериализация и обмен даннымиУрок 19. Паттерн 11. Сериализация и обмен данными
Урок 19. Паттерн 11. Сериализация и обмен данными
 
Урок 17. Паттерн 9. Смешанная арифметика
Урок 17. Паттерн 9. Смешанная арифметикаУрок 17. Паттерн 9. Смешанная арифметика
Урок 17. Паттерн 9. Смешанная арифметика
 
Урок 16. Паттерн 8. Memsize-типы в объединениях
Урок 16. Паттерн 8. Memsize-типы в объединенияхУрок 16. Паттерн 8. Memsize-типы в объединениях
Урок 16. Паттерн 8. Memsize-типы в объединениях
 
Урок 15. Паттерн 7. Упаковка указателей
Урок 15. Паттерн 7. Упаковка указателейУрок 15. Паттерн 7. Упаковка указателей
Урок 15. Паттерн 7. Упаковка указателей
 
Урок 13. Паттерн 5. Адресная арифметика
Урок 13. Паттерн 5. Адресная арифметикаУрок 13. Паттерн 5. Адресная арифметика
Урок 13. Паттерн 5. Адресная арифметика
 
Урок 11. Паттерн 3. Операции сдвига
Урок 11. Паттерн 3. Операции сдвигаУрок 11. Паттерн 3. Операции сдвига
Урок 11. Паттерн 3. Операции сдвига
 
Урок 10. Паттерн 2. Функции с переменным количеством аргументов
Урок 10. Паттерн 2. Функции с переменным количеством аргументовУрок 10. Паттерн 2. Функции с переменным количеством аргументов
Урок 10. Паттерн 2. Функции с переменным количеством аргументов
 
Урок 9. Паттерн 1. Магические числа
Урок 9. Паттерн 1. Магические числаУрок 9. Паттерн 1. Магические числа
Урок 9. Паттерн 1. Магические числа
 
Урок 8. Статический анализ для выявления 64-битных ошибок
Урок 8. Статический анализ для выявления 64-битных ошибокУрок 8. Статический анализ для выявления 64-битных ошибок
Урок 8. Статический анализ для выявления 64-битных ошибок
 
Урок 7. Проблемы выявления 64-битных ошибок
Урок 7. Проблемы выявления 64-битных ошибокУрок 7. Проблемы выявления 64-битных ошибок
Урок 7. Проблемы выявления 64-битных ошибок
 
Урок 6. Ошибки в 64-битном коде
Урок 6. Ошибки в 64-битном кодеУрок 6. Ошибки в 64-битном коде
Урок 6. Ошибки в 64-битном коде
 
Урок 5. Сборка 64-битного приложения
Урок 5. Сборка 64-битного приложенияУрок 5. Сборка 64-битного приложения
Урок 5. Сборка 64-битного приложения
 
Урок 4. Создание 64-битной конфигурации
Урок 4. Создание 64-битной конфигурацииУрок 4. Создание 64-битной конфигурации
Урок 4. Создание 64-битной конфигурации
 
Статический анализ Си++ кода
Статический анализ Си++ кодаСтатический анализ Си++ кода
Статический анализ Си++ кода
 

Изучение проблемы: перенос Си++ библиотек для работы с облаками точек итриангулированными сетками на 64-битную платформу

  • 1. Изучение проблемы: перенос Си++ библиотек для работы с облаками точек итриангулированными сетками на 64-битную платформу Автор: Евгений Рыжков Дата: 15.01.2009 Аннотация Итальянская компания E.G.S. S.r.l. занимается разработкой решений в области моделирования трехмерных объектов на базе триангулированных сеток. Введение Итальянская компания E.G.S. S.r.l. занимается разработкой решений в области моделирования трехмерных объектов на базе триангулированных сеток. Для этой цели она использует собственную библиотеку компонентов Leios Components. Когда компании E.G.S. S.r.l. понадобилось выпустить 64-битную версию своих компонентов, она обратилась к ООО "СиПроВер" как к компании, специализирующейся на разработке анализаторов кода для 64-битных и параллельных приложений.
  • 2. Библиотека компонентов Leios Components Библиотека компонентов Leios Components представляет собой набор различных библиотек: 1. Программный интерфейс для работы с облаками точек и триангулированными сетками. 2. Библиотека подгонки поверхностей. 3. Библиотека для обработки граней и ребер. Общий объем исходного кода составляет 13 мегабайт (440 000 строк кода), решение состоит из нескольких десятков проектов. Очевидно, что перенос такого объема кода на 64-битную систему вручную представляется затруднительным, особенно учитывая сложность математических алгоритмов. Для того чтобы представить себе тип кода, который содержится в библиотеке, достаточно посмотреть основные возможности трех указанных компонентов. Программный интерфейс для работы с облаками точек и триангулированными сетками • Библиотека содержит процедуры импорта/экспорта облаков точек и триангулированных поверхностей (форматы ASCII, STL, PLY, OBJ, VRML и собственный формат Leios RVE). • Сбор данных о сетки • Элементарные операции редактирования сетки. • Операции выбора облаков точек и триангулированных поверхностей. • Фильтрация облаков точек, подавление шума, сглаживание, офсет.
  • 3. Триангуляция облаков точек. • Восстановление триангулированной сетки, заполнение отверстий, сглаживание. • Прореживание и перестройка триангулированной сетки.
  • 4. Построение сечений и разбиение триангулированной поверхности с использование плоскости. • Создание плоских, цилиндрических или сферических поверхностей из частей сетки. • Соединение нескольких облаков точек или триангулированных сеток в единый объект. • Визуализация облака точек и триангулированной поверхности с помощью библиотеки OpenGL. • Регистрация триангулированных поверхностей или облаков точек. • Процедуры псевдо трехмерной триангуляции (2.5D). • Триангуляция облаков точек внутри заданного внешнего контура.
  • 5. Использование временных файлов для осуществления редактирования больших облаков точек в 32 битной среде. • Триангуляция между двумя ломаными линиями. • Процедура пластической деформации самопересечений сетки. • Процедура пластической деформации пересечения ломаных линий двух сеток. • Процедура сглаживания ломаных линий и уменьшения размера. • Процедура пластической деформации поперечного сечения сетки через две точки на сетке. • Процедуры импорта-экспорта с поддержкой координат центра масс с двойной точностью. • Процедура автоматического объединения объектов. Библиотека подгонки деталей Это расширение библиотеки для управления необработанными NURBS поверхностями при использовании подгонки. • Спецификация четырехгранных конфигураций на триангулированной сетке. • Автоматическая подгонка поверхностей с автоматической коррекцией NURBS кривыми.
  • 6. Библиотека обработки граней и ребер Эта библиотека расширения осуществляет: • Автоматическое выделение линий скруглений (кривых граней, центральной кривой сетки, кривых ребер). • Разбиение сетки на участки без участия скруглений, которые могут быть подогнаны к необработанным NURBS поверхностям.
  • 7. Необходимость миграции библиотеки компонентов на 64-битную платформу Компания E.G.S. S.r.l. занимается разработкой своих решений с 2002 года, когда в Италии был открыт ее офис. С самых ранних этапов разработки компании были ориентированы на высокопроизводительные настольные системы. Минимальный компьютер, на котором работает решение E.G.S. S.r.l. имеет следующую конфигурацию (по данным на начало 2008 года): • Процессор: Intel Core Duo T2300 or higher, AMD X2 3800+ or higher. • Оперативная память: 2GB • Графическая карта: Nvidia Quadro / 6x series or higher, ATI/AMD "x" series / FireGL or higher. • Операционная система: Windows XP Professional SP2 or higher, Windows Vista В связи с ростом обрабатываемых объемов данных, разумеется, ограничения на оперативную память 32-битной версии (не более 3 гигабайт) оказались недостаточными для серьезных проектов. Поэтому необходимость выпуска 64-битной версии не вызывала вопросов у руководства E.G.S. S.r.l.. Однако под вопросом была возможность быстрого выпуска подобной версии. Вручную просмотреть указанный объем кода практически невозможно. Участие компании ООО "СиПроВер" в миграции библиотеки компонентов На помощь пришли специалисты компании ООО "СиПроВер", которые использовали для миграции кода на 64-битную платформу анализатор кода Viva64. Программный продукт Viva64 обеспечивает диагностику ошибок, специфичных для 64-битных Windows-приложений. Viva64 представляет собой lint-подобный статический анализатор Си/Си++ кода. Области применения Viva64: проверка новых 64-битных программных решений, помощь в
  • 8. переносе 32-битного программного кода на 64-битную систему, оптимизация кода с учетом особенностей 64-битной архитектуры. Используя Viva64 специалисты ООО "СиПроВер" обеспечили быструю миграцию библиотеки компонентов, обнаружив и исправив проблемные места в исходном коде библиотеки. В результате в процессе миграции такой большой и сложной библиотеки были задействованы всего лишь несколько человек. Миграция кода с использованием Viva64 позволила сэкономить много времени, которое бы пришлось затратить на ручной просмотр кода. А главное не допустить новых программных ошибок, которые возможны в процессе миграции на новую платформу. Основные проблемные моменты, выявленные в процессе анализа кода: • особенности вычислительных алгоритмов при обработке больших объемов данных; • работа с файлами большого размера; • обработка 3d-моделей, содержащих большое количество треугольников (чем больше треугольников, тем точнее модели); • работа подсистемы лицензирования; Все обнаруженные с помощью анализатора Viva64 проблемы были исправлены, в результате чего 64-битная версия Leios Studio была выпущена в срок с высоким качеством. E.G.S. S.r.l. - частная компания, миссией которой является разработка программ и решений для развитой обработки результатов 3D сканирования. Офисы компании были открыты в Италии и в Москве в 2002 году. Сайт: http://www.egsolutions.com.