Общие положения о программировании в Linux

  1. Детализация задачи (про упрощение каждой составляющей)
    • фронтенд/бэкенд
    • бэкенд — библиотека
  2. Поиск чего-то существующего
    1. переписать всё с нуля
    2. дописать
    3. форкнуться
  3. Об интерфейсах. IPC, shared memory, текстовых интерфейсах, библиотеках
  4. KISS, про отказ от монстров. про простой протокол, про стек. рассказ про проектирование протокола. про стандарты, POSIX, RFC
  5. Про выбор языка (вспоминаем про компонентность), про скриптовые языки

Соглашения о стиле программирования

Аудиозапись | Видеозапись

Структура файлов проекта. Make.

Make

  • Makefile: Workflow сборки.
  • Понятие зависимости и правила.
  • Недостатки простого понятия правил.
  • Встроенные правила и встроенные переменные.
  • Правила-шаблоны.
  • Автоматические переменные.
  • Автоматическая генерация зависимостей.
  • Расширения GNU make (для подстановок, правил-шаблонов, условий).

Git

  1. Введение в системы управления версиями (VCS)
  2. Отличия централизованных VCS от распределённых.
  3. Концепции распределённых VCS.
  4. Характерные черты Git как DVCS.
  5. Способы синхронизации репозиториев.
  6. Модели взаимодействия разработчиков.

CMake

FrBrGeorge нашёл пару статей по теме:

Авторский план лекции

  1. Что такое система сборки и для чего она нужна.
    1. IDE обычно — и система сборки тоже.
    2. Простейший пример на основе программы из двух файлов и команды make.
    3. Далее — сборка на компьютере друга — нам нужно разрешить зависимости (autotools: configure, make, make install).
    4. Конфигурирование опций (configure).
    5. Далее — кроссплатформенность.
  2. История того, почему я выбрал CMake: кроссплатформенность.
  3. Ключевые преимущества CMake:
    1. Сборка out-of-tree.
    2. Генерация файлов, нативных для платформы/IDE. Некоторые IDE сами поддерживают CMake нативно (KDevelop последних версий).
    3. Не только сборка, но и конфигурирование проекта (гораздо более быстрый, чем в autotools, поиск библиотек).
    4. Удобные средства конфигурирования исходных кодов (команда CONFIGURE).

    5. Интеграция с системой пакетирования CPack и системой тестирования CTest, а также с Dart — системой автоматизированной сборки (nightly builds).
    6. Экспортирование установленного проекта в CMake-файлах с возможностью быстрого подключения к другим проектам.
  4. Сравнение с другими кроссплатформенными системами сборки (scons, bjam, ant, qmake):
    1. SCons: плохо показал себя при попытке перемещения на него KDE, разработчиком приходилось самим патчить его, не было поддержки от разработчиков SCons.

    2. Ant: зависима от Java.

    3. Bjam: на работе лектора соседний отдел его использует, с другой стороны, раз boost постепенно переходит на CMake, то это неспроста :) Bjam, кроме того, не нативен вроде, т. е. не генерирует файлы для IDE.

  5. Для чего лектор использует CMake, помимо сборки
    1. Генерация документации по коду. Язык документации (русский/английский) выбирается автоматически в зависимости от языка системы. Версия библиотек автоматически включается в документацию.
    2. Генерация RPM-пакетов.
    3. Версия пакета задается в файле CMake и может быть использована при конфигурировании.
    4. Использование различных настроек оптимизации.
  6. Обзор синтаксиса 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)

Локализация

  1. Использовать QObject::tr() или QT_TR_NOOP()
  2. Занесение в файл проекта строк: TRANSLATIONS = app_ln.ts
  3. Вставка в код объектов QTranslator для загрузки локализации
  4. Использование lupdate-qt4 для извлечения и обновления файлов перевода
  5. Перевод в Qt Linguist
  6. Компиляция файлов посредством lrelease-qt4

Примеры

main.cpp

   1 #include <QApplication>
   2 #include <QLabel>
   3 
   4 int main( int argc, char *argv[] ) {
   5         QApplication app( argc, argv );
   6 
   7         QLabel w( "<b style='color:red;'>Hello, world!</b>" );
   8         w.show();
   9 
  10         return app.exec();
  11 }

hello.pro

SOURCES += main.cpp
TEMPLATE = app
TARGET = hello

Сборка:

qmake-qt4 hello.pro && make && make install

Инструментальные библиотеки

  • Зачем нужны библиотеки, что такое "разделяемые библиотеки"
  • Кроссплатформенность
  • Задачи, решаемые библиотекой "общего назначения"
    • унификация окружения
    • решения популярных подзадач
    • обеспечение пользовательского интерфейса
  • POSIX
    • Недостаточность POSIX как библиотекой "общего назначения"
  • GLib как пример инструментальной библиотеки
    1. Ориентация на GUI
    2. Кроссплатформенность
    3. Повышение уровня работы с программными примитивами (напр., StreamingIO)
    4. "Новые" программные примитивы (списки, исключения, кодировки, IPC, сеть и т. п.)
  • QtCore и wxBase, их особенности

Вопросы:

  • Что не входит в библиотеку "общего назначения"?
  • Особенности "ориентации на GUI"

LecturesCMC/Programming2010/ResultPlans (последним исправлял пользователь eSyr 2010-05-24 15:00:46)