Домашние задания, выполненные на 3ем семестре РТУ МИРЭА, по дисциплине

Overview

ДЗ по курсу "Конфигурационное управление" в РТУ МИРЭА

Описание

В данном репозитории находятся домашние задания, выполненные на 3ем семестре РТУ МИРЭА, по дисциплине "Конфигурационное управление".

Хочется выразить большую благодарность Петру Николаевич Советову @true-grue за лекции, практики и интересные задания!

Содержание

  1. Эмулятор консоли
  2. Визуализатор зависимостей пакета
  3. Выдуманный конфигурационный язык
  4. Мини-версия Make

Задания

1. Эмулятор консоли (ConsoleEmulator)

Эмулятор командной строки на языке Python с использованием библиотек zipfile (для работы с zip-архивом), sys (получение адреса архива из командой строки), os.path (работа с адресами), calendar (форматирование даты файла для вывода)

Для тестирования необходимо разместить main.py, archive.py в одном каталоге (для удобства тестируемый архив можно разместить в этом же каталоге, тогда вторым аргументом при запуске main.py передать только имя архива и тип) и запустить main.py

Эмулятор поддерживает команды cd, ls, ls -l, cat, pwd

Структура программы:

  • main.py — содержит функцию main, которая создает объект класса Archive и в бесконечном цикле передает ему аргументы командной строки, обрабатывая их и вызывая соответствующие методы объекта

  • archive.py — содержит описание класса Archive и несколько вспомогательных функций для работы

Демонстрация:

image

2. Визуализатор зависимостей пакета (DependencyGraph)

Визуализатор зависимостей пакетов pypi на языке Python. Возвращает граф в виде кода на языке Graphviz.

Программа состоит из функций:

  • main — начальная точка выполнения программы
  • getDeps — получение зависимостей с помощью запроса - скачивание whl-пакета актуальной версии указанной на pypi и чтении METADATA
  • formatDepsToNestedDicts — форматирование зависимостей и представление их в виде вложенных словарей
  • convertNestedDictsToLinks — конвертирование вложенных словарей в связи между пакетами, возврат строки связей В основе formatDepsToNestedDicts и convertNestedDictsToLinks рекурсивный обход в глубину

Дополнительно использовались библиотеки requests и sys — для отправки запросов и получения аргументов командой строки.

Демонстрация:

image

3. Выдуманный конфигурационный язык (ConfLang)

Синтаксис языка в форме Бэкуса — Наура:

program ::= { statements } object
statements ::= statement | statement statements |
statement ::= NAME ASSIGN value;

object ::= ( assign ) | ( assign, list_assign ) | ( )
list_assign ::= assign list_assign |

assign ::= NAME(list_value)
list_value ::= value list_value |
value ::= object | string | number | &NAME | for(b e s) | for(b e s PATTERN)

Файл моего конфигурационного языка состоит из двух частей:

  • Область объявления переменных;
  • Область описания объектов.

Область объявления переменных обозначается фигурными скобками и состоит из списка "утверждений".

Каждое утверждение отделяется точкой с запятой. Утверждение состоит из имени переменной, знака "равно" и списка значений, который данной переменной присваивается. Если список значений состоит из одного элемента, то это уже не список, а просто значение.

Значением может быть объект, строка, число, разыменованная с помощью & переменная, список полученный из одного из циклов for.

Строка и число это самые простые типы:

  • Строка — набор символов, заключенный в двойные кавычки
  • Число — число из множества натуральных.

Объект заключен в скобки и содержит список соответствий.

Соответствия состоят из имени и значения.

Чтобы извлечь значение объявленное в области переменных, нужно разыменовать переменную с помощью амперсанда &.

Циклы for используются главным образом для генерации массивов.

for(b e s) принимает 3 числа:

  • b — begin
  • e — end
  • s — step

Возвращает массив из чисел

for(b e s PATTERN) принимает также 3 числа и шаблон строковой переменной, внутри которой есть амперсанд &, на место этого амперсанда вставляются числа и из данного цикла for возвращается массив из строковых переменных.

Демонстрация

image

4. Мини-версия Make (MiniMake)

Проект разбит на 3 файла:

  • maker.py (главный файл, содержит вызовы функций из остальных файлов)
  • analyzer.py (анализатор содержимого makefile с помощью SLY, решена проблема с отступами)
  • top_sort.py (алгоритм топологической сортировки, получает граф зависимостей в виде словаря, возвращает массив узлов)

Для того, чтобы повторные задачи не выполнялись, используется хранение хэшей в файле memory.json.

Также программа может выводить зависимости задач в коде graphviz, данную функцию можно включить ключом -v

Демонстрация работы

Для демонстрации создал 4 файла: factorial.cpp, hello.cpp, main.cpp, functions.h

Написал соответствующий makefile с выводом в консоль с помощью еcho выполненной задачи:

all: hello

hello: main.o factorial.o hello.o
 g++ main.o factorial.o hello.o -o hello
 echo "Компоновка исполняемого файла"
 
main.o: main.cpp
 g++ -c main.cpp
 echo "Компиляция main.cpp"

factorial.o: factorial.cpp
 g++ -c factorial.cpp
 echo "Компиляция factorial.cpp"

hello.o: hello.cpp
 g++ -c hello.cpp
 echo "Компиляция hello.cpp"
  1. Команда и результат первого вызова.
"hello"; "hello" -> "main.o"; "hello" -> "factorial.o"; "hello" -> "hello.o"; "main.o" -> "main.cpp"; "factorial.o" -> "factorial.cpp"; "hello.o" -> "hello.cpp"; "Компиляция main.cpp" "Компиляция factorial.cpp" "Компиляция hello.cpp" "Компоновка исполняемого файла" Содержимое memory.json: { "hello.o": "e0f717132a90c2b86fc54cdadf85cd23", "main.cpp": "fd7833700807dac1ea9f357df37b39f3", "factorial.cpp": "7d4f51c6a8061dc5224a0424bde06c14", "hello.cpp": "4d1b492da8ddeff3755d9ad44b6c5f3b", "main.o": "028a389da0c91e444f1aeb004a12eecb", "factorial.o": "d761f9cfe52f2c4c78375414cb9e3f58" }">
Input:
maker.py -v makefile

Output:
"all" -> "hello";
"hello" -> "main.o";
"hello" -> "factorial.o";
"hello" -> "hello.o";
"main.o" -> "main.cpp";
"factorial.o" -> "factorial.cpp";
"hello.o" -> "hello.cpp";

"Компиляция main.cpp"
"Компиляция factorial.cpp"
"Компиляция hello.cpp"
"Компоновка исполняемого файла"

Содержимое memory.json:
{
  "hello.o": "e0f717132a90c2b86fc54cdadf85cd23",
  "main.cpp": "fd7833700807dac1ea9f357df37b39f3",
  "factorial.cpp": "7d4f51c6a8061dc5224a0424bde06c14",
  "hello.cpp": "4d1b492da8ddeff3755d9ad44b6c5f3b",
  "main.o": "028a389da0c91e444f1aeb004a12eecb",
  "factorial.o": "d761f9cfe52f2c4c78375414cb9e3f58"
}
  1. Повторный вызов без ключа.
Input:
maker.py makefile

Output:
"Компоновка исполняемого файла"

Содержимое memory.json:
{
  "hello.o": "e0f717132a90c2b86fc54cdadf85cd23",
  "main.cpp": "fd7833700807dac1ea9f357df37b39f3",
  "factorial.cpp": "7d4f51c6a8061dc5224a0424bde06c14",
  "hello.cpp": "4d1b492da8ddeff3755d9ad44b6c5f3b",
  "main.o": "028a389da0c91e444f1aeb004a12eecb",
  "factorial.o": "d761f9cfe52f2c4c78375414cb9e3f58"
}
  1. Повторный вызов после изменения файла hello.cpp.
Input:
maker.py makefile

Output:
"Компиляция hello.cpp"
"Компоновка исполняемого файла"

Содержимое memory.json:
{
  "hello.o": "e0f717132a90c2b86fc54cdadf85cd23",
  "main.cpp": "fd7833700807dac1ea9f357df37b39f3",
  "factorial.cpp": "7d4f51c6a8061dc5224a0424bde06c14",
  "hello.cpp": "e84d9058224c1f362554b5fd15c2b64b",
  "main.o": "028a389da0c91e444f1aeb004a12eecb",
  "factorial.o": "d761f9cfe52f2c4c78375414cb9e3f58"
}

Как видно при втором запуске изменилось хэш-значение только файла hello.cpp, хотя после отработки makefile изменится и файл hello.o.

Owner
Semyon Esaev
Semyon Esaev
Semyon Esaev
For my Philips Airpurifier AC3259/10

Philips-Airpurifier For my Philips Airpurifier AC3259/10 I will try to keep this code

AcidSleeper 7 Feb 26, 2022
Port of the OpenCascade library to JavaScript / WebAssembly using Emscripten

OpenCascade.js A port of the OpenCascade CAD library to JavaScript and WebAssembly via Emscripten. Explore the docs » Examples · Issues · Discuss Proj

Sebastian Alff 347 Jan 08, 2023
Monochrome's API, implemented with Deta Base and Deta Drive.

Monochrome Monochrome's API, implemented with Deta Base and Deta Drive. Create a free account on Deta to test this out! Most users will prefer the Mon

Monochrome 5 Sep 22, 2022
App to get data from popular polish pages with job offers

Job board parser I written simple app to get me data from popular pages with job offers, because I wanted to knew immidietly if there is some new offe

0 Jan 04, 2022
Easy Alias's for bash

easy-alias Easy Alias's for bash Setup Your system needs to have 'echo' which every 21st century computer has You dont need any python requirments but

Hashm 2 Jan 18, 2022
This is the old code for bitcoin risk metric, the whole purpose form it is to help you DCA your investment according to bitcoin risk.

About The Project This is the old code for bitcoin risk metric, the whole purpose form it is to help you DCA your investment according to bitcoin risk

BitcoinRaven 2 Aug 03, 2022
Tools I'm building in order to help my investments decisions

b3-tools Tools I'm building in order to help my investments decisions. Based in the REITs I've in my personal portifolio I ran a script that scrapy th

Rafael Cassau 2 Jan 21, 2022
Бэкапалка таблиц mysql 8 через брокер сообщений nats

nats-mysql-tables-backup Бэкап таблиц mysql 8 через брокер сообщений nats (проверено и работает в ubuntu 20.04, при наличии python 3.8) ПРИМЕРЫ: Ниже

Constantine 1 Dec 13, 2021
An advanced NFT Generator

NFT Generator An advanced NFT Generator Free software: GNU General Public License v3 Documentation: https://nft-generator.readthedocs.io. Features TOD

NFT Generator 5 Apr 21, 2022
Python library and cli util for https://www.zerochan.net/

Zerochan Library for Zerochan.net with pics parsing and downloader included! Features CLI utility for pics downloading from zerochan.net Library for c

kiriharu 10 Oct 11, 2022
Python Create Your Own Tool Series

Python Create Your Own Tool Series Hey there! This is an additional Github repository that contains the final product files for each video in my Youtu

Joe Helle 21 Dec 02, 2022
Open-source library for analyzing the results produced by ABINIT

Package Continuous Integration Documentation About AbiPy is a python library to analyze the results produced by Abinit, an open-source program for the

ABINIT 91 Dec 09, 2022
Add your recently blog and douban states in your GitHub Profile

Add your recently blog and douban states in your GitHub Profile

Bingjie Yan 4 Dec 12, 2022
oracle arm registration script.

oracle_arm oracle arm registration script. 乌龟壳刷ARM脚本 本脚本优点 简单,主机配置好oci,然后下载main.tf即可,不用自己获取各种参数。 运行环境配置 本简单脚本使用python3编写,请自行配置好python3环境和requests库。(高版

test1234455 419 Jan 01, 2023
Hello, Welcome to this repo. don't forget to read guidelines in readme.md

Hacktoberfest_2021 If you looking for your first contribution, we are here to help. Just create a simple program using any language you like in our fo

Wafa Rifqi Anafin 117 Dec 14, 2022
Converts a base copy of Pokemon BDSP's masterdatas into a more readable and editable Pokemon Showdown Format.

Showdown-BDSP-Converter Converts a base copy of Pokemon BDSP's masterdatas into a more readable and editable Pokemon Showdown Format. Download the lat

Alden Mo 2 Jan 02, 2022
Predicting Global Crop Yield for World Hunger

Crop Yield And Global Famine - The fifth project I created during my time at General Assembly. I completed this project with three other classmates in the span of three weeks. Most of my work was dir

Adam Muhammad Klesc 2 Jun 19, 2022
Simple application that does transformation with HPF and LPFs.

Simple application that applies Butterworth, Gaussian & Ideal kernels on HPF and LPFs -aka Frequency Domain Filtering- Upload image from sidebar, set

Merve Noyan 3 Jul 06, 2022
hey, this repo is the backend of the sociio project

sociio backend Hey, this repository is a part of sociio project , In this repo we are working to create an independent server for everything you can i

2 Jun 09, 2022
ToDoListAndroid - To-do list application created using Kivymd

ToDoListAndroid To-do list application created using Kivymd. Version 1.0.0 (1/Jan/2022). Planned to do next: -Add setting (theme selector, etc) -Add f

AghnatHs 1 Jan 01, 2022