Задания, которые необходимо сделать для допуска на экзамен по курсу «Разработка прикладных программ на языке программирования Python»

/!\ TODO

  • Прочитать про git в Git HOWTO

  • Завести аккаунт на GitHub (он понадобится вам и в будущем :) )

  • Склонировать репозиторий PythonWinter2015-initial, отредактировать файл README.md и опубликовать результат (использование GitHub не обязательно)

  • Зарегистрироваться в гугл-группе uneex-python

  • Оповестить всех о созданном репозитории ( /!\ как это проще сделать, чтобы не засорять пространство? в отдельном топике?)

Каждое изменение сопровождается минимум одним коммитом и публикацией. Пункты, помеченные <!> — необязательные

  • Склонировать Пример

  • Исправить ошибку (перетаскивание пустого места приводит к падению)
  • Реализовать гравитацию (это просто приращение скорости)
  • Написать класс «вращающиеся шары разного размера» на базе основного класса (можно использовать transform.html)

  • Реализовать соударение: количество шаров лучше взять небольшим, чтобы не просчитывать соударение нескольких
    • При принятии решения о соударении использовать mask.html или знание о диаметре шара

  • <!> Перераспределение импульса (описано тут)

Если кому-то хочется переделать всё и написать свой код:

В качестве основы взять репозиторий с примером. Каждое изменение сопровождается минимум одним коммитом и публикацией. Пункты, помеченные <!> — необязательные

  • Обработка урла / — если залогинен, то редиректить на /forum, иначе редиректить на /login

  • Общая шапка с навигацией по разделам (toolbar)
  • Форма добавления сообщений (POST /forum)

  • Сохранение и отображение автора сообщений (хранить id как ForeignKey, отображать username) <!>

  • Ответные сообщения (=дискуссии) <!>

Полезная информация

  • Склонировать недокалькулятор

  • Сделать нормальный выход из цикла
  • Отладить выполнение сценариев (я не пробовал, может, всё и так работает ;) )

  • Реализовать умножение векторов и двумерных матриц (а не то, что сейчас получается :) )

  • Сделать «красивую» выдачу двумерных матриц (это не так просто, надо вычислять ширину колонки)
  • <!> Реорганизовать ввод так, чтобы можно было вводить нечто построчно (например, матрицу — по аналогии с предыдущим выводом, или функцию, см. далее)

  • <!> Реализовать определение и вызов функций (работа с пространствами имён)

Решения всех задач должны быть оформлены отдельными sage-скриптами или worksheet-ами (примеры см. выше), годными для запуска в sage-консоли или в notebook. Также полезно (и ускорит обратную связь), если они будут опубликованы в какой-либо живой Sage-системе (например в этом notebook или даже лучше в в новом облаке — и тогда ссылка на соответствующий worksheet должна быть размещена в README

Пункты, помеченные <!> — необязательные.

  1. Рисование (вручную заполнить объект Graphics)
    1. Написать функцию, которая принимате на вход граф (sage.graphs.Graph) и рисует его, размещая на пустом объекте Graphic() вершины и ребра.
    2. Написать функцию, которая получает на вход текстовое представление лабиринта (из прошлого семестра) и рисует его на графике (можно и трехмерном) так, чтобы лабиринт был похож на лабиринт.

  2. Анимация (animate) — построить объект Animation, пригодный для сохранения в gif-ке
    1. Написать функцию, которая по данному графу и двум вершинам строит анимацию (объект Animation), которая иллюистрирует алгоритм (можно взять любой) поиска пути по графу (по кадру на каждый шаг поиска, с подсветкой текущего пути другим цветом).
    2. Написать функцию, которая по текстовому представлению лабиринта (см. выше) строит анимацию (объект Animation), иллюстрирущую алгоритм поиска пути в лабиринте (закрашивание просмотренных клеток)
    3. Написать фрагмент кода на Sage, который создаёт анимацию (объект Animation), иллюстрирующую падение во фрактал (в любой), хотя бы 100 кадров. Желательно с зацикливанием. <!>

    4. С помощью Sage получить познавательную и реалистичную визуализацию нетривиального физического явления (теплопроводность, распространение волн, упругость, гравитационный маневр и т.п.), решив подходящее уравнение (систему уравнений) аналитически или численно. <!>

  3. Интерактивные элементы (interact) — написать interact-функцию, пригодную для использования в браузере
    1. Написать функцию, которая генерирует случайный граф (параметры: начальное зерно генератора случайных чисел, число вершин в графе, плотность ребер) и строит анимацию поиска пути в графе (между первой и последней вершинами). Завернуть ее в interact, снабдив все параметры подходящими элементами управления.
    2. Написать функцию, которая генерирует случайный лабиринт (параметры: начальное зерно генератора случайных чисел, размеры) и строит анимацию поиска пути в нем (из левой верхней и правую нижнюю клетку). Завернуть ее в interact, снабдив все параметры подходящими элементами управления.

Полезные ссылки

  1. Sage

  2. Документация

  3. SageWiki — много примеров кода, в т.ч. интерактивных.

    1. Галерея графики, в т.ч. интерактивной

  4. Немного русской документации и скринкастов, стареньких (courtesy Alexander Turenko).

  5. Старенький онлайн-notebook

  6. Новое Sage-облако. По сути, это полноценный бесплатный shared linux hosting с дополнительным веб-интерфейсом к файловой системе и Sage notebook, а также веб-терминалом (bash). Можно грабить корованы работать по SSH. Краткая инструкция:

    1. Зарегистрироваться в системе.
    2. Склонировать репозиторий куда-нибудь к себе, быстрее всего на GitHub же.

    3. Создать новый пустой проект (Project).
    4. Выполнить терминальную команду вида git clone https://github.com/spacediver/sage-demo.git (заменить путь репозиторию на свой, https:// оставить. push будет делаться по https с вводом логина-пароля всякий раз. Можно заморочиться с ssh-keygen, подкладыванием ~/.ssh/id_rsa.pub на свой аккаунт github и доступанием к репозиторию через ssh, это тоже должно работать).

    5. Перейти в подкаталог sage-demo (или какой создался).

    6. Создать новый терминал (это такой файл с расширением .term, который в веб-интерфейсе открывается в виде полноценного терминала).

    7. Запустить htop, cat /etc/passwd, bitcoind...-

    8. Настроить git для новых коммитов

          git config --global user.name "John Doe"
          git config --global user.email johndoe@example.com 

      (ну или подложить свой ~/.gitconfig)

    9. Плодотворно поработать в веб-интерфейсе системы, создавая и редактируя рабочие листы (worksheet), копируя в них код примеров, и т.п.
    10. В терминале выполнить команды git status, diff, add, commit, push.
    11. ...
    12. PROFIT!
    13. Можно зайти на сервер по ssh (см. кнопку «Settings» вашего проекта — нужно будет через веб-интерфейс подложить свой ключик в ~/.ssh/authorized_keys).
  • Запустить valgrind и установить Cython
    • Вариант: скачать отсюда файлы виртуальной машины (Cython-disk1.vmdk и Cython.ovf)

      • Импорт из командной строки: VBoxManage import Cython.ovf или в GUI: «Файл → Импорт конфигураций → Cython.ovf»

      • Проброс 22-го порта (ssh) на localhost:2200 (заход по ssh даёт возможность использовать copy+paste)

      • Установлен ALT Linux Sisyphus и нужные пакеты
      • Работают редакторы: mcedit, vim, nano, geany
      • Пароли: rootroot, useruser

  • ПрочитатьПросмотреть:

  • Склонировать репозиторий с заданиями

  • По аналогии со str.c сделать работу со списком

  • Удалить memory leak, возникающий при тестировании woexp

  • Написать интерфейс-модуль к ftw

  • <!> Написать полезный интерфейс-модуль (которого нет на PyPi :) ) и пример его использования

Include: Ничего не найдено по регулярному выражению «^== Д/З ==$».

Совместная разработка и контроль качества кода

Командная разработка открытого (и не только) проекта: общие принципы

  1. Соблюдать принятые полиси (оформления кода, ведения дискуссии и т. п.)
    • Заявление о намерениях
    • Удобство
  2. Читать
    • Чужой код
    • Информационный поток
  3. Участвовать в информационном пространстве
    • Пояснения, комментарии и тусовка
    • Багтрекеры

Пример:

  • Лидер проекта
    • Разработчик
    • Случайный разработчик
    • Автор контента

  • Полиси и рабочий процесс по разработке
    • Precious repo + индивидуальные хранилища
  • Полиси по взаимодействию с контентом
    • Тестовый свободный + авторский
  • Рабочий процесс тестирования

Совместная разработка и немножко больше про git

  • Что бы уже знаем про git (повторение)
  • История и её роль в процессе разработки
  • Методы точечного переписывания истории: reset + commit, commit --amend

  • Переписывание истории в целом: rebase

    1. Перемещение ветви, зачем это нужно
    2. rebase --interactive

  • stash

Сопровождение публичного и «релизного» хранилища

  • Удалённые хранилища, push / pull (повторение)

  • merge (pull = fetch + merge)

    • Прямоточный, рекурсивный и ручной мерж
    • mergetool и четыре полушария

  • Merge-request
    • git format-patch // git apply/git am

  • Подробнее про remote


отсюда в лекцию не вошло

Средства контроля качества исходного кода

Основная ссылка: pep-0008 — рекомендации к оформлению кода.

Анализаторы кода:

PyLint

  • Жёсткость pep-0008

  • Настройка:
    • pylint --generate-rcfile

    • Отдельные параметры
  • Пример настройки для vim
    • Почему так делать не надо :)

Include: Ничего не найдено по регулярному выражению «^== Д/З ==$».

Проектирование

Виды разработки (по характеру и динамике требований)

  • Исследовательская разработка
  • Заказная разработка (большая и маленькая)
  • Продуктовая разработка

Управление требованиями (приоритезация)

  • Список функциональных и нефункциональных требований к программе должен быть в базовом виде готов до начала программирования
  • Требования могут изменять свой приоритет в ходе разработки

Суть проектирования

  • Организация программы как набора выделенных частей, каждая из которых имеет определенный круг ответственности, а также интерфейсы к другим частям и внешним системам.

Объектное проектирование

  • Программа как набор взаимодействующих объектов: каждый объект является экземпляром некоторого класса, а классы образуют иерархию.

Проектирование «не с нуля»: виды композиции и взаимодействия кода

  • POSIX-подпроцессы (duplicity)
  • просто скрипт поверх библиотеки (sage)
  • true-объектная композиция (Django apps: middleware, contextprocessors)

BIG upfront design — достоинства и недостатки для разных задач

  • большой ответственный софт (атомные реакторы, космические аппараты)
  • маленький безответственный софт (веб-сервисы)

Примеры плохого проектирования (doing it wrong)

  • we engineers like to (over)engineer
  • overdesign example: workers, threads, statuses, queues...
  • все во одном классе — OOP done wrong
  • uwsgi/print example

Постепенное проектирование

  • minimum viable product
  • Гибкость внешних требований
  • Непрерывное тестирование
  • Непрерывный рефакторинг
  • Хорошая тестируемость и отлаживаемость (пример с NT Service, который отлаживать сложно)

Паттерны проектирования

  • Не нужно пытаться внедрить в программу их все сразу
  • Хорошее основание для рефакторинга
  • Спорное основание для проектирования upfront

Ссылки

Include: Ничего не найдено по регулярному выражению «^== Д/З ==$».

Стиль программирования, комментарии и документирование


TODO

Оформление кода

Основная ссылка: pep-0008 — рекомендации к оформлению кода.

Анализаторы кода:

PyLint

  • Жёсткость pep-0008

  • Настройка:
    • pylint --generate-rcfile

    • Отдельные параметры
  • Пример настройки для vim
    • Почему так делать не всегда надо :)

Комментарии

  • Не «что» и «как», а «зачем» и «почему»
  • Комментарии vs. код на Python (это не Си же)
  • Комментарии vs. строки документации
  • Выковыривание комментариев с помощью inspect.getcomments()

Документирование

Битва PEP-ов: pep-0256, pep-0258 — оба отвергнуты.

Include: Ничего не найдено по регулярному выражению «^== Д/З ==$».

Тестирование

Теория

  • Место тестирования в жизненном цикле программного продукта
  • Виды тестирования
  • Тестирование только новых функций или старых тоже (регрессионное тестирование)
  • Ручное, автоматизированное, автоматическое
  • green test trap: Тестирование может доказать наличие дефектов, но не их отсутствие
  • red test trap: Не всякие проваленные тесты означают дефекты. Могут означать пробел в требованиях, в том числе нефункциональных
  • Полезные термины: ошибка программиста при написании программы может привести к дефекту (багу) в программе, который в свою очередь может проявиться (или не проявиться) в виде программного сбоя

  • Стоимость исправления дефекта возрастает пропорционально его «возрасту»
  • Модульное и интеграционное тестирование
  • Непрерывная интеграция

Python

  • Интеграционное тестирование: пример с Selenium / Django
  • Модульное тестирование
    • doctest
    • unittest
    • py.test
  • Показатель покрытия кода тестами (coverage)

Для семестрового проекта

  • Обязательно: набор модульных тестов py.test / unittest
    • с 100% уровнем покрытия (по мнению pytest-cov или coverage),

    • или хорошее обоснование того, почему не достигается 100% покрытие,

    • или интересный рассказ о том, каким тривиально-бесполезным образом оно формально достигается.

  • По возможности: интеграционные тесты (end-to-end)

Ссылки

Include: Ничего не найдено по регулярному выражению «^== Д/З ==$».

Интернационализация и локализация

Напоминание про locale.

«Адаптация культурных и языковых предпочтений»

Объекты ПО:

  • Сообщения и тексты в составе ПО
  • Размер и оформление интерфейсных элементов (RTL, например)
  • Изображения: текст на них и культурная атрибуция
  • Управляющие клавиши (иероглифы, ага :( )

  • Параметры, чувствительные к локали (LANG=ru_RU.KOI8-R LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT LC_IDENTIFICATION LC_ALL)
  • Ссылки на внешние ресурсы (поддержка, издатель и пр.; телефоны, url и пр.)
  • (в сложных случаях) Шрифты

Другие объекты продукта:

  • Электронная документация
  • Непрограммные данные (шаблоны документов и форм и т. п.)
  • Бумажная документация и др. сопутствующие предметы

i18n + l10n

i18n:

  • Универсализация кода
    • См. список объектов
  • Оборачивание в (пустые) вызовы локализующих библиотек
    • Plural forms

l10n: Перевод и создание объектов.

  • Общие словари
  • Translation memory: размеченные корпусы текстов vs. строки сообщений
  • Moving target :(

  • Modern latin
  • Знать Москву или знать русский?
    • => координация переводов и распределение ответственности

    • Неграмотная программа хотя бы не работает…

GNU Gettext

LecturesCMC/LinuxApplicationDevelopment2012/09/Gettext.png

  • Исходный текст как ID
  • Числовые словоформы
  • Неточный перевод (fuzzy) и работа с ним
  • *-format

  • Комментарии и привязки

Пример

https://github.com/FrBrGeorge/PythonWinter2015-gettext

Полезные ссылки

/!\ TODO

Include: Ничего не найдено по регулярному выражению «^== Д/З ==$».

Пакетирование и деплоймент

  • distutils

    • «Сборка» python-пакетов
    • Сборка C-расширений
      • Проблема сборочного окружения
    • Установка
    • Файл setup.py и его команды

  • setuptools

    • Тот же setup.py

    • + easy_install для скачивания и установки с PyPI

    • + Создание egg-файлов

  • Современные setuptools:

PyPI и работа с ним при помощи easy_install и pip

  • Регистрация

Учебный репозитарий: http://github.com/FrBrGeorge/PythonWinter2015-dist

PyInstaller


https://docs.python.org/2.7/library/distutils.html#module-distutils

https://pythonhosted.org/an_example_pypi_project/setuptools.html

https://setuptools.pypa.io/en/latest/setuptools.html#developer-s-guide

http://www.scotttorborg.com/python-packaging/index.html

https://docs.python.org/2/extending/building.html

pip

ezinstall

http://peak.telecommunity.com/DevCenter/PythonEggs

http://wheel.readthedocs.org/en/latest/

LecturesCMC/PythonDevelopment2015/PreExamProjects (последним исправлял пользователь FrBrGeorge 2015-02-28 16:43:27)