Какую информацию можно получить из grid
Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Кореньков В. В.
В статье представлены базовые понятия концепции грид и перспективы использования современных грид технологий для различных отраслей науки, промышленности и бизнеса. Дано краткое описание проектов по созданию гридинфраструктур. Особое внимание уделено участию России в глобальных проектах EGEE и WLCG и созданию российского грид консорциума РДИГ.
Похожие темы научных работ по компьютерным и информационным наукам , автор научной работы — Кореньков В. В.
Распределенная система для обработки, хранения и анализа экспериментальных данных Большого адронного коллайдера Использование grid-технологи й для проведения вычислений Грид-сервисы в вычислительной химии: достижения и перспективы Сетевые структуры гуманитарной информатики: технологии е-humanities i Не можете найти то, что вам нужно? Попробуйте сервис подбора литературы.GRID-Technologies: Status and Prospectives
The conception of grid and perspectives of the usage of modern grid technologies for various fields of science, commerce and business are presented. Current projects on creation of grid infrastructures are shortly described. A special attention is paid to the participation of Russia in the EGEE and WLCG global projects and the creation of Russian grid consortium RDIG.
Текст научной работы на тему «Грид-технологии: статус и перспективы»
ГРИД-ТЕХНОЛОГИИ: СТАТУС И ПЕРСПЕКТИВЫ
Объединенный институт ядерных исследований, Дубна
GRID-Technologies: Status and Prospectives
V. V. Korenkov Joint Institute for Nuclear Research, Dubna
В статье представлены базовые понятия концепции грид и перспективы использования современных грид-техноло-гий для различных отраслей науки, промышленности и бизнеса. Дано краткое описание проектов по созданию грид-инфраструктур. Особое внимание уделено участию России в глобальных проектах EGEE и WLCG и созданию российского грид-консорциума РДИГ.
The conception of grid and perspectives of the usage ofmodern grid technologies for various fields of science, commerce and business are presented. Current projects on creation of grid-infrastructures are shortly described. A special attention is paid to the participation of Russia in the EGEE and WLCG global projects and the creation of Russian grid-consortium RDIG.
Развитие научных исследований в физике высоких энергий, астрофизике, биологии, науках о Земле, химии, а также в медицине, нанотехнологиях, промышленности, бизнесе и других направлениях человеческой деятельности требуют совместной работы многих организаций по обработке большого объема данных в относительно короткие сроки. Для этого необходимы географически распределенные вычислительные системы, способные передавать, обрабатывать и хранить огромные массивы данных.
В настоящее время в мире информационных технологий интенсивно развивается грид (название по аналогии с электрическими сетями — electric power grid) — это компьютерная инфраструктура нового типа, обеспечивающая глобальную интеграцию информационных и вычислительных ресурсов [1, 2]. Суть инициативы грид состоит в создании набора стандартизированных служб для обеспечения надежного, совместимого, дешевого и безопасного доступа к географически распределенным высокотехнологичным информационным и вычислительным ресурсам — отдельным компьютерам, кластерам и суперкомпьютерным центрам, хранилищам информации, сетям, научному инструментарию и т. д.
Миссия Интернет состояла в глобализации обмена информацией, а всемирная паутина WWW стандартизовала поиск и доставку документов. Грид стал следующим этапом в этой цепочке революционных преобразований — стандартизации и глобализации использования всех видов компьютерных ресурсов.
Грид — это система, которая координирует использование ресурсов при отсутствии централизованно-
го управления этими ресурсами; использует стандартные, открытые, универсальные протоколы и интерфейсы; обеспечивает высококачественное обслуживание.
Грид предлагает технологию доступа к общим ресурсам и службам в рамках виртуальных организаций. Виртуальная организация (УО) — является сообществом пользователей грид-системы, объединённых для решения проблем в режиме скоординированного распределения ресурсов. В каждой виртуальной организации имеется своя собственная политика поведения ее участников, которые должны соблюдать установленные правила. Виртуальная организация может образовываться динамически и иметь ограниченное время существования.
Первоначально технологии грид использовались для научных и инженерных приложений. Однако теперь они становятся основой для координированного совместного использования ресурсов в динамических, охватывающих многие предприятия виртуальных организациях в государственном управлении, в медицине, в промышленности, в бизнесе. Появились и активно используются новые термины е-Бстепсе, е-НеакЬ, е-Соттегсе, которые подчеркивают теснейшую связь в развитии науки, медицины, бизнеса с современными информационными технологиями, в первую очередь, с грид-технологиями (см. рис. 1). Таким образом, грид служит универсальной эффективной инфраструктурой для высокопроизводительных распределенных вычислений и обработки данных. Общая схема взаимодействия пользователей, программной среды и ресурсов показана на рис. 2
К приложениям грид относятся:
• сложное моделирование на удаленных суперкомпьютерах;
• вычисления с привлечением больших объемов географически распределенных данных, например, в метеорологии, астрономии, физике высоких энергий, медицине, науках о земле;
• коллективные вычисления, в которых одновременно принимают участие пользователи из различных организаций.
Проекты развития грид-технологий
В мире накоплен большой опыт создания программной среды (middleware) для реализации распределенной грид-инфраструктуры. Одним из первых и наиболее популярных программных решений, которое стало стандартом де-факто на реализацию грид-систем — это Globus Toolkit [4]. Данный инструментарий реализует механизмы сервисов, которые охватывают вопросы защиты, обнаружения информации, управления данными и ресурсами, коммуникации, обнаружения ошибок и т. д. В настоящее время этот инструментарий применяется во многих проектах по всему миру. Кроме Globus Toolkit существуют много других программных сред (middleware) для реализации грид-систем Legion, Condor, Unicore, ARC, gLite [5] и т. д.
В этом веке было создано большое количество масштабных грид-инфраструк-тур, среди которых — DEI SA (Европа), NAREGI (Япония), Open Science Grid («Открытый научный грид») и TeraGrid в США, GridPP (Великобритания), INFN GRID (Италия), NorduGRID (Скандинавия).
Особое место среди этих проектов занимают EGEE (Enabling Grids for E-sciencE)[6] и WLCG (Worldwide LHC Computing GRID) [7].
Проект EGEE («Развёртывание грид-систем для развития е-науки») воплотил в действительность замысел превратить мировые компьютерные ресурсы в единую однородную среду, где ими можно пользоваться совместно в мировом масштабе.
Проект финансируется Европейским Рис. Z. Общая схема взаимодействия пользователей, программной г -г rj г
среды и ресурсов в грид-инфраструктуре. Сообществом и странами-участниками. В
Рис. 1. Грид: наука, медицина и коммерция, использующие ресурсы глобальной информационно-вычислительной инфраструктуры на основе современных грид-технологий.
• совместная визуализация очень больших наборов научных данных;
• распределенная обработка в целях анализа данных;
i Не можете найти то, что вам нужно? Попробуйте сервис подбора литературы.• соединение научного инструментария с удаленными компьютерами и архивами данных.
Среди основных направлений использования грид на данный момент можно выделить:
• организация эффективного использования ресурсов для небольших задач, с утилизацией временно простаивающих компьютерных ресурсов;
• распределенные супервычисления, решение очень крупных задач, требующих огромных процессорных ресурсов, памяти и т. д.;
Рис. 3. Общая инфраструктура проекта EGEE и родственных проектов.
результате появилась высокопроизводительная всемирная инфраструктура, намного превосходящая по своим возможностям локальные кластеры и отдельные центры.
В консорциум EGEE входят свыше 140 организаций из более чем 50 стран, которые объединены в 13 федераций, одна из которых «Russia», и представляют почти все основные европейские международные и национальные грид-проекты, а также проекты в США и Азии. Кроме того, множество родственных проектов (более 50 ассоциированных участников) распространяют грид-инфраструктуру на Средиземноморье, Балтику, Латинскую Америку, Индию и Китай (рис. 3).
Грид-инфраструктура EGEE уже стала повседневным рабочим средством для целого ряда больших и малых исследовательских сообществ. В ней работают приложения для физики высоких энергий, биологических наук и смежных дисциплин, наук о Земле, астрофизики, вычислительной химии, термоядерной энергетики и других. Число пользователей инфраструктуры EGEE более 14000, и они объединены в более чем 200 виртуальных организациях. В настоящее время в день выполняется более 400 тысяч заданий (более 12 миллионов в месяц), и с каждым месяцем эти показатели растут.
Проект WLCG (Worldwide LHC Computing GRID) принят в 2001 году в ЦЕРНе с целью создания глобальной информационно-вычислительной инфраструктуры для обработки, хранения и анализа данных, полученных во время экспериментов, проводимых на Большом адронном коллайдере. Для реализации этой грандиозной задачи построена масштабная глобальная грид-инфраст-руктура на основе региональных центров различного уровня, обеспечивающая моделирование, хранение, передачу данных с Большого адронного коллайдера.
Пользователи и виртуальные организации EGEE
Сообщество ученых, занимающихся физикой высоких энергий (ФВЭ) — главный пользователь инфраструктуры EGEE.
Биомедицинские науки представляют другое основное сообщество пользователей инфраструктуры EGEE. Эта сфера чётко делится на три области. Прежде всего, это разработка систем регистрации, надежного хранения и оперативного анализа 2D и 3D медицинских изображений (различные томограммы, «мамограммы», «виртуальные биопсии», кардиограммы и т. д.). Далее следуют различные направления биоинформатики — от анализа белковых цепочек до оптимизации обработки биологических данных. Наконец, Грид-инфраструктура используется в разработке лекарств для ускорения расчёта пристыковки молекул (молекулярного докинга): исследователи быстро просматривают многие тысячи вариантов и отбирают наиболее перспективные соединения, что снижает высокую стоимость разработки препаратов.
Исследователи наук о Земле решают широкий круг проблем в рамках виртуальной организации ESR (Earth Science Research, «Исследования в области наук о Земле»).
В инфраструктуре EGEE работают несколько приложений для исследований в области термоядерного синтеза. Для демонстрации принципиальной и технической возможности термоядерного синтеза учреждён ITER — международный проект соответствующих исследований и разработок.
Главным пользователем грид-инфраструктуры в области вычислительной химии является GEMS — приложение для молекулярного моделирования. В грид-ин-фраструктуре размещены и используются на промышленном уровне несколько приложений для расчёта химических реакций, моделирования молекулярной динамики сложных систем и расчёта электронной структуры молекул.
Чтобы обеспечить полномасштабное участие России в осуществлении проектов EGEE и WLCG в 2003 году был образован консорциум РДИГ (Российский ГРИД для интенсивных операций с данными, Russian Data Intensive GRID, RDIG) [8,9]. Меморандум о создании консорциума был подписан руководителями восьми крупных институтов: Института физики высоких энергий (Протвино), Института математических проблем биологии (Пущино), Института теоретической и экспериментальной физики (Москва), Объединенного института ядерных исследований (Дубна), Института прикладной математики им. М.В. Келдыша (Москва), НИИ ядерной физики МГУ (Москва), Петербургского института ядерной физики (Санкт-Петербург) и РНЦ «Курчатовский институт» (Москва), а с 2008 года — Геофизического центра РАН (Москва). Схематическая карта состава РДИГ представлена на рис. 4.
Рис. 4. Консорциум РДИГ.
Консорциум РДИГ входит в структуру EGEE в качестве региональной федерации «Россия», и его целью является создание действующей грид-инфраструк-туры в России, что включает в себя:
• наращивание вычислительных ресурсов и ресурсов хранения данных российского сегмента грид-среды;
• обеспечение надежной сетевой инфраструктуры;
• обеспечение работы базовых грид-сервисов в российском сегменте;
• создание Регионального операционного центра (Regional Operations Center — ROC);
• помощь ресурсным центрам в установке ППО и поддержка его функционирования;
• поддержка пользователей грида;
• участие в предоставлении ресурсов для исследований в важных прикладных областях (в области биомедицины, термоядерного синтеза, физики высоких энергий, космофизики);
• управление функционированием инфраструктуры: регистрация пользователей, региональных виртуальных организаций и мониторинг;
• популяризация технологий и вовлечение новых пользователей из научных и производственных кругов, а также обучение пользователей и администраторов.
В 2009 году была создана распределенная инфраструктура для обучения грид-технологиям [10], в которую на данный момент включены грид-сайты Москов-
i Не можете найти то, что вам нужно? Попробуйте сервис подбора литературы.1. Foster I, Kesseîman C (eds), «The Grid, Blueprint for a New computing Infrastructure», Morgan Kaufmann Publishers, 1998.
2. Foster I, Kesseîman C (eds), «The Grid 2: Blueprint for a New Computing Infrastructure», Morgan Kaufmann Publishers, 2004.
3. Демичев А. П, Ильин В. А, Крюков А. П., Шамардин Л. В. Грид-технологии
на службе компьютинга для Большого адронного коллайдера// Информатизация образования и наукию — М., 2009. 4: 158.
ской области (Дубна и Протвино) и грид-сайты в Узбекистане (Ташкент), Болгарии (София) и Украине (Киев). Эта инфраструктура не только успешно используется для обучающих целей, но и способствует развитию международного сотрудничества РДИГ.
В настоящее время в рамках РДИГ работают более 100 ученых и специалистов в области компьютерных технологий, подключено 17 ресурсных центров, предоставляющих ресурсы для грид-среды, с общим числом процессорных узлов более 3000 и с общим объемом хранилищ данных около 2 Петабайт.
Российские ученые уже сейчас активно используют грид-инфраструктуру для своих исследований, но не все направления науки включились в процесс освоения этой новой инновационной технологии.
Перспективы развития грид-технологий
Грид-технологии вступают в пору зрелости — происходит переход от пилотных приложений к постоянной устойчивой работе по обслуживанию самых разнообразных прикладных областей науки и производства Масштаб внедрения грид-технологий в значительной степени будет зависеть от способности новых и существующих приложений быть развернутыми в этой среде. Поэтому важно обеспечить простые (графические, основанные на технологии веб-порталов) интерфейсы к системам запуска и мониторинга заданий и управления данными в гриде.
Создание удобных интерфейсов для конкретных приложений является важным для того, чтобы сделать грид-технологии доступными широкому кругу пользователей в области промышленного производства и других бизнес-приложений.
Что касается проекта EGEE, то планируется, что с 2010 года начнет функционировать Европейская грид инфраструктура (EGI — European Grid Infrastructure). В основе этой инициативы лежит сотрудничество между национальными грид инфраструктурами (National Grid Initiatives, NGIs) и координирующей организацией (the EGI Organisation, EGI.eu). Это сотрудничество должно обеспечить дальнейшее развитие устойчивой и постоянно действующей глобальной грид-инфраструк-туры, обеспечивающей оптимальное использование вычислительных ресурсов и ресурсов хранения данных.
9. Ильин В., Кореньков В., Солдатов А. Российский сегмент глобальной инфраструктуры LCG// Открытые системы, 2003. 1.
10. Кореньков В., Кутовский Н. Инфраструктура обучения грид-технологи-ям// Открытые системы, 2009. 11: 48—51.
Гетерогенные вычислительные системы — электронные системы, использующие различные типы вычислительных блоков, работающих вместе для выполнения огромного количества заданий (операций, работ). Эта технология применяется для решения научных, математических задач, требующих значительных вычислительных ресурсов. Грид-вычисления используются также в коммерческой инфраструктуре для решения таких трудоёмких задач, как экономическое прогнозирование, сейсмоанализ, разработка и изучение свойств новых лекарств.
Грид с точки зрения сетевой организации представляет собой согласованную, открытую и стандартизованную среду, которая обеспечивает гибкое, безопасное, скоординированное разделение вычислительных ресурсов и ресурсов хранения информации, которые являются частью этой среды, в рамках одной виртуальной организации [2] .
Грид-вычисления можно организовать на базе множества устаревших моделей персональных компьютеров [3] объединённых в иерархическую локальную вычислительную сеть Ethernet [4] с присутствием серверов. Эта сеть может иметь соединение с интернетом.
Содержание
Сравнение грид-систем и обычных суперкомпьютеров
Распределённые, или грид-вычисления, в целом являются разновидностью параллельных вычислений, которое основывается на обычных компьютерах (со стандартными процессорами, устройствами хранения данных, блоками питания и т. д.), подключенных к сети (локальной [5] или глобальной [6] ) при помощи обычных протоколов, например Ethernet. В то время как обычный суперкомпьютер [7] содержит множество процессоров, подключенных к локальной высокоскоростной шине. [Источник 2] Основным преимуществом распределённых вычислений является то, что отдельная ячейка вычислительной системы может быть приобретена как обычный неспециализированный компьютер. Таким образом можно получить практически те же вычислительные мощности, что и на обычных суперкомпьютерах, но с гораздо меньшей стоимостью.
Технология облачных вычислений
Феномен облачных вычислений объединяет несколько различных концепций информационных технологий и представляет собой новую парадигму предоставления информационных ресурсов (аппаратных и программных комплексов). Со стороны владельца вычислительных ресурсов облачные вычисления ориентированы на предоставление информационных ресурсов внешним пользователям. Со стороны пользователя, облачные вычисления - это получение информационных ресурсов в виде услуги у внешнего поставщика, оплата за которую производится в зависимости от объема потребленных ресурсов согласно установленному тарифу. Ключевыми характеристиками облачных вычислений являются масштабируемость и виртуализация.
Сегодня мы с вами рассмотрим свойства CSS Grid (далее также — Грид), позволяющие создавать адаптивные или отзывчивые макеты веб-страниц. Я постараюсь кратко, но полно объяснить, как работает каждое свойство.
Что такое CSS Grid ?
Грид — это макет для сайта (его схема, проект).
Грид-модель позволяет размещать контент сайта (располагать его определенным образом, позиционировать). Она позволяет создавать структуры, необходимые для обеспечения отзывчивости сайтов на различных устройствах. Это означает, что сайт будет одинаково хорошо смотреться на компьютере, телефоне и планшете.
Вот простой пример макета сайта, созданного с помощью Грида.
Компьютер
Телефон
Архитектура CSS Grid
Как же Грид работает? Элементы Грида (grid items) располагаются вдоль главной или основной (main) и поперечной (cross) оси (axis). При помощи различных свойств мы можем манипулировать элементами для создания макетов.
Помимо прочего, у нас имеется возможность объединять строки и колонки подобно тому, как мы это делаем в Excel , что предоставляет нам большую гибкость, чем Флекс ( Flexbox ).
К слову, если вас интересует Флекс, вот соответствующая статья.
Схема CSS Grid
Схема содержит все возможные свойства, предоставляемые Гридом. Эти свойства делятся на:
- родительские (свойства грид-контейнера) и
- дочерние (свойства грид-элементов)
Обратите внимание: красным цветом отмечены сокращения для свойств:
К концу настоящей статьи у вас будет полное понимание того, как работает каждое из них.
Настройка проекта
Для данного проекта требуются начальные знания HTML , CSS и умение работать с VSCode (или другим редактором по вашему вкусу). Делаем следующее:
- Создаем директорию для проекта, например, Project1 и открываем ее в редакторе ( cd Project1 , code . )
- Создаем файлы index.html и style.css
- Устанавливаем в VSCode сервер для разработки ( Live Server , расширение) и запускаем его
Или вы можете просто открыть Codepen (или любую другую песочницу) и начать писать код.
Все готово, можно приступать к делу.
Создаем 3 контейнера внутри body :
Шаг 1
Шаг 2
Немного стилизуем body :
Шаг 3
Стилизуем все контейнеры:
Не волнуйтесь, мы рассмотрим каждое из указанных свойств Грида.
Шаг 4
Добавим небольшой отступ между контейнерами:
Погодите-ка
Давайте разберемся с отношениями между родительским и дочерними элементами.
Свойства родительского элемента определяются в .container , а свойства дочерних элементов — в .box-* .
Свойства грид-контейнера
Начнем со свойств родительского элемента.
grid-template-columns
Данное свойство используется для определения количества и ширины колонок. При этом, можно определять как свойства для каждой колонки в отдельности, так и устанавливать ширину всех колонок с помощью функции repeat() .
Добавим строку в style.css :
- значения в пикселях будут точными. Ключевое слово auto означает заполнение элементом всего доступного пространства
- использование единицы fr (фракция) в repeat() означает, что все контейнеры будут иметь одинаковую ширину
grid-template-rows
Данное свойство используется для определения количества и высоты строк. При этом, можно определять как высоту каждой колонки в отдельности, так и устанавливать высоту всех строк с помощью функции repeat() .
Изменим строку в style.css :
grid-template-areas
Данное свойство используется для определения количества пространства, занимаемого ячейкой Грида (grid cell), в терминах колонок и строк, в родительском контейнере.
Это можно считать схемой макета:
Для получения результата требуется не только родительское, но и хотя бы одно дочернее свойство:
- grid-template-areas : родительское свойство, создающее схему
- grid-area : дочернее свойство, которое использует схему
Создаем схему
Применяем схему
Обратите внимание: мы вернемся к свойству grid-area , когда будем говорить о дочерних свойствах.
column-gap
Данное свойство используется для добавления отступа между колонками.
Обратите внимание: свойство column-gap используется совместно со свойством grid-template-columns .
row-gap
Данное свойство используется для добавления отступов между строками.
Обратите внимание: свойство row-gap используется совместно со свойством grid-template-rows .
justify-items
Данное свойство используется для позиционирования грид-элементов внутри грид-контейнера вдоль главной оси. Оно принимает 4 возможных значения:
Добавим еще один контейнер в HTML :
И немного изменим CSS :
align-items
Данное свойство используется для позиционирования грид-элементов внутри грид-контейера вдоль поперечной оси. Оно принимает 4 возможных значения:
justify-content
Данное свойство используется для позиционирования самого грида внутри грид-контейнера вдоль основной оси. Оно принимает 7 возможных значений:
align-content
Данное свойство используется для позиционирования самого грида внутри грид-контейнера вдоль поперечной оси. Оно принимает 7 возможных значений:
Свойства грид-элементов
Шкала CSS Grid
Данная шкала показывает, как вычисляются строки и колонки при их объединении. Для этого используется два вида единиц:
На представленной ниже иллюстрации показаны начальные и конечные точки строк и колонок в одной ячейке:
При использовании функции repeat() мы может установить одинаковую ширину/высоту для колонок/строк. Пример с колонками:
Это аналогично следующему:
Небольшая заметка
При использовании единицы измерения fr , доступное пространство делится на равные части.
В данном случае доступное пространство делится на 4 равные части.
grid-columns: start/end
Данное свойство позволяет объединять колонки. Оно является сокращением для:
Мы разделили доступное пространство на 12 равных частей как по ширине, так и по высоте. 1 контейнер занимает 1 часть или фракцию. В данном случае 8 фракций остались невостребованными.
Поскольку мы говорим о свойствах дочерних элементов, имеет смысл разделить их стили:
Вернемся к шкале. Мы разбираемся с колонками — поэтому пока не обращайте внимания на строки.
Каждый класс .box-* по умолчанию имеет такой масштаб (scale):
Это можно переписать с помощью ключевого слова span :
Давайте "присвоим" 8 фракций .box-1 :
Небольшая заметка
Как мы производим вычисления? box-1 занимает 1 часть. Кроме этого, к ней добавляется еще 8 частей. И еще 1 в конце. Получается: 8 + 1 + 1 = 10.
Как использовать ключевое слово span
Считается, что использование span делает код более читаемым.
В этом случае нам просто нужно добавить к box-1 8 частей:
Это даст такой же результат.
grid-row: start/end
Данное свойство позволяет объединять строки. Оно является сокращением для:
Теперь сосредоточимся на строках:
Давайте добавим к box-1 9 частей:
Расчет выглядит так: box-1 занимает 1 часть + 9 частей + 1 часть в конце, получается 9 + 1 + 1 = 11.
Вот вариант со span :
grid-area
Сначала нам нужно настроить grid-temlate-areas , о чем мы говорили выше. После этого в дочерних классах определяются названия областей, которые используются в родительском классе:
Определяем grid-template-areas в родительском классе:
Затем определяем grid-area в дочерних классах:
justify-self
Данное свойство используется для позиционирования отдельного грид-элемента вдоль основной оси. Оно принимает 4 возможных значения:
align-self
Данное свойство используется для позиционирования отдельного грид-элемента вдоль поперечной оси. Оно принимает 4 возможных значения:
Сокращения для свойств CSS Grid
- place-content
- place-items
- place-self
- grid-template
- gap / grid-gap
place-content
Данное свойство является сокращением для:
place-items
Данное свойство является сокращением для:
place-self
Данное свойство является сокращением для:
grid-template
Данное свойство является сокращением для:
- grid-template-rows
- grid-template-columns
gap/grid-gap
Данное свойство является сокращением для:
Заключение
Теперь в ваших руках имеется мощное средство для создания адаптивных макетов веб-страниц.
VPS-хостинг с быстрыми NVMе-дисками и посуточной оплатой. Загрузка своего ISO.
Табличные элементы управления (обычно в их названии присутствуют слова Table или Grid) широко используются при разработке GUI. Так получилось, что на работе мы используем С++ и MFC для разработки пользовательского интерфейса. В начале мы использовали CGridCtrl — общедоступную и довольно известную реализацию грида. Но с некоторого времени он перестал нас устраивать и появилась на свет собственная разработка. Идеями, лежащими в основе нашей реализации, я хочу с вами здесь поделиться. Есть задумка сделать open source проект (скорее всего под Qt). Поэтому данную заметку можно рассматривать как «Proof Of Concept». Конструктивная критика и замечания приветствуются.
Причины, по которым меня не устраивают существующие реализации я опущу (это тема для отдельной заметки).
Проекты у нас инженерно-научные, с богатой графикой, и списки и таблицы используются повсеместно. Поэтому новый грид должен был обеспечивать гибкую кастомизацию, хорошее быстродействие и минимальное потребление памяти при показе больших объемов информации. При разработке я старался придерживаться следующим правилом: реализуй функциональность максимально обобщенно и абстрактно, но не во вред удобству использования и оптимальности работы. Конечно, это правило противоречиво, но насколько мне удалось соблюсти баланс — судить вам.
Чтобы с чего-то начать, давайте попробуем дать определение элементу управления grid. Для сохранения общности можно сказать, что grid — это визуальный элемент, который разбивает пространство на строки и столбцы. В результате получается сетка ячеек (место пересечения строк и столбцов), внутри которых отображается некоторая информация. Таким образом у грида можно различить два компонента: структуру и данные. Структура грида определяет как мы будем разбивать пространство на строки и столбцы, а данные описывают, собственно, то, что мы хотим видеть в получившихся ячейках.
- Главное свойство Count — количество линий, из которых состоит Lines
- Каждая линия может менять свой размер (строка высоту, а столбец — ширину)
- Линии можно переупорядочивать (строки сортировать, столбцам менять порядок)
- Линии можно скрывать (делать невидимыми для пользователя)
Комментарии и некоторые служебные функции и поля опущены для наглядности.
Вы можете заметить, что в классе есть функции GetAbsoluteLineID и GetVisibleLineID . Так как мы позволяем перемешивать и скрывать линии, то абсолютный и видимый индекс линии различаются. Надеюсь картинка наглядно показывает эту ситуацию.
Также нужно сделать пояснение по поводу строки
Здесь определён сигнал (так он называется в Qt или boost). С появлением С++11 и std::function, можно легко написать простую реализацию signals/slots, чтобы не зависеть от внешних библиотек. В данном случае мы определили эвент в классе Lines, и к нему можно подключать любую функцию или функтор. Например грид подключается к этому эвенту и получает оповещение, когда экземпляр Lines меняется.
Таким образом структура грида у нас представлена двумя экземплярами Lines:
Переходим к данным. Каким образом давать гриду информацию о том, какие данные он будет отображать и как их отображать? Здесь уже всё изобретено до нас — я воспользовался триадой MVC (Model-View-Controller). Начнем с элемента View. Так же как класс Lines определяет не одну линию, а целый набор, определим класс View как нечто, что отображает какие-то однородные данные в некотором подмножестве ячеек грида. Например, у нас в первом столбце будет отображаться текст. Это означает, что мы должны создать объект, который умеет отображать текстовые данные и который умеет говорить, что отображаться эти данные должны в первой колонке. Так как данные у нас могут отображаться разные и в разных местах, то лучше реализовать эти функции в разных классах. Назовем класс, который умеет отображать данные, собственно View, а класс, который умеет говорить где данные отображать Range (набор ячеек). Передавая в грид два экземпляра этих классов, мы как раз указываем что и где отображать.
Давайте подробнее остановимся на классе Range. Это удивительно маленький и мощный класс. Его главная задача — быстро отвечать на вопрос, входит ли определенная ячейка в него или нет. По сути это интерфейс с одной функцией:
Таким образом можно определять любой набор ячеек. Самыми полезными конечно же будут следующие два:
Первый класс определяет набор из всех ячеек, а второй — набор из одного конкретного столбца.
- Сколько надо места, что бы отобразить данные (например чтобы колонкам установить ширину, достаточную для отображения текста — режим Fit)
- Дай текстовое представление данных (чтобы скопировать в буфер обмена как текст или отобразить в tooltip)
Для наглядности рассмотрим пример в котором в первом столбце отображаются чекбоксы и текст. Во втором столбце представлены радио-кнопки, квадратики с цветом и текстовое представление цвета. И еще в одной ячейке есть звёздочка.
Например для чекбокса мы будем использовать LayoutLeft, который спросит у View его размер и «откусит» прямоугольник нужного размера от прямоугольника ячейки. А для текста мы будем использовать LayoutAll, к которому в параметре cellRect перейдет уже усеченный прямоугольник ячейки. LayoutAll не будет спрашивать размер у своего View, а просто «заберет» все доступное пространство ячейки. Можно напридумывать много разных полезных Layouts, которые будут комбинироваться с любыми View.
Возвратимся к классу Grid, для которого мы хотели задавать данные. Получается, что хранить мы можем тройки <Range, View, Layout>, которые определяют в каких ячейках, каким образом отображать данные, плюс как эти данные должны быть расположены внутри ячейки. Итак класс Grid у нас выглядит примерно так:
- Нужно отфильтровать m_data и оставить только те тройки, для которых наша ячейка попадает в Range
- Определить прямоугольник для ячейки
- Определить прямоугольники для всех View
- Отрисовать все View в рассчитанные для них прямоугольники
Этот класс в конструкторе выполняет первые три пункта и сохраняет результат в m_cache. При этом функция Draw получилась достаточно легковесной. За эту легковесность пришлось заплатить в виде m_cache. Поэтому создавать экземпляры такого класса на каждую ячейку будет накладно (мы ведь договорились не иметь данных, зависящих от общего количества ячеек). Но нам и не надо иметь экземпляры CellCache для всех ячеек, достаточно только для видимых. Как правило в гриде видна небольшая часть всех ячеек и их количество не зависит от общего числа ячеек.
Таким образом у нас появился еще один класс, который управляет видимой областью грида, хранит CellCache для каждой видимой ячейки и умеет быстро рисовать их.
Когда пользователь меняет размер грида или скроллирует содержимое, мы просто выставляем новый visibleRect в этом объекте. При этом переформируется m_cells, так чтобы содержать только видимые ячейки. Функциональности GridCache достаточно, что бы реализовать read-only грид.
Разделение классов Grid и GridCache очень полезно. Оно позволяет, например, создавать несколько GridCache для одного экземпляра Grid. Это может использоваться для реализации постраничной печати содержимого грида или экспорта грида в файл в виде изображения. При этом объект GridWindow никаким образом не модифицируется — просто в стороне создается GridCache, ссылающийся на тот же экземпляр Grid, в цикле новому GridCache выставляется visibleRect для текущей страницы и распечатывается.
Как же добавить интерактивности? Здесь на первый план выходит Controller. В отличие от остальных классов, этот класс определяет интерфейс со многими функциями. Но лишь потому, что самих мышиных событий достаточно много.
Так же как и для отрисовки, для работы с мышью нам нужны только видимые ячейки. Добавим в класс GridCache функции обработки мыши. По положению курсора мыши определим какая ячейка (CacheCell) находится под ней. Далее в ячейке для всех View, в чей прямоугольник попала мышь, забираем Controller и вызываем у него соответствующий метод. Если метод возвратил true — прекращаем обход Views. Данная схема работает достаточно быстро. При этом нам пришлось в класс View добавить ссылку на Controller.
Осталось разобраться с классом Model. Он нужен как шаблон адаптер. Его основная цель — предоставить данные для View в «удобном» виде. Давайте рассмотрим пример. У нас есть ViewText который умеет рисовать текст. Что бы его нарисовать в конкретной ячейке, этот текст надо для ячейки запросить у объекта ModelText, который, в свою очередь, лишь интерфейс, а его конкретная реализация знает откуда текст взять. Вот примерная реализация класса ViewText:
Таким образом несложно угадать какой интерфейс должен быть у ModelText:
Обратите внимание, мы добавили сеттер для того, что бы им мог воспользоваться контроллер. На практике наиболее часто используется реализация ModelTextCallback
Эта модель позволяет при инициализации грида назначить лямбда функции доступа к настоящим данным.
Ну а что же общего у моделей для разных данных: ModelText, ModelInt, ModelBool . В общем-то ничего, единственное, что про них всех можно сказать, что они должны информировать все заинтересованные объекте о том, что данные изменились. Таким образом базовый класс Model у нас примет следующий вид:
В итоге наш грид разбился на множество небольших классов, каждый из которых выполняет четко определенную небольшую задачу. С одной стороны может показаться, что для реализации грида представлено слишком много классов. Но, с другой стороны, классы получились маленькими и простыми, с четкими взаимосвязями, что упрощает понимание кода и уменьшает его сложность. При этом всевозможные комбинации наследников классов Range, Layout, View, Controller и Model дают очень большую вариативность. Использование лямбда функций для ModelCallback позволяют легко и быстро связывать грид с данными.
В следующей заметке я опишу как реализовать стандартную функциональность грида: selection, sorting, column/row resize, printing, как добавить заголовок (фиксированные верхние строки и левые столбцы).
Раскрою небольшой секрет — все что описано в данной статье уже достаточно для реализации вышеперечисленного. Если какую-то функциональность я пропустил, пожалуйста, пишите в комментариях и я опишу их реализацию в следующей статье.
Читайте также: