Задания, которые необходимо сделать для допуска на экзамен по курсу «Разработка прикладных программ на языке программирования Python»
TODO
Прочитать про git в Git HOWTO
(более подробно — Pro Git book)
Завести аккаунт на GitHub (он понадобится вам и в будущем )
Склонировать репозиторий PythonWinter2015-initial, отредактировать файл README.md и опубликовать результат (использование GitHub не обязательно)
Зарегистрироваться в гугл-группе uneex-python
Оповестить всех о созданном репозитории ( как это проще сделать, чтобы не засорять пространство? в отдельном топике?)
Каждое изменение сопровождается минимум одним коммитом и публикацией. Пункты, помеченные — необязательные
Склонировать Пример
- Исправить ошибку (перетаскивание пустого места приводит к падению)
- Реализовать гравитацию (это просто приращение скорости)
Написать класс «вращающиеся шары разного размера» на базе основного класса (можно использовать transform.html)
- Реализовать соударение: количество шаров лучше взять небольшим, чтобы не просчитывать соударение нескольких
При принятии решения о соударении использовать mask.html или знание о диаметре шара
Перераспределение импульса (описано тут)
Если кому-то хочется переделать всё и написать свой код:
- Пожалуйста!
Подумайте, а не стоит ли взять PyGame в качестве базы для учебного проекта
В качестве основы взять репозиторий с примером. Каждое изменение сопровождается минимум одним коммитом и публикацией. Пункты, помеченные — необязательные
Обработка урла / — если залогинен, то редиректить на /forum, иначе редиректить на /login
- Общая шапка с навигацией по разделам (toolbar)
Форма добавления сообщений (POST /forum)
Сохранение и отображение автора сообщений (хранить id как ForeignKey, отображать username)
Ответные сообщения (=дискуссии)
Полезная информация
учебный Python-хостинг (если совсем не получается поставить всё локально)
Как получить активированное vinrualenv-окружение по Windows «в один клик»:
Создать ярлык на .bat-файл Проект\Scripts\activate.bat
- Отредактировать этот ярлык так, чтобы
рабочий каталог был Проект
activate.bat запускался не напрямую, а с помощью cmd /k
В получившемся окружении все python-сценарии запускать командой python сценарий (при попытке запустить сценарий просто по имени запустится «невиртуализованный» python)
В принципе, не очень важно, но сценарии лежат не в Проект/bin, а в Проект/Scripts
Склонировать недокалькулятор
- Сделать нормальный выход из цикла
Отладить выполнение сценариев (я не пробовал, может, всё и так работает )
Реализовать умножение векторов и двумерных матриц (а не то, что сейчас получается )
- Сделать «красивую» выдачу двумерных матриц (это не так просто, надо вычислять ширину колонки)
Реорганизовать ввод так, чтобы можно было вводить нечто построчно (например, матрицу — по аналогии с предыдущим выводом, или функцию, см. далее)
Реализовать определение и вызов функций (работа с пространствами имён)
Решения всех задач должны быть оформлены отдельными sage-скриптами или worksheet-ами (примеры см. выше), годными для запуска в sage-консоли или в notebook. Также полезно (и ускорит обратную связь), если они будут опубликованы в какой-либо живой Sage-системе (например в этом notebook или даже лучше в в новом облаке — и тогда ссылка на соответствующий worksheet должна быть размещена в README
Пункты, помеченные — необязательные.
- Рисование (вручную заполнить объект Graphics)
- Написать функцию, которая принимате на вход граф (sage.graphs.Graph) и рисует его, размещая на пустом объекте Graphic() вершины и ребра.
Написать функцию, которая получает на вход текстовое представление лабиринта (из прошлого семестра) и рисует его на графике (можно и трехмерном) так, чтобы лабиринт был похож на лабиринт.
- Анимация (animate) — построить объект Animation, пригодный для сохранения в gif-ке
- Написать функцию, которая по данному графу и двум вершинам строит анимацию (объект Animation), которая иллюистрирует алгоритм (можно взять любой) поиска пути по графу (по кадру на каждый шаг поиска, с подсветкой текущего пути другим цветом).
- Написать функцию, которая по текстовому представлению лабиринта (см. выше) строит анимацию (объект Animation), иллюстрирущую алгоритм поиска пути в лабиринте (закрашивание просмотренных клеток)
Написать фрагмент кода на Sage, который создаёт анимацию (объект Animation), иллюстрирующую падение во фрактал (в любой), хотя бы 100 кадров. Желательно с зацикливанием.
С помощью Sage получить познавательную и реалистичную визуализацию нетривиального физического явления (теплопроводность, распространение волн, упругость, гравитационный маневр и т.п.), решив подходящее уравнение (систему уравнений) аналитически или численно.
- Интерактивные элементы (interact) — написать interact-функцию, пригодную для использования в браузере
- Написать функцию, которая генерирует случайный граф (параметры: начальное зерно генератора случайных чисел, число вершин в графе, плотность ребер) и строит анимацию поиска пути в графе (между первой и последней вершинами). Завернуть ее в interact, снабдив все параметры подходящими элементами управления.
- Написать функцию, которая генерирует случайный лабиринт (параметры: начальное зерно генератора случайных чисел, размеры) и строит анимацию поиска пути в нем (из левой верхней и правую нижнюю клетку). Завернуть ее в interact, снабдив все параметры подходящими элементами управления.
Полезные ссылки
SageWiki — много примеров кода, в т.ч. интерактивных.
Галерея графики, в т.ч. интерактивной
Немного русской документации и скринкастов, стареньких (courtesy Alexander Turenko).
Старенький онлайн-notebook
Новое Sage-облако. По сути, это полноценный бесплатный shared linux hosting с дополнительным веб-интерфейсом к файловой системе и Sage notebook, а также веб-терминалом (bash). Можно грабить корованы работать по SSH. Краткая инструкция:
- Зарегистрироваться в системе.
Склонировать репозиторий куда-нибудь к себе, быстрее всего на GitHub же.
- Создать новый пустой проект (Project).
Выполнить терминальную команду вида git clone https://github.com/spacediver/sage-demo.git (заменить путь репозиторию на свой, https:// оставить. push будет делаться по https с вводом логина-пароля всякий раз. Можно заморочиться с ssh-keygen, подкладыванием ~/.ssh/id_rsa.pub на свой аккаунт github и доступанием к репозиторию через ssh, это тоже должно работать).
Перейти в подкаталог sage-demo (или какой создался).
Создать новый терминал (это такой файл с расширением .term, который в веб-интерфейсе открывается в виде полноценного терминала).
Запустить htop, cat /etc/passwd, bitcoind...-
Настроить git для новых коммитов
git config --global user.name "John Doe" git config --global user.email johndoe@example.com
(ну или подложить свой ~/.gitconfig)
- Плодотворно поработать в веб-интерфейсе системы, создавая и редактируя рабочие листы (worksheet), копируя в них код примеров, и т.п.
- В терминале выполнить команды git status, diff, add, commit, push.
- ...
- PROFIT!
- Можно зайти на сервер по 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
Пароли: root — root, user — user
ПрочитатьПросмотреть:
Склонировать репозиторий с заданиями
По аналогии со str.c сделать работу со списком
Удалить memory leak, возникающий при тестировании woexp
Написать интерфейс-модуль к ftw
Написать полезный интерфейс-модуль (которого нет на PyPi ) и пример его использования
Include: Ничего не найдено по регулярному выражению «^== Д/З ==$».
Совместная разработка и контроль качества кода
Командная разработка открытого (и не только) проекта: общие принципы
- Соблюдать принятые полиси (оформления кода, ведения дискуссии и т. п.)
- Заявление о намерениях
- Удобство
- Читать
- Чужой код
- Информационный поток
- Участвовать в информационном пространстве
- Пояснения, комментарии и тусовка
- Багтрекеры
Пример:
- Лидер проекта
- Разработчик
- Случайный разработчик
- Автор контента
⇒
- Полиси и рабочий процесс по разработке
- Precious repo + индивидуальные хранилища
- Полиси по взаимодействию с контентом
- Тестовый свободный + авторский
- Рабочий процесс тестирования
Совместная разработка и немножко больше про git
- Что бы уже знаем про git (повторение)
- История и её роль в процессе разработки
Методы точечного переписывания истории: reset + commit, commit --amend
Переписывание истории в целом: rebase
- Перемещение ветви, зачем это нужно
rebase --interactive
- …
stash
Сопровождение публичного и «релизного» хранилища
Удалённые хранилища, push / pull (повторение)
merge (pull = fetch + merge)
- Прямоточный, рекурсивный и ручной мерж
mergetool и четыре полушария
- Merge-request
git format-patch // git apply/git am
Подробнее про remote
отсюда в лекцию не вошло
Средства контроля качества исходного кода
Основная ссылка: pep-0008 — рекомендации к оформлению кода.
Анализаторы кода:
Статический анализ: pyflakes, …
PyLint
Жёсткость pep-0008
Пример: в коде PyGame-проекта
- Настройка:
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
Ссылки
Eric. S. Raymond. The art of UNIX Programming — очень толковый, с многочисленными примерами из свободных программ, обзор принципов проектирования (UNIX)
Gang of Four — Design Patterns — знаменитая монография по паттернам
Test Driven Django Development — очень толковое введение в инкрементную разработку, основанную на тестах (Test Driven Development) на примере Django.
Include: Ничего не найдено по регулярному выражению «^== Д/З ==$».
Стиль программирования, комментарии и документирование
TODO
Оформление кода
Основная ссылка: pep-0008 — рекомендации к оформлению кода.
Анализаторы кода:
Статический анализ: pyflakes, …
PyLint
Жёсткость pep-0008
Пример: в коде PyGame-проекта
- Настройка:
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
- Исходный текст как ID
- Числовые словоформы
- Неточный перевод (fuzzy) и работа с ним
*-format
- Комментарии и привязки
Пример
https://github.com/FrBrGeorge/PythonWinter2015-gettext
Полезные ссылки
Лекция Андрея Черепанова «Про локализацию свободного ПО» из курса 2007 года (почему она обмазана фотографиями FrBrGeorge? o_O — потому что FrBrGeorge весьма артистично стоял вокруг металлоконструкции в П-12, пока cas читал лекцию)
Windows: в MSDN есть раздел про интернационализацию. Из полезного можно отметить чеклист для обеспечения интернационализации. Также можно оценить удобство и технологичность реализации механизмов интернационализации в Windows на примерном проекте.
TODO
Include: Ничего не найдено по регулярному выражению «^== Д/З ==$».
Пакетирование и деплоймент
distutils
- «Сборка» python-пакетов
- Сборка C-расширений
- Проблема сборочного окружения
- Установка
Файл setup.py и его команды
setuptools
Тот же setup.py
+ easy_install для скачивания и установки с PyPI
+ Создание egg-файлов
Современные setuptools:
+ Создание wheel-файлов
PyPI и работа с ним при помощи easy_install и pip
- Регистрация
Учебный репозитарий: http://github.com/FrBrGeorge/PythonWinter2015-dist
…
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