Содержание
Общие положения о программировании в Linux
- Детализация задачи (про упрощение каждой составляющей)
- фронтенд/бэкенд
- бэкенд — библиотека
- Поиск чего-то существующего
- переписать всё с нуля
- дописать
- форкнуться
- Об интерфейсах. IPC, shared memory, текстовых интерфейсах, библиотеках
- KISS, про отказ от монстров. про простой протокол, про стек. рассказ про проектирование протокола. про стандарты, POSIX, RFC
- Про выбор языка (вспоминаем про компонентность), про скриптовые языки
Соглашения о стиле программирования
- Понятие «coding style»
- Цели введения coding style в свободном сообществе
- Дисциплина разработки и её влияние на сообщество
- Предотвращение распространённых ошибок и заблуждений
- Увеличение повторного использования кода
- Популяризация определённых «правильных» методов разработки
- Особенности рекомендованного стиля программирования в зависимости от задач, решаемых сообществом
- Linux kernel coding style как пример подобного соглашения:
- Мотивация
- Пробелы и табуляции
- Именование и typedef
- Функции и goto
- Комментарии; комментирование функций, данных и кода
- Особенности LKCS: Magic numbers, #ifdefs, labaled identifiers
- Ссылки:
- Другие CSP:
Структура файлов проекта. Make.
Make
- Makefile: Workflow сборки.
- Понятие зависимости и правила.
- Недостатки простого понятия правил.
- Встроенные правила и встроенные переменные.
- Правила-шаблоны.
- Автоматические переменные.
- Автоматическая генерация зависимостей.
- Расширения GNU make (для подстановок, правил-шаблонов, условий).
Git
- Введение в системы управления версиями (VCS)
- Отличия централизованных VCS от распределённых.
- Концепции распределённых VCS.
- Характерные черты Git как DVCS.
- Способы синхронизации репозиториев.
- Модели взаимодействия разработчиков.
CMake
FrBrGeorge нашёл пару статей по теме:
Авторский план лекции
- Что такое система сборки и для чего она нужна.
- IDE обычно — и система сборки тоже.
- Простейший пример на основе программы из двух файлов и команды make.
- Далее — сборка на компьютере друга — нам нужно разрешить зависимости (autotools: configure, make, make install).
- Конфигурирование опций (configure).
- Далее — кроссплатформенность.
- История того, почему я выбрал CMake: кроссплатформенность.
- Ключевые преимущества CMake:
- Сборка out-of-tree.
- Генерация файлов, нативных для платформы/IDE. Некоторые IDE сами поддерживают CMake нативно (KDevelop последних версий).
- Не только сборка, но и конфигурирование проекта (гораздо более быстрый, чем в autotools, поиск библиотек).
Удобные средства конфигурирования исходных кодов (команда CONFIGURE).
- Интеграция с системой пакетирования CPack и системой тестирования CTest, а также с Dart — системой автоматизированной сборки (nightly builds).
- Экспортирование установленного проекта в CMake-файлах с возможностью быстрого подключения к другим проектам.
- Сравнение с другими кроссплатформенными системами сборки (scons, bjam, ant, qmake):
SCons: плохо показал себя при попытке перемещения на него KDE, разработчиком приходилось самим патчить его, не было поддержки от разработчиков SCons.
Ant: зависима от Java.
Bjam: на работе лектора соседний отдел его использует, с другой стороны, раз boost постепенно переходит на CMake, то это неспроста Bjam, кроме того, не нативен вроде, т. е. не генерирует файлы для IDE.
- Для чего лектор использует CMake, помимо сборки
- Генерация документации по коду. Язык документации (русский/английский) выбирается автоматически в зависимости от языка системы. Версия библиотек автоматически включается в документацию.
- Генерация RPM-пакетов.
- Версия пакета задается в файле CMake и может быть использована при конфигурировании.
- Использование различных настроек оптимизации.
- Обзор синтаксиса CMake-файлов, простейшие проекты.
Отладка. gdb, ld.so, strace, ltrace, ldd
GDB
- Интерактивная отладка приложений.
- Функциональность GDB и фронтэнды к нему.
Strace/Ltrace
- Интерфейс Glibc. Схема работы вызовов стандартной библиотеки Си в UNIX.
- Функциональность strace.
- ld.so.*. Схема работы внешних вызовов в Си/UNIX. Переменные окружения.
- Функциональность ltrace.
- Перехват специфических внешних вызовов на основе интерфейса, предоставляемого бинарным интерпретатором ELF.
Valgrind
- Ошибки при использовании памяти.
- Принципы работы пакетов для анализа программ: бинарная трансляция и инструментация, LD_PRELOAD.
- Google Perftools.
- Интермедия Артема Гавриченкова и Леши Преображенского про применение mmap и устройство gdb.
- Инструменты из пакета Valgrind: Memcheck, Helgrind, Callgrind (Преображенский).
- Ошибки в многопоточных программах.
- Другие инструменты для поиска ошибок в программах.
- Практическое применение perftools, Memcheck, Helgrind.
Документирование кода, doxygen; buildbot
doxygen
- Документирование кода
- Виды комментариев
- Цели документирования
- Самодокументирующийся код
- Типичные ошибки при комментировании исходного кода
- Автогенерация документации на основе комментариев: Doxygen
- Цель, применимость
- Функциональность
- Примеры команд
buildbot
- Введение в сборочные системы
- Отличительные особенности buildbot
- Схема работы buildbot (Master, Slave, Builder, Scheduler, Changeset, etc.)
- Интерфейсы уведомлений buildbot (IRC, IM, Web, etc.)
Библиотека Qt
На данной странице представлен авторский конспект лекции «Средства разработки: библиотека Qt» курса лекций «Программирование в Linux». Также доступны аудио- и видеозапись лекции.
Преимущества Qt
- огромный выбор простых в использовании классов
- подробная документация по всей библиотеке и методам работы (best practice)
- классы и инструменты для упрощения разработки: сборки, справки и документации, «рисования» интерфейсов, локализации.
- GPL v3, LGPL
- кроссплатформенность (X Window, Windows, Mac OS)
- расширение посредством подключаемых модулей (plugins): драйвера СУБД, форматы изображений, кодировки, стили оформления и многое другое
- полноценная поддержка многопоточности
- взаимодействие (IPC): шина D-Bus, TCP/IP, общая память, QCOP (для Qt for Embedded Linux)
- инфраструктура автотестирования
мультимедийная среда Phonon и встроенный движок браузера WebKit
инфраструктура вызова объектов через встроенный скриптовый язык (Qt Script базируется на ECMAScript, как и реализации JavaScript)
Состав
В отличие от предыдущих версий Qt (Qt3), Qt4 состоит из небольших библиотек:
QtCore |
общая функциональность без графических классов |
QtGui |
графическая среда |
QtNetwork |
поддержка сети и различных протоколов |
!QtOpenGL |
поддержка графического ускорения OpenGL |
QtSql |
работа с СУБД |
QtSvg |
отрисовка векторной графики в формате SVG |
QtXml |
работа с XML |
Qt3Support |
совместимость с Qt 3 |
QAxContainer |
классы клиента ActiveQt (ActiveX) |
QAxServer |
классы сервера ActiveQt (ActiveX) |
QtAssistant |
классы запуска Qt Assistant |
QtDesigner |
классы расширения и внедрения Qt Designer |
QtUiTools |
классы динамической генерации графического интерфейса |
QtTest |
вспомогательные классы для тестирования |
Объектная модель
Qt расширяет объектную модель С++ следующими возможностями:
- мощным механизмом сигналов-слотов
- свойствами объекта
- событиями и фильтрами событий (общая обработка событий a la callbacks)
- контекстно-зависимыми переводами
- внутренними таймерами
- манипулирование иерархией наследования классов
- управляемыми указателями, содержащими счётчик их использования
- динамическое приведение типов
Объекты
Объекты Qt (созданные с использованием мета-объектов, генерируемых программой moc):
- могут иметь уникальное имя
- имеют место в иерархии объектов (удаляются при удалении родительского объекта)
- могут быть связаны с другими объектами с помощью сигналов и слотов
- поддерживают динамическое изменение набора «свойств» (properties), не заданных явно в определении класса.
Графические возможности Qt
- Полноценная библиотека графических виджетов
- Динамическое размещение виджетов (с автоматическим изменением размеров и положения во время выполнения)
- Динамическое и статическое (uic) подключение форм интерфейса, описанных на XML.
- Механизм отрисовки, одинаковый для экрана и на печать (QPainter):
- Поддержка большинства графических форматов, включая растровые, векторные (SVG) и видео.
- Концепция MVC (Model-View-Controller) для виджетов с данными, предоставление «делегатов» для нестандартной отрисовки
- Поддержка стиля оформления всех виджетов и одиночного заданного.
Контейнеры
- Более простые, чем STL, в использовании контейнеры.
- Можно использовать как итераторы в стиле STL, так и в стиле Java
- Большой выбор предопределённых контейнеров: списки, двунаправленные списки, векторы, стеки, очереди, множества, словари и хэши (в том числе и неуникальными ключами)
- Итератор foreach (variable, container)
Локализация
- Использовать QObject::tr() или QT_TR_NOOP()
- Занесение в файл проекта строк: TRANSLATIONS = app_ln.ts
- Вставка в код объектов QTranslator для загрузки локализации
- Использование lupdate-qt4 для извлечения и обновления файлов перевода
- Перевод в Qt Linguist
- Компиляция файлов посредством lrelease-qt4
Примеры
main.cpp
hello.pro
SOURCES += main.cpp TEMPLATE = app TARGET = hello
Сборка:
qmake-qt4 hello.pro && make && make install
Инструментальные библиотеки
- Зачем нужны библиотеки, что такое "разделяемые библиотеки"
- Кроссплатформенность
- Задачи, решаемые библиотекой "общего назначения"
- унификация окружения
- решения популярных подзадач
- обеспечение пользовательского интерфейса
- POSIX
- Недостаточность POSIX как библиотекой "общего назначения"
- GLib как пример инструментальной библиотеки
- Ориентация на GUI
- Кроссплатформенность
- Повышение уровня работы с программными примитивами (напр., StreamingIO)
- "Новые" программные примитивы (списки, исключения, кодировки, IPC, сеть и т. п.)
QtCore и wxBase, их особенности
Вопросы:
- Что не входит в библиотеку "общего назначения"?
- Особенности "ориентации на GUI"