',
29 | html = '',
30 | latex = '\\newpage{}',
31 | ms = '.bp',
32 | ooxml = '',
33 | odt = ''
34 | }
35 |
36 | local function pagebreaks_from_config (meta)
37 | local html_class =
38 | (meta.newpage_html_class and stringify(meta.newpage_html_class))
39 | or os.getenv 'PANDOC_NEWPAGE_HTML_CLASS'
40 | if html_class and html_class ~= '' then
41 | pagebreak.html = string.format('', html_class)
42 | end
43 |
44 | local odt_style =
45 | (meta.newpage_odt_style and stringify(meta.newpage_odt_style))
46 | or os.getenv 'PANDOC_NEWPAGE_ODT_STYLE'
47 | if odt_style and odt_style ~= '' then
48 | pagebreak.odt = string.format('', odt_style)
49 | end
50 | end
51 |
52 | --- Return a block element causing a page break in the given format.
53 | local function newpage(format)
54 | if format:match 'asciidoc' then
55 | return pandoc.RawBlock('asciidoc', pagebreak.asciidoc)
56 | elseif format == 'context' then
57 | return pandoc.RawBlock('context', pagebreak.context)
58 | elseif format == 'docx' then
59 | return pandoc.RawBlock('openxml', pagebreak.ooxml)
60 | elseif format:match 'epub' then
61 | return pandoc.RawBlock('html', pagebreak.epub)
62 | elseif format:match 'html.*' then
63 | return pandoc.RawBlock('html', pagebreak.html)
64 | elseif format:match 'latex' then
65 | return pandoc.RawBlock('tex', pagebreak.latex)
66 | elseif format:match 'ms' then
67 | return pandoc.RawBlock('ms', pagebreak.ms)
68 | elseif format:match 'odt' then
69 | return pandoc.RawBlock('opendocument', pagebreak.odt)
70 | else
71 | -- fall back to insert a form feed character
72 | return pandoc.Para{pandoc.Str '\f'}
73 | end
74 | end
75 |
76 | local function is_newpage_command(command)
77 | return command:match '^\\newpage%{?%}?$'
78 | or command:match '^\\pagebreak%{?%}?$'
79 | end
80 |
81 | -- Filter function called on each RawBlock element.
82 | function RawBlock (el)
83 | -- Don't do anything if the output is TeX
84 | if FORMAT:match 'tex$' then
85 | return nil
86 | end
87 | -- check that the block is TeX or LaTeX and contains only
88 | -- \newpage or \pagebreak.
89 | if el.format:match 'tex' and is_newpage_command(el.text) then
90 | -- use format-specific pagebreak marker. FORMAT is set by pandoc to
91 | -- the targeted output format.
92 | return newpage(FORMAT)
93 | end
94 | -- otherwise, leave the block unchanged
95 | return nil
96 | end
97 |
98 | -- Turning paragraphs which contain nothing but a form feed
99 | -- characters into line breaks.
100 | function Para (el)
101 | if #el.content == 1 and el.content[1].text == '\f' then
102 | return newpage(FORMAT)
103 | end
104 | end
105 |
106 | return {
107 | {Meta = pagebreaks_from_config},
108 | {RawBlock = RawBlock, Para = Para}
109 | }
110 |
--------------------------------------------------------------------------------
/filters/upper.lua:
--------------------------------------------------------------------------------
1 | local text = require('text')
2 |
3 | function Header(el)
4 | if el.level == 1 and FORMAT == 'docx' then
5 | return pandoc.walk_block(el, {
6 | Str = function(el)
7 | return pandoc.Str(text.upper(el.text))
8 | end })
9 | end
10 | end
11 |
12 | function Blocks(blocks)
13 | local hblocks = {}
14 | for i, el in pairs(blocks) do
15 | if el.t == "Header" and el.level == 1 then
16 | table.insert(hblocks, pandoc.RawBlock("tex","\\newpage"))
17 | end
18 | table.insert(hblocks, el)
19 | end
20 | return hblocks
21 | end
--------------------------------------------------------------------------------
/images/cli1.svg:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
142 |
--------------------------------------------------------------------------------
/images/cli2.svg:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
222 |
--------------------------------------------------------------------------------
/images/docs3.svg:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
59 |
--------------------------------------------------------------------------------
/images/docs5.svg:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
166 |
--------------------------------------------------------------------------------
/images/docs6.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/images/docs7.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/images/dsl2.svg:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
98 |
--------------------------------------------------------------------------------
/images/git1.svg:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
65 |
--------------------------------------------------------------------------------
/images/git2.svg:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
113 |
--------------------------------------------------------------------------------
/images/git3.svg:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
131 |
--------------------------------------------------------------------------------
/images/git4.svg:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
101 |
--------------------------------------------------------------------------------
/images/git5.svg:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
213 |
--------------------------------------------------------------------------------
/images/make2.svg:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
117 |
--------------------------------------------------------------------------------
/images/pm1.svg:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
164 |
--------------------------------------------------------------------------------
/images/vm1.svg:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
68 |
--------------------------------------------------------------------------------
/images/vm2.svg:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
80 |
--------------------------------------------------------------------------------
/makefile:
--------------------------------------------------------------------------------
1 | MD_FILES = md/introduction.md \
2 | md/command_line.md \
3 | md/package_managers.md \
4 | md/conf_languages.md \
5 | md/build_automation.md \
6 | md/version_control.md \
7 | md/docs_as_code.md \
8 | md/virtual_machines.md \
9 | md/bibliography.md
10 |
11 | HTML_FILE = build/kisscm.html
12 | PDF_FILE = build/kisscm.pdf
13 | DOCX_FILE = build/kisscm.docx
14 |
15 | OPTIONS = -d default.yaml \
16 | --from=markdown+tex_math_single_backslash+tex_math_dollars+raw_tex \
17 | --toc \
18 | --resource-path=images \
19 | -F pandoc-crossref \
20 | --columns=1 \
21 | --citeproc \
22 | --lua-filter=filters/pagebreak.lua \
23 | --lua-filter=filters/upper.lua
24 |
25 | ifeq ($(OS), Windows_NT)
26 | MK_BUILD = if not exist build mkdir build
27 | RM_BUILD = del /q build\*.*
28 | else
29 | MK_BUILD = mkdir -p build
30 | RM_BUILD = rm build/*.*
31 | endif
32 |
33 | all: html pdf docx
34 |
35 | html: $(HTML_FILE)
36 |
37 | pdf: $(PDF_FILE)
38 |
39 | docx: $(DOCX_FILE)
40 |
41 | $(HTML_FILE): $(MD_FILES)
42 | $(MK_BUILD)
43 | pandoc $(MD_FILES) $(OPTIONS) --output=$(HTML_FILE) --to=html5 --mathjax --self-contained
44 |
45 | $(PDF_FILE): $(MD_FILES)
46 | $(MK_BUILD)
47 | pandoc $(MD_FILES) $(OPTIONS) --metadata-file pdf.yaml --output=$(PDF_FILE) --to=latex --pdf-engine=xelatex
48 |
49 | $(DOCX_FILE): $(MD_FILES)
50 | $(MK_BUILD)
51 | pandoc $(MD_FILES) $(OPTIONS) --reference-doc=template.docx --output=$(DOCX_FILE) --to=docx
52 | python filters/bullets.py $(DOCX_FILE)
53 |
54 | clean:
55 | $(RM_BUILD)
56 |
--------------------------------------------------------------------------------
/md/bibliography.md:
--------------------------------------------------------------------------------
1 | # Список литературы {-}
2 |
--------------------------------------------------------------------------------
/md/build_automation.md:
--------------------------------------------------------------------------------
1 | # Системы автоматизации сборки
2 |
3 | ## Виды систем сборки
4 |
5 | Сборка программного проекта может состоять из большого числа этапов, среди которых: компиляция модулей, подготовка файлов данных и преобразование их форматов, генерирование документации. Чтобы не повторять рутинные действия из раза в раз можно написать программу на языке интерпретатора командной строки. Тем не менее, работа простых сборочных скриптов на больших проектах часто занимает непозволительно большое время.
6 |
7 | К системе сборки @mokhov2020build могут быть предъявлены следующие требования:
8 |
9 | * каждая сборочная задача выполняется не более одного раза, а сами задачи выполняются лишь в том случае, если они прямо или косвенно зависят от входных данных, которые изменились с предыдущей сборки проекта;
10 | * задачи, которые прямо и косвенно не зависят друг от друга, имеется возможность выполнить параллельно.
11 |
12 | К *основным элементам системы сборки* относятся:
13 |
14 | * таблица, в которой содержатся ключи – задачи и значения – файлы или другие данные, определяющие результат выполнения задачи;
15 | * план выполнения задач с определением действий по выполнению каждой задачи и указанием стартовой задачи;
16 | * алгоритм планировщика задач и способ определения задач, которые не нуждаются в перестроении.
17 |
18 | Система сборки принимает на вход таблицу и план выполнения задач и возвращает таблицу в актуальном состоянии – для стартовой задачи и всех ее зависимостей выполнены необходимые действия.
19 |
20 | Система сборки принимает описание задачи, целевой ключ и хранилище и возвращает измененное хранилище, в котором целевой ключ и всего его зависимости принимают актуальные значения.
21 |
22 | *Таблица* может быть представлена одним из следующих основных способов:
23 |
24 | 1. файловая система вместо отдельной таблицы и время модификации файлов. Если время модификации одного из файлов-зависимостей задачи более новое, чем время модификации файла-результата самой задачи – необходимо перестроить задачу;
25 | 2. хранилище с хеш-значениями файлов в качестве ключей. Если хеш файла, связанного с задачей, изменился, то задачу необходимо перестроить.
26 |
27 | *План выполнения задач* описывается на языке системы сборки. Такие языки можно отнести к классу конфигурационных языков.
28 |
29 | Системы сборки различаются по типу используемого *алгоритма планировщика*:
30 |
31 | * алгоритм топологической сортировки графа зависимостей задач;
32 | * алгоритм на основе рестартов задач;
33 | * алгоритм на основе приостановки задач;
34 |
35 | Алгоритм на основе рестартов задач устроен следующим образом. Рассмотрим ситуацию, когда выполняется задача $A$ и было установлено, что она имеет зависимую задачу $B$, которая должна быть выполнена в первую очередь. В этом случае выполнение задачи $A$ отменяется, выполняется задача $B$, затем выполнение задачи $A$ стартует повторно.
36 |
37 | Алгоритм на основе приостановки задач отличается тем, что не отменяет выполнение задачи $A$ полностью, а лишь приостанавливает это выполнение. После завершения задачи $B$ система сборки возвращается к приостановленной ранее задаче $A$ и продолжает ее выполнение.
38 |
39 | Также системы сборки различаются по **типу зависимостей**:
40 |
41 | * статические зависимости;
42 | * динамические зависимости.
43 |
44 | Статические зависимости устанавливаются на этапе составления плана выполнения задач. Динамические зависимости обнаруживаются в процессе сборки. Например, одна из задач формирует файл-список файлов-рисунков, для каждого из которых необходимо выполнить отдельную задачу – преобразовать рисунок в некоторый графический формат.
45 |
46 | В системе сборки может применяться **техника раннего среза** (early cutoff) – если задача выполнена, но ее результат не изменился с предыдущей сборки, то нет необходимости исполнять зависимые задачи, то есть процесс сборки можно завершить ранее. На практике такая ситуация определяется по хеш-значению файла, связанного с задачей. Например, если в файл main.c был добавлен новый комментарий, сборка может быть остановлена после определения отсутствия изменений в хеш-значении объектного файла – main.o.
47 |
48 | При использовании облачной системы сборки скорость сборки может быть существенно увеличена, благодаря разделению результатов сборки между отдельными разработчиками. Облачная система сборки может поддержать вариант сборки, при котором локально образуются только конечные результаты сборки, а все промежуточные файлы остаются в облаке.
49 |
50 | На @fig:make1 приведен пример сценария работы с облачной системой сборки. Пользователь совершает следующие действия:
51 |
52 | 1. Загружает исходные тексты, их хеш-значения 1, 2 и 3.
53 | 2. Затем пользователь запрашивает сборку main.exe. Система сборки определяет с помощью изучения истории предыдущих сборок, что кто-то уже скомпилировал ранее эти исходные тексты для main.exe. Результаты их сборки хранятся в облаке с хешами 4 (util.o) и 5 (main.o). Система сборки далее определяет, что для зависимостей с такими хешами есть готовый main.exe с хешем 6. По ключу 6 из облачного хранилища извлекается конечный результат;
54 | 3. Далее пользователь изменяет util.c, и его хеш становится равен 7. В облаке комбинации хешей (7, 2) не существует, то есть ранее никто еще не компилировал такой вариант исходного кода. Процесс продолжается до получения нового main.exe, после чего новые варианты файлов и их хеш-значения сохраняются в облаке.
55 |
56 | {#fig:make1}
57 |
58 | ## Топологическая сортировка
59 |
60 | Топологическая сортировка является популярным алгоритмом планировщика в системах сборки.
61 |
62 | Рассмотрим пример, показанный на @fig:make2. Здесь целевой задачей является «экипировка», для достижения которой необходимо выполнить подзадачи в корректном порядке. Таким порядком может быть следующий:
63 |
64 | ```default
65 | 1 3 2 5 7 4 6 8
66 | ```
67 |
68 | Легко заметить, что это не единственный корректный порядок. Следующий вариант тоже имеет право на существование:
69 |
70 | ```default
71 | 1 3 4 2 6 5 7 8
72 | ```
73 |
74 | Обратите внимание, что такие задачи, как, например, 4 и 5, можно было бы выполнить одновременно, поскольку они не зависят друг от друга. Одевающемуся человеку это выполнить проблематично, но в случае сборки ПО возможность параллельного выполнения подзадач является полезной.
75 |
76 | Простой алгоритм топологической сортировки состоит из следующих шагов:
77 |
78 | 1. Найти узлы графа без входных зависимостей и добавить их к списку результатов.
79 | 2. Удалить ранее найденные узлы. Если узлов в графе не осталось, то возвратить результат. В противном случае перейти к п.1.
80 |
81 | На практике чаще используется алгоритм топологической сортировки, основанный на обходе графа в глубину.
82 |
83 | Топологическая сортировка определена для графов, не имеющих циклических зависимостей между задачами. На практике циклы в графе могут возникнуть при использовании динамических зависимостей.
84 |
85 | {#fig:make2}
86 |
87 | ## Система сборки Make
88 |
89 | Система сборки Make является старейшей в своем классе (1976 г.) и при этом до сих пор активно используется разработчиками.
90 |
91 | К основным характеристикам Make относятся:
92 |
93 | * Использование файловой системы, вместо таблицы, а также времени модификации файлов для определения необходимости пересборки задач;
94 | * Поддержка только статических зависимостей;
95 | * Использование алгоритма топологической сортировки в качестве алгоритма планировщика.
96 |
97 | В Make используется специальный конфигурационный файл с именем Makefile для определения плана сборки. Основными элементами декларативного языка Makefile являются определения переменных, а также правила сборки, состоящие из задачи-цели и ряда задач-зависимостей для этой цели.
98 |
99 | Рассмотрим пример определения Makefile для графа «экипировки» на @fig:make2.
100 |
101 | ```makefile
102 | equipment: shoes jacket
103 | @echo $@
104 |
105 | underwear:
106 | @echo $@
107 |
108 | socks: underwear
109 | @echo $@
110 |
111 | shirt: underwear
112 | @echo $@
113 |
114 | trousers: shirt
115 | @echo $@
116 |
117 | sweater: shirt
118 | @echo $@
119 |
120 | shoes: trousers
121 | @echo $@
122 |
123 | jacket: sweater
124 | @echo $@
125 | ```
126 |
127 | В этом примере имеется последовательность правил следующего вида:
128 |
129 | ```default
130 | цель: зависимости
131 | действие
132 | ```
133 |
134 | Действия представляют собой последовательность строк, это команды для интерпретатора командой строки ОС. Командами могут быть, в частности, вызовы компилятора или вызовы инструментов преобразования форматов данных.
135 |
136 | Обратите внимание, что строки действий выделяются символом табуляции. Именно табуляцией, а не пробелами. Если была получена ошибка `missing separator` при выполнении Makefile, то речь идет именно о путанице с пробелами и табуляциями.
137 |
138 | Цели и зависимости представляют собой, с точки зрения make, имена файлов. У этих файлов и проверяется время последней модификации. Если файл цели задачи отсутствует, то сборка этой задачи всегда будет произведена.
139 |
140 | Вызов make в каталоге, содержащем приведенный выше Makefile, выдаст следующую информацию:
141 |
142 | ```default
143 | underwear
144 | shirt
145 | trousers
146 | shoes
147 | sweater
148 | jacket
149 | equipment
150 | ```
151 |
152 | В правилах могут использоваться специальные переменные, среди которых:
153 |
154 | * `$@`. Имя цели.
155 | * `$<`. Имя первой зависимости.
156 | * `$^`. Список имен всех зависимостей.
157 |
158 | Переменные в Makefile определяются, как показано в примере ниже:
159 |
160 | ```makefile
161 | SHOW = @echo $@
162 | %:
163 | $(SHOW)
164 |
165 | equipment: shoes jacket
166 | underwear:
167 | socks: underwear
168 | shirt: underwear
169 | trousers: shirt
170 | sweater: shirt
171 | shoes: trousers
172 | jacket: sweater
173 | ```
174 |
175 | Здесь используется определение шаблона с помощью `%`, что обозначает произвольное имя. В рассматриваемом примере это приводит к выполнению указанного действия для всех целей.
176 |
177 | Утилита make по умолчанию начинает выполнение с первой цели, указанной в Makefile. Можно также указать и конкретную цель для сборки:
178 |
179 | ```default
180 | # make trousers
181 | underwear
182 | shirt
183 | trousers
184 | ```
185 |
186 | В Makefile часто добавляются псевдоцели, такие как all (собрать все) и clean (очистить от временных файлов). Для того, чтобы утилита make могла отличить псевдоцели от файлов, используется специальная цель .PHONY.
187 |
--------------------------------------------------------------------------------
/md/docs_as_code.md:
--------------------------------------------------------------------------------
1 | # Документация как код
2 |
3 | Как известно, большинство программистов не любит писать документацию к своим проектам. На это есть причины. В частности, документацию трудно поддерживать в актуальном состоянии в процессе разработки программы. Кроме того, традиционный подход к ведению технической документации с использованием редакторов в духе Microsoft Word с точки зрения разработчика сильно отличается от процессов ведения программного проекта.
4 |
5 | В связи с вышесказанным перспективным является подход «документация как код» (docs as code), основная идея которого в использовании для создания технической документации тех же процессов, что и для разработки программ. Подход «документация как код» отличается следующими особенностями:
6 |
7 | * Использование текстовых языков разметки, удобных как для чтения человеком, так и с точки зрения машинной обработки;
8 | * Использование текстовых языков описания графических материалов;
9 | * Использование системы контроля версий для хранения проекта документации;
10 | * Использование инструментов командной строки для автоматической проверки, сборки документации и непрерывной интеграции (continuous integration);
11 | * Ориентация на выходной web-формат.
12 |
13 | ## Языки разметки
14 |
15 | Языки разметки, помимо очевидной возможности написания текстов, поддерживают специальные команды, отвечающие за внешний вид и структурные особенности документа. В отличие от обычных WYSIWYG-редакторов («что вижу на экране, то и получу в документе»), язык разметки позволяет документ «запрограммировать», при этом «программа» на языке разметки и ее результат в виде документа отличаются друг от друга.
16 |
17 | Очевидным примером языка разметки является HTML, но для задач составления документации было создано множество специальных языков, в частности:
18 |
19 | * LaTeX;
20 | * Markdown;
21 | * reStructuredText;
22 | * AsciiDoc.
23 |
24 | Важным достоинством языка разметки является удобство использование системы контроля версий – в истории репозитория легко отследить изменения, внесенные в документ. Этого не удалось бы добиться с двоичными форматами в духе docx.
25 |
26 | Одной из важнейших проблем проектирования языка разметки является обеспечение необходимой гибкости в компьютерной верстке документа при использовании облегченного, почти «невидимого» для пользователя командного языка.
27 |
28 | Один из древнейших и, пожалуй, самый мощный язык разметки – TeX, который используется в одноименной системе компьютерной верстки. TeX был разработан Д. Кнутом в 1978 году для задач написания литературы в области компьютерных наук. В 1984 году Л. Лэмпорт создал набор макрорасширений для TeX под названием LaTeX. Сегодня LaTeX используется для написания статьей в журналах по математике и физике, создания технических книг, дипломов и диссертаций.
29 |
30 | LaTeX отличают средства автоматизации создания документов, это касается, в частности, построения списка литературы, нумерации элементов и ссылок на них, оптимизации размещения элементов на страницах и описания математических формул.
31 |
32 | Ниже представлен пример простого документа в LaTeX:
33 |
34 | ```latex
35 | \documentclass[14pt]{article} % Формат страниц
36 | \usepackage{polyglossia} % Поддержка русского языка
37 | \setmainlanguage{russian}
38 | \setmainfont{Times New Roman} % Настройка шрифта
39 |
40 | \title{Тестовый документ} % Заголовок
41 | \author{П.Н. Советов} % Автор
42 | \date{\today} % Дата создания
43 |
44 | \begin{document} % Тело документа
45 |
46 | \maketitle % Вставка заголовка
47 |
48 | Это простой \textbf{пример} документа в \LaTeX.
49 |
50 | \end{document}
51 | ```
52 |
53 | Можно заметить, что команды в LaTeX предваряются символом `\` и могут иметь аргументы, заключенные в скобки различных форм.
54 |
55 | Результат компиляции документа с помощью `xelatex` показан на @fig:docs1.
56 |
57 | {#fig:docs1}
58 |
59 | Особый интерес представляет использующийся в LaTeX язык разметки математических формул. Формулы обрамляются символами `$` (встраивание в текст) или `$$` (в отдельной строке). Примеры простых формул представлены ниже:
60 |
61 | ```latex
62 | $$
63 | a^n + b^n = c^n
64 | $$
65 |
66 | $$
67 | x_{1,2}=\frac{-b \pm \sqrt {b^2-4ac}}{2a}
68 | $$
69 |
70 | $$
71 | f(x) = \frac{1}{\sigma \sqrt{2\pi} }
72 | e^{-\frac{1}{2}\left(\frac{x-\mu}{\sigma}\right)^2}
73 | $$
74 |
75 | $$
76 | \eta(T|a)= \sum_{v\in vals(a)} {\frac{|S_a{(v)}|}{|T|}
77 | \cdot \eta\left(S_a{\left(v\right)}\right)}
78 | $$
79 | ```
80 |
81 | Результат компиляции формул представлен на @fig:docs2.
82 |
83 | {#fig:docs2}
84 |
85 | Знакомство с языком описания формул LaTeX очень полезно, поскольку этот язык или его подмножества используются во многих современных системах, например, в языке разметки Wikipedia.
86 |
87 | ## Грамотное программирование
88 |
89 | Как уже говорилось выше, особенную проблему представляет разделенность программного кода и документации на программный проект. Ранней попыткой решить указанную проблему является подход «грамотного программирования» (literate programming) Д. Кнута в виде системы WEB, созданной в 1984 году. WEB основана на системе TeX и позволяет вести документацию с внедренным в нее программным кодом.
90 |
91 | С помощью инструмента `weave` из WEB-файла извлекается только часть, связанная с документацией. С помощью инструмента `tangle` из WEB-файла извлекается программный код. Схема работы WEB показана на @fig:docs3.
92 |
93 | {#fig:docs3}
94 |
95 | На @fig:docs4 показан пример LaTeX-документа, извлеченного из WEB-файла.
96 |
97 | {#fig:docs4}
98 |
99 | Из приведенного WEB-документа может быть извлечен также следующий код:
100 |
101 | ```Python
102 | def insert(tree, key):
103 | if not tree:
104 | tree = Node(key)
105 | elif key < tree.key:
106 | tree = Node(tree.key, insert(tree.left, key), tree.right)
107 | elif key > tree.key:
108 | tree = Node(tree.key, tree.left, insert(tree.right, key))
109 | return tree
110 | ```
111 |
112 | В какой-то мере черты грамотного программирования унаследовала система Jupyter-блокнотов, в которой документы представлены в виде последовательности ячеек. Ячейка может либо содержать программный код, либо – документацию. Jupyter-блокноты используются, в основном, в области научно-технических расчетов и для анализа данных.
113 |
114 | ## Markdown и Pandoc
115 |
116 | Одним из простейших языков разметки является Markdown. Его авторы преследовали цель получения незаметного командного языка, чтобы файлы на Markdown было легко читать, как есть, даже без трансляции в какое-то выходное представление.
117 |
118 | Ниже показаны примеры элементов синтаксиса Markdown:
119 |
120 | ~~~markdown
121 | # Заголовок 1
122 | ## Заголовок 2
123 | ## Заголовок 3
124 |
125 | Параграф с текстом и [ссылкой](https://pandoc.org/).
126 |
127 | Параграф с текстом, выделенным **жирным** и *курсивом*.
128 |
129 | > Важная цитата (Автор)
130 |
131 | Список элементов:
132 |
133 | 1. Первый.
134 | 1. Второй.
135 | * Вложенный первый.
136 | * Вложенный второй.
137 | 1. Третий.
138 |
139 | | Поле 1 | Поле 2 |
140 | | ----------- | ----------- |
141 | | Данные 1 | Данные 3 |
142 | | Данные 2 | Данные 4 |
143 |
144 | ```python
145 | {
146 | "name": "Ivan",
147 | "last_name": "Drago",
148 | "age": 25
149 | }
150 | ```
151 | ~~~
152 |
153 | Markdown, в силу простоты и читаемости своего синтаксиса, представляет собой возможную альтернативу LaTeX. Однако, при использовании более-менее сложного форматирования документов возможностей Markdown быстро перестанет хватать. В этой ситуации может помочь инструмент Pandoc @pandoc, предназначенный для трансляции документов из одного представления в другое. Особенность Pandoc в том, что в нем поддерживается расширенный вариант Markdown, который, в свою очередь, можно дополнить рядом сторонних модулей.
154 |
155 | Архитектура Pandoc показана на @fig:docs5. Работу Pandoc можно разбить на три этапа:
156 |
157 | 1. Одно из входных представлений с помощью поддерживаемых трансляторов для чтения (readers) преобразуется во внутреннее представление Pandoc – дерево абстрактного синтаксиса.
158 | 2. На уровне AST могут бы применены пользовательские фильтры (filters).
159 | 3. Полученное AST с помощью поддерживаемых трансляторов для записи (writers) преобразуется в одно из выходных представлений.
160 |
161 | В варианте markdown от Pandoс поддерживаются некоторые элементы LaTeX, в частности, язык описания математических формул.
162 |
163 | {#fig:docs5}
164 |
165 | ## Языки описания диаграмм
166 |
167 | Как и в случае текста, языки описания графических материалов позволяют легко вносить и отслеживать изменения в рисунок. Еще одним преимуществом таких языков является возможность автоматизации построения рисунков. Это касается, в частности, построения различных диаграмм на основе автоматического анализа классов и модулей из программного кода.
168 |
169 | Одним из наиболее популярных инструментов в этой области является Graphviz, в котором для описания графов различного вида используется язык Dot.
170 |
171 | Пример кода на языке Dot показан далее:
172 |
173 | ```dot
174 | digraph G {
175 | n1 [style=filled, color=brown1, label="1", shape=oval]
176 | n2 [style=filled, color=darkolivegreen1, label="2", shape=box]
177 | n3 [style=filled, color=aquamarine, label="3", shape=circle]
178 |
179 | n1 -> n2 -> n3
180 | n3 -> n1
181 | }
182 | ```
183 |
184 | Результат компиляции в графический файл представлен на @fig:docs6.
185 |
186 | {#fig:docs6}
187 |
188 | Еще одним популярным инструментом является PlantUML, предназначенный для создания как UML-диаграмм различного вида, так и для диаграмм иного вида (диаграммы Ганта, интеллект-карты и проч.).
189 |
190 | Ниже представлен пример диаграммы, описанной на языке PlantUML:
191 |
192 | ```plantuml
193 | @startuml
194 | skinparam monochrome true
195 | skinparam shadowing false
196 |
197 | A -> B: шаг
198 |
199 | activate B
200 | B -> C: шаг
201 |
202 | activate C
203 | C --> C: действие
204 | C -> B: шаг
205 | deactivate C
206 |
207 | B -> A: шаг
208 | deactivate B
209 | @enduml
210 | ```
211 |
212 | Результат компиляции в графический файл представлен на @fig:docs7.
213 |
214 | {#fig:docs7}
215 |
216 | ## Генераторы документации на основе исходных текстов
217 |
218 | Очевидным способом объединения документации и программного кода является подробное комментирование программного кода. При внесении изменений в программу имеется возможность сразу же обновить документирующие поведение программы комментарии в коде. Существуют инструменты, позволяющие автоматически извлечь из файла программы специальным образом оформленные комментарии и оформить результат в виде справочной документации по программному модулю.
219 |
220 | Примеры генераторов документации:
221 |
222 | * Javadoc для языка Java;
223 | * Doxygen для C++ и некоторых других языков;
224 | * Расширения для системы Sphinx, поддерживающие целый ряд языков.
225 |
226 | Ниже показан пример программы на языке C со специальными комментариями, поддерживаемыми системой Doxygen. Обратите внимание на специальные ключевые слова `\file`, `\brief` и `\param`:
227 |
228 | ```doxygen
229 | /// \file main.cpp
230 | /// Модуль main.
231 |
232 | #include
233 |
234 | /// \brief Главная функция.
235 | /// \param int argc Счетчик аргументов.
236 | /// \param char **argv Указатель на аргументы.
237 | int main(int argc, char **argv) {
238 | return 0;
239 | }
240 | ```
241 |
242 | Далее приведен пример программы на языке Питон, с комментариями, поддерживаемыми системой Sphinx. Обратите внимание на специальные ключевые слова `param`, `type` и `return`:
243 |
244 | ```python
245 | """
246 | Модуль main.
247 | """
248 |
249 | def main(x, y):
250 | """
251 | Функция main.
252 |
253 | :param x: Параметр x.
254 | :type x: str
255 | :param y: Параметр y.
256 | :type y: int
257 | :return: Ничего не возвращает.
258 | """
259 | ```
260 |
--------------------------------------------------------------------------------
/md/introduction.md:
--------------------------------------------------------------------------------
1 | # Введение {-}
2 |
3 | ## Что такое конфигурационное управление {-}
4 |
5 | Задача управления конфигурацией (configuration management) некоторой системы является типичной для инженерной деятельности. Под конфигурацией понимается состав элементов системы и взаимное их расположение. Конфигурацией можно управлять, отслеживая ее состояние и контролируя целостность изменений конфигурации, а также фиксируя эти изменения в документации.
6 |
7 | Можно заметить, что конфигурационное управление в описанном виде представляется достаточно рутинной работой. К счастью, инструменты и подходы, разработанные для конфигурационного управления ПО (software configuration management), позволили автоматизировать многие задачи. Это, в частности, касается популярного инструмента git, который сегодня используется не только программистами, но даже некоторыми художниками и писателями для управления конфигурацией своих творений. Далее под конфигурационным управлением будет пониматься именно конфигурационное управление ПО.
8 |
9 | Конфигурационное управление является частью программной инженерии, поэтому к нему применима следующая цитата:
10 |
11 | > «Программная инженерия – это то, что происходит с программированием при добавлении времени и других программистов»
12 | >
13 | > (Russ Cox).
14 |
15 | ## Формальные определения {-}
16 |
17 | Рассмотрим теперь несколько формальных определений конфигурационного управления.
18 |
19 | В ГОСТ Р ИСО/МЭК 12207-2010 определены следующие термины:
20 |
21 | **Базовая линия** (baseline) – спецификация или продукт, которые были официально рассмотрены и согласованы с тем, чтобы впоследствии служить основой для дальнейшего развития, и которые могут быть изменены только посредством официальных и контролируемых процедур изменения
22 |
23 | **Составная часть конфигурации** (configuration item) – объект в пределах конфигурации, который удовлетворяет некоторой функции целевого применения и может быть однозначно идентифицирован в данный момент
24 |
25 | С использованием этих терминов определена цель конфигурационного управления (менеджмента конфигурации):
26 |
27 | Цель процесса менеджмента конфигурации состоит в установлении и поддержании целостности всех идентифицированных выходных результатов проекта или процесса обеспечения доступа к ним любой заинтересованной стороны.
28 |
29 | В результате успешного осуществления процесса менеджмента конфигурации:
30 |
31 | 1. определяется стратегия менеджмента конфигурации;
32 | 1. определяются составные части, нуждающиеся в менеджменте конфигурации;
33 | 1. устанавливается базовая линия конфигурации;
34 | 1. осуществляется управление изменениями в составных частях, находящихся под менеджментом конфигурации;
35 | 1. осуществляется управление конфигурацией составных частей, входящих в выпуск;
36 | 1. статус составных частей, на которые распространяется менеджмент конфигурации, становится доступным на протяжении всего жизненного цикла.
37 |
38 | Во введении к стандарту IEEE 828-2012 конфигурационное управление в системной и программной инженерии определено, как специальная дисциплина в рамках более крупной дисциплины конфигурационного управления. Целями конфигурационного управления является:
39 |
40 | 1. идентифицировать и задокументировать функциональные и физические характеристики любого продукта, компонента, результата или услуги;
41 | 1. управлять любыми изменениями этих характеристик;
42 | 1. вести записи и сообщать о каждом изменении и статусе его реализации;
43 | 1. поддерживать аудит продуктов, результатов, услуг или компонентов для проверки соответствия требованиям.
44 |
45 | ## Тематика книги {-}
46 |
47 | В этой книге конфигурационное управление трактуется более широко, чем в приведенных выше формальных определениях. Тематика книги в некоторой степени пересекаются с заслуживающими внимания материалами из @missing и @irving2021research.
48 |
49 | Рассматриваемые далее темы:
50 |
51 | 1. командная строка;
52 | 1. менеджеры пакетов;
53 | 1. конфигурационные языки;
54 | 1. системы автоматизации сборки;
55 | 1. системы контроля версий;
56 | 1. документация как код;
57 | 1. вопросы виртуализации.
58 |
59 | Часто можно наблюдать этаких «сапожников без сапог» – программистов, которые решают задачи конечных пользователей, но не занимаются автоматизацией собственных рутинных задач. Поэтому выбор тем книги обусловлен общей целью – стремлением к автоматизации процессов, связанных с разработкой ПО.
60 |
61 | Акцент на сиюминутных технологиях и инструментах может привести к чрезвычайно быстрому устареванию материала. По этой причине основное внимание в книге уделено общим подходам, алгоритмам и использованию проверенных временем инструментов с открытым кодом.
62 |
--------------------------------------------------------------------------------
/md/package_managers.md:
--------------------------------------------------------------------------------
1 | # Менеджеры пакетов
2 |
3 | ## Нумерация версий ПО
4 |
5 | В программе, состоящей из нескольких модулей (программных библиотек, пакетов), подключение этих модулей может происходить следующими способами:
6 |
7 | * статическое связывание, которое осуществляется на этапе компиляции;
8 | * динамическое связывание, происходящее на этапе выполнения программы.
9 |
10 | Как программа, так и подключаемые к ней модули, обычно существуют в нескольких версиях.
11 |
12 | Существуют различные схемы нумерации версий:
13 |
14 | * последовательные значения;
15 | * дата выпуска;
16 | * хеш-сумма содержимого;
17 | * различные экзотические схемы (например, последовательные цифры числа $\pi$ или $e$).
18 |
19 | Проблема **ада зависимостей** (dependency hell) состоит в наличии конфликтных ситуаций между зависимостями различных модулей. Например, в системном каталоге библиотек может быть только одна версия библиотеки $X$, при этом одна программа требует $X$ в версии $A$, а другая – в несовместимой с $A$ версии $B$.
20 |
21 | Для управления зависимостями между модулями необходима строгая и единая система нумерации версий, определяющая совместимые и несовместимые сочетания модулей.
22 |
23 | ## Семантическая нумерация версий
24 |
25 | В спецификации SemVer (semantic versioning) версия состоит из следующих основных компонентов (см. @fig:pm3):
26 |
27 | 1. мажорная часть, означающая несовместимые с предыдущими версиями изменения;
28 | 1. минорная часть, означающая, добавление обратно совместимой функциональности;
29 | 1. патч, к которому относятся обратно совместимые исправления ошибок.
30 |
31 | {#fig:pm3}
32 |
33 | Сравнение двух версий осуществляется слева направо, до определения первого расхождения. Таким образом устанавливается порядок между версиями, а также могут быть введены интервалы версий.
34 |
35 | С помощью символа `^` указываются совместимый интервал версий. Например `~1.2.3` означает `>=1.2.3` и `<2.0.0`. Символ `~` определяет близкие друг к другу версии. Например `~1.2.3` означает `>=1.2.3` и `<1.3.0`.
36 |
37 | ## Управление пакетами
38 |
39 | Менеджер пакетов предназначен для автоматического управления установкой, настройкой и обновлением специального вида модулей, называемых пакетами.
40 |
41 | Менеджеры пакетов бывают следующих видов:
42 |
43 | 1. уровня ОС (например, RPM в Linux);
44 | 1. уровня языка программирования (например, npm для JavaScript);
45 | 1. уровня приложения (например, Package Control для редактора Sublime Text, управление плагинами для среды Eclipse).
46 |
47 | **Пакет** содержит в некотором файловом формате программный код и метаданные. К **метаданным** относятся:
48 |
49 | * указание авторства, версии и описание пакета;
50 | * список зависимостей пакета;
51 | * хеш-значение содержимого пакета.
52 |
53 | Для хранения пакетов используется **репозиторий**. Репозитории делятся на локальные, располагающиеся на компьютере пользователя и удаленные, размещаемые на сервере, предназначенном работы с конкретным менеджером пакетов.
54 |
55 | ## Менеджер пакетов apk
56 |
57 | Менеджер пакетов apk входит в дистрибутив Alpine ОС Linux.
58 |
59 | Работа c apk осуществляется из командной строки. Для добавления нового пакета необходимо использовать опцию add:
60 |
61 | ```default
62 | / # apk add python3
63 | fetch https://dl-cdn.alpinelinux.org/alpine/v3.14/main/x86_64/
64 | APKINDEX.tar.gz
65 | fetch https://dl-cdn.alpinelinux.org/alpine/v3.14/community/x86_64/
66 | APKINDEX.tar.gz
67 | (1/13) Installing libbz2 (1.0.8-r1)
68 | (2/13) Installing expat (2.4.1-r0)
69 | (3/13) Installing libffi (3.3-r2)
70 | (4/13) Installing gdbm (1.19-r0)
71 | (5/13) Installing xz-libs (5.2.5-r0)
72 | (6/13) Installing libgcc (10.3.1_git20210424-r2)
73 | (7/13) Installing libstdc++ (10.3.1_git20210424-r2)
74 | (8/13) Installing mpdecimal (2.5.1-r1)
75 | (9/13) Installing ncurses-terminfo-base (6.2_p20210612-r0)
76 | (10/13) Installing ncurses-libs (6.2_p20210612-r0)
77 | (11/13) Installing readline (8.1.0-r0)
78 | (12/13) Installing sqlite-libs (3.35.5-r0)
79 | (13/13) Installing python3 (3.9.5-r1)
80 | Executing busybox-1.33.1-r3.trigger
81 | OK: 56 MiB in 27 packages
82 | ```
83 |
84 | В первую очередь менеджером пакетов были загружены списки доступных пакетов из удаленного репозитория. В архиве APKINDEX.tar.gz можно найти информацию по устанавливаемому пакету и его зависимостям:
85 |
86 | ```default
87 | C:Q1A2S5Zfy6pdKftVzGVhkE5s9r1f4=
88 | P:python3
89 | V:3.9.5-r1
90 | A:x86_64
91 | S:13405337
92 | I:47747072
93 | T:A high-level scripting language
94 | U:https://www.python.org/
95 | L:PSF-2.0
96 | o:python3
97 | m:Natanael Copa
98 | t:1620852262
99 | c:2d63700fe78744e22c497d2cf7f8610828f00544
100 | D:so:libbz2.so.1 so:libc.musl-x86_64.so.1 so:libcrypto.so.1.1 so:libexpat.so.1 so:libffi.so.7 so:libgdbm.so.6 so:libgdbm_compat.so.4 so:liblzma.so.5 so:libmpdec.so.3 so:libncursesw.so.6 so:libpanelw.so.6 so:libreadline.so.8 so:libsqlite3.so.0 so:libssl.so.1.1 so:libz.so.1
101 | p:so:libpython3.9.so.1.0=1.0 so:libpython3.so=0 cmd:2to3 cmd:2to3-3.9 cmd:pydoc3 cmd:pydoc3.9 cmd:python3 cmd:python3.9 py3.9:README.txt=3.9.5-r1
102 | ```
103 | Здесь `P:` определяет имя пакета, а `V:` – его версию. С помощью `D:` в последних строках определяются зависимости, а с помощью `p:` – те модули, которые пакет предоставляет после своей установки.
104 |
105 | ## Менеджер пакетов apt
106 |
107 | В дистрибутиве Ubuntu ОС Linux используется менеджер пакетов apt.
108 |
109 | Для установки пакета используется команда apt с опцией install:
110 |
111 | ```default
112 | apt install instead
113 | ```
114 |
115 | В файле Packages, расположенном на удаленном репозитории, располагается информация о доступных для установке пакетах.
116 |
117 | Пакет instead имеет следующее описание:
118 |
119 | ```default
120 | Package: instead
121 | Architecture: amd64
122 | Version: 3.2.1-1
123 | Priority: optional
124 | Section: universe/games
125 | Origin: Ubuntu
126 | Maintainer: Ubuntu Developers
127 | Original-Maintainer: Sam Protsenko
128 | Bugs: https://bugs.launchpad.net/ubuntu/+filebug
129 | Installed-Size: 527
130 | Depends: libc6 (>= 2.14), libgdk-pixbuf2.0-0 (>= 2.22.0), libglib2.0-0 (>= 2.12.0), libgtk2.0-0 (>= 2.8.0), liblua5.1-0, libsdl2-2.0-0 (>= 2.0.8), libsdl2-image-2.0-0 (>= 2.0.2), libsdl2-mixer-2.0-0 (>= 2.0.2), libsdl2-ttf-2.0-0 (>= 2.0.14), zlib1g (>= 1:1.1.4), instead-data (= 3.2.1-1)
131 | Filename: pool/universe/i/instead/instead_3.2.1-1_amd64.deb
132 | Size: 224840
133 | MD5sum: ae8edb2974cece3ff42ce664bcba8485
134 | SHA1: 8e4f27d806d5822e2364c26b6a77502e6e1aada1
135 | SHA256: f0d20dd6d7e3de3c2981bfe3a6fbab0f0be8ecc7bfd3f71736508bee0fe063df
136 | Homepage: https://instead-hub.github.io/
137 | Description: Simple text adventures/visual novels engine
138 | Description-md5: ef0040d4434ac942fb089e9e171d022f
139 | ```
140 |
141 | Как можно заметить, анализируя строку `Depends:`, помимо системных библиотек пакет instead зависит также от пакета instead-data, у которого также имеется описание:
142 |
143 | ```default
144 | Package: instead-data
145 | Architecture: all
146 | Version: 3.2.1-1
147 | Priority: optional
148 | Section: universe/games
149 | Source: instead
150 | Origin: Ubuntu
151 | Maintainer: Ubuntu Developers
152 | Original-Maintainer: Sam Protsenko
153 | Bugs: https://bugs.launchpad.net/ubuntu/+filebug
154 | Installed-Size: 4092
155 | Depends: fonts-liberation
156 | Recommends: instead
157 | Filename: pool/universe/i/instead/instead-data_3.2.1-1_all.deb
158 | Size: 3681604
159 | MD5sum: e244752081374392d024ab100648213a
160 | SHA1: b560cbc4118b95b5633be48ed40b679652dc1322
161 | SHA256: 06582dc02515a031297dc7ae2e280795f7052266dbb4aee1e2a8406d132ea2c8
162 | Homepage: https://instead-hub.github.io/
163 | Description: Data files for INSTEAD
164 | Description-md5: abbaa9f2bdb5492dca18ea9558b57a9d
165 | ```
166 |
167 | Зависимости пакета instead приведены в графе на @fig:pm1.
168 |
169 | {#fig:pm1}
170 |
171 | ## Задача разрешения зависимостей пакетов
172 |
173 | Задача разрешения зависимостей, которую решает менеджер пакетов, в общем виде относится к труднорешаемым и может быть определена следующим образом.
174 |
175 | Дано:
176 |
177 | 1. Состояние локального репозитория, содержащего уже установленные пакеты.
178 | 1. Состояние удаленного репозитория, в котором находятся все доступные к установке пакеты.
179 | 1. Имя устанавливаемого пакета.
180 |
181 | Необходимо получить план установки нового пакета с разрешением всех его зависимостей. При этом желателен такой вариант решения, который требует установки минимального числа новых пакетов.
182 |
183 | Пример задачи разрешения зависимостей показан на @fig:pm2. Обратите внимание, что из всех возможных версий пакета menu, менеджеру пакетов необходимо выбрать 1.0.0, иначе не получится разрешить зависимости пакета icons.
184 |
185 | {#fig:pm2}
186 |
187 | Для задачи разрешения зависимостей в менеджерах пакетов сегодня все чаще используются универсальные решатели NP-полных задач: SAT-решатели @tucker2007opium, решатели для задачи программирования в ограничениях @pubgrub и другие @abate2020dependency.
188 |
189 |
190 |
191 |
192 |
--------------------------------------------------------------------------------
/md/version_control.md:
--------------------------------------------------------------------------------
1 | # Системы контроля версий
2 |
3 | ## О системах контроля версий
4 |
5 | Предположим, программист, незнакомый с инструментами контроля версий, хочет внести новое, экспериментальное изменение в свою программу. Наш программист сохраняет текущее состояние программного проекта в отдельном каталоге и далее занимается нововведениями в своем коде. В какой-то момент оказывается, что экспериментальная идея оказалась неудачной и программист восстанавливает состояние проекта из ранее сохраненного каталога. Такой способ управления версиями проекта требует большой дисциплины и ручного труда. Особенно трудоемкой работа с версиями проекта становится в условиях коллективной разработки. Именно эту работу и призвана автоматизировать система контроля версий.
6 |
7 | **Система контроля версий** (СКВ, Version Control System, VCS) – основной инструмент конфигурационного управления, позволяющий управлять изменениями (версиями) в файлах или иных наборах данных.
8 |
9 | **Коммит** (commit) – фиксация факта изменений в СКВ.
10 |
11 | **Репозиторий** (repository, repo) – место хранения данных проекта, управляемого СКВ.
12 |
13 | **Ветка** (branch) – отдельная копия части репозитория, в которую можно вносить изменения, не влияющие на другие ветки.
14 |
15 | Различают следующие типы систем контроля версий (СКВ):
16 |
17 | * локальные системы;
18 | * централизованные системы;
19 | * распределенные системы.
20 |
21 | **Локальные СКВ** (local VCS) относятся к самым первым системам контроля версий, которые появились еще в начале 70-х. Локальность означает, что история изменений хранится на компьютере пользователя. В локальных СКВ файлы хранятся в виде патчей – изменений между соседними версиями файла (см. утилиту diff в UNIX), что позволяет экономить дисковое пространство. В коллективном режиме пользователи обмениваются между собой (обычно по электронной почте) патчами. Очевидно, что такой подход к коллективной разработке нельзя назвать удобным.
22 |
23 | **Централизованные СКВ** (centralized VCS) используют клиент-серверную архитектуру. СКВ и связанный с ней репозиторий проекта теперь находятся на сервере. Каждый пользователь на своем локальном компьютере имеет только ту часть общего репозитория, с который непосредственно работает. Такой подход упрощает коллективную разработку, однако проблемы с доступом к серверу СКВ могут затруднить работу всего коллектива.
24 |
25 | **Распределенные СКВ** (distributed VCS) отличаются использованием полной копии проекта на каждом из компьютеров пользователя, что обеспечивает лучшую сохранность проекта, чем в случае централизованных СКВ. В распределенных СКВ могут использоваться различные схемы взаимодействия между удаленными репозиториями и, в частности, может моделироваться работа по клиент-серверной модели.
26 |
27 | При совместной работе над одними и теми же файлами неизбежно возникают конфликты доступа к данным. В СКВ используются следующие способы разрешения конфликтов:
28 |
29 | * блокировка доступа к файлу первым пользователем, который к нему обратился;
30 | * использование локальных копий файла у каждого пользователя с последующим слиянием общих результатов работы в автоматическом или ручном режиме.
31 |
32 | В @tbl:table1 представлены три поколения СКВ.
33 |
34 | : Поколения систем контроля версий {#tbl:table1}
35 |
36 | | Поколение | Модель взаимодействия | Единица операции | Примеры |
37 | | --- | ------ | ---- | ---- |
38 | | 1 | Локальная | Файл | SCCS, RCS |
39 | | 2 | Централизованная | Файл / множество файлов |CVS, SourceSafe, Subversion, Team Foundation Server |
40 | | 3 | Распределенная | Множество файлов | Bazaar, Git, Mercurial, Fossil |
41 |
42 | История развития СКВ показана на @fig:git6.
43 |
44 | {#fig:git6}
45 |
46 | ## Система контроля версий Git
47 |
48 | Git @git является децентрализованной СКВ. Разработана эта система была Л. Торвальдсом в 2005 году для нужд управления версиями ядра ОС Linux. Сегодня Git является самой популярной СКВ. Работу с Git не назовешь простой и многие пользователи критикуют эту систему за неудобный интерфейс командной строки. Тем не менее, основные архитектурные решения в Git являются изящными и логичными, но для того, чтобы их оценить, необходимо узнать, как работает Git изнутри.
49 |
50 | ### Простейшие команды Git
51 |
52 | Рассмотрим сначала самые распространенные команды Git.
53 |
54 | Создание Git-репозитория в текущем каталоге:
55 |
56 | ```default
57 | ~# mkdir my_repo
58 | ~# cd my_repo
59 | ~/my_repo# git init .
60 | Initialized empty Git repository in /root/my_repo/.git/
61 | ```
62 |
63 | Состояние git-репозитория:
64 |
65 | ```default
66 | ~/my_repo# git status
67 | On branch master
68 |
69 | No commits yet
70 |
71 | nothing to commit (create/copy files and use "git add" to track)
72 | ```
73 |
74 | В данном случае Git сообщает очевидное – в проекте еще не было коммитов.
75 |
76 | Создадим теперь первый файл в репозитории:
77 |
78 | ```default
79 | ~/my_repo# echo "# Some text" > readme.md
80 | root@DESKTOP-OI5FV17:~/my_repo# git status
81 | On branch master
82 |
83 | No commits yet
84 |
85 | Untracked files:
86 | (use "git add ..." to include in what will be committed)
87 | readme.md
88 |
89 | nothing added to commit but untracked files present (use "git add" to track)
90 | ```
91 |
92 | Теперь информация о статусе репозитория изменилась – появился неотслеживаемый файл readme.md.
93 |
94 | В Git файлы могут находиться в следующих состояниях:
95 |
96 | * неотслеживаемые файлы (untracked) – файлы, которые Git не учитывает в своей работе,
97 | * измененные файлы (modified) – отслеживаемые файлы, содержимое которых было изменено, но не добавлено в область индексирования;
98 | * индексированные файлы (staged) – измененные файлы, добавленные в область индексирования;
99 | * зафиксированные файлы (commited) – файлы, добавленные в коммит.
100 |
101 | Таким образом, при создании нового коммита сначала нужно добавить выбранные файлы в специальную промежуточную зону – область индексирования.
102 |
103 | Проиндексировать файлы можно с помощью команды Git add:
104 |
105 | ```default
106 | ~/my_repo# git add readme.md
107 | ~/my_repo# git status
108 | On branch master
109 |
110 | No commits yet
111 |
112 | Changes to be committed:
113 | (use "git rm --cached ..." to unstage)
114 | new file: readme.md
115 | ```
116 |
117 | После добавления всех необходимых файлов в зону индекса (это можно сделать одной командой: `git add .`) создается коммит, но если в Git еще не заданы данные пользователя, то необходимо сначала их указать:
118 |
119 | ```default
120 | ~/my_repo# git config --local user.name "Peter"
121 | ~/my_repo# git config --local user.email "peter@example.com"
122 | ~/my_repo# git commit -m "first commit"
123 | [master (root-commit) 3ba9fa7] first commit
124 | 1 file changed, 1 insertion(+)
125 | create mode 100644 readme.md
126 | ```
127 |
128 | Теперь первая версия проекта зафиксирована. Информацию о коммитах выдает следующая команда:
129 |
130 | ```default
131 | ~/my_repo# git log
132 | commit 3ba9fa7980a4ba36086e66389b1ef95cbbf317e2 (HEAD -> master)
133 | Author: Peter
134 | Date: Tue Nov 16 17:08:47 2021 +0300
135 |
136 | first commit
137 | ```
138 |
139 | Обратите внимание на длинную последовательность `3ba9fa...`. Это хеш-значение коммита, определяющее текущую версию репозитория. Текущая ветка проекта является главной и традиционно называется `master` или `main`.
140 |
141 | Работу с версиями в Git можно изобразить в виде графа коммитов, см. @fig:git1.
142 |
143 | {#fig:git1}
144 |
145 | ### Ветвление в Git
146 |
147 | Традиционно ветвление в СКВ позволяет разделять проект на независимые сущности (ветки), где изменения в конкретной ветке не затрагивают остальные ветки. Это полезно в условиях коллективной разработки, когда программисты одновременно работают над разными частями программы. Представим ситуацию, когда есть задача по разработке новой функциональности, но необходимо параллельно вносить и исправления в проект, не затрагивая новые функции. В таких ситуациях используется ветвление: под новые задачи создается отдельная ветка, и разработка ведется в ней.
148 |
149 | Рассмотрим на примерах ветвление в Git.
150 |
151 | Новая ветка создается с помощью команды `git branch имя`. Переключиться на ветку можно с помощью `git checkout имя`. Так как создание ветки и переключение на нее – зачастую следующие друг за другом операции, их можно выполнить одной командой `git checkout -b имя`.
152 |
153 | Предположим, работа над репозиторием my_repo развивалась следующим образом:
154 |
155 | ```default
156 | git branch tests
157 | git add ...
158 | git commit -m "..."
159 | git checkout tests
160 | git add ...
161 | git commit -m "..."
162 | git add ...
163 | git commit -m "..."
164 | ```
165 |
166 | На @fig:git2 показано новое состояние графа коммитов репозитория.
167 |
168 | {#fig:git2}
169 |
170 | В какой-то момент ветки сливаются (merge):
171 |
172 | ```default
173 | git checkout master
174 | git merge tests
175 | ```
176 |
177 | На @fig:git3 показан результат этого слияния. Был создан новый коммит, объединяющий в себе изменения из обеих веток.
178 |
179 | Так как ветки master и tests указывают на один и тот же коммит, то ветку test, если она больше не нужна, можно удалить командой `git branch -d tests`.
180 |
181 | {#fig:git3}
182 |
183 | Еще одним способом объединения веток является перебазирование, осуществляемой командой `git rebase`:
184 |
185 | ```default
186 | git checkout master
187 | git rebase tests
188 | ```
189 |
190 | На @fig:git4 показан результат перебазирования ветки tests на master. Здесь изменения, созданные в tests, были применены поверх master. В результате получена линейная история коммитов, которую, зачастую, изучать проще, чем результат, полученный с помощью merge.
191 |
192 | {#fig:git4}
193 |
194 | ## Git изнутри
195 |
196 | Все служебную информацию о репозитории Git хранит в подкаталоге .git. Основой Git является таблица объектов, адресуемая по ключам – хеш-значениям этих объектов. Такая схема хранения позволяет автоматически задавать уникальную версию для каждого файла (эта версия определяется ключом в таблице, то есть хеш-значением содержимого файла), а также дает возможность избежать дублирования файлов с одинаковым содержимым.
197 |
198 | В Git используются следующие типы объектов:
199 |
200 | * blob (binary large object) – содержимое файлов репозитория,
201 | * дерево – текущее состояние или снимок файловой иерархии репозитория,
202 | * коммит – информация о коммите.
203 |
204 | На @fig:git5 показано более детальное состояние репозитория для примера с перебазированием из предыдущего раздела.
205 |
206 | {#fig:git5}
207 |
208 | Попробуем найти в нашем тестовом репозитории my_repo (в его состоянии на момент первого коммита) информацию о хеш-значениях веток:
209 |
210 | ```default
211 | # cd .git
212 | ~/my_repo/.git# ls
213 | COMMIT_EDITMSG HEAD branches config description hooks index info logs objects refs
214 | ~/my_repo/.git# cd refs
215 | ~/my_repo/.git/refs# ls
216 | heads tags
217 | ~/my_repo/.git/refs# cd heads
218 | ~/my_repo/.git/refs/heads# ls
219 | master
220 | ~/my_repo/.git/refs/heads# cat master
221 | 3ba9fa7980a4ba36086e66389b1ef95cbbf317e2
222 | ```
223 |
224 | Зная хеш-значение объекта master можно попробовать найти его в таблице объектов:
225 |
226 | ```default
227 | ~/my_repo/.git/refs/heads# cd ..
228 | ~/my_repo/.git/refs# cd ..
229 | ~/my_repo/.git# cd objects/
230 | ~/.git/objects# ls
231 | 07 3b 7d info pack
232 | ~/my_repo/.git/objects# cd 3b
233 | ~/my_repo/.git/objects/3b# ls
234 | a9fa7980a4ba36086e66389b1ef95cbbf317e2
235 | ```
236 |
237 | Подкаталоги с числами в objects указывают на начальную часть хеш-значения объекта, сам же файл объекта можно найти соответствующего подкаталога.
238 |
239 | Файлы, содержащие объекты внутри objects, хранятся в двоичном формате. Для отображения информации об объекте по его хеш-значению можно использовать следующую команду:
240 |
241 | ```default
242 | ~/my_repo# git cat-file -p 3ba9fa7980a4ba36086e66389b1ef95cbbf317e2
243 | tree 074f8b59918b080288259854fcf875a6b8e543fe
244 | author Peter 1637071727 +0300
245 | committer Peter 1637071727 +0300
246 |
247 | first commit
248 | ```
249 |
250 | Был выдан объект коммита. Объекты этого типа включают в себя:
251 |
252 | * хеш-значение связанного с коммитом объекта дерева;
253 | * хеш-значения родителей коммита (в рассматриваемом случае коммит единственный, поэтому информация о его родителях не показана);
254 | * метаданные, в том числе указание авторства и текст коммита.
255 |
256 | Попробуем теперь изучить объект дерева по его полученному хеш-значению:
257 |
258 | ```default
259 | ~/my_repo# git cat-file -p 074f8b59918b080288259854fcf875a6b8e543fe
260 | 100644 blob 7dfce3922d94e459d1545a9fc568be0369eaa973 readme.md
261 | ```
262 |
263 | В нашем случае файловая иерархия состоит из всего одного файла. Объекты типа дерева включают в себя:
264 |
265 | * хеш-значения blob-объектов;
266 | * хеш-значения объектов деревьев;
267 | * указание прав доступа к файлам и каталогам.
268 |
269 | Blob-объект для readme.md можно изучить аналогичным образом.
270 |
271 | Обратите внимание, что в Git хеш-значение единственного коммита характеризует не только репозиторий на момент совершения коммита, но и всю предшествующую над ним работу. Это достигается благодаря использованию в Git иерархии хеш-значений («хеш-значения от хеш-значений»). Благодаря такой организации данных любые внесенные искажения в репозиторий или в одну из его предыдущих версий могут быть немедленно выявлены.
272 |
273 |
--------------------------------------------------------------------------------
/pdf.yaml:
--------------------------------------------------------------------------------
1 | documentclass: extbook
2 | classoption: openany
3 | fontsize: 14pt
4 | geometry: margin=2cm
5 | biblatexoptions: [backend=biber]
6 | header-includes: |
7 | \usepackage{fontspec}
8 | \usepackage{polyglossia}
9 | \usepackage{unicode-math}
10 | \setmainlanguage{russian}
11 | \setotherlanguage{english}
12 | \usepackage{unicode-math}
13 | \setmainfont{CMU Serif}
14 | \setsansfont{CMU Sans Serif}
15 | \setmonofont{CMU Typewriter Text}
16 | \usepackage{caption}
17 | \captionsetup[figure]{font={normalfont},format=plain,labelsep=period}
18 | \captionsetup[table]{font={normalfont},format=plain,labelsep=period}
19 | \usepackage{fvextra}
20 | \DefineVerbatimEnvironment{Highlighting}{Verbatim}{breaklines,commandchars=\\\{\}}
21 | \usepackage{hyperref}
22 | \hypersetup{
23 | colorlinks=true,
24 | linkcolor=violet,
25 | filecolor=magenta,
26 | urlcolor=violet
27 | }
28 | \usepackage{indentfirst}
29 | \setlength{\parindent}{1.5em}
30 |
31 |
--------------------------------------------------------------------------------
/pract/chip.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/true-grue/kisscm/f2c97ce460a5daed62ec2a93c766965be3dae13b/pract/chip.zip
--------------------------------------------------------------------------------
/pract/civgraph.json:
--------------------------------------------------------------------------------
1 | {"pottery": [], "irrigation": ["pottery"], "writing": ["pottery"], "animal_husbandry": [], "archery": ["animal_husbandry"], "mining": [], "masonry": ["mining"], "bronze_working": ["mining"], "the_wheel": ["mining"], "apprenticeship": ["mining", "currency", "horseback_riding"], "sailing": [], "celestial_navigation": ["sailing", "astrology"], "shipbuilding": ["sailing"], "astrology": [], "drama_poetry": ["astrology", "irrigation", "masonry", "early_empire", "mysticism"], "theology": ["astrology", "mysticism", "drama_poetry"], "horseback_riding": ["archery"], "machinery": ["archery", "iron_working", "engineering"], "currency": ["writing", "foreign_trade"], "state_workforce": ["writing", "bronze_working", "craftsmanship"], "recorded_history": ["writing", "political_philosophy", "drama_poetry"], "construction": ["masonry", "the_wheel", "horseback_riding"], "engineering": ["masonry", "the_wheel"], "iron_working": ["bronze_working"], "mathematics": ["bronze_working", "celestial_navigation", "currency", "drama_poetry"], "military_training": ["bronze_working", "military_tradition", "games_recreation"], "cartography": ["celestial_navigation", "shipbuilding"], "medieval_faires": ["currency", "feudalism"], "guilds": ["currency", "feudalism", "civil_service"], "mercantilism": ["currency", "humanism"], "stirrups": ["horseback_riding", "feudalism"], "mass_production": ["shipbuilding", "machinery", "education"], "naval_tradition": ["shipbuilding", "defensive_tactics"], "military_tactics": ["mathematics"], "education": ["mathematics", "apprenticeship"], "military_engineering": ["construction", "engineering"], "castles": ["construction", "divine_right", "exploration"], "games_recreation": ["construction", "state_workforce"], "gunpowder": ["apprenticeship", "stirrups", "military_engineering"], "printing": ["machinery", "education"], "metal_casting": ["machinery", "gunpowder"], "banking": ["education", "stirrups", "guilds"], "astronomy": ["education"], "military_science": ["stirrups", "printing", "siege_tactics"], "siege_tactics": ["castles", "metal_casting"], "square_rigging": ["cartography", "gunpowder"], "exploration": ["cartography", "mercenaries", "medieval_faires"], "industrialization": ["mass_production", "square_rigging"], "scientific_theory": ["banking", "astronomy", "the_enlightenment"], "colonialism": ["astronomy", "mercantilism"], "ballistics": ["metal_casting", "siege_tactics"], "economics": ["metal_casting", "scientific_theory"], "scorched_earth": ["metal_casting", "nationalism"], "steam_power": ["industrialization"], "flight": ["industrialization", "scientific_theory", "economics"], "steel": ["industrialization", "rifling"], "class_struggle": ["industrialization", "ideology"], "sanitation": ["scientific_theory", "urbanization"], "rifling": ["ballistics", "military_science"], "totalitarianism": ["military_science", "ideology"], "electricity": ["steam_power", "mercantilism"], "radio": ["steam_power", "flight", "conservation"], "chemistry": ["sanitation"], "suffrage": ["sanitation", "ideology"], "replaceable_parts": ["economics"], "capitalism": ["economics", "mass_media"], "combined_arms": ["flight", "combustion"], "synthetic_materials": ["flight", "plastics"], "rapid_deployment": ["flight", "cold_war"], "advanced_ballistics": ["replaceable_parts", "steel", "electricity"], "combustion": ["steel", "natural_history"], "computers": ["electricity", "radio", "suffrage", "totalitarianism", "class_struggle"], "advanced_flight": ["radio"], "rocketry": ["radio", "chemistry"], "nanotechnology": ["radio", "composites"], "mass_media": ["radio", "urbanization"], "nuclear_program": ["chemistry", "ideology"], "plastics": ["combustion"], "satellites": ["advanced_flight", "rocketry"], "globalization": ["advanced_flight", "rapid_deployment", "space_race"], "guidance_systems": ["rocketry", "advanced_ballistics"], "space_race": ["rocketry", "cold_war"], "nuclear_fission": ["advanced_ballistics", "combined_arms"], "telecommunications": ["computers"], "robotics": ["computers", "globalization"], "lasers": ["nuclear_fission"], "cold_war": ["nuclear_fission", "ideology"], "composites": ["synthetic_materials"], "stealth_technology": ["synthetic_materials"], "social_media": ["telecommunications", "professional_sports", "space_race"], "nuclear_fusion": ["lasers"], "code_of_laws": [], "craftsmanship": ["code_of_laws"], "foreign_trade": ["code_of_laws"], "military_tradition": ["craftsmanship"], "early_empire": ["foreign_trade"], "mysticism": ["foreign_trade"], "political_philosophy": ["state_workforce", "early_empire"], "defensive_tactics": ["games_recreation", "political_philosophy"], "humanism": ["drama_poetry", "medieval_faires"], "mercenaries": ["military_training", "feudalism"], "feudalism": ["defensive_tactics"], "civil_service": ["defensive_tactics", "recorded_history"], "divine_right": ["theology", "civil_service"], "diplomatic_service": ["guilds"], "reformed_church": ["guilds", "divine_right"], "the_enlightenment": ["humanism", "diplomatic_service"], "civil_engineering": ["mercantilism"], "nationalism": ["the_enlightenment"], "opera_ballet": ["the_enlightenment"], "natural_history": ["colonialism"], "urbanization": ["civil_engineering", "nationalism"], "conservation": ["natural_history", "urbanization"], "mobilization": ["urbanization"], "cultural_heritage": ["conservation"], "ideology": ["mass_media", "mobilization"], "professional_sports": ["ideology"]}
2 |
--------------------------------------------------------------------------------
/pract/dep_tasks.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/true-grue/kisscm/f2c97ce460a5daed62ec2a93c766965be3dae13b/pract/dep_tasks.pdf
--------------------------------------------------------------------------------
/pract/git_tasks.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/true-grue/kisscm/f2c97ce460a5daed62ec2a93c766965be3dae13b/pract/git_tasks.pdf
--------------------------------------------------------------------------------
/pract/images/formula.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/true-grue/kisscm/f2c97ce460a5daed62ec2a93c766965be3dae13b/pract/images/formula.png
--------------------------------------------------------------------------------
/pract/images/git.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/true-grue/kisscm/f2c97ce460a5daed62ec2a93c766965be3dae13b/pract/images/git.png
--------------------------------------------------------------------------------
/pract/images/plantuml.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/true-grue/kisscm/f2c97ce460a5daed62ec2a93c766965be3dae13b/pract/images/plantuml.png
--------------------------------------------------------------------------------
/pract/images/pubgrub.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/true-grue/kisscm/f2c97ce460a5daed62ec2a93c766965be3dae13b/pract/images/pubgrub.png
--------------------------------------------------------------------------------
/pract/make.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/true-grue/kisscm/f2c97ce460a5daed62ec2a93c766965be3dae13b/pract/make.zip
--------------------------------------------------------------------------------
/pract/pract1.md:
--------------------------------------------------------------------------------
1 | # Практическое занятие №1. Введение, основы работы в командной строке
2 |
3 | П.Н. Советов, РТУ МИРЭА
4 |
5 | Научиться выполнять простые действия с файлами и каталогами в Linux из командной строки. Сравнить работу в командной строке Windows и Linux.
6 |
7 | ## Задача 1
8 |
9 | Вывести отсортированный в алфавитном порядке список имен пользователей в файле passwd (вам понадобится grep).
10 |
11 | ## Задача 2
12 |
13 | Вывести данные /etc/protocols в отформатированном и отсортированном порядке для 5 наибольших портов, как показано в примере ниже:
14 |
15 | ```
16 | [root@localhost etc]# cat /etc/protocols ...
17 | 142 rohc
18 | 141 wesp
19 | 140 shim6
20 | 139 hip
21 | 138 manet
22 | ```
23 |
24 | ## Задача 3
25 |
26 | Написать программу banner средствами bash для вывода текстов, как в следующем примере (размер баннера должен меняться!):
27 |
28 | ```
29 | [root@localhost ~]# ./banner "Hello from RTU MIREA!"
30 | +-----------------------+
31 | | Hello from RTU MIREA! |
32 | +-----------------------+
33 | ```
34 |
35 | Перед отправкой решения проверьте его в ShellCheck на предупреждения.
36 |
37 | ## Задача 4
38 |
39 | Написать программу для вывода всех идентификаторов (по правилам C/C++ или Java) в файле (без повторений).
40 |
41 | Пример для hello.c:
42 |
43 | ```
44 | h hello include int main n printf return stdio void world
45 | ```
46 |
47 | ## Задача 5
48 |
49 | Написать программу для регистрации пользовательской команды (правильные права доступа и копирование в /usr/local/bin).
50 |
51 | Например, пусть программа называется reg:
52 |
53 | ```
54 | ./reg banner
55 | ```
56 |
57 | В результате для banner задаются правильные права доступа и сам banner копируется в /usr/local/bin.
58 |
59 | ## Задача 6
60 |
61 | Написать программу для проверки наличия комментария в первой строке файлов с расширением c, js и py.
62 |
63 | ## Задача 7
64 |
65 | Написать программу для нахождения файлов-дубликатов (имеющих 1 или более копий содержимого) по заданному пути (и подкаталогам).
66 |
67 | ## Задача 8
68 |
69 | Написать программу, которая находит все файлы в данном каталоге с расширением, указанным в качестве аргумента и архивирует все эти файлы в архив tar.
70 |
71 | ## Задача 9
72 |
73 | Написать программу, которая заменяет в файле последовательности из 4 пробелов на символ табуляции. Входной и выходной файлы задаются аргументами.
74 |
75 | ## Задача 10
76 |
77 | Написать программу, которая выводит названия всех пустых текстовых файлов в указанной директории. Директория передается в программу параметром.
78 |
79 | ## Полезные ссылки
80 |
81 | Линукс в браузере: https://bellard.org/jslinux/
82 |
83 | ShellCheck: https://www.shellcheck.net/
84 |
85 | Разработка CLI-приложений
86 |
87 | Общие сведения
88 |
89 | https://ru.wikipedia.org/wiki/Интерфейс_командной_строки
90 | https://nullprogram.com/blog/2020/08/01/
91 | https://habr.com/ru/post/150950/
92 |
93 | Стандарты
94 |
95 | https://www.gnu.org/prep/standards/standards.html#Command_002dLine-Interfaces
96 | https://www.gnu.org/software/libc/manual/html_node/Argument-Syntax.html
97 | https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html
98 |
99 | Реализация разбора опций
100 |
101 | Питон
102 |
103 | https://docs.python.org/3/library/argparse.html#module-argparse
104 | https://click.palletsprojects.com/en/7.x/
--------------------------------------------------------------------------------
/pract/pract2.md:
--------------------------------------------------------------------------------
1 | # Практическое занятие №2. Менеджеры пакетов
2 |
3 | П.Н. Советов, РТУ МИРЭА
4 |
5 | Разобраться, что представляет собой менеджер пакетов, как устроен пакет, как читать версии стандарта semver. Привести примеры программ, в которых имеется встроенный пакетный менеджер.
6 |
7 | ## Задача 1
8 |
9 | Вывести служебную информацию о пакете matplotlib (Python). Разобрать основные элементы содержимого файла со служебной информацией из пакета. Как получить пакет без менеджера пакетов, прямо из репозитория?
10 |
11 | ## Задача 2
12 |
13 | Вывести служебную информацию о пакете express (JavaScript). Разобрать основные элементы содержимого файла со служебной информацией из пакета. Как получить пакет без менеджера пакетов, прямо из репозитория?
14 |
15 | ## Задача 3
16 |
17 | Сформировать graphviz-код и получить изображения зависимостей matplotlib и express.
18 |
19 | ## Задача 4
20 |
21 | **Следующие задачи можно решать с помощью инструментов на выбор:**
22 |
23 | * Решатель задачи удовлетворения ограничениям (MiniZinc).
24 | * SAT-решатель (MiniSAT).
25 | * SMT-решатель (Z3).
26 |
27 | Изучить основы программирования в ограничениях. Установить MiniZinc, разобраться с основами его синтаксиса и работы в IDE.
28 |
29 | Решить на MiniZinc задачу о счастливых билетах. Добавить ограничение на то, что все цифры билета должны быть различными (подсказка: используйте all_different). Найти минимальное решение для суммы 3 цифр.
30 |
31 | ## Задача 5
32 |
33 | Решить на MiniZinc задачу о зависимостях пакетов для рисунка, приведенного ниже.
34 |
35 | 
36 |
37 | ## Задача 6
38 |
39 | Решить на MiniZinc задачу о зависимостях пакетов для следующих данных:
40 |
41 | ```
42 | root 1.0.0 зависит от foo ^1.0.0 и target ^2.0.0.
43 | foo 1.1.0 зависит от left ^1.0.0 и right ^1.0.0.
44 | foo 1.0.0 не имеет зависимостей.
45 | left 1.0.0 зависит от shared >=1.0.0.
46 | right 1.0.0 зависит от shared <2.0.0.
47 | shared 2.0.0 не имеет зависимостей.
48 | shared 1.0.0 зависит от target ^1.0.0.
49 | target 2.0.0 и 1.0.0 не имеют зависимостей.
50 | ```
51 |
52 | ## Задача 7
53 |
54 | Представить задачу о зависимостях пакетов в общей форме. Здесь необходимо действовать аналогично реальному менеджеру пакетов. То есть получить описание пакета, а также его зависимости в виде структуры данных. Например, в виде словаря. В предыдущих задачах зависимости были явно заданы в системе ограничений. Теперь же систему ограничений надо построить автоматически, по метаданным.
55 |
56 | ## Полезные ссылки
57 |
58 | Semver: https://devhints.io/semver
59 |
60 | Удовлетворение ограничений и программирование в ограничениях: http://intsys.msu.ru/magazine/archive/v15(1-4)/shcherbina-053-170.pdf
61 |
62 | Скачать MiniZinc: https://www.minizinc.org/software.html
63 |
64 | Документация на MiniZinc: https://www.minizinc.org/doc-2.5.5/en/part_2_tutorial.html
65 |
66 | Задача о счастливых билетах: https://ru.wikipedia.org/wiki/%D0%A1%D1%87%D0%B0%D1%81%D1%82%D0%BB%D0%B8%D0%B2%D1%8B%D0%B9_%D0%B1%D0%B8%D0%BB%D0%B5%D1%82
67 |
--------------------------------------------------------------------------------
/pract/pract3.md:
--------------------------------------------------------------------------------
1 | # Практическое занятие №3. Конфигурационные языки
2 |
3 | П.Н. Советов, РТУ МИРЭА
4 |
5 | Разобраться, что собой представляют программируемые конфигурационные языки (Jsonnet, Dhall, CUE).
6 |
7 | ## Задача 1
8 |
9 | Реализовать на Jsonnet приведенный ниже пример в формате JSON. Использовать в реализации свойство программируемости и принцип DRY.
10 |
11 | ## Задача 2
12 |
13 | Реализовать на Dhall приведенный ниже пример в формате JSON. Использовать в реализации свойство программируемости и принцип DRY.
14 |
15 | ```
16 | {
17 | "groups": [
18 | "ИКБО-1-20",
19 | "ИКБО-2-20",
20 | "ИКБО-3-20",
21 | "ИКБО-4-20",
22 | "ИКБО-5-20",
23 | "ИКБО-6-20",
24 | "ИКБО-7-20",
25 | "ИКБО-8-20",
26 | "ИКБО-9-20",
27 | "ИКБО-10-20",
28 | "ИКБО-11-20",
29 | "ИКБО-12-20",
30 | "ИКБО-13-20",
31 | "ИКБО-14-20",
32 | "ИКБО-15-20",
33 | "ИКБО-16-20",
34 | "ИКБО-17-20",
35 | "ИКБО-18-20",
36 | "ИКБО-19-20",
37 | "ИКБО-20-20",
38 | "ИКБО-21-20",
39 | "ИКБО-22-20",
40 | "ИКБО-23-20",
41 | "ИКБО-24-20"
42 | ],
43 | "students": [
44 | {
45 | "age": 19,
46 | "group": "ИКБО-4-20",
47 | "name": "Иванов И.И."
48 | },
49 | {
50 | "age": 18,
51 | "group": "ИКБО-5-20",
52 | "name": "Петров П.П."
53 | },
54 | {
55 | "age": 18,
56 | "group": "ИКБО-5-20",
57 | "name": "Сидоров С.С."
58 | },
59 | <добавьте ваши данные в качестве четвертого студента>
60 | ],
61 | "subject": "Конфигурационное управление"
62 | }
63 | ```
64 |
65 | Для решения дальнейших задач потребуется программа на Питоне, представленная ниже. Разбираться в самом языке Питон при этом необязательно.
66 |
67 | ```Python
68 | import random
69 |
70 |
71 | def parse_bnf(text):
72 | '''
73 | Преобразовать текстовую запись БНФ в словарь.
74 | '''
75 | grammar = {}
76 | rules = [line.split('=') for line in text.strip().split('\n')]
77 | for name, body in rules:
78 | grammar[name.strip()] = [alt.split() for alt in body.split('|')]
79 | return grammar
80 |
81 |
82 | def generate_phrase(grammar, start):
83 | '''
84 | Сгенерировать случайную фразу.
85 | '''
86 | if start in grammar:
87 | seq = random.choice(grammar[start])
88 | return ''.join([generate_phrase(grammar, name) for name in seq])
89 | return str(start)
90 |
91 |
92 | BNF = '''
93 | E = a
94 | '''
95 |
96 | for i in range(10):
97 | print(generate_phrase(parse_bnf(BNF), 'E'))
98 |
99 | ```
100 |
101 | Реализовать грамматики, описывающие следующие языки (для каждого решения привести БНФ). Код решения должен содержаться в переменной BNF:
102 |
103 | ## Задача 3
104 |
105 | Язык нулей и единиц.
106 |
107 | ```
108 | 10
109 | 100
110 | 11
111 | 101101
112 | 000
113 | ```
114 |
115 | ## Задача 4
116 |
117 | Язык правильно расставленных скобок двух видов.
118 |
119 | ```
120 | (({((()))}))
121 | {}
122 | {()}
123 | ()
124 | {}
125 | ```
126 |
127 | ## Задача 5
128 |
129 | Язык выражений алгебры логики.
130 |
131 | ```
132 | ((~(y & x)) | (y) & ~x | ~x) & x
133 | y & ~(y)
134 | (~(y) & y & ~y)
135 | ~x
136 | ~((x) & y | (y) | (x)) & x | x | (y & ~y)
137 | ```
138 |
139 | ## Полезные ссылки
140 |
141 | Configuration complexity clock: https://mikehadlow.blogspot.com/2012/05/configuration-complexity-clock.html
142 |
143 | Json: http://www.json.org/json-ru.html
144 |
145 | Язык Jsonnet: https://jsonnet.org/learning/tutorial.html
146 |
147 | Язык Dhall: https://dhall-lang.org/
148 |
149 | Учебник в котором темы построения синтаксических анализаторов (БНФ, Lex/Yacc) изложены подробно: https://ita.sibsutis.ru/sites/csc.sibsutis.ru/files/courses/trans/LanguagesAndTranslationMethods.pdf
150 |
151 | Полезные материалы для разработчика (очень рекомендую посмотреть слайды и прочие ссылки, все это актуально и для других тем нашего курса): https://habr.com/ru/company/JetBrains-education/blog/547768/
--------------------------------------------------------------------------------
/pract/pract4.md:
--------------------------------------------------------------------------------
1 | # Практическое задание №4. Системы контроля версий
2 |
3 | П.Н. Советов, РТУ МИРЭА
4 |
5 | Работа с Git.
6 |
7 | ## Задача 1
8 |
9 | На сайте https://onlywei.github.io/explain-git-with-d3 или http://git-school.github.io/visualizing-git/ (цвета могут отличаться, есть команды undo/redo) с помощью команд эмулятора git получить следующее состояние проекта (сливаем master с first, перебазируем second на master): см. картинку ниже. Прислать свою картинку.
10 |
11 | 
12 |
13 | ## Задача 2
14 |
15 | Создать локальный git-репозиторий. Задать свои имя и почту (далее – coder1). Разместить файл prog.py с какими-нибудь данными. Прислать в текстовом виде диалог с git.
16 |
17 | ## Задача 3
18 |
19 | Создать рядом с локальным репозиторием bare-репозиторий с именем server. Загрузить туда содержимое локального репозитория. Команда git remote -v должна выдать информацию о server! Синхронизировать coder1 с server.
20 |
21 | Клонировать репозиторий server в отдельной папке. Задать для работы с ним произвольные данные пользователя и почты (далее – coder2). Добавить файл readme.md с описанием программы. Обновить сервер.
22 |
23 | Coder1 получает актуальные данные с сервера. Добавляет в readme в раздел об авторах свою информацию и обновляет сервер.
24 |
25 | Coder2 добавляет в readme в раздел об авторах свою информацию и решает вопрос с конфликтами.
26 |
27 | Прислать список набранных команд и содержимое git log.
28 |
29 | Пример лога коммитов:
30 |
31 | ```
32 | * commit a457d748f0dab75b4c642e964172887de3ef4e3e
33 | |\ Merge: 48ce283 d731ba8
34 | | | Author: Coder 2
35 | | | Date: Sun Oct 11 11:27:09 2020 +0300
36 | | |
37 | | | readme fix
38 | | |
39 | | * commit d731ba84014d603384cc3287a8ea9062dbb92303
40 | | | Author: Coder 1
41 | | | Date: Sun Oct 11 11:22:52 2020 +0300
42 | | |
43 | | | coder 1 info
44 | | |
45 | * | commit 48ce28336e6b3b983cbd6323500af8ec598626f1
46 | |/ Author: Coder 2
47 | | Date: Sun Oct 11 11:24:00 2020 +0300
48 | |
49 | | coder 2 info
50 | |
51 | * commit ba9dfe9cb24316694808a347e8c36f8383d81bbe
52 | | Author: Coder 2
53 | | Date: Sun Oct 11 11:21:26 2020 +0300
54 | |
55 | | docs
56 | |
57 | * commit 227d84c89e60e09eebbce6c0b94b41004a4541a4
58 | Author: Coder 1
59 | Date: Sun Oct 11 11:11:46 2020 +0300
60 |
61 | first commit
62 | ```
63 |
64 | ## Задача 4
65 |
66 | Написать программу на Питоне (или другом ЯП), которая выводит список содержимого всех объектов репозитория. Воспользоваться командой "git cat-file -p". Идеальное решение – не использовать иных сторонних команд и библиотек для работы с git.
67 |
68 | ## Полезные ссылки
69 |
70 | Git
71 |
72 | Учебник (рус.): https://git-scm.com/book/ru/v2
73 |
74 | Шпаргалка (рус.): https://training.github.com/downloads/ru/github-git-cheat-sheet/
75 |
76 | Официальная документация: https://git-scm.com/docs
77 |
78 | Эксцентричный доклад Л. Торвальдса о Git: https://www.youtube.com/watch?v=4XpnKHJAok8
79 |
80 | Дерево Меркла: http://cryptowiki.net/index.php?title=Дерево_Merkle
81 |
82 | Git for Windows: https://git-scm.com/download/win
83 |
84 | Репозиторий chibicc: https://github.com/rui314/chibicc.git
85 |
86 | Игра по git: https://learngitbranching.js.org/?locale=ru_RU
87 |
88 | SHA-1
89 |
90 | Описание алгоритма: https://ru.wikipedia.org/wiki/SHA-1
91 |
92 | Вероятность хеш-коллизии: https://preshing.com/20110504/hash-collision-probabilities/
93 |
94 | https://ru.m.wikipedia.org/wiki/Парадокс_дней_рождения
95 |
96 | https://security.googleblog.com/2017/02/announcing-first-sha1-collision.html
97 |
--------------------------------------------------------------------------------
/pract/pract5.md:
--------------------------------------------------------------------------------
1 | # Практическое занятие №5. Вопросы виртуализации
2 |
3 | П.Н. Советов, РТУ МИРЭА
4 |
5 | ## Задача 1
6 |
7 | Исследование виртуальной стековой машины CPython.
8 |
9 | Изучите возможности просмотра байткода ВМ CPython.
10 |
11 | ```
12 | import dis
13 |
14 | def foo(x):
15 | while x:
16 | x -= 1
17 | return x + 1
18 |
19 | print(dis.dis(foo))
20 | ```
21 |
22 | Опишите по шагам, что делает каждая из следующих команд (приведите эквивалентное выражение на Python):
23 |
24 | 11 0 LOAD_FAST 0 (x)
25 | 2 LOAD_CONST 1 (10)
26 | 4 BINARY_MULTIPLY
27 | 6 LOAD_CONST 2 (42)
28 | 8 BINARY_ADD
29 | 10 RETURN_VALUE
30 |
31 |
32 | ## Задача 2
33 |
34 | Что делает следующий байткод (опишите шаги его работы)? Это известная функция, назовите ее.
35 |
36 | ```
37 | 5 0 LOAD_CONST 1 (1)
38 | 2 STORE_FAST 1 (r)
39 |
40 | 6 >> 4 LOAD_FAST 0 (n)
41 | 6 LOAD_CONST 1 (1)
42 | 8 COMPARE_OP 4 (>)
43 | 10 POP_JUMP_IF_FALSE 30
44 |
45 | 7 12 LOAD_FAST 1 (r)
46 | 14 LOAD_FAST 0 (n)
47 | 16 INPLACE_MULTIPLY
48 | 18 STORE_FAST 1 (r)
49 |
50 | 8 20 LOAD_FAST 0 (n)
51 | 22 LOAD_CONST 1 (1)
52 | 24 INPLACE_SUBTRACT
53 | 26 STORE_FAST 0 (n)
54 | 28 JUMP_ABSOLUTE 4
55 |
56 | 9 >> 30 LOAD_FAST 1 (r)
57 | 32 RETURN_VALUE
58 | ```
59 |
60 | ## Задача 3
61 |
62 | Приведите результаты из задач 1 и 2 для виртуальной машины JVM (Java) или .Net (C#).
63 |
64 | ## Задача 4
65 |
66 | Работа с qemu. Скачать и установить ISO-образ Alpine Linux для виртуальных машин с официального сайта.
67 | Создать с помощью qemu образ жесткого диска (опция -f qcow2). Объем диска 500 Мб.
68 | Запустить Alpine Linux с CD-ROM.
69 | Установить систему на sda. Изменить motd.
70 | Загрузиться уже с sda.
71 | Прислать полный список команд для установки и загрузки, а также скриншот с motd, где фигурируют ваши имя и фамилия.
72 |
73 | ## Задача 5
74 |
75 | (после разбора на семинаре и написания у доски базовой части эмулятора древней игровой приставки CHIP-8)
76 |
77 | 1. Реализовать вывод на экран.
78 | 2. Добиться запуска Тетриса.
79 | 3. Реализовать ввод с клавиатуры.
80 | 4. Добиться успешной работы всех приложений.
81 |
82 | [Архив эмулятора CHIP-8](chip.zip)
83 |
84 | ## Полезные ссылки
85 |
86 | Compiler Explorer: https://godbolt.org/
87 |
88 | Байткод CPython: https://docs.python.org/3/library/dis.html
89 |
90 | QEMU для Windows: https://www.qemu.org/download/#windows
91 | http://sovietov.com/tmp/mqemu.zip
92 |
93 | Документация по QEMU: https://www.qemu.org/docs/master/system/index.html
94 |
95 | Старая документация по QEMU (рус.): https://www.opennet.ru/docs/RUS/qemu_doc/
96 |
97 | Образы Alpine Linux: https://alpinelinux.org/downloads/
98 |
99 | Документация по игровому компьютеру CHIP-8: http://devernay.free.fr/hacks/chip8/C8TECH10.HTM
100 |
101 | Учебник по созданию миниатюрной ОС: https://www.cs.bham.ac.uk/~exr/lectures/opsys/10_11/lectures/os-dev.pdf
102 |
103 | Nasm: https://nasm.us/
104 |
105 | Прерывания BIOS: http://www.ctyme.com/intr/int.htm
106 |
107 | Игры в загрузочном секторе: https://github.com/nanochess/Invaders
--------------------------------------------------------------------------------
/pract/pract6.md:
--------------------------------------------------------------------------------
1 | # Практическое задание №6. Системы автоматизации сборки
2 |
3 | П.Н. Советов, РТУ МИРЭА
4 |
5 | Работа с утилитой Make.
6 |
7 | Изучить основы языка утилиты make. Распаковать в созданный каталог [make.zip](make.zip), если у вас в в системе нет make.
8 |
9 | Создать приведенный ниже Makefile и проверить его работоспособность.
10 |
11 | ```
12 | dress: trousers shoes jacket
13 | @echo "All done. Let's go outside!"
14 |
15 | jacket: pullover
16 | @echo "Putting on jacket."
17 |
18 | pullover: shirt
19 | @echo "Putting on pullover."
20 |
21 | shirt:
22 | @echo "Putting on shirt."
23 |
24 | trousers: underpants
25 | @echo "Putting on trousers."
26 |
27 | underpants:
28 | @echo "Putting on underpants."
29 |
30 | shoes: socks
31 | @echo "Putting on shoes."
32 |
33 | socks: pullover
34 | @echo "Putting on socks."
35 | ```
36 |
37 | Визуализировать файл [civgraph.txt](civgraph.txt).
38 |
39 |
40 | ## Задача 1
41 |
42 | Написать программу на Питоне, которая транслирует граф зависимостей civgraph в makefile в духе примера выше. Для мало знакомых с Питоном используется упрощенный вариант civgraph: [civgraph.json](civgraph.json).
43 |
44 | Пример:
45 |
46 | ```
47 | > make mathematics
48 | mining
49 | bronze_working
50 | sailing
51 | astrology
52 | celestial_navigation
53 | pottery
54 | writing
55 | code_of_laws
56 | foreign_trade
57 | currency
58 | irrigation
59 | masonry
60 | early_empire
61 | mysticism
62 | drama_poetry
63 | mathematics
64 | ```
65 |
66 | ## Задача 2
67 |
68 | Реализовать вариант трансляции, при котором повторный запуск make не выводит для civgraph на экран уже выполненные "задачи".
69 |
70 |
71 | ## Задача 3
72 |
73 | Добавить цель clean, не забыв и про "животное".
74 |
75 | ## Задача 4
76 |
77 | Написать makefile для следующего скрипта сборки:
78 |
79 | ```
80 | gcc prog.c data.c -o prog
81 | dir /B > files.lst
82 | 7z a distr.zip *.*
83 | ```
84 |
85 | Вместо gcc можно использовать другой компилятор командной строки, но на вход ему должны подаваться два модуля: prog и data.
86 | Если используете не Windows, то исправьте вызовы команд на их эквиваленты из вашей ОС.
87 | В makefile должны быть, как минимум, следующие задачи: all, clean, archive.
88 | Обязательно покажите на примере, что уже сделанные подзадачи у вас не перестраиваются.
89 |
90 | ## Полезные ссылки
91 |
92 | Описание (рус.): https://unix1.jinr.ru/faq_guide/programming/make/make.html
93 |
94 | Шпаргалка: https://devhints.io/makefile
95 |
96 | Топологическая сортировка: https://ru.wikipedia.org/wiki/Топологическая_сортировка
97 |
--------------------------------------------------------------------------------
/pract/pract7.md:
--------------------------------------------------------------------------------
1 | # Практическое занятие №7. Генераторы документации
2 |
3 | П.Н. Советов, РТУ МИРЭА
4 |
5 | ## Задача 1
6 |
7 | Реализовать с помощью математического языка LaTeX нижеприведенную формулу:
8 |
9 | 
10 |
11 | Прислать код на LaTeX и картинку-результат, где, помимо формулы, будет указано ФИО студента.
12 |
13 | ## Задача 2
14 |
15 | На языке PlantUML реализовать диаграмму на рисунке ниже. Прислать текст на PlantUML и картинку-результат, в которой ФИО студента заменены Вашими собственными.
16 | Обратите внимание на оформление, желательно придерживаться именно его, то есть без стандартного желтого цвета и проч. Чтобы много не писать используйте псевдонимы с помощью ключевого слова "as".
17 |
18 | Используйте [онлайн-редактор](https://plantuml-editor.kkeisuke.com/).
19 |
20 | 
21 |
22 | ## Задача 3
23 |
24 | Описать какой-либо алгоритм сортировки с помощью noweb. Язык реализации не важен. Прислать nw-файл, pdf-файл и файл с исходным кодом. В начале pdf-файла должно быть указано ваше авторство. Добавьте, например, где-то в своем тексте сноску: \footnote{Разработал Фамилия И.О.}
25 | Дополнительное задание: сравните "грамотное программирование" с Jupyter-блокнотами (см. https://github.com/norvig/pytudes/blob/master/ipynb/BASIC.ipynb), опишите сходные черты, различия, перспективы того и другого.
26 |
27 | ## Задача 4
28 |
29 | Выбрать программный проект из нескольких файлов (лучше свой собственный), состоящий из нескольких файлов. Получить для него документацию в Doxygen. Язык реализации не важен. Должны быть сгенерированы: описания классов и функций, диаграммы наследования, диаграммы графа вызовов функции. Прислать pdf-файл с документацией (см. latex/make.bat), в котором будет указано ваше авторство. Необходимо добиться корректного вывода русского текста.
30 |
31 | ## Задача 5
32 |
33 | Выбрать программный проект на Python (лучше свой собственный), состоящий из нескольких файлов. Получить для него документацию в Doxygen. Должны быть сформированы: руководство пользователя и руководство программиста. Руководство программиста должно содержать описание API, полученное с использованием расширения autodoc. Для каждого из модулей должна присутствовать диаграмма наследования и подробное описание классов и функций (назначение, описание параметров и возвращаемых значений), извлеченных из docstring. Прислать pdf-файл с документацией, в котором будет указано ваше авторство и весь авторский текст приведен на русском языке.
34 |
35 | ## Полезные ссылки
36 |
37 | **LaTeX**
38 |
39 | http://grammarware.net/text/syutkin/TextInLaTeX.pdf
40 |
41 | https://grammarware.net/text/syutkin/MathInLaTeX.pdf
42 |
43 | https://www.overleaf.com/learn/latex/Learn_LaTeX_in_30_minutes
44 |
45 | https://www.overleaf.com/learn/latex/XeLaTeX
46 |
47 | **Noweb**
48 |
49 | https://www.pbr-book.org/3ed-2018/Introduction/Literate_Programming
50 |
51 | https://www.cs.tufts.edu/~nr/noweb/
52 |
53 | **Doxygen**
54 |
55 | https://www.doxygen.nl/index.html
56 |
57 | https://habr.com/ru/post/252101/
58 |
59 | **Sphinx**
60 |
61 | https://www.sphinx-doc.org/en/master/
62 |
63 | https://sphinx-ru.readthedocs.io/ru/latest/index.html
64 |
65 | https://breathe.readthedocs.io/en/latest/
66 |
67 |
68 | **PlantUML**
69 |
70 | https://plantuml.com/ru/
71 |
72 | https://pdf.plantuml.net/PlantUML_Language_Reference_Guide_ru.pdf
73 |
74 | **Mermaid**
75 |
76 | https://mermaid.js.org/
77 |
78 | https://mermaid.live/edit
79 |
--------------------------------------------------------------------------------
/pract/test_tasks.docx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/true-grue/kisscm/f2c97ce460a5daed62ec2a93c766965be3dae13b/pract/test_tasks.docx
--------------------------------------------------------------------------------
/slides/lect1.md:
--------------------------------------------------------------------------------
1 | ---
2 | theme: white
3 | highlightTheme: white
4 | transition: none
5 | slideNumber: true
6 | enableMenu: false
7 | ---
8 |
9 |
10 |
11 | ## Конфигурационное управление
12 |
13 | Лекция №1. Введение
14 |
15 | Лектор: *Советов Пётр Николаевич*
16 |
17 | ---
18 |
19 | ## О чем этот предмет?
20 |
21 | *ГОСТ Р 59193-2020*
22 |
23 |
Управление конфигурацией (УК) - это управленческий процесс, оказывающий воздействие на другие процессы ЖЦ. Его цель - обеспечить соответствие создаваемого продукта заданным требованиям, а также обеспечить возможность контроля заинтересованными сторонами того, что создаваемый продукт соответствует их потребностям.
24 |
25 | Для решения задач УК сложного изделия выполняют декомпозицию исходного объекта анализа на отдельные управляемые объекты - объекты конфигурации.
26 |
27 | В качестве объекта конфигурации (далее для удобства также используется термин "объект") может выступать изделие (комплект, комплекс, сборочная единица, деталь), система, программное обеспечение, аппаратное обеспечение, материал, отдельный документ, объект инфраструктуры и т.п.
28 |
29 | Для каждого объекта конфигурации разрабатывается комплект документации конфигурации, который после утверждения представляет "утвержденную конфигурацию" данного объекта. Примером комплекта документации конфигурации является, например, полный комплект конструкторской документации по Единой системе конструкторской документации.
30 |
31 |
32 | ---
33 |
34 | ## Не об этом!
35 |
36 | ---
37 |
38 | ## Автоматизация (коллективной) разработки
39 |
40 | 1. Инструменты командной строки Linux.
41 | 1. Менеджеры пакетов и зависимости.
42 | 1. Конфигурационные языки.
43 | 1. Системы сборки.
44 | 2. Система контроля версий git.
45 | 3. Генераторы документации.
46 | 4. Виртуализация.
47 |
48 | ---
49 |
50 | ## Зачем изучать?
51 |
52 | Чтобы понимать такие шутки: https://xkcd.com/149/
53 |
54 | ---
55 |
56 | ## Не только для DevOps
57 |
58 | Из вакансий для разработчиков:
59 |
60 |
61 |
62 | * "Опыт работы с системами контроля версий (Git и др.)".
63 | * "Опыт работы с командной строкой и терминалом".
64 | * "Владение инструментами командной строки (grep/sed/awk)".
65 | * "Знание скриптовых языков (bash/python)".
66 | * "Практический опыт использования Linux окружения".
67 | * "Опыт работы с системой контроля версий git".
68 | * "Навыки работы с системами контроля версий (Git)".
69 | * "Опыт работы с Linux, Git".
70 | * "Документирование кода Doxygen".
71 | * "Build systems like Ant, Maven, SCons, CMake".
72 | * "Javadoc / Doxygen / MkDocs frameworks, PlantUML".
73 | * "Опыт работы с системами управления версиями (Git, SVN и т.д.)".
74 | * "Знание платформ виртуализации: Proxmox, QEMU/KVM, Libvirt, Vmware, OpenStack".
75 |
76 |
77 |
78 | ---
79 |
80 | ## О зачете
81 |
82 | * Для допуска: **4 защищенных домашних задания**.
83 | * Число задач на зачете зависит от **баллов активности**, полученных на семинарах.
84 |
85 | ---
86 |
87 | ## Материалы по КУ
88 |
89 | * Github-репозиторий https://github.com/true-grue/kisscm.
90 | * Страница на СДО.
91 |
92 | ---
93 |
94 | ## О командной строке
95 |
96 | 1. ASCII Star Wars через telnet.
97 | 1. Виртуальный психотерапевт "Элиза".
98 | 1. DosBox и Zork.
99 | 1. Современные текстовые игры: метапарсер.
100 | 1. "Хакерский терминал" в Windows.
101 | 1. Командная строка в Windows и Linux.
102 | 1. Документация по командам Linux.
103 |
104 | ---
105 |
106 | ## Задачи на CSVKit
107 |
108 | * Скачать xlsx-расписание через терминал (lynx, nano, curl).
109 | * Найти все аудитории для конкретного преподавателя.
110 | * Найти все предметы, изучаемые на втором курсе, отсортировать по числу вхождений в расписание.
111 |
112 | ---
113 |
114 | ## Задачи на jq
115 |
116 | * С помощью github api получить отсортированную таблицу для конкретного пользователя: репозитории и количество звезд.
117 | * С помощью hacker news api изобразить верхнюю новость от лица "коровы".
118 |
119 | ---
120 |
121 | ## Что почитать о Unix и командной строке
122 |
123 | * *Брайан Керниган*. Время UNIX. A History and a Memoir.
124 | * *Керниган Б., Пайк Р*. Unix. Программное окружение.
125 | * *Робачевский А. М.* Операционная система UNIX, 2 изд.
126 | * *Шоттс Уильям*. Командная строка Linux. Полное руководство. 2-е межд. изд.
127 | * *Janssens J.* Data science at the command line.
128 |
--------------------------------------------------------------------------------
/slides/lect2.md:
--------------------------------------------------------------------------------
1 | ---
2 | theme: white
3 | highlightTheme: white
4 | transition: none
5 | slideNumber: true
6 | enableMenu: false
7 | ---
8 |
9 |
10 |
11 | ## Конфигурационное управление
12 |
13 | Лекция №2. Командная строка
14 |
15 | Лектор: *Советов Пётр Николаевич*
16 |
17 | ---
18 |
19 | ## Конвейер
20 |
21 | * В математике и на обычных языках программирования.
22 | * Связь с функциональным программированием.
23 | * Примеры (Pipe).
24 |
25 | ---
26 |
27 | ## Перенаправление ввода-вывода
28 |
29 | * Stdin, stdout, stderr.
30 | * Пример (подсчет слов в файле с сохранением статистики в файл).
31 |
32 | ---
33 |
34 | ## Grep и sed
35 |
36 | Аналогичны поиску и замене в текстовом редакторе.
37 |
38 | * Факториал в виде однострочника.
39 | * В виде скрипта оболочки: https://www.shellcheck.net/
40 |
41 | ---
42 |
43 | ## Awk: вычисление индекса Хирша
44 |
45 | * curl и cookies для elibrary.ru.
46 | * Устройство программы на Awk.
47 |
48 | ---
49 |
50 | ## Конвейер с командами на разных языках
51 |
52 | 1. C.
53 | 1. Shell.
54 | 1. Python.
55 |
56 | Реализация с аргументом командной строки и через стандартный ввод.
57 |
58 | ---
59 |
60 | ## Регулярные выражения
61 |
62 | * Базовые операции: соединение, альтернатива и повторение.
63 | * https://regex101.com/
64 | * https://regex-vis.com/
65 |
66 | ---
67 |
68 | ## CLI, TUI, GUI
69 |
70 | * Правила интерфейсов командной строки.
71 | * ASCII и ANSI-графика. Doom в терминале. "Бублик".
72 |
--------------------------------------------------------------------------------
/slides/lect3.md:
--------------------------------------------------------------------------------
1 | ---
2 | theme: white
3 | highlightTheme: white
4 | transition: none
5 | slideNumber: true
6 | enableMenu: false
7 | ---
8 |
9 |
10 |
11 | ## Конфигурационное управление
12 |
13 | Лекция №3. Менеджеры пакетов
14 |
15 | Лектор: *Советов Пётр Николаевич*
16 |
17 | ---
18 |
19 | ## Пакеты и менеджеры пакетов
20 |
21 | ```graphviz
22 | digraph {
23 | rankdir=LR
24 | node [shape=box]
25 | "Менеджер пакетов" [style=bold]
26 | Пакет [style=bold]
27 | Пакет -> "Код, данные" [label="состоит из"]
28 | Пакет -> "Метаданные:\nверсия, зависимости" [label="состоит из"]
29 | "Менеджер пакетов" -> Пакет [label="устанавливает"]
30 | Пакет -> Репозиторий [label="находится в"]
31 | "Менеджер пакетов" -> Репозиторий [label="скачивает пакет из"]
32 | "Менеджер пакетов" -> "1) уровня ОС" [label="или"]
33 | "Менеджер пакетов" -> "2) уровня языка" [label="или"]
34 | "Менеджер пакетов" -> "3) уровня приложения" [label="или"]
35 | }
36 | ```
37 |
38 | ---
39 |
40 | ## Программист ДЗ: достижение мастерства
41 |
42 |
43 |
44 | ---
45 |
46 | ## Подробности по ДЗ №2
47 |
48 |