├── .gitignore ├── LICENSE ├── README.md ├── bibliography.bib ├── default.yaml ├── filters ├── bullets.py ├── pagebreak.lua └── upper.lua ├── gost-r-7-0-5-2008-numeric-iaa.csl ├── images ├── cli1.svg ├── cli2.svg ├── docs1.svg ├── docs2.svg ├── docs3.svg ├── docs4.svg ├── docs5.svg ├── docs6.svg ├── docs7.svg ├── dsl1.svg ├── dsl2.svg ├── git1.svg ├── git2.svg ├── git3.svg ├── git4.svg ├── git5.svg ├── git6.svg ├── make1.svg ├── make2.svg ├── pm1.svg ├── pm2.svg ├── pm3.svg ├── vm1.svg └── vm2.svg ├── makefile ├── md ├── bibliography.md ├── build_automation.md ├── command_line.md ├── conf_languages.md ├── docs_as_code.md ├── introduction.md ├── package_managers.md ├── version_control.md └── virtual_machines.md ├── pdf.yaml ├── pract ├── chip.zip ├── civgraph.json ├── civgraph.txt ├── dep_tasks.pdf ├── git_tasks.pdf ├── images │ ├── formula.png │ ├── git.png │ ├── plantuml.png │ └── pubgrub.png ├── make.zip ├── pract1.md ├── pract2.md ├── pract3.md ├── pract4.md ├── pract5.md ├── pract6.md ├── pract7.md └── test_tasks.docx ├── slides ├── lect1.md ├── lect2.md ├── lect3.md ├── lect4.md ├── lect5.md ├── lect6.md └── programmer.jpg └── template.docx /.gitignore: -------------------------------------------------------------------------------- 1 | $*.* 2 | ~*.* 3 | *.exe 4 | build/*.docx 5 | build/*.pdf 6 | build/*.html 7 | 8 | ## Core latex/pdflatex auxiliary files: 9 | *.aux 10 | *.lof 11 | *.log 12 | *.lot 13 | *.fls 14 | *.out 15 | *.toc 16 | *.fmt 17 | *.fot 18 | *.cb 19 | *.cb2 20 | .*.lb 21 | 22 | ## Intermediate documents: 23 | *.dvi 24 | *.xdv 25 | *-converted-to.* 26 | # these rules might exclude image files for figures etc. 27 | # *.ps 28 | # *.eps 29 | # *.pdf 30 | 31 | ## Generated if empty string is given at "Please type another file name for output:" 32 | .pdf 33 | 34 | ## Bibliography auxiliary files (bibtex/biblatex/biber): 35 | *.bbl 36 | *.bcf 37 | *.blg 38 | *-blx.aux 39 | *-blx.bib 40 | *.run.xml 41 | 42 | ## Build tool auxiliary files: 43 | *.fdb_latexmk 44 | *.synctex 45 | *.synctex(busy) 46 | *.synctex.gz 47 | *.synctex.gz(busy) 48 | *.pdfsync 49 | 50 | ## Build tool directories for auxiliary files 51 | # latexrun 52 | latex.out/ 53 | 54 | ## Auxiliary and intermediate files from other packages: 55 | # algorithms 56 | *.alg 57 | *.loa 58 | 59 | # achemso 60 | acs-*.bib 61 | 62 | # amsthm 63 | *.thm 64 | 65 | # beamer 66 | *.nav 67 | *.pre 68 | *.snm 69 | *.vrb 70 | 71 | # changes 72 | *.soc 73 | 74 | # comment 75 | *.cut 76 | 77 | # cprotect 78 | *.cpt 79 | 80 | # elsarticle (documentclass of Elsevier journals) 81 | *.spl 82 | 83 | # endnotes 84 | *.ent 85 | 86 | # fixme 87 | *.lox 88 | 89 | # feynmf/feynmp 90 | *.mf 91 | *.mp 92 | *.t[1-9] 93 | *.t[1-9][0-9] 94 | *.tfm 95 | 96 | #(r)(e)ledmac/(r)(e)ledpar 97 | *.end 98 | *.?end 99 | *.[1-9] 100 | *.[1-9][0-9] 101 | *.[1-9][0-9][0-9] 102 | *.[1-9]R 103 | *.[1-9][0-9]R 104 | *.[1-9][0-9][0-9]R 105 | *.eledsec[1-9] 106 | *.eledsec[1-9]R 107 | *.eledsec[1-9][0-9] 108 | *.eledsec[1-9][0-9]R 109 | *.eledsec[1-9][0-9][0-9] 110 | *.eledsec[1-9][0-9][0-9]R 111 | 112 | # glossaries 113 | *.acn 114 | *.acr 115 | *.glg 116 | *.glo 117 | *.gls 118 | *.glsdefs 119 | *.lzo 120 | *.lzs 121 | 122 | # uncomment this for glossaries-extra (will ignore makeindex's style files!) 123 | # *.ist 124 | 125 | # gnuplottex 126 | *-gnuplottex-* 127 | 128 | # gregoriotex 129 | *.gaux 130 | *.gtex 131 | 132 | # htlatex 133 | *.4ct 134 | *.4tc 135 | *.idv 136 | *.lg 137 | *.trc 138 | *.xref 139 | 140 | # hyperref 141 | *.brf 142 | 143 | # knitr 144 | *-concordance.tex 145 | # TODO Comment the next line if you want to keep your tikz graphics files 146 | *.tikz 147 | *-tikzDictionary 148 | 149 | # listings 150 | *.lol 151 | 152 | # luatexja-ruby 153 | *.ltjruby 154 | 155 | # makeidx 156 | *.idx 157 | *.ilg 158 | *.ind 159 | 160 | # minitoc 161 | *.maf 162 | *.mlf 163 | *.mlt 164 | *.mtc[0-9]* 165 | *.slf[0-9]* 166 | *.slt[0-9]* 167 | *.stc[0-9]* 168 | 169 | # minted 170 | _minted* 171 | *.pyg 172 | 173 | # morewrites 174 | *.mw 175 | 176 | # nomencl 177 | *.nlg 178 | *.nlo 179 | *.nls 180 | 181 | # pax 182 | *.pax 183 | 184 | # pdfpcnotes 185 | *.pdfpc 186 | 187 | # sagetex 188 | *.sagetex.sage 189 | *.sagetex.py 190 | *.sagetex.scmd 191 | 192 | # scrwfile 193 | *.wrt 194 | 195 | # sympy 196 | *.sout 197 | *.sympy 198 | sympy-plots-for-*.tex/ 199 | 200 | # pdfcomment 201 | *.upa 202 | *.upb 203 | 204 | # pythontex 205 | *.pytxcode 206 | pythontex-files-*/ 207 | 208 | # tcolorbox 209 | *.listing 210 | 211 | # thmtools 212 | *.loe 213 | 214 | # TikZ & PGF 215 | *.dpth 216 | *.md5 217 | *.auxlock 218 | 219 | # todonotes 220 | *.tdo 221 | 222 | # vhistory 223 | *.hst 224 | *.ver 225 | 226 | # easy-todo 227 | *.lod 228 | 229 | # xcolor 230 | *.xcp 231 | 232 | # xmpincl 233 | *.xmpi 234 | 235 | # xindy 236 | *.xdy 237 | 238 | # xypic precompiled matrices and outlines 239 | *.xyc 240 | *.xyd 241 | 242 | # endfloat 243 | *.ttt 244 | *.fff 245 | 246 | # Latexian 247 | TSWLatexianTemp* 248 | 249 | ## Editors: 250 | # WinEdt 251 | *.bak 252 | *.sav 253 | 254 | # Texpad 255 | .texpadtmp 256 | 257 | # LyX 258 | *.lyx~ 259 | 260 | # Kile 261 | *.backup 262 | 263 | # gummi 264 | .*.swp 265 | 266 | # KBibTeX 267 | *~[0-9]* 268 | 269 | # TeXnicCenter 270 | *.tps 271 | 272 | # auto folder when using emacs and auctex 273 | ./auto/* 274 | *.el 275 | 276 | # expex forward references with \gathertags 277 | *-tags.tex 278 | 279 | # standalone packages 280 | *.sta 281 | 282 | # Makeindex log files 283 | *.lpz 284 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Peter Sovietov 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # kisscm-docs 2 | 3 | [Сборники домашних заданий по Конфигурационному управлению](https://disk.yandex.ru/d/r2770-jsMS7VXg). 4 | 5 | ## Установка 6 | 7 | Сборка проекта настроена для ОС Windows. Для редактирования используется [Visual Studio Code](https://code.visualstudio.com/download). 8 | 9 | 1. Установить [pandoc](https://pandoc.org/). 10 | 1. Установить [Tex Live](https://www.tug.org/texlive/acquire-netinstall.html) или [MikTeX](https://miktex.org/download). Убедитесь, что пакет microtype у вас имеет версию 3.0b или выше. 11 | 1. Установить плагин [pandoc-crossref](https://lierdakil.github.io/pandoc-crossref/). 12 | 1. Установить [make для Windows](http://gnuwin32.sourceforge.net/packages/make.htm). 13 | 1. Установить [Python 3](https://www.python.org/downloads/). 14 | 1. Установить [rsvg-convert](http://sourceforge.net/projects/tumagcc/files/rsvg-convert-2.40.20.7z/download). 15 | 16 | ## TODO 17 | 18 | * Реализовать вывод в HTML в духе [mdBook](https://rust-lang.github.io/mdBook/) и [Bookdown](https://bookdown.org/). 19 | 20 | ## Благодарности 21 | 22 | Проекту [gostdown](https://gitlab.iaaras.ru/iaaras/gostdown) за CSL-файл. 23 | 24 | Студентам: 25 | 26 | * [TMentosT](https://github.com/TMentosT) за демонстрацию работы с шаблонным docx-файлом. 27 | * [HaidesAidoseus](https://github.com/HaidesAidoseus) за рисунки. 28 | * [maxim760](https://github.com/maxim760), [Samsonenko-Stanislav](https://github.com/Samsonenko-Stanislav) за исправление опечаток. 29 | * [adpadalko](https://github.com/adpadalko) за исправления и расшифровку некоторых названий. 30 | * [CalamityDeadshot](https://github.com/CalamityDeadshot) за добавления в главу о системах контроля версий. 31 | * [Samsonenko-Stanislav](https://github.com/Samsonenko-Stanislav) и [mrDNT](https://github.com/mrDNT) за помощь в определении проблемы с пакетом microtype. 32 | * [0niel](https://github.com/0niel) за идею и прототип генератора для mdBook. 33 | -------------------------------------------------------------------------------- /bibliography.bib: -------------------------------------------------------------------------------- 1 | @online{missing, 2 | title = {The Missing Semester of Your CS Education}, 3 | url = "https://missing.csail.mit.edu/" 4 | } 5 | 6 | @book{janssens2021data, 7 | title={Data Science at the Command Line}, 8 | author={Janssens, Jeroen}, 9 | year={2021}, 10 | publisher={" O'Reilly Media, Inc."}, 11 | url="https://www.datascienceatthecommandline.com/2e/" 12 | } 13 | 14 | @article{irving2021research, 15 | title={Research software engineering with python: Building software that makes research possible}, 16 | author={Irving, Damien and Hertweck, Kate and Johnston, Luke and Ostblom, Joel and Wickham, Charlotte and Wilson, Greg}, 17 | year={2021}, 18 | publisher={Chapman and Hall/CRC}, 19 | url="https://merely-useful.tech/py-rse/" 20 | } 21 | 22 | @online{shellcheck, 23 | title = {ShellCheck – shell script analysis tool}, 24 | url = "https://www.shellcheck.net/" 25 | } 26 | 27 | @online{regex101, 28 | title = {regex101: build, test, and debug regex}, 29 | url = "https://regex101.com/" 30 | } 31 | 32 | @article{ramey2011bourne, 33 | title={The Bourne-Again SHell}, 34 | author={Ramey, Chet}, 35 | journal={The Architecture of Open Source Applications}, 36 | year={2011}, 37 | url = "https://www.aosabook.org/en/bash.html" 38 | } 39 | 40 | @inproceedings{tucker2007opium, 41 | title={Opium: Optimal package install/uninstall manager}, 42 | author={Tucker, Chris and Shuffelton, David and Jhala, Ranjit and Lerner, Sorin}, 43 | booktitle={29th International Conference on Software Engineering (ICSE'07)}, 44 | pages={178--188}, 45 | year={2007}, 46 | organization={IEEE} 47 | } 48 | 49 | @inproceedings{abate2020dependency, 50 | title={Dependency solving is still hard, but we are getting better at it}, 51 | author={Abate, Pietro and Di Cosmo, Roberto and Gousios, Georgios and Zacchiroli, Stefano}, 52 | booktitle={2020 IEEE 27th International Conference on Software Analysis, Evolution and Reengineering (SANER)}, 53 | pages={547--551}, 54 | year={2020}, 55 | organization={IEEE} 56 | } 57 | 58 | @online{pubgrub, 59 | title = {The package manager for Dart}, 60 | url = "https://github.com/dart-lang/pub" 61 | } 62 | 63 | @online{antlr, 64 | title = {ANTLR}, 65 | url = "https://www.antlr.org/" 66 | } 67 | 68 | @online{sly, 69 | title = {Sly Lex Yacc}, 70 | url = "https://github.com/dabeaz/sly" 71 | } 72 | 73 | @article{mokhov2020build, 74 | title={Build systems {\`a} la carte: Theory and practice}, 75 | author={Mokhov, Andrey and Mitchell, Neil and Jones, Simon Peyton}, 76 | journal={Journal of Functional Programming}, 77 | volume={30}, 78 | year={2020}, 79 | publisher={Cambridge University Press} 80 | } 81 | 82 | @online{git, 83 | title = {Pro Git book}, 84 | url = "https://git-scm.com/book/ru/v2" 85 | } 86 | 87 | @online{pandoc, 88 | title = {Pandoc User's Guide}, 89 | url = "https://pandoc.org/MANUAL.html" 90 | } 91 | 92 | @book{model, 93 | title={Программное моделирование вычислительных систем}, 94 | author={Г. С. Речистов and Е. А. Елюгин and А. А. Иванов}, 95 | year={2016}, 96 | url="https://atakua.org/w/images/simulation-lectures-latest.pdf", 97 | note = russian 98 | } 99 | 100 | @book{unix, 101 | title={Операционная система UNIX, 2 изд.}, 102 | author={А. М. Робачевский}, 103 | year={2010}, 104 | publisher={БХВ-Петербург}, 105 | note = russian 106 | } 107 | -------------------------------------------------------------------------------- /default.yaml: -------------------------------------------------------------------------------- 1 | metadata: 2 | title: КОНФИГУРАЦИОННОЕ УПРАВЛЕНИЕ 3 | subtitle: Учебное пособие 4 | author: П.Н. Советов 5 | date: Москва – 2021 6 | figureTitle: Рис. 7 | figPrefix: рис. 8 | titleDelim: . 9 | tableTitle: Таблица 10 | tblPrefix: табл. 11 | numberSections: true 12 | sectionsDepth: 3 13 | secHeaderDelim: ". " 14 | toc-title: Оглавление 15 | bibliography: bibliography.bib 16 | link-citations: true 17 | csl: gost-r-7-0-5-2008-numeric-iaa.csl 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /filters/bullets.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | from zipfile import ZipFile 4 | 5 | BULLETS = [ 6 | ('w:val="•"', 'w:val="–"') 7 | ] 8 | 9 | docx_file = sys.argv[1] 10 | temp_file = docx_file + '.temp' 11 | 12 | with ZipFile(docx_file, 'r') as zipread: 13 | with ZipFile(temp_file, 'w') as zipwrite: 14 | for item in zipread.infolist(): 15 | data = zipread.read(item.filename) 16 | if item.filename == 'word/numbering.xml': 17 | data = data.decode('utf8') 18 | for (src, dst) in BULLETS: 19 | data = data.replace(src, dst) 20 | zipwrite.writestr(item, data) 21 | 22 | os.remove(docx_file) 23 | os.rename(temp_file, docx_file) 24 | -------------------------------------------------------------------------------- /filters/pagebreak.lua: -------------------------------------------------------------------------------- 1 | --[[ 2 | pagebreak – convert raw LaTeX page breaks to other formats 3 | 4 | Copyright © 2017-2021 Benct Philip Jonsson, Albert Krewinkel 5 | 6 | Permission to use, copy, modify, and/or distribute this software for any 7 | purpose with or without fee is hereby granted, provided that the above 8 | copyright notice and this permission notice appear in all copies. 9 | 10 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11 | WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12 | MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13 | ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14 | WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15 | ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16 | OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17 | ]] 18 | local stringify_orig = (require 'pandoc.utils').stringify 19 | 20 | local function stringify(x) 21 | return type(x) == 'string' and x or stringify_orig(x) 22 | end 23 | 24 | --- configs – these are populated in the Meta filter. 25 | local pagebreak = { 26 | asciidoc = '<<<\n\n', 27 | context = '\\page', 28 | epub = '

', 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 | 9 | 10 | G 11 | 12 | 13 | 14 | n1 15 | 16 | Ввод 17 | 18 | 19 | 20 | n4 21 | 22 | Синтаксический 23 | разбор 24 | 25 | 26 | 27 | n1->n4 28 | 29 | 30 | 31 | 32 | 33 | n2 34 | 35 | Выполнение 36 | команды 37 | 38 | 39 | 40 | n3 41 | 42 | Статус 43 | завершения 44 | 45 | 46 | 47 | n2->n3 48 | 49 | 50 | 51 | 52 | 53 | n5 54 | 55 | Подстановка 56 | 57 | 58 | 59 | n4->n5 60 | 61 | 62 | 63 | 64 | 65 | n5->n2 66 | 67 | 68 | 69 | 70 | 71 | n6 72 | 73 | Подстановка 74 | скобок 75 | 76 | 77 | 78 | n5->n6 79 | 80 | 81 | 82 | 83 | 84 | n7 85 | 86 | Подстановка ~ 87 | 88 | 89 | 90 | n6->n7 91 | 92 | 93 | 94 | 95 | 96 | n8 97 | 98 | Подстановка переменных, 99 | параметров, команд, 100 | процессов, арифметики 101 | 102 | 103 | 104 | n7->n8 105 | 106 | 107 | 108 | 109 | 110 | n9 111 | 112 | Разбиение 113 | на слова 114 | 115 | 116 | 117 | n8->n9 118 | 119 | 120 | 121 | 122 | 123 | n10 124 | 125 | Генерация 126 | имен файлов 127 | 128 | 129 | 130 | n9->n10 131 | 132 | 133 | 134 | 135 | 136 | n10->n5 137 | 138 | 139 | 140 | 141 | 142 | -------------------------------------------------------------------------------- /images/cli2.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | G 11 | 12 | 13 | 14 | n1c 15 | 16 | pwd 17 | 18 | 19 | 20 | nZc 21 | 22 | stdout 23 | 24 | 25 | 26 | n1c->nZc 27 | 28 | 29 | 30 | 31 | 32 | n3c 33 | 34 | stdin 35 | 36 | 37 | 38 | nZc->n3c 39 | 40 | 41 | 42 | 43 | 44 | n2c 45 | 46 | Экран: 47 | toor/ 48 | 49 | 50 | 51 | n6c 52 | 53 | rev 54 | 55 | 56 | 57 | n3c->n6c 58 | 59 | 60 | 61 | 62 | 63 | n4c 64 | 65 | stdout 66 | 67 | 68 | 69 | n4c->n2c 70 | 71 | 72 | 73 | 74 | 75 | n5c 76 | 77 | stderr 78 | 79 | 80 | 81 | n5c->n2c 82 | 83 | 84 | 85 | 86 | 87 | n6c->n4c 88 | 89 | 90 | 91 | 92 | 93 | n6c->n5c 94 | 95 | 96 | 97 | 98 | 99 | n1b 100 | 101 | Клавиатура: 102 | abcd 103 | 104 | 105 | 106 | n3b 107 | 108 | stdin 109 | 110 | 111 | 112 | n1b->n3b 113 | 114 | 115 | 116 | 117 | 118 | n2b 119 | 120 | Экран: 121 | dcba 122 | 123 | 124 | 125 | n6b 126 | 127 | rev 128 | 129 | 130 | 131 | n3b->n6b 132 | 133 | 134 | 135 | 136 | 137 | n4b 138 | 139 | stdout 140 | 141 | 142 | 143 | n4b->n2b 144 | 145 | 146 | 147 | 148 | 149 | n5b 150 | 151 | stderr 152 | 153 | 154 | 155 | n5b->n2b 156 | 157 | 158 | 159 | 160 | 161 | n6b->n4b 162 | 163 | 164 | 165 | 166 | 167 | n6b->n5b 168 | 169 | 170 | 171 | 172 | 173 | n2 174 | 175 | Экран: 176 | /root 177 | 178 | 179 | 180 | n4 181 | 182 | stdout 183 | 184 | 185 | 186 | n4->n2 187 | 188 | 189 | 190 | 191 | 192 | n5 193 | 194 | stderr 195 | 196 | 197 | 198 | n5->n2 199 | 200 | 201 | 202 | 203 | 204 | n6 205 | 206 | pwd 207 | 208 | 209 | 210 | n6->n4 211 | 212 | 213 | 214 | 215 | 216 | n6->n5 217 | 218 | 219 | 220 | 221 | 222 | -------------------------------------------------------------------------------- /images/docs3.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | G 11 | 12 | 13 | 14 | n1 15 | 16 | noweb 17 | 18 | 19 | 20 | n2 21 | 22 | TeX 23 | 24 | 25 | 26 | n1->n2 27 | 28 | 29 | noweave 30 | 31 | 32 | 33 | n3 34 | 35 | Python 36 | 37 | 38 | 39 | n1->n3 40 | 41 | 42 | notangle 43 | 44 | 45 | 46 | n4 47 | 48 | PDF 49 | 50 | 51 | 52 | n2->n4 53 | 54 | 55 | LaTeX 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /images/docs5.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | G 11 | 12 | 13 | cluster_1 14 | 15 | 16 | 17 | 18 | n1 19 | 20 | AST₁ 21 | 22 | 23 | 24 | n7 25 | 26 | Фильтры 27 | 28 | 29 | 30 | n1->n7 31 | 32 | 33 | 34 | 35 | 36 | n2 37 | 38 | Markdown 39 | 40 | 41 | 42 | n2->n1 43 | 44 | 45 | 46 | 47 | 48 | n3 49 | 50 | LaTeX 51 | 52 | 53 | 54 | n3->n1 55 | 56 | 57 | 58 | 59 | 60 | n4 61 | ... 62 | 63 | 64 | 65 | n4->n1 66 | 67 | 68 | 69 | 70 | 71 | n5 72 | 73 | DOCX 74 | 75 | 76 | 77 | n5->n1 78 | 79 | 80 | 81 | 82 | 83 | n6 84 | 85 | HTML 86 | 87 | 88 | 89 | n6->n1 90 | 91 | 92 | 93 | 94 | 95 | n8 96 | 97 | AST₂ 98 | 99 | 100 | 101 | n7->n8 102 | 103 | 104 | 105 | 106 | 107 | n9 108 | 109 | Markdown 110 | 111 | 112 | 113 | n8->n9 114 | 115 | 116 | 117 | 118 | 119 | n10 120 | 121 | LaTeX 122 | 123 | 124 | 125 | n8->n10 126 | 127 | 128 | 129 | 130 | 131 | n11 132 | ... 133 | 134 | 135 | 136 | n8->n11 137 | 138 | 139 | 140 | 141 | 142 | n12 143 | 144 | DOCX 145 | 146 | 147 | 148 | n8->n12 149 | 150 | 151 | 152 | 153 | 154 | n13 155 | 156 | HTML 157 | 158 | 159 | 160 | n8->n13 161 | 162 | 163 | 164 | 165 | 166 | -------------------------------------------------------------------------------- /images/docs6.svg: -------------------------------------------------------------------------------- 1 | 3 | 4 | G 5 | 6 | 7 | 8 | n1 9 | 10 | 1 11 | 12 | 13 | 14 | n2 15 | 16 | 2 17 | 18 | 19 | 20 | n1->n2 21 | 22 | 23 | 24 | 25 | 26 | n3 27 | 28 | 3 29 | 30 | 31 | 32 | n2->n3 33 | 34 | 35 | 36 | 37 | 38 | n3->n1 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /images/docs7.svg: -------------------------------------------------------------------------------- 1 | AABBCCшагшагдействиешагшаг -------------------------------------------------------------------------------- /images/dsl2.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | G 11 | 12 | 13 | 14 | n1 15 | 16 | Компьютерные 17 | языки 18 | 19 | 20 | 21 | n2 22 | 23 | Тьюринг-полные 24 | языки 25 | 26 | 27 | 28 | n1->n2 29 | 30 | 31 | 32 | 33 | 34 | n3 35 | 36 | Тьюринг-неполные 37 | языки 38 | 39 | 40 | 41 | n1->n3 42 | 43 | 44 | 45 | 46 | 47 | n4 48 | 49 | Предметно-ориентированные 50 | языки 51 | 52 | 53 | 54 | n2->n4 55 | 56 | 57 | 58 | 59 | 60 | n5 61 | 62 | Языки 63 | общего назначения 64 | 65 | 66 | 67 | n2->n5 68 | 69 | 70 | 71 | 72 | 73 | n3->n4 74 | 75 | 76 | 77 | 78 | 79 | n7 80 | 81 | Конфигурационные 82 | языки 83 | 84 | 85 | 86 | n4->n7 87 | 88 | 89 | 90 | 91 | 92 | n5->n7 93 | 94 | 95 | 96 | 97 | 98 | -------------------------------------------------------------------------------- /images/git1.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | 12 | cluster_commits 13 | 14 | Коммиты 15 | 16 | 17 | cluster_branches 18 | 19 | Ветки 20 | 21 | 22 | 23 | d6c30b 24 | 25 | d6c30b 26 | 27 | 28 | 29 | eec8e6 30 | 31 | eec8e6 32 | 33 | 34 | 35 | d6c30b->eec8e6 36 | 37 | 38 | 39 | 40 | 41 | 3ba9fa 42 | 43 | 3ba9fa 44 | 45 | 46 | 47 | eec8e6->3ba9fa 48 | 49 | 50 | 51 | 52 | 53 | master 54 | 55 | master 56 | 57 | 58 | 59 | master->d6c30b 60 | 61 | 62 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /images/git2.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | 12 | cluster_commits 13 | 14 | Коммиты 15 | 16 | 17 | cluster_branches 18 | 19 | Ветки 20 | 21 | 22 | 23 | a0c8e2 24 | 25 | a0c8e2 26 | 27 | 28 | 29 | d6c30b 30 | 31 | d6c30b 32 | 33 | 34 | 35 | a0c8e2->d6c30b 36 | 37 | 38 | 39 | 40 | 41 | eec8e6 42 | 43 | eec8e6 44 | 45 | 46 | 47 | d6c30b->eec8e6 48 | 49 | 50 | 51 | 52 | 53 | 3ba9fa 54 | 55 | 3ba9fa 56 | 57 | 58 | 59 | eec8e6->3ba9fa 60 | 61 | 62 | 63 | 64 | 65 | 51b5c8 66 | 67 | 51b5c8 68 | 69 | 70 | 71 | d0ee37 72 | 73 | d0ee37 74 | 75 | 76 | 77 | 51b5c8->d0ee37 78 | 79 | 80 | 81 | 82 | 83 | d0ee37->d6c30b 84 | 85 | 86 | 87 | 88 | 89 | master 90 | 91 | master 92 | 93 | 94 | 95 | master->a0c8e2 96 | 97 | 98 | 99 | 100 | 101 | tests 102 | 103 | tests 104 | 105 | 106 | 107 | tests->51b5c8 108 | 109 | 110 | 111 | 112 | 113 | -------------------------------------------------------------------------------- /images/git3.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | 12 | cluster_commits 13 | 14 | Коммиты 15 | 16 | 17 | cluster_branches 18 | 19 | Ветки 20 | 21 | 22 | 23 | bd848b 24 | 25 | bd848b 26 | 27 | 28 | 29 | a0c8e2 30 | 31 | a0c8e2 32 | 33 | 34 | 35 | bd848b->a0c8e2 36 | 37 | 38 | 39 | 40 | 41 | 51b5c8 42 | 43 | 51b5c8 44 | 45 | 46 | 47 | bd848b->51b5c8 48 | 49 | 50 | 51 | 52 | 53 | d6c30b 54 | 55 | d6c30b 56 | 57 | 58 | 59 | a0c8e2->d6c30b 60 | 61 | 62 | 63 | 64 | 65 | eec8e6 66 | 67 | eec8e6 68 | 69 | 70 | 71 | d6c30b->eec8e6 72 | 73 | 74 | 75 | 76 | 77 | 3ba9fa 78 | 79 | 3ba9fa 80 | 81 | 82 | 83 | eec8e6->3ba9fa 84 | 85 | 86 | 87 | 88 | 89 | d0ee37 90 | 91 | d0ee37 92 | 93 | 94 | 95 | 51b5c8->d0ee37 96 | 97 | 98 | 99 | 100 | 101 | d0ee37->d6c30b 102 | 103 | 104 | 105 | 106 | 107 | master 108 | 109 | master 110 | 111 | 112 | 113 | master->bd848b 114 | 115 | 116 | 117 | 118 | 119 | tests 120 | 121 | tests 122 | 123 | 124 | 125 | tests->51b5c8 126 | 127 | 128 | 129 | 130 | 131 | -------------------------------------------------------------------------------- /images/git4.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | 12 | cluster_commits 13 | 14 | Коммиты 15 | 16 | 17 | cluster_branches 18 | 19 | Ветки 20 | 21 | 22 | 23 | 51b5c8 24 | 25 | 51b5c8 26 | 27 | 28 | 29 | d0ee37 30 | 31 | d0ee37 32 | 33 | 34 | 35 | 51b5c8->d0ee37 36 | 37 | 38 | 39 | 40 | 41 | d6c30b 42 | 43 | d6c30b 44 | 45 | 46 | 47 | d0ee37->d6c30b 48 | 49 | 50 | 51 | 52 | 53 | eec8e6 54 | 55 | eec8e6 56 | 57 | 58 | 59 | d6c30b->eec8e6 60 | 61 | 62 | 63 | 64 | 65 | 3ba9fa 66 | 67 | 3ba9fa 68 | 69 | 70 | 71 | eec8e6->3ba9fa 72 | 73 | 74 | 75 | 76 | 77 | master 78 | 79 | master 80 | 81 | 82 | 83 | master->51b5c8 84 | 85 | 86 | 87 | 88 | 89 | tests 90 | 91 | tests 92 | 93 | 94 | 95 | tests->51b5c8 96 | 97 | 98 | 99 | 100 | 101 | -------------------------------------------------------------------------------- /images/git5.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | 12 | cluster_blobs 13 | 14 | Blobs (данные) 15 | 16 | 17 | cluster_trees 18 | 19 | Деревья 20 | 21 | 22 | cluster_commits 23 | 24 | Коммиты 25 | 26 | 27 | cluster_branches 28 | 29 | Ветки 30 | 31 | 32 | 33 | readme.md 01b51e 34 | 35 | readme.md 01b51e 36 | 37 | 38 | 39 | readme.md 1ad607 40 | 41 | readme.md 1ad607 42 | 43 | 44 | 45 | readme.md 7dfce3 46 | 47 | readme.md 7dfce3 48 | 49 | 50 | 51 | readme.md 91ed53 52 | 53 | readme.md 91ed53 54 | 55 | 56 | 57 | / dc10a6 58 | 59 | / dc10a6 60 | 61 | 62 | 63 | / dc10a6->readme.md 01b51e 64 | 65 | 66 | 67 | 68 | 69 | / 450fc1 70 | 71 | / 450fc1 72 | 73 | 74 | 75 | / 450fc1->readme.md 1ad607 76 | 77 | 78 | 79 | 80 | 81 | / 074f8b 82 | 83 | / 074f8b 84 | 85 | 86 | 87 | / 074f8b->readme.md 7dfce3 88 | 89 | 90 | 91 | 92 | 93 | / 3a72e0 94 | 95 | / 3a72e0 96 | 97 | 98 | 99 | / 3a72e0->readme.md 91ed53 100 | 101 | 102 | 103 | 104 | 105 | 51b5c8 106 | 107 | 51b5c8 108 | 109 | 110 | 111 | 51b5c8->/ dc10a6 112 | 113 | 114 | 115 | 116 | 117 | d0ee37 118 | 119 | d0ee37 120 | 121 | 122 | 123 | 51b5c8->d0ee37 124 | 125 | 126 | 127 | 128 | 129 | d0ee37->/ 450fc1 130 | 131 | 132 | 133 | 134 | 135 | d6c30b 136 | 137 | d6c30b 138 | 139 | 140 | 141 | d0ee37->d6c30b 142 | 143 | 144 | 145 | 146 | 147 | d6c30b->/ 074f8b 148 | 149 | 150 | 151 | 152 | 153 | eec8e6 154 | 155 | eec8e6 156 | 157 | 158 | 159 | d6c30b->eec8e6 160 | 161 | 162 | 163 | 164 | 165 | eec8e6->/ 3a72e0 166 | 167 | 168 | 169 | 170 | 171 | 3ba9fa 172 | 173 | 3ba9fa 174 | 175 | 176 | 177 | eec8e6->3ba9fa 178 | 179 | 180 | 181 | 182 | 183 | 3ba9fa->/ 074f8b 184 | 185 | 186 | 187 | 188 | 189 | master 190 | 191 | master 192 | 193 | 194 | 195 | master->51b5c8 196 | 197 | 198 | 199 | 200 | 201 | tests 202 | 203 | tests 204 | 205 | 206 | 207 | tests->51b5c8 208 | 209 | 210 | 211 | 212 | 213 | -------------------------------------------------------------------------------- /images/make2.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | G 11 | 12 | 13 | 14 | n1 15 | 16 | 2. Носки 17 | 18 | 19 | 20 | n6 21 | 22 | 6. Обувь 23 | 24 | 25 | 26 | n1->n6 27 | 28 | 29 | 30 | 31 | 32 | n3 33 | 34 | 4. Брюки 35 | 36 | 37 | 38 | n3->n6 39 | 40 | 41 | 42 | 43 | 44 | n4 45 | 46 | 3. Рубашка 47 | 48 | 49 | 50 | n4->n3 51 | 52 | 53 | 54 | 55 | 56 | n8 57 | 58 | 5. Свитер 59 | 60 | 61 | 62 | n4->n8 63 | 64 | 65 | 66 | 67 | 68 | n5 69 | 70 | 1. Нательное 71 | белье 72 | 73 | 74 | 75 | n5->n1 76 | 77 | 78 | 79 | 80 | 81 | n5->n4 82 | 83 | 84 | 85 | 86 | 87 | n7 88 | 89 | 8. Экипировка 90 | 91 | 92 | 93 | n6->n7 94 | 95 | 96 | 97 | 98 | 99 | n9 100 | 101 | 7. Куртка 102 | 103 | 104 | 105 | n8->n9 106 | 107 | 108 | 109 | 110 | 111 | n9->n7 112 | 113 | 114 | 115 | 116 | 117 | -------------------------------------------------------------------------------- /images/pm1.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | packages 11 | 12 | 13 | 14 | instead 15 | 16 | instead 17 | 18 | 19 | 20 | libc6 21 | 22 | libc6 23 | 24 | 25 | 26 | instead->libc6 27 | 28 | 29 | 30 | 31 | 32 | libgdk-pixbuf2.0-0 33 | 34 | libgdk-pixbuf2.0-0 35 | 36 | 37 | 38 | instead->libgdk-pixbuf2.0-0 39 | 40 | 41 | 42 | 43 | 44 | libglib2.0-0 45 | 46 | libglib2.0-0 47 | 48 | 49 | 50 | instead->libglib2.0-0 51 | 52 | 53 | 54 | 55 | 56 | libgtk2.0-0 57 | 58 | libgtk2.0-0 59 | 60 | 61 | 62 | instead->libgtk2.0-0 63 | 64 | 65 | 66 | 67 | 68 | liblua5.1-0 69 | 70 | liblua5.1-0 71 | 72 | 73 | 74 | instead->liblua5.1-0 75 | 76 | 77 | 78 | 79 | 80 | libsdl2-2.0-0 81 | 82 | libsdl2-2.0-0 83 | 84 | 85 | 86 | instead->libsdl2-2.0-0 87 | 88 | 89 | 90 | 91 | 92 | libsdl2-image-2.0-0 93 | 94 | libsdl2-image-2.0-0 95 | 96 | 97 | 98 | instead->libsdl2-image-2.0-0 99 | 100 | 101 | 102 | 103 | 104 | libsdl2-mixer-2.0-0 105 | 106 | libsdl2-mixer-2.0-0 107 | 108 | 109 | 110 | instead->libsdl2-mixer-2.0-0 111 | 112 | 113 | 114 | 115 | 116 | libsdl2-ttf-2.0-0 117 | 118 | libsdl2-ttf-2.0-0 119 | 120 | 121 | 122 | instead->libsdl2-ttf-2.0-0 123 | 124 | 125 | 126 | 127 | 128 | zlib1g 129 | 130 | zlib1g 131 | 132 | 133 | 134 | instead->zlib1g 135 | 136 | 137 | 138 | 139 | 140 | instead-data 141 | 142 | instead-data 143 | 144 | 145 | 146 | instead->instead-data 147 | 148 | 149 | 150 | 151 | 152 | fonts-liberation 153 | 154 | fonts-liberation 155 | 156 | 157 | 158 | instead-data->fonts-liberation 159 | 160 | 161 | 162 | 163 | 164 | -------------------------------------------------------------------------------- /images/vm1.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | G 11 | 12 | 13 | 14 | n6 15 | 16 | Виды виртуализации 17 | 18 | 19 | 20 | n7 21 | 22 | Языковая виртуальная машина 23 | 24 | 25 | 26 | n6->n7 27 | 28 | 29 | 30 | 31 | 32 | n8 33 | 34 | Виртуализация вычислительной системы 35 | 36 | 37 | 38 | n6->n8 39 | 40 | 41 | 42 | 43 | 44 | n9 45 | 46 | Виртуализация приложения 47 | 48 | 49 | 50 | n6->n9 51 | 52 | 53 | 54 | 55 | 56 | n10 57 | 58 | Виртуализация уровня ОС 59 | 60 | 61 | 62 | n6->n10 63 | 64 | 65 | 66 | 67 | 68 | -------------------------------------------------------------------------------- /images/vm2.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | G 11 | 12 | 13 | 14 | n1 15 | 16 | Техники виртуализации 17 | 18 | 19 | 20 | n2 21 | 22 | Эмуляция 23 | 24 | 25 | 26 | n1->n2 27 | 28 | 29 | 30 | 31 | 32 | n5 33 | 34 | Аппаратная виртуализация 35 | 36 | 37 | 38 | n1->n5 39 | 40 | 41 | 42 | 43 | 44 | n6 45 | 46 | Паравиртуализация 47 | 48 | 49 | 50 | n1->n6 51 | 52 | 53 | 54 | 55 | 56 | n3 57 | 58 | Интерпретация 59 | 60 | 61 | 62 | n2->n3 63 | 64 | 65 | 66 | 67 | 68 | n4 69 | 70 | Двоичная трансляция 71 | 72 | 73 | 74 | n2->n4 75 | 76 | 77 | 78 | 79 | 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 | ![Пример сценария работы с облачной системой сборки: 1) загрузка исходных текстов, 2) построение main.exe, 3) модификация util.c и пересборка](make1.svg){#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 | ![Пример графа зависимостей задач](make2.svg){#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 | ![Результат компиляции LaTeX-документа](docs1.svg){#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 | ![Полученные формулы](docs2.svg){#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 | ![Схема работы системы WEB](docs3.svg){#fig:docs3} 94 | 95 | На @fig:docs4 показан пример LaTeX-документа, извлеченного из WEB-файла. 96 | 97 | ![Пример WEB-документа](docs4.svg){#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 | ![Архитектура Pandoc](docs5.svg){#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 | ![Результат работы Graphviz](docs6.svg){#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 | ![Результат работы PlantUML](docs7.svg){#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 | ![Формат версии по спецификации SemVer](pm3.svg){#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 | ![Зависимости пакета instead](pm1.svg){#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 | ![Пример задачи разрешения зависимостей пакетов](pm2.svg){#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 | ![История развития систем контроля версий](git6.svg){#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 | ![Состояние репозитория после нескольких коммитов](git1.svg){#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 | ![Работа с дополнительной веткой](git2.svg){#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 | ![Слияние веток](git3.svg){#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 | ![Перебазирование веток](git4.svg){#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 | ![Взаимосвязи объектов в репозитории](git5.svg){#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 | ![](images/pubgrub.png) 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 | ![](images/git.png) 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 | ![](images/formula.png) 10 | 11 | Прислать код на LaTeX и картинку-результат, где, помимо формулы, будет указано ФИО студента. 12 | 13 | ## Задача 2 14 | 15 | На языке PlantUML реализовать диаграмму на рисунке ниже. Прислать текст на PlantUML и картинку-результат, в которой ФИО студента заменены Вашими собственными. 16 | Обратите внимание на оформление, желательно придерживаться именно его, то есть без стандартного желтого цвета и проч. Чтобы много не писать используйте псевдонимы с помощью ключевого слова "as". 17 | 18 | Используйте [онлайн-редактор](https://plantuml-editor.kkeisuke.com/). 19 | 20 | ![](images/plantuml.png) 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 |
49 | Менеджер пакетов    Репозиторий                     Формат
50 | ------------------  ------------------------------  ---------------
51 | pip                 pypi.org/pypi/{name}/json       JSON
52 | npm                 registry.npmjs.org/{name}       JSON
53 | Maven               repo1.maven.org/maven2          XML, pom-файл
54 | NuGet               api.nuget.org/v3                XML
55 | apk                 dl-cdn.alpinelinux.org/alpine/  APKINDEX.tar.gz
56 | apt                 archive.ubuntu.com/ubuntu/      Packages.gz
57 | 
58 | 59 | --- 60 | 61 | ## Менеджер пакетов в Ubuntu 62 | 63 | * apt, deb. 64 | * sources.list. 65 | * Однострочник: как получить адрес репозитория. 66 | * https://wiki.debian.org/PackageManagement 67 | 68 | --- 69 | 70 | ## Визуализатор зависимостей для Packages.gz 71 | 72 | * Репозитории main и universe. 73 | * Алгоритм обхода в ширину и без рекурсии. 74 | * Утилита graphviz и язык dot. 75 | 76 | --- 77 | 78 | ## SAT-решатели и разрешение зависимостей 79 | 80 | $$ 81 | (x \lor \neg y) \land (\neg x \lor y) 82 | $$ 83 | 84 | * Задачи из классов P, NP-полные и NP-трудные. 85 | * Кролики и фазаны. 86 | * Задача из практики №2. 87 | * Минимизация зависимостей. 88 | -------------------------------------------------------------------------------- /slides/lect4.md: -------------------------------------------------------------------------------- 1 | --- 2 | theme: white 3 | highlightTheme: white 4 | transition: none 5 | slideNumber: true 6 | enableMenu: false 7 | --- 8 | 9 | 10 | 11 | ## Конфигурационное управление 12 | 13 | Лекция №4. Конфигурационные языки 14 | 15 | Лектор: *Советов Пётр Николаевич* 16 | 17 | --- 18 | 19 | ## Компьютерные языки 20 | 21 | ```graphviz 22 | digraph { 23 | node [shape=box fixedsize=true width=2.7] 24 | "Конфигурационные" [style=filled] 25 | 26 | "Компьютерные языки" -> "Общего назначения" 27 | "Компьютерные языки" -> "Тьюринг-полные" 28 | "Компьютерные языки" -> "Тьюринг-неполные" 29 | "Компьютерные языки" -> "Предметно-ориентированные" 30 | "Тьюринг-полные" -> "Предметно-ориентированные" 31 | "Тьюринг-неполные" -> "Предметно-ориентированные" 32 | "Тьюринг-полные" -> "Общего назначения" 33 | "Предметно-ориентированные" -> "Конфигурационные" 34 | "Конфигурационные" -> "Общего назначения" 35 | "Конфигурационные" -> "Непрограммируемые" 36 | "Конфигурационные" -> "Программируемые" 37 | } 38 | ``` 39 | 40 | --- 41 | 42 | ## Как описать язык 43 | 44 | * **Синтаксис**. 45 | * Семантика. 46 | * Прагматика. 47 | 48 | Синтаксис с помощью грамматики: 49 | 50 | 1. регулярная, 51 | 1. контекстно-свободная. 52 | 53 | --- 54 | 55 | ## Регулярная грамматика 56 | 57 | 1. Пусто или одиночный символ. 58 | 1. Повторение: `r*`. 59 | 1. Последовательность: `r1 r2`. 60 | 1. Альтернатива: `r1 | r2`. 61 | 62 | Какая связь с регулярными выражениями? 63 | 64 | Как описать язык `((((...))))`? 65 | 66 | Знаменитый [вопрос](https://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags 67 | ) со stackoverflow. 68 | 69 | --- 70 | 71 | ## Контекстно-свободная грамматика 72 | 73 | Добавим к регулярной грамматике рекурсию! 74 | 75 | * Железнодорожные диаграммы и БНФ: http://www.json.org/json-ru.html 76 | * Lark: https://www.lark-parser.org/ide/ 77 | 78 | --- 79 | 80 | ## Разбор мини-версии Лого 81 | 82 | ``` 83 | to square 84 | repeat 4 [fd 100 rt 90] 85 | end 86 | 87 | repeat 20 [square rt 20] 88 | ``` 89 | 90 | * https://calormen.com/jslogo/ 91 | * https://deepakjois.github.io/hs-logo/examples.html 92 | 93 | --- 94 | 95 | ## Разбор S-выражений 96 | 97 | ``` 98 | (define square 99 | (lambda (x) (* x x))) 100 | ``` 101 | 102 | * https://try.scheme.org/ 103 | * http://norvig.com/lispy.html 104 | 105 | --- 106 | 107 | ## Разбор языка Conf 108 | 109 | ``` 110 | # comment 111 | vm = { 112 | ip = [192 168 44 44] 113 | memory = 1024 114 | synced_folders = [{ 115 | host_path = "data/" 116 | guest_path = "/var/www" 117 | type = "default" 118 | }] 119 | } 120 | log = "conf.log" 121 | ``` 122 | 123 | --- 124 | 125 | ## Разбор регулярных выражений 126 | 127 | Однозначность грамматики. 128 | 129 | Приоритеты: 130 | 131 | 1. Скобки. 132 | 1. Повторение. 133 | 1. Последовательность. 134 | 1. Альтернатива. 135 | 136 | --- 137 | 138 | ## Библиотека peco 139 | 140 | * https://github.com/true-grue/peco 141 | * Conf на peco: https://github.com/true-grue/peco/blob/main/test_conf.py 142 | -------------------------------------------------------------------------------- /slides/lect5.md: -------------------------------------------------------------------------------- 1 | --- 2 | theme: white 3 | highlightTheme: white 4 | transition: none 5 | slideNumber: true 6 | enableMenu: false 7 | --- 8 | 9 | 10 | 11 | ## Конфигурационное управление 12 | 13 | Лекция №5. Системы управления версиями 14 | 15 | Лектор: *Советов Пётр Николаевич* 16 | 17 | --- 18 | 19 | > "Чего не могу воссоздать, того не понимаю" 20 | 21 | Р. Фейнман 22 | 23 | --- 24 | 25 | ## План действий на сегодня 26 | 27 | * Реализуем команду diff. 28 | * Реализуем свой git. 29 | * Реализуем аналог cat-file настоящего git. 30 | 31 | --- 32 | 33 | ## Свой diff 34 | 35 | * Основа любой СКВ. Почему текстовые файлы хранить предпочтительнее бинарных? 36 | * diff выдает последовательность команд для получения из исходного файла файла-результата. 37 | * Команды: вставка строки, удаление, пропуск без изменений. 38 | * Простой алгоритм diff можно реализовать на основе расстояния Левенштейна. Сравним результат с git diff. 39 | 40 | --- 41 | 42 | ## Свой git 43 | 44 | * База объектов (контентно-адресуемое хранилище). 45 | * Хеши, хеш-функции. Насколько опасны [хеш-коллизии](https://preshing.com/20110504/hash-collision-probabilities/)? 46 | * Основные типы объектов: blob, tree, commit. 47 | 48 | --- 49 | 50 | ## Граф коммитов 51 | 52 | * Родители коммитов и DAG. 53 | * Хеш от хешей. Связь с торрентами и блокчейном. Дерево Меркла. 54 | * Визуализация DAG с ветвями и слиянием. 55 | 56 | --- 57 | 58 | ## Свой git cat-file 59 | 60 | * Подсказки для ДЗ №2. 61 | * Реализация разбора трех типов объектов. 62 | 63 | --- 64 | 65 | ## Комиксы по git 66 | 67 | * https://xkcd.com/1597/ 68 | * https://xkcd.com/1296/ 69 | -------------------------------------------------------------------------------- /slides/lect6.md: -------------------------------------------------------------------------------- 1 | --- 2 | theme : white 3 | highlightTheme: white 4 | transition: none 5 | slideNumber: true 6 | enableMenu: false 7 | --- 8 | 9 | 10 | 11 | ## Конфигурационное управление 12 | 13 | Лекция №6. Виртуальные машины 14 | 15 | Лектор: *Советов Пётр Николаевич* 16 | 17 | --- 18 | 19 | ## Виртуальные машины 20 | 21 | * Программные реализации реальных процессоров. 22 | * Языковые виртуальные машины (ВМ). 23 | 24 | --- 25 | 26 | ## Байткод CPython 27 | 28 | * Стековая ВМ. 29 | * Модуль [dis](https://docs.python.org/3/library/dis.html). 30 | * Пример с дискриминантом. 31 | * Реализация ассемблера. 32 | * Реализация интерпретатора. 33 | 34 | --- 35 | 36 | ## RISC-V 37 | 38 | * Регистровая архитектура. 39 | * Оптимизированный код дискриминанта ([godbolt](https://godbolt.org/), gcc). 40 | * Реализация ассемблера и интерпретатора. 41 | 42 | --- 43 | 44 | ## Виртуальные игровые ретро-приставки 45 | 46 | * [CHIP-8](https://taniarascia.github.io/chip8/). 47 | * [PICO-8](https://nerdyteachers.com/PICO-8/Games/Top200/). 48 | 49 | --- 50 | 51 | ## ByteByteJump 52 | 53 | * [Архитектура](https://esolangs.org/wiki/ByteByteJump) память-память. 54 | * ВМ с одной командой. 55 | * Как реализовать умножение? 56 | 57 | --- 58 | 59 | ## Виртуальная приставка [BytePusher](https://esolangs.org/wiki/BytePusher) 60 | 61 | * Карта памяти. 62 | * Поддержка графики. 63 | * Тестирование "картриджей". 64 | 65 | --- 66 | 67 | ## Эмулятор QEMU 68 | 69 | * QNX на одной дискете. 70 | * Программы и [игры](https://gist.github.com/XlogicX/8204cf17c432cc2b968d138eb639494e) в загрузочном секторе. 71 | 72 | --- 73 | 74 | ## WebAssembly 75 | 76 | Демонстрация компилятора подмножества Питона в WASM, по мотивам [доклада](https://github.com/true-grue/python-dsls). 77 | 78 | -------------------------------------------------------------------------------- /slides/programmer.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/true-grue/kisscm/f2c97ce460a5daed62ec2a93c766965be3dae13b/slides/programmer.jpg -------------------------------------------------------------------------------- /template.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/true-grue/kisscm/f2c97ce460a5daed62ec2a93c766965be3dae13b/template.docx --------------------------------------------------------------------------------