Работа с историей и событийное программирование
Git
Структура
Содержимое .git
- …
.git/objects/??/*
- Блобы (файлы)
Деревья (не деревья! это срезы рабочей копии, как файл называется + его id)
- Коммиты: какой блоб из какого получился (в действительности — какой срез из какого) + message + родительский коммит
см. git log -p --full-index
python3 -c "import zlib; import sys; print(zlib.decompress(sys.stdin.buffer.read()).decode())"
но проще openssl zlib -d
- Примеры
⇒ Git хранит все когда-либо бывшие объекты и деревья
Ветки
Базовая статья (читать всю главу)
Деревья — не деревья, а срезы ⇒ ветки — не ветки, а что?
Ветка: именованный путь в графе истории изменений, ссылка на ветку отмечает конец такого пути
git checkout -b ветка / git checkout ветка — приводит рабочую копию в соответствие последнему срезу ветки
HEAD, HEAD^, HEAD^^, …
Merge: объединение историй
К. О.: git merge
- Если наследование прямое, просто передвигается HEAD
- Если есть отдельная история, формируется т. н. merge commit
Если есть интерференция коммитов (conflicts), формируется diff3, который надо исправлять руками
TODO Пример
Rebase: переписывание истории
Переписывание линейной истории с помощью git rebase -i
$EDITOR ☺
- Виды действий с историей
- (пример)
- возможно. потребуется ручное вмешательство
- (пример)
Общее правило: при rebase меняются все коммиты, начиная с первого сделанного изменения (даже если это только reword и он только один)
Статья на Хабре относительно выбора междк merge и rebase
PyGame
PyGame = «обёртка» SDL + атомарность
Поверхностное описание:
Основные объекты: surface.html, rect.html, timer.html, image.html, transform.html, …
- Другие возможности
Событийное программирование
Проблемы алгоритмической полноты «событийного ЯП» в части описания среды порождения, передачи и обработки событий вне объектов этой среды (диспетчера).
Кто-нибудь знает пример такого ЯП?
- Модель:
- среда (игровой мир) = проводник событий + контейнер объектов
- Варианты реализации
- Предзаданная среда + обработчики событий в объектах (+ средства подписки на события)
- Моделирование среды с помощью «цикла разбора событий» (mainloop)
Pygame и событийное программирование
- Понятие «игровых часов» (tick)
- Классическая организация игрового времени: таймер
- «доделать всё и подождать тика»
- Работает на медленных платформах, просто медленно
- Современная организация игрового времени: такт
- «тик — это событие»
- Накопление / сброс необработанных событий
- Классическая организация игрового времени: таймер
- Образующий цикл игровой модели
- Определение адресата события
- Обработка низкоуровневого события (немедленная)
- Активность объектов (возможно, немедленная)
- Изменение игрового мира (каждый tick)
- Отрисовка игрового мира (возможно, немедленная)
Пример: https://git.sr.ht/~frbrgeorge/PyGameExample/log
Доделать
Д/З
- Прочитать и прощёлкать
Про ветвление в учебнике по Git
Две методички по PyGame (введение и пришиби макаку)