¿Qué es un lenguaje de programación? 

Un lenguaje de programación es un sistema de escritura que los programadores usan para indicar instrucciones de tal manera que una computadora pueda entenderlas y ejecutarlas. 

Un lenguaje de programación no solo es escribir las instrucciones y ya, para que una computadora pueda entender el lenguaje, este necesita tener ciertas características que lo ayudan desde la escritura hasta la ejecución en la computadora. 

Características de un lenguaje de programación 

Sintaxis

Es un conjunto de reglas que definen la estructura de la escritura, palabras reservadas, el uso de punto y coma ( ; ), indentación, ortografía, etc. Cada lenguaje tiene sus propias normas que seguir para su correcto funcionamiento. 

Semántica

Se refiere al comportamiento de la escritura del código, aunque la sintaxis sea correcta, la estructura en el proceso de ejecución del código tiene que ser claro. 

Tipado

El manejo de los datos en la ejecución del programa, es la forma en que se le indica a una variable cuál es el tipo de dato que va a manejar. 

Cuando un lenguaje es fuertemente tipado no permite conversiones entre diferentes tipos, un tipado débil si permite este tipo de conversiones. 

Un lenguaje con tipado estático verifica el tipo de dato en la compilación mientras que un tipado dinámico lo hace en tiempo de ejecución. 

Paradigma de programación

Se puede clasificar en diferentes paradigmas como el Imperativo, el Orientado a Objetos, Funcional, Estructurado, etc. 

Portabilidad

La posibilidad de que el programa pueda ejecutarse en diferentes plataformas con pocas o ninguna modificacion como windows, android, web, ios, etc. 

Eficiencia

Es la velocidad conla que puede ejecutarse el codigo del lenguaje, por ejemplo los lenguajes como ensamblador de bajo nivel son mas eficientes respecto a los recursos, pero los lenguajes de alto nivel sacrifican algo de eficiencia a cambio de la facilidad y desarrollo mas rapidos. 

Abstracción

Permite a los programadores trabajar con conceptos de alto nivel como variables, objetos,funciones, etc.  

Librerias y Frameworks

Los lenguajes cuentan con librerias y frameworks con tareas comunes para facilitar su uso y no tener que escribirlas desde cero 

Herramientas de desarrollo

Los lenguajes de programación suelen estar acompañados de herramientas y entornos de desarrollo integrados (IDEs) que facilitan tareas como la compilacion, la depuracion, uso de control de versiones y el desarrollo en si, generalmente son los lenguajes compilados que generan un archivo de instalcion los que son acompañados por su propio IDE, otros lenguajes que son interpretados pueden escribirse practicamente en cualquier editor de texto. 

Compilacion

En realidad existen los lenguajes compilados , lenguajes interpretados y lenguajes semi-compilados 

  • Lenguajes compilados: el codigo se traduce completamente al lenguaje máquina antes de ejecutarse. 
  • Lenguajes interpretados:  el codigo se interpreta linea por linea mediante un interprete
  • Lenguaje semi-compilado: combinan ambas caracteristicas 

Comunidad y Soporte:

otra cosa a tener en cuenta cuando se elige un lenguaje de programación es la disponibilidad de recursos, documentacion y soporte de la comunidad que hay disponible, existen lenguajes con grandes cantidades de recursos en donde buscar, pero tambien hay otros que tienen muy poca documentacion haciendo dificil la curva de aprendizaje. 

    Loading

    Comandos básicos de GIT

    Trabajar con un control de versiones es impresindible en la actualidad para poder tener tus proyectos organizados y se puede realizar de manera gráfica en tu IDE preferido o desde la consola de git con simples comandos.

    A continuación listaré algunos de los comandos git que nos permitirán trabajar con nuestros proyectos.

    Para trabajar con los comandos de git primero hay que instalarlo en tu computadora y despues podremos usar la consola que windows o mac traen por defecto o bien al instalar git se instala la consola de git, la git bash.

    Para utilizar estos comandos correctamente en tu proyecto, necesitas posicionarte en el directorio donde está guardado.

    Recuerda consultar la documentación para ver todos los comandos disponibles

    Versión

    Lo primero después de instalar git es comprobarlo y para eso consultamos la versión instalada

    //
    git --version
    //

    Help

    Primero necesitamos saber que con este comando podremos ver una lista de comandos con la descripcion de lo que hace, cuando no recuerdas bien la sintaxis de alguno de ellos, en esta lista podras comprobarlo.

    //
    git --help
    //

    Configuraciones

    Estas configuraciones afectan a toda la instalacion de git en tu máquina y no sólo al proyecto en el que estas trabajando

    //
    git config --global
    //

    Este comando agrega el numbre de usuario que se utilizara para registrar todos los movimientos que se hagan en el control de versiones

    //
    git config --global user.name "<tu_nombre_de_usuario>"
    //

    Este comando agerga el correo electrónico del usuario

    //
    git config --global user.email "<tu_correo>"
    //

    Este comando configura el nombre de la rama principal para tus repositorios, en caso que tu versión de git no lo haga automáticamente en “main” que por convención es el nombre que se le asigna a la rama principal

    //
    git config --global init.defaultbranch <main>
    //

    Este comando muestra la lista de configuraciones por si necesitas modificar alguna otra

    //
    git config --list
    //

    Iniciando

    Crea un repositorio vacío en la carpeta .git oculta del proyecto

    //
    git init
    //

    Status

    • Indica la rama en la que estas trabajando actualmente
    • Los commits que se han hecho
    • Los archivos que se han creado nuevos, si ya se agregarón al repositrio o estan en el stage de git
    //
    git status
    //

    Agregar archivos

    Para agregar los archivos nuevos al stage para poder haer commit con ellos, los archivos que esten en el stage se agregarán al commit, los que no se agregarón se quedaran en el proyecto local

    //
    git add <nombre_del_archivo.txt>  //agrega sólo el archivo indicado
    git add .  //con el punto podemos agregar todos los archivos que no se han agregado antes
    //

    Sacar del Stage

    Si agregaste por error un archivo al stage, con este comando lo puedes regresar a su estado normal, hay archivos que contienen datos privados como credenciales, tokens, etc. que no deverían enviarse a un repositorio ya sea público o privado.

    //
    git rm --cached <nombre_del_archivo.txt>
    //

    Commit

    Comando para enviar un commit al repositorio, el comentario es obligatorio, recomiendo poner un comentario breve pero descriptivo de lo que se hizo en el commit, por ejemplo “se creo función para ordenar listado”, esto es muy útil en caso de buscar el repositorio donde se realizo esa función, en cambio poner “cambios martes” no indica nada y tendremos que revisar el código del commit para ver los cambios realizados

    //
    git commit -m "se creo función para ordenar listado"
    //

    Log

    Regresa una lista de todos los cambios que se han registrado en el repositorio, cada commit con si hash (identificadir), el autor, fecha y mensaje indicado

    //
    git log
    //

    Crear Rama

    Este comando crea una rama nueva y te posiciona en ella para realizar los cambios correspondientes.

    Si la rama que indicaste ya existe, entonces solo se cambiará a esa rama, sin crear nada

    //
    git checkout -b <nueva_rama>
    //

    Cambiar de Rama

    No solamente puedes cambiar de rama con checkout, con este comando tambien puedes cambiarte de ramas

    //
    git switch <nombre_rama>
    git switch -c <nueva_rama> //con -c puedes crear la rama
    //

    Lista de Ramas

    Este comando muestra una lista de todas las ramas del rpositorio

    //
    git Branch
    //

    Merge / Fusión

    Cuando terminas el trabajo asignado en tu rama, con todos esos commits, es hora de fusionar con la rama principal que suele ser main

    //
    git merge <tu_rama_actual>
    //

    Borrar Rama

    Después de terminar tutrabajo en esa rama y hacer merge con la rama principal, puedes borrarla con este comando

    //
    git Branch -D <nombre_rama>
    //

    Deshacer cambios

    Si necesitas hacer cambios de un commit especifico, necesitas el hash indicador del commit, el hash es una serie de caracteres alfanuméricos que aparece delante del mensaje del commit cuando pones git log

    Puedes indicar que tú hiciste estos cambios en el mensaje.

    //
    git revert <hash>
    //

    Reset

    Este comando sirve para regresar a un commit anterior y puedes usarlo con tres características

    //
    git reset --soft <hash> //deshace el commit pero mantiene los cambios en el stage
    git reset --mixed <hash> //deshace el commit y lo quita del stage pero los cambios se mantienen en el código
    git reset --hard <hash> //borra todos los cambios, commit, stage y código hasta el commit indicado, úsalo con precaución ya que no solo afectas tus commits, sino los de tus compañeros
    //

    Clone

    Sirve para clonar un repositorio desde cualquier servidor GitHub, azure, bitbucket, etc. en tu computadora en el directorio en el que estas posicionado, creando una carpeta con el nombre del repositorio que estas clonando

    //
    git clone <url_del_repositorio>
    //

    Sincronizar

    Para sincronizar las ramas descargando desde el origen o repositorio colonado, git llama al repositorio alojado en algun servidor como github, azure, etc. como el origen.

    //
    git fetch
    //

    Crear Rama con Origen

    Para crear una rama local que es en la que trabajarás y se relacione a una rama en el origen para poder subir tus cambios, por decir que alguien más te asigna la rama

    //
    git checkout -b <Nombre_Rama> // se recomienda poner el mismo nombre de la rama origen
    //

    Pull

    Con este comando te aseguras de descargar el contenido del repositorio de origen

    //
    git pull
    //

    Push

    A diferencia de fetch, push envía el contenido desde el repositorio local al repositorio origen, normalmente se hace después de hacer un commit

    //
    git push
    //

    Comandos de consola

    Recuerda que estastrabajando en una consola de comandos y los siguientes pueden ayudarte a moverte entre los diferentes directorios, crear y editar archivos, etc.

    Cambiar de directorio

    Primero tenemos que posicionarnos dentro de la carpeta del proyecto y tienes que localizar la ruta completa

    //
    cd C:/users //con cd puedes posicionarte en un directorio indicando la ruta completa, pero no es necesario indicar la ruta desde el  inicio, puedes indicar solo la carpeta a la que quieras entrar de ese dierectorio
    
    dir  //muestra el directorio de la carpeta donde te encuentras
    
    cd .. //con los dos puntos puedes subir un nivel del directorio
    //

    Básicos

    Estos comandos son básicos en cualquier consola de comandos

    //
    help  //muestra una lista de comandos con su descripcion
    
    clear  //limpia la consola para poder trabajar mejor
    //

    Archivos con Linux

    A pesar de que puedes hacerlo con la consola de windows por ejemplo, encontrarás en muchas partes que para la creacion y edicion de archivos utilizan los comandos de linux, estos comandos puede ser que no funcionen en la consola cmd de windows ni en power shell, pero no tendras problema en git bash.

    //
    ls    //muestra el directorio de la carpeta
    nano <archivo.txt> //crea o edita un archivo con un editor de texto de linux llamado nano
    //

    Estos son algunos comandos que te ayudarán a trabajar con git desde la consola.

    Loading

    Unidades de medida de datos

    En informatica las unidades de medida se utilizan para comprender la capacidad de almacenamiento y transferencia de la información.

    Bit

    Es la unidad mas pequeña de información, que puede tener 2 valores (0, 1) que representa el estado de un sistema binario.

    Byte 

    Un Byte esta compuesto por 8 bits y es la unidad básica de almacenamiento, se usa para poder representar un caracter, puede ser una letra, numero o un símbolo 

    Los múltiplos del Byte para almacenamiento se basan en potencias de 2 o de 10 que se van duplicando a medida que aumentan.

    NombreEquivalenciaPotencia binariaBytes
    Bite 1 Bite1
    Byte 8 Bites8
    Kilobyte 1024 bytes2 ^ 10 1024 
    Megabyte 1024 kilobytes 2 ^ 20 1048576 
    Gigabyte 1024 megabytes 2 ^ 30 1073741824 
    Terabyte 1024 gigabytes 2 ^ 40 1099511627776 
    Petabyte 1024 terabytes 2 ^ 50 1125899906842624 
    Exabyte 1024 petabytes 2 ^ 60 1152921504606846976 
    Zettabyte 1024 exabytes 2 ^ 70 1180591620717411303424 
    Yottabyte 1024 zettabytes 2 ^ 80 1208925819614629174706176 

    Loading

    ¿Qué es la programación?

    La programación es el proceso de crear y desarrollar todo tipo de software por medio de la escritura de un código de programación que es un conjunto de instrucciones que le dicen a una computadora cómo realizar una tarea, el código se tiene que escribir, probar, depurar y mantener, el código se puede escribir en uno de los variados lenguajes de programación.

    Se puede crear software para diferentes fines y plataformas que van desde aplicaciones de escritorio, aplicaciones web, aplicaciones móviles, videojuegos, sistemas operativos, etc.

    El proceso de la creación de un programa tiene varias fases entre ellas

    Análisis del programa

    • Análisis del programa
    • Diseño
    • Codificación
    • Depuración
    • Mantenimiento

    La programación tiene varios componentes clave de los que hay que tener algún conocimiento.

    Lenguaje de programación: Son herramientas que permiten expresar instrucciones en un formato comprensible para los sistemas.

    Algoritmos: Conjunto de instrucciones lógicas que siguen la resolución de una tarea especifica.

    Estructuras de datos: Formas de organizar y almacenar los datos en memoria de manera eficiente (arreglos, listas, colas, etc.)

    Paradigmas de programación: Enfoques o estilos de programación para estructurar el código

    Ciclo de vida del Software: Todas las fases por las que pasa el software desde su concepción

      Loading

      Arreglos

      Los arreglos en programación o array en ingles son estructuras de datos que permiten almacenar y manipular de manera ordenada un conjunto de datos del mismo tipo, enteros, texto, booleanos, incluso otros arreglos, etc. 

      Características de un arreglo:

      1. Tamaño: los arreglos tienen un tamaño fijo que se define al momento de declarar la variable del arreglo por la manera en que se guarda en la memoria como veremos en la siguiente característica, en algunos lenguajes de programación como Python o JavaScript el número de posiciones si se puede modificar durante la ejecución del programa.
      2. Almacenamiento: los datos del arreglo se almacenan en memoria de manera consecutiva lo que permite que el acceso a los elementos sea rápido y eficiente, ya que las posiciones se pueden calcular fácilmente a partid del índice.
      3. Orden: los elementos del arreglo tienen un orden que se mantiene desde que se declaran los valores a menos que se ejecuten algoritmos de ordenamiento como burbuja, quicksort, mergesort, entre otros.
      4. Índices: los índices del arreglo se determinan en orden con el número de posición en que fueron creados los espacios del mismo y siempre se empieza a contar desde el número cero hasta el final, es decir desde la posición 0 hasta la posición n-1 y se puede acceder directamente a cualquier posición
      5. Homogeneidad: esta característica hace referencia a que todos los datos que se van a guardar en el arreglo sean del mismo tipo y esto se indica cuando se declara el mismo arreglo.

      Operaciones con arreglos

      Declaracion e inicializacion 

      //
      // Declaración e inicialización de un arreglo de enteros 
              int[] numeros = new int[5]; // Arreglo de 5 elementos 
       
             
      
      // Inicialización directa de un arreglo con valores 
              string[] nombres = { "Juan", "Ana", "Luis", "Maria" }; 
      //

      Acceso 

      //
      // Acceso a los elementos del arreglo 
              Console.WriteLine("Elemento en la posición 2: " + numeros[2]); // Imprime 30 
      //
      

      Recorrido 

      //
      // Recorrido del arreglo usando un bucle for 
              Console.WriteLine("Recorriendo el arreglo:"); 
              for (int i = 0; i < numeros.Length; i++) 
              { 
                  Console.WriteLine("Elemento en la posición " + i + ": " + numeros[i]); 
              } 
      
      // Recorrido del arreglo usando un bucle foreach 
              Console.WriteLine("Recorriendo el arreglo de nombres:"); 
              foreach (string nombre in nombres) 
              { 
                  Console.WriteLine(nombre); 
              } 
      //

      Búsqueda  

      //
              int[] numeros = { 10, 20, 30, 40, 50 }; 
              int valorBuscado = 30; 
       
              // Buscar el valor usando Array.IndexOf 
              int indice = Array.IndexOf(numeros, valorBuscado); 
       
              if (indice != -1) 
              { 
                  Console.WriteLine($"Valor {valorBuscado} encontrado en la posición {indice}."); 
              } 
              else 
              { 
                  Console.WriteLine($"Valor {valorBuscado} no encontrado en el arreglo."); 
              } 
      //

      Modificación 

      //
        numeros[0] = 10; 
        numeros[1] = 20; 
        numeros[2] = 30; 
        numeros[3] = 40; 
        numeros[4] = 50; 
      //

      Loading

      Abstracción

      La abstracción en programación es una manera de reducir, simplificar y encapsular la complejidad de un sistema o proceso que permite a los desarrolladores trabajar con un nivel de detalle basada en el principio de “ocultamiento de informacion” o “principio de ocultacion”, uno de los pilares de la programación orientada a objetos.

      Se puede aplicar a diferentes niveles de programación, desde el diseño de clases y objetos hasta el uso de lenguajes de alto nivel que permiten expresar las soluciones de forma mas natural y cercana a modelos conceptuales que representan las caracteristicas esenciales de las entidades o procesos del mundo real.

      Por ejemplo podemos definir una clase abstracta llamada Automovil que presente el concepto general de un vehículo de cuatro ruedas que se mueve por medio de un motor.

      Esta clase tendría propiedades como: marca, modelo, color, año, kilometraje, etc. y métodos como: encender, apagar, acelerar, frenar, etc.

      A partir de la clase abstracta podemos crear clases especificas que hereden sus propiaedades y métodos, pero que también tengan sus propias caractéristicas especificas. Por ejemplo, podríamos crear una clase llamada Deportivo que hereda de Automovil y que tenga propiedades adicionales como: velocidadMaxima, tipoDeMotor, numeroDePuertas, etc. y métodos adicionales como: turbo, drift, etc.

      De esta manera, podemos crear objetos de la clase Deportivo que sean instancias de la clase Automovil y que compartan sus características y comportamientos generales, pero que también tengan sus propias particularidades, por ejemplo, podríamos crear un objeto llamado miDeportivo que tenga los siguientes valores:
      marca: “Ferrari”
      modelo: “F8 Spider”
      color: “Rojo”
      año: 2023
      kilometraje: 0
      velocidadMaxima: 340
      tipoDeMotor: “V8”
      numeroDePuertas: 2

      El objetivo principal de la abstraccion en el area de programacion es simplificar el desarrollo y el mantenimiento del software al dividir un sistema en componentes abstraidos y los programadores pueden trabajar en partes especificas sin preocuparse de cómo funcionan otras partes. Esto facilita la colaboracion en equippos de desarrollo, ya que cada miembro del equipo puede centrarse en su area de experiencia sin necesidad de comprender los detalles de todo el sistema.

      El ejemplo anterior podria estar representado de la siguiente manera en lenguaje C#

          // Clase abstracta Automovil
          public abstract class Automovil
          {
              // Propiedades comunes a todos los automóviles
              public string Marca { get; set; }
              public string Modelo { get; set; }
              public string Color { get; set; }
              public int Año { get; set; }
              public double Kilometraje { get; set; }
      
              // Métodos comunes a todos los automóviles
              public void Encender()
              {
                  Console.WriteLine("El automóvil se ha encendido");
              }
      
              public void Apagar()
              {
                  Console.WriteLine("El automóvil se ha apagado");
              }
      
              public void Acelerar()
              {
                  Console.WriteLine("El automóvil ha acelerado");
              }
      
              public void Frenar()
              {
                  Console.WriteLine("El automóvil ha frenado");
              }
      
              // Método abstracto que debe ser definido por las clases derivadas
              public abstract void MostrarInformacion();
          }
      
          // Clase concreta Deportivo que hereda de Automovil
          public class Deportivo : Automovil
          {
              // Propiedades específicas de los deportivos
              public int VelocidadMaxima { get; set; }
              public string TipoDeMotor { get; set; }
              public int NumeroDePuertas { get; set; }
      
              // Métodos específicos de los deportivos
              public void Turbo()
              {
                  Console.WriteLine("El deportivo ha activado el turbo");
              }
      
              public void Drift()
              {
                  Console.WriteLine("El deportivo ha hecho un drift");
              }
      
              // Método abstracto que se define en esta clase
              public override void MostrarInformacion()
              {
                  Console.WriteLine($"Este es un deportivo de marca {Marca}, modelo {Modelo}, color {Color}, año {Año}, kilometraje {Kilometraje}, velocidad máxima {VelocidadMaxima}, tipo de motor {TipoDeMotor} y número de puertas {NumeroDePuertas}");
              }
          }
      
          // Creación de un objeto de la clase Deportivo
          Deportivo miDeportivo = new Deportivo();
          miDeportivo.Marca = "Ferrari";
          miDeportivo.Modelo = "F8 Spider";
          miDeportivo.Color = "Rojo";
          miDeportivo.Año = 2023;
          miDeportivo.Kilometraje = 0;
          miDeportivo.VelocidadMaxima = 340;
          miDeportivo.TipoDeMotor = "V8";
          miDeportivo.NumeroDePuertas = 2;
      
          // Invocación de los métodos heredados de la clase Automovil
          miDeportivo.Encender();
          miDeportivo.Apagar();
          miDeportivo.Acelerar();
          miDeportivo.Frenar();
      
          // Invocación de los métodos propios de la clase Deportivo
          miDeportivo.Turbo();
          miDeportivo.Drift();
      
          // Invocación del método abstracto definido en la clase Deportivo
          miDeportivo.MostrarInformacion();

      Loading

      Algoritmo

      En informática un algoritmo es un conjunto de reglas, instrucciones o procesos que le indican a una computadora los pasos a seguir para realizar una tarea y obtener un resultado específico, el algoritmo garantiza que un sistema realice una tarea de modo que el usuario obtenga el resultado esperado, a menudo se suele comparar con una receta de cocina ya que es el ejemplo perfecto por tener las características propias de un algoritmo como lo son: Factible, Finito, Sin dependencia del lenguaje, Sin ambigüedad, Entradas bien definidas, Salidas bien definidas.
      Existe una gran variedad de algoritmos para realizar las tareas mas variadas por ejemplo hay algoritmos para búsqueda, para ordenamiento, para bucles, etc.

      Ejemplo:

      En este ejemplo veremos el algoritmo de ordenamiento de tipo burbuja o bubble sort, el cual se encarga de ordenar un arreglo de numeros ya sea en orden ascendente o descendente.

      El algoritmo de burbuja recorre el arreglo comparando el valor de cada posicion con el de la posición siguiente y en caso de estar desordenados, los ordena de manera adecuada

      Aqui tenemos un arreglo desordenado 37, 91, 12, 68, 49, 23, 75, 4

      int[] areglo = { 37, 91, 12, 68, 49, 23, 75, 4 };
      int n = areglo.Length;
      
      for (int i = 0; i < n - 1; i++)
      {
          Console.WriteLine("Iteracion - " + (i+1));
          for (int j = 0; j < n - i - 1; j++)
          {
              if (areglo[j] > areglo[j + 1])
              {
                  int temp = areglo[j];
                  areglo[j] = areglo[j + 1];
                  areglo[j + 1] = temp;
              }
          }
      }
      

      Todas las iteraciones que se realizaron

      Iteracion 1 – 37 12 68 49 23 75 4 91
      Iteracion 2 – 12 37 49 23 68 4 75 91
      Iteracion 3 – 12 37 23 49 4 68 75 91
      Iteracion 4 – 12 23 37 4 49 68 75 91
      Iteracion 5 – 12 23 4 37 49 68 75 91
      Iteracion 6 – 12 4 23 37 49 68 75 91
      Iteracion 7 – 4 12 23 37 49 68 75 91

      y aquí el resultado ordenado 4, 12, 23, 37, 49, 68, 75, 91

      Conclusión

      Como podemos apreciar, sin importar cuantos elementos tenga el arreglo o cual sea al valor o si estan ordenados o desordenados, el algoritmo siempre ejecutara la misma tarea y siempre regresara el mismo resultado, en este caso es el arreglo ordenado.

      Loading

      .NET

      .NET (2020)

      Para finalizar con la evolución del framewor de .NET se creó ésta versión para unificar lo mejor de las versiónes anteriores.

      Su nombre es solamente .NET y comienza desde la versión 5 para evitar confuciones con las versiones 4.8 de .NET Framework y 3.1 de .NET Core

      .NET Standard

      Es una especificación de reglas que se tienen que cumplir para que .NET framework y .NET Core sean interoperables, aclarando que este no es un framework, solo un conjunto de especificaciones

      .NET Core (2014)

      Con la necesidad de adaptarse a los cambios en las diferentes tecnologías Microsoft evolucionó .NET Framework y según dicen para evitar confución con las versiónes decidió llamarlo .NET Core haciendolo completamente Open Source y pensado para microservicios.

      Con este nuevo framework .NET Core se pueden hacer aplicaciones multiplataforma, aplicaciones en la nube además de todas las caracteristicas de su predecesor como los lenguajes de programación C#, F# y Visual Basic se pueden crear aplicaciones, juegos, IoT, Windows, Web, Android e iOS.

      .net Core es modular lo que significa que puedes instalar las bibliotecas o funciónes que necesitas distribuidos en paquetes NuGet sin la necesidad de instalar la totalidad de las librerias

      Sus versiones van desde la 1.0 hasta la 3.1

      .NET Framework (2002)

      Framework creado por Microsoft en el año 2002 intentando de reemplazar a Java y la Java Virtual Machine (JVM) para desarrollo en entorno de Windows que incluye un conjunto de bibliotecas de clases y funciones juntas, lo que lo hace un framework monolitico y pesado que los desarrolladores puedan usar para crear aplicaciones Windows usando diferentes lenguages de programación como C#, F# y Visual Basic, también es importante mencionar que para poder instalar una aplicación creada con este framework y necesario instalar la versión del framewok con la que se creo dicha aplicación que si no se tiene instalado, al momento de hacer la instalación de la aplicación se indica la versión y si se quiere instalar en la computadora.

      Incluye un entorno de tiempo de ejecución (CLR) para administrar el proceso de ejecución de las aplicaciones, también es compatible con la interoperabilidad entre lenguages y plataformas, lo que permite a los desarrolladores integrar fácilmente diferentes tecnologias en sus aplicaciones.

      Su última versión es la 4.8 y mientras exista Windows se podra desarrollar en .Net Framework pero ya no evolucionará mas allá de esta versión.

      Loading

      Glosario Programacion

      Terminos usados en programación y areas a fines a la tecnología.

      .NET

      Algoritmo

      Abstracción

      Arreglos

      Programación

      Unidades de medida de datos

      ¿Qué es un lenguaje de programación? 

      Abstracción
      Es un principio fundamental en la programación que consiste en ocultar los detalles complejos y mostrar solo las características esenciales de un objeto o sistema. Esto permite a los desarrolladores trabajar con conceptos de alto nivel sin preocuparse por los detalles de implementación.

      Adapter
      Es un patrón de diseño estructural que permite que dos interfaces incompatibles trabajen juntas. Actúa como un puente entre dos componentes. Ejemplo: Un adaptador de corriente convierte un enchufe de un país para que funcione en otro. En código, un Adapter podría convertir datos de formato JSON a XML para que un sistema legacy los entienda.

      Agile / Scrum / Kanban
      Agile: Es una metodología de desarrollo de software que se centra en la entrega iterativa e incremental de productos, con un enfoque en la colaboración y la flexibilidad.

      Scrum
      Es un marco de trabajo dentro de Agile que se basa en sprints (iteraciones cortas) para entregar incrementos de producto. Incluye roles como Scrum Master, Product Owner y equipo de desarrollo.

      Kanban
      Es otra metodología Agile que se centra en la visualización del trabajo y la gestión del flujo de trabajo. Utiliza un tablero Kanban para rastrear el progreso de las tareas.

      AJAX (Asynchronous JavaScript and XML)
      Es un conjunto de técnicas que permiten a las aplicaciones web comunicarse con un servidor en segundo plano sin necesidad de recargar la página completa. Esto resulta en interfaces de usuario más dinámicas y responsivas. Hoy se usa más con JSON que con XML.

      Algoritmo
      Un algoritmo es un conjunto de instrucciones o pasos finitos y ordenados que se siguen para resolver un problema o realizar una tarea específica. Los algoritmos son fundamentales en la programación y la informática.

      Análisis de Complejidad
      Este análisis evalúa la cantidad de recursos computacionales (como tiempo de ejecución y memoria) que un algoritmo necesita en función del tamaño de la entrada. Se utiliza para evaluar la eficiencia de los algoritmos y se expresa generalmente en términos de notación Big O (O(n)).

      Angular
      Es un framework de desarrollo de código abierto basado en TypeScript, utilizado para construir aplicaciones web complejas de una sola página (Single Page Applications SPA). Proporciona una estructura organizada y herramientas para el desarrollo del lado del cliente.

      Ansible
      Es una poderosa herramienta de automatización de código abierto utilizada para la gestión de la configuración, el despliegue de aplicaciones y la orquestación de tareas. Se usa para configurar servidores, instalar software y coordinar tareas repetitivas de forma automática y remota.

      API (Application Programming Interface)
      Una API es un conjunto de definiciones y protocolos que permiten que diferentes componentes de software se comuniquen e intercambien información. Define los métodos y formatos de datos que las aplicaciones pueden usar para solicitar y compartir servicios.

      API GraphQL
      Es un entorno de ejecución para obtener los datos necesarios de forma precisa en la que haces una sola petición a un único punto de entrada, y puedes pedir exactamente los campos que necesitas, ni más ni menos. Fue desarrollado por Facebook.

      API Key
      Es una cadena de texto única que se usa como una contraseña para autenticar a un usuario o una aplicación que intenta conectarse a una API. Se utiliza para poder controlar y rastrear el uso de la API, detectar accesos no autorizados y evitar abusos y garantizar que solo los accesos con permiso puedan usar ciertos servicios o datos.

      API RESTful
      Es una interfaz que permite a las aplicaciones comunicarse entre sí utilizando el protocolo HTTP que sigue los principios de REST (Representational State Transfer). Utiliza métodos estándar de HTTP como GET, POST, PUT y DELETE para realizar operaciones sobre recursos identificados por URLs de manera estructurada y eficiente. Es muy usada por su simplicidad y compatibilidad con la web.

      API-first
      Es una metodología de desarrollo en la que se diseña y construye primero la API, antes que cualquier aplicación o interfaz de usuario. Esto asegura que la API sea clara, reutilizable y bien documentada desde el inicio facilitando al equipo de desarrolladores el trabajo en paralelo sobre la base del diseño de la API.

      Árbol
      En programación un árbol es una estructura de datos que organiza la información de manera jerárquica compuesta por nodos conectados donde cada nodo puede tener cero o varios nodos hijos. Se usa en algoritmos de búsqueda o representaciones de jerarquía como el DOM en HTML.

      Argumento
      Es un valor o variable que se pasa a una función o método cada vez que se invoca modificando su comportamiento o los datos con los que opera y pueden ser números, cadenas de texto u otro tipo de datos necesario para el procesamiento.

      Array (Arreglo)
      Es una estructura de datos que almacena una colección de elementos del mismo tipo en una posición ordenada y contigua en la memoria, accesibles mediante un índice, lo que permite un acceso rápido y eficiente a los datos.

      Assembly
      También llamado lenguaje ensamblador, es un lenguaje de programación de bajo nivel que se comunica directamente con el hardware de la computadora, su programación corresponde directamente a instrucciones de la CPU, lo que le da un control preciso sobre el hardware pero también implica una mayor complejidad para escribir y mantener.

      Atomicidad
      En bases de datos y sistemas concurrentes, es la propiedad que garantiza que una transacción se complete en su totalidad o no se realice en absoluto, sin estados intermedios visibles si la operación falla, garantizando la integridad de los datos. Si ocurre un error, los cambios se revierten para mantener la coherencia.

      Atributo
      Es una propiedad o característica de un objeto o una entidad en base de datos que describe su estado o valor, pueden ser diferentes tipos de datos como números, cadenas de texto o booleanos, etc. También se le conoce como variable de instancia o campo. En HTML/XML, se refiere a una propiedad adicional de una etiqueta que proporciona información extra.

      Autenticación
      Es el proceso de verificar la identidad de un usuario, aplicación o dispositivo antes de permitir el acceso. Generalmente se hace pidiendo credenciales como usuario y contraseña, tokens, biometría o certificados digitales para asegurar que solo usuarios legítimos accedan a los recursos protegidos.

      Autorización
      Es el proceso mediante el cual un sistema o aplicación determina los niveles de acceso de un usuario con la verificación de políticas de seguridad, roles asignados y listas de control de acceso (ACL) para determinar si se tiene permiso para realizar una acción específica, como leer, escribir o modificar datos. Los sistemas modernos suelen emplear modelos como RBAC (Control de Acceso Basado en Roles) o ABAC (Control de Acceso Basado en Atributos) para gestionar la autorización de manera eficiente.

      AWS / Azure / Google Cloud
      Son plataformas de computación en la nube también conocidas como “cloud computing” que ofrecen una amplia gama de servicios de infraestructura, como servidores, almacenamiento, inteligencia artificial y bases de datos, accesibles a través de internet permitiendo a empresas y desarrolladores construir aplicaciones sin tener que gestionar hardware físico.

      BaaS (Backend as a Service)
      Es un servicio en la nube que ofrece a desarrolladores herramientas y componentes prediseñados, permitiendo y escalables como autenticación de usuarios, almacenamiento en la nube, notificaciones push, integración con redes sociales y sincronización de datos entre dispositivos mediante APIs, sin tener que construir todo el backend desde cero. Ejemplos populares de BaaS incluyen Firebase (Google), Amplify (AWS) y Supabase.

      Backend
      Es la parte “oculta” de una aplicación que maneja la lógica de negocio, el procesamiento de datos, la autenticación y autorización de usuarios, y la comunicación con bases de datos y otros servicios externos. El backend recibe solicitudes del frontend (interfaz de usuario), procesa estas peticiones según reglas predefinidas, realiza operaciones en la base de datos y devuelve respuestas estructuradas.

      Balanceador de carga (Load Balancer)
      Su función principal es optimizar la utilización de recursos, maximizar el rendimiento, garantizar alta disponibilidad y evitar la sobrecarga de cualquier servidor individual.

      Balanceo de carga
      El balanceo de carga es el proceso técnico de repartir el trabajo entre varios servidores o recursos, optimizando el uso de capacidad y evitando cuellos de botella. Este proceso busca optimizar el uso de recursos, maximizar el rendimiento, reducir tiempos de respuesta y evitar sobrecargas en componentes individuales. Existen diversos algoritmos para implementar el balanceo, como Round Robin (distribución secuencial), Least Connection (envío a servidores con menos conexiones activas), IP Hash (distribución basada en la dirección IP del cliente) o ponderado (asignando diferentes capacidades a los servidores).

      Base de datos
      Sistema que almacena y organiza datos de forma estructurada para su consulta rápida. Las bases de datos están diseñadas para ofrecer un método eficaz de almacenar, actualizar, eliminar, buscar y analizar grandes volúmenes de datos mediante consultas estructuradas.

      Base de datos relacional (SQL)
      Es un tipo de base de datos que organiza la información en tablas con relaciones entre ellas, usando el lenguaje SQL para gestionar los datos. Ejemplos populares incluyen PostgreSQL, MySQL y SQL Server.

      Batch Processing (Procesamiento por lotes)
      El procesamiento por lotes es un método de ejecutar tareas automatizadas en grupos (lotes) sin la necesidad de interacción manual. Este método es especialmente útil para tareas como generación de informes periódicos, actualizaciones masivas de bases de datos, cálculos complejos, facturación mensual o análisis de datos que requieren uso intensivo de recursos.

      Biblioteca o Librería (Library)
      Es una colección de código preescrito (funciones, clases, etc.) que los programadores pueden utilizar en sus proyectos para realizar tareas comunes sin tener que escribirlas desde cero, ahorrando tiempo y esfuerzo.

      Big Data
      Se refiere a conjuntos de datos extremadamente grandes y complejos que requieren tecnologías y herramientas especializadas para procesarlos y analizarlos. Estos datos pueden provenir de diversas fuentes, como redes sociales, sensores, transacciones financieras, entre otros. Es clave para descubrir patrones y tomar decisiones informadas en empresas o investigaciones.

      Big O
      La notación Big O es una forma matemática de describir cómo escala un algoritmo en términos de tiempo de ejecución o espacio de memoria cuando aumenta el tamaño de los datos de entrada. Esta notación nos permite comparar la eficiencia de diferentes algoritmos sin preocuparnos por detalles de implementación específicos o capacidades de hardware.

      Binario
      Sistema numérico de base 2 que solo usa 0 y 1. Es fundamental en computación porque los dispositivos electrónicos trabajan con dos estados (apagado/encendido). Cada dígito binario se llama bit, y grupos de 8 bits forman un byte.

      Bit
      Un bit es la unidad más pequeña de información en computación y comunicaciones digitales. Proviene de la contracción de “binary digit” (dígito binario) y puede tener solo uno de dos valores: 0 o 1.

      Blazor
      Es un framework de Microsoft para el desarrollo de aplicaciones web interactivas utilizando C# en lugar de JavaScript. Permite crear interfaces modernas con tecnología .NET.

      Blockchain
      Es una tecnología de registro distribuido que almacena información en bloques enlazados criptográficamente, formando una cadena inmutable y cronológica. Cada bloque contiene un hash del bloque anterior, una marca de tiempo y datos de transacciones, lo que hace prácticamente imposible alterar la información sin modificar todos los bloques subsiguientes. Es conocido por su uso en criptomonedas como Bitcoin, pero también tiene aplicaciones en contratos inteligentes, seguimiento de activos y más.

      Booleano
      Un valor booleano es un tipo de dato lógico que solo puede tener uno de dos posibles valores: verdadero (true) o falso (false). Estos valores son fundamentales en la programación para el control de flujo y la toma de decisiones. Se utiliza en programación para representar condiciones lógicas y es fundamental en estructuras de control como condicionales (if) y bucles (while, for). Por ejemplo, una expresión como “5 > 3” devuelve un valor booleano verdadero.

      Branch / Merge
      En control de versiones (como Git), un branch es una copia del código donde puedes trabajar sin afectar la versión principal. Cuando terminas los cambios, haces un merge para unir ese trabajo con el código principal. Esto permite que varios desarrolladores colaboren sin interferir entre sí. Es esencial en desarrollo colaborativo.

      Bucles (Loops)
      Son estructuras de programación que permiten repetir un bloque de código varias veces hasta que se cumpla una condición específica.

      Bucles / Ciclos (for, while)
      Son tipos específicos de bucles. El ciclo for se usa cuando se conoce de antemano cuántas veces se repetirá; el ciclo while se repite mientras una condición sea verdadera.

      Buffer
      Un buffer es un área de memoria temporal usada para almacenar datos mientras se transfieren entre dos procesos o dispositivos. Esto permite mejorar el rendimiento y evitar pérdidas de datos por diferencias de velocidad entre dispositivos o programas. Por ejemplo cuando se descarga un archivo, los datos se almacenan en el buffer antes de ser procesados.

      Bug
      Un bug es un error o defecto en el código fuente de un programa de computadora que causa un comportamiento inesperado o incorrecto. Puede ser algo pequeño, como una mala visualización, o algo grave, como un fallo que bloquea el programa. Los desarrolladores trabajan para identificar y corregir los bugs para mejorar la calidad del software.

      Build (Compilación)
      Es el proceso de traducir el código fuente de un programa en código máquina que la computadora puede ejecutar directamente. Durante este proceso, un compilador traduce el código de alto nivel (como C#, Java, etc.) a código máquina o bytecode. Se verifican errores de sintaxis, se optimiza el código y se enlazan las diferentes partes del programa.

      Builder
      Es un patrón de diseño que se utiliza para crear objetos complejos paso a paso. En lugar de pasar todos los parámetros en un constructor, un builder permite configurar el objeto de manera flexible y legible. Esto es especialmente útil cuando un objeto puede tener muchas configuraciones opcionales. Por ejemplo, si estás creando un auto, un builder te permitiría especificar el color, el motor y otros detalles sin tener un constructor enorme.

      C# (C sharp)
      Es un lenguaje de programación moderno y orientado a objetos desarrollado por Microsoft. Se utiliza ampliamente para crear aplicaciones de escritorio y web en la plataforma .NET. C# es conocido por su sintaxis clara y su fuerte tipado, lo que ayuda a los desarrolladores a escribir código seguro y eficiente.

      C++
      Es un lenguaje de programación potente que extiende el lenguaje C añadiendo programación orientada a objetos. Ofrece control de bajo nivel sobre el hardware mientras proporciona abstracciones de alto nivel para facilitar el desarrollo. Es ampliamente utilizado en desarrollo de sistemas operativos, videojuegos, aplicaciones de alto rendimiento, sistemas embebidos y software donde la eficiencia y velocidad son críticas.

      Cache
      Es una memoria de acceso rápido que almacena datos usados frecuentemente para acelerar el rendimiento del sistema. Funciona bajo el principio de que los datos recientemente utilizados tienen alta probabilidad de ser requeridos nuevamente. En programación, también se usa para evitar cálculos repetidos. La cache puede estar en el procesador, disco o software.

      Callback
      Es una función que se pasa como argumento a otra función y se ejecuta después de un evento. Es un concepto fundamental en la programación asíncrona, donde una operación puede tardar tiempo en completarse, y el callback se invoca una vez que la operación ha terminado o un evento específico ha ocurrido.

      Capa de negocio
      La capa de negocio es una parte de la arquitectura de software donde se implementa la lógica principal de una aplicación, como reglas de negocio, validaciones y cálculos.

      Capa de servicio
      Componente de software que gestiona la comunicación entre la capa de negocio y otras partes del sistema, como la interfaz de usuario o APIs externas. Facilita la modularidad y escalabilidad.

      Carga (Load)
      Se refiere al proceso de transferir datos o programas desde un almacenamiento permanente (disco duro) hacia la memoria RAM para su ejecución o uso, en un ambiente web se refiere al tiempo que tarda una web o aplicación en cargar completamente todos sus recursos (imágenes, scripts, estilos, etc).

      CI/CD
      Continuous Integration/Continuous Deployment es una metodología de desarrollo de software que automatiza el proceso de construir, probar y desplegar cambios en el código. Esta práctica consiste en el desarrollo de software donde los cambios de código se integran y prueban automáticamente, permitiendo lanzamientos más rápidos y confiables.

      Cifrado
      Es el proceso de convertir datos en un formato ilegible para evitar el acceso no autorizado. Se utiliza en seguridad informática para proteger información sensible, empleando algoritmos como AES o RSA.

      Clase (Class)
      Es una estructura fundamental de la programación orientada a objetos que define un conjunto de atributos y métodos que representan un concepto o entidad, es una plantilla o molde que define las propiedades y comportamientos de un objeto. Permite organizar el código de forma modular y reutilizable.

      CLI (Command Line Interface)
      Interfaz de usuario basada en texto donde los usuarios interactúan con el sistema operativo o aplicaciones mediante comandos escritos, requiere conocer comandos específicos pero ofrece mayor control y eficiencia para tareas complejas. Es especialmente popular entre desarrolladores y administradores de sistemas por su precisión y capacidad de automatización. Terminal en macOS/Linux y Command Prompt en Windows.

      Closure (Clausura)
      Es una característica de programación donde una función tiene acceso a su propio ámbito, al ámbito de la función exterior y al ámbito global. Permite mantener el estado de las variables incluso después de que la función exterior haya terminado de ejecutarse.

      CMS
      Sistema de Gestión de Contenidos (Content Management System), es una aplicación que permite crear, editar, organizar y publicar contenido digital, como sitios web o blogs, sin necesidad de conocimientos técnicos avanzados de programación. Ejemplos comunes incluyen WordPress, Drupal y Joomla.

      Código de alto nivel
      Son lenguajes de programacion que estan diseñados para ser legibles y comprensibles por humanos, con una sintaxis mas intuitiva con el objetivo de aumentar la productividad. Este tipo de codigo no interactua directamente con el hardware, sino que pasa por un compilador o un interprete quitandole la tarea de gestion de memoria o instrucciones especificas del procesador al desarrollador. Algunos ejemplos de lenguages que usan codigo de alto nivel son Python, Java, C#, etc.

      Codigo de bajo nivel
      Es un tipo de codigo que esta mas cercano al lenguaje máquina y el hardware de la computadora que permite un control directo sobre los recursos del sistema y la memoria utilizando el ensamblador o instrucciones binarias. Es mas dificil de leer y mantener para los humanos, pero su rendimiento y eficiencia son mayores, por lo general son mas usados en drivers, firmware o sistemas embebidos.

      Código fuente (Source code)
      El código fuente es el conjunto de instrucciones escritas por un programador en un lenguaje de programación de alto nivel para construir una aplicación o sistema. Este código debe ser compilado o interpretado para que una máquina lo ejecute. Es la base de cualquier software y se almacena en archivos editables. El código fuente representa toda la lógica y funcionalidad del programa en forma textual.

      Código legacy
      Código legacy o codigo legado son sistemas o codigo fuente antiguo o desactualizado, se considera obsoleto tecnologicamente, es dificil de entender y mantener debido a la falta de documentacion, dependencias obsoletas o arquitecturas rigidas. Se mantiene en uso porque sigue cumpliendo su proposito y reemplazarlo seria riesgoso y costoso y algunas empresas optan por una refactorizacion gradual para mejorar su calidad, un ejemplo de codigo legacy es COBOL en los bancos.

      Código limpio (Clean Code)
      Es una filosofía y conjunto de principios para escribir código que sea fácil de leer, entender y mantener por cualquier desarrollador. Implica escribir código que sea fácil de entender por otros desarrolladores (y por uno mismo en el futuro). Algunas características del código limpio incluyen nombres de variables descriptivos, funciones cortas y específicas, y una estructura lógica y consistente. Reduce bugs, facilita la colaboración en equipo y hace que las modificaciones futuras sean más sencillas.

      Cola (Queue)
      Una cola es una estructura de datos que sigue el principio FIFO (First In, First Out), es decir, el primero en entrar es el primero en salir. Son fundamentales en programación para manejar tareas que deben procesarse en orden de llegada, como sistemas de impresión, manejo de procesos en sistemas operativos, algoritmos de búsqueda BFS (Breadth-First Search), y gestión de requests en servidores web.

      Commit
      Representa una instantánea de un conjunto de cambios realizados en el código fuente de un proyecto. Registra estas modificaciones de manera atómica, creando un punto en el historial del proyecto al que se puede revertir o comparar. Cada commit incluye un mensaje descriptivo, un autor y una marca de tiempo, facilitando el seguimiento y la colaboración en equipos de desarrollo.

      Compilador
      Un compilador es un programa que traduce código fuente escrito en un lenguaje de programación de alto nivel a un lenguaje de bajo nivel, como el código máquina, para que pueda ser ejecutado por una computadora. Detecta errores de sintaxis y optimiza el código para una ejecución eficiente en el hardware del sistema.

      Compresión de datos
      La compresión de datos es un proceso que reduce el tamaño de un archivo o conjunto de datos, haciendo más eficiente su almacenamiento y transmisión. Esto se logra mediante algoritmos que eliminan la redundancia y representan la información de manera más compacta. La compresión puede ser con pérdida o sin pérdida, dependiendo de si se permite la pérdida de información original durante el proceso.

      Computación en la nube
      Es un paradigma tecnológico que permite el acceso a servicios informáticos a través de Internet (“la nube”), en lugar de poseer y mantener la infraestructura localmente. Provee recursos como servidores, almacenamiento, bases de datos, redes y software bajo demanda, generalmente con un modelo de pago por uso. Esto permite a los desarrolladores acceder a recursos informáticos escalables sin necesidad de mantener infraestructura física. Modelos comunes incluyen IaaS (AWS), PaaS (Google App Engine) y SaaS (Dropbox). Escala dinámicamente y reduce costos operativos.

      Concurrency
      La concurrencia se refiere a la capacidad de un programa para ejecutar múltiples tareas o procesos simultáneamente, mejorando la eficiencia y el rendimiento. Se logra con hilos (threads), async/await o event loops. Mejora la eficiencia y el rendimiento en entornos de programación.

      Condicional
      Es una estructura fundamental en cualquier lenguaje de programación que permite controlar el flujo de ejecución de un programa basándose en la evaluación de una expresión booleana. Las sentencias condicionales, como if, else if y else, o switch/case, permiten al código tomar decisiones: si una condición es verdadera, se ejecuta un bloque de código; si es falsa, se ejecuta otro o ninguno. Estas sentencias son fundamentales para controlar el flujo de un programa y tomar decisiones basadas en condiciones específicas.

      Conjuntos
      Es una estructura de datos que almacena elementos únicos sin orden específico, permitiendo operaciones como unión, intersección y diferencia. Los conjuntos son especialmente útiles para manejar colecciones de elementos sin duplicados y realizar operaciones de conjunto.

      Constructor
      Es un método especial dentro de una clase en la programación orientada a objetos (POO) que se invoca automáticamente cuando se crea una nueva instancia (objeto) de esa clase. Su propósito principal es inicializar el estado del objeto, asignando valores iniciales a sus atributos (variables de instancia) y realizando cualquier configuración necesaria para que el objeto esté listo para su uso. Los constructores suelen llevar el mismo nombre que la clase y pueden estar sobrecargados para aceptar diferentes parámetros.

      Contenedor
      Se refiere a una estructura de datos que almacena y organiza múltiples elementos, como listas, conjuntos o mapas, facilitando su gestión y acceso.

      También puede referirse a contenedores de software donde una unidad de software empaquetada con su código, bibliotecas y configuraciones, ejecutándose de forma aislada y portable. Simplifica el despliegue en distintos entornos sin problemas de compatibilidad.

      Contexto
      Conjunto de información relevante dentro de un programa que determina el estado de ejecución. Puede incluir variables globales, entornos de función y elementos que afectan la interpretación del código en tiempo de ejecución, como los valores de las variables locales y globales, el “this” o “self” en POO, el estado del programa, la pila de llamadas, y los recursos disponibles. Comprender el contexto es crucial para depurar, entender el comportamiento del código y diseñar funciones que interactúen correctamente con su entorno.

      Control de versiones (Version Control)
      Es un sistema que permite gestionar los cambios realizados en el código fuente de un proyecto a lo largo del tiempo. Ayuda a colaborar entre varios programadores, ya que permite ver qué cambios se hicieron, por quién y cuándo. También facilita volver a versiones anteriores si algo sale mal.

      CORS (Cross-Origin Resource Sharing)
      Mecanismo de seguridad que permite o restringe solicitudes entre recursos de diferentes dominios (orígenes). Evita que una página web acceda a datos de otro sitio sin permiso explícito. Esto se logra mediante cabeceras HTTP especiales que el servidor envía para indicar si la solicitud de un origen diferente está permitida.

      CRUD (Create, Read, Update, Delete)
      Representa las cuatro operaciones básicas que se pueden realizar sobre datos en cualquier sistema de información persistente. Create se refiere a la creación de nuevos registros, Read a la consulta o lectura de información existente, Update a la modificación de datos ya almacenados, y Delete a la eliminación de registros.

      CSS (Cascading Style Sheets)
      Lenguaje utilizado para dar estilo y diseño a páginas web. Controla colores, fuentes, márgenes y otras propiedades visuales para mejorar la presentación de los elementos HTML.

      Data Mining (Minería de datos)
      La minería de datos es el proceso de descubrir patrones, tendencias y conocimientos útiles a partir de grandes conjuntos de datos utilizando técnicas estadísticas, matemáticas y de inteligencia artificial. Las técnicas incluyen clustering, clasificación, regresión, análisis de asociaciones y detección de anomalías. Es ampliamente utilizada en marketing, finanzas, medicina y comercio electrónico para tomar decisiones basadas en datos y predecir comportamientos futuros.

      Data Science (Ciencia de datos)
      Es un campo interdisciplinario que utiliza métodos, procesos, algoritmos y sistemas científicos para extraer conocimiento y perspectivas de datos estructurados y no estructurados. Combina técnicas de estadística, informática y conocimiento del dominio.

      Dependencia (Dependency)
      Es la relación en la que un programa o módulo requiere de otro componente, como una biblioteca o framework, para funcionar correctamente. Por ejemplo, una biblioteca externa que proporciona funciones específicas. Administrar bien las dependencias es esencial para mantener un código limpio y fácil de actualizar.

      Depuración (Debugging)
      Es el proceso sistemático de identificar, localizar y corregir errores o bugs en el código de software. Involucra técnicas como el uso de debuggers, puntos de interrupción, inspección de variables, análisis de logs y pruebas paso a paso del programa. Es una habilidad fundamental que requiere pensamiento lógico, paciencia y comprensión profunda del funcionamiento del código y el sistema.

      Desarrollo ágil (Agile)
      Es una metodología de gestión de proyectos de software que enfatiza la flexibilidad, colaboración y entrega incremental de valor. Se basa en iteraciones cortas llamadas sprints, donde los equipos desarrollan funcionalidades específicas y obtienen retroalimentación constante del cliente. Prioriza la adaptación al cambio sobre seguir un plan rígido, la colaboración sobre procesos estrictos, y el software funcionando sobre documentación exhaustiva.

      Desbordamiento de pila (Stack Overflow)
      Es un error en la ejecución de un programa que ocurre cuando la pila de llamadas de funciones supera su límite de memoria. Sucede comúnmente en recursión infinita o cuando se almacenan demasiadas variables en la pila, lo que provoca que el programa se bloquee o termine abruptamente.

      Deserialización
      Es el proceso de convertir datos que han sido almacenados o transmitidos en un formato específico (como JSON o XML) en objetos o estructuras de datos utilizables en un programa. Se usa frecuentemente en APIs y almacenamiento persistente.

      Deuda técnica
      Se refiere a las decisiones de diseño o implementación en el desarrollo de software que, aunque pueden acelerar la entrega inicial de un producto, generan problemas a largo plazo. Puede incrementar el costo y tiempo de mantenimiento futuro si no se aborda.

      DevOps
      Cultura y conjunto de prácticas que integran desarrollo de software (Dev) y operaciones de TI (Ops) para acelerar el ciclo de entrega. Promueve automatización (CI/CD), monitoreo y colaboración, mejorando eficiencia y calidad en despliegues.

      Diagrama de flujo
      Es una representación gráfica de un proceso o algoritmo utilizando símbolos estandarizados. Ayuda a visualizar la lógica de un programa antes de codificarlo. Se usa para identificar pasos, decisiones y posibles errores. Es una herramienta clave en el diseño de software y documentación.

      Diccionarios
      Es una estructura de datos que almacena pares de clave-valor. Permite acceder a valores mediante claves únicas, ofreciendo flexibilidad y eficiencia para organizar datos dinámicos, como en configuraciones o mapeos. Los diccionarios son mutables, lo que significa que se pueden agregar, eliminar o modificar elementos después de su creación.

      Django
      Framework web de alto nivel en Python que promueve el desarrollo rápido y el diseño limpio. Utiliza el patrón MVC (Modelo-Vista-Controlador), incluye ORM para bases de datos y es ideal para aplicaciones escalables y seguras. Django incluye características como autenticación, administración, APIs y más.

      Docker
      Plataforma de contenedores que empaqueta aplicaciones y sus dependencias en unidades aisladas y portables. Permite ejecutar software en cualquier entorno sin conflictos, garantizando consistencia entre desarrollo, testing y producción. Usa imágenes y contenedores ligeros vs. máquinas virtuales.

      DOM (Document Object Model)
      Es una interfaz de programación que representa la estructura de un documento HTML o XML como un árbol de nodos. Permite a los desarrolladores manipular el contenido, la estructura y el estilo de los documentos de manera dinámica mediante lenguajes como JavaScript, facilitando la creación de aplicaciones web interactivas.

      Driver
      Es un software que permite que el sistema operativo y las aplicaciones se comuniquen con hardware específico. Los drivers son esenciales para que los dispositivos, como impresoras o tarjetas gráficas, funcionen correctamente en un sistema, traduciendo las instrucciones del software en comandos que el hardware puede entender.

      Edge Computing
      Paradigma que procesa datos cerca de su fuente como en dispositivos IoT, sensores, etc. En lugar de enviarlos a la nube, esto reduce la latencia y ancho de banda, mejorando la eficiencia y la velocidad de respuesta, es muy útil en aplicaciones en tiempo real.

      Editor de texto
      Es una herramienta de software que permite a los programadores escribir y editar código fuente sin funcionalidades avanzadas de desarrollo como depuración o compilación. A diferencia de los procesadores de texto, los editores de texto están diseñados para manejar archivos de texto plano y suelen incluir características como resaltado de sintaxis, autocompletado y soporte para múltiples lenguajes de programación.

      Eficiencia
      Se refiere a la capacidad de un algoritmo o programa para utilizar los recursos disponibles de manera óptima, como la memoria, el procesador y el tiempo de ejecución. Un programa eficiente es aquel que puede resolver un problema de manera rápida y con un mínimo desperdicio de recursos. Se mide comúnmente mediante la notación Big O (O(n), O(log n), etc.). Es clave en aplicaciones de alto rendimiento.

      Elemento
      Unidad dentro de una estructura de datos, como un elemento en un array o un nodo en una lista enlazada. Cada uno contiene valores y, en algunos casos, referencias a otros elementos. También puede referirse a nodos en XML/HTML o ítems en una base de datos. Su manipulación (añadir, eliminar, modificar) es fundamental en algoritmos.

      Encapsulamiento
      El encapsulamiento es un principio de programación orientada a objetos que consiste en restringir el acceso a ciertos componentes de un objeto y exponer solo lo necesario a través de interfaces públicas. Esto ayuda a proteger el estado interno del objeto y a reducir la complejidad al ocultar detalles de implementación.

      Encriptación (Cifrado)
      Es el proceso de convertir información legible en un formato codificado que solo puede ser descifrado con una clave. En programación, se usa para proteger datos sensibles durante su almacenamiento o transmisión. Existen distintos métodos como AES o RSA. Es clave en la seguridad informática.

      Endpoint
      Es una dirección específica donde se puede acceder a un recurso o servicio. Los endpoints son puntos de comunicación en una API (Interfaz de Programación de Aplicaciones) que permiten a los clientes enviar solicitudes y recibir respuestas, facilitando la interacción entre diferentes sistemas.

      Engine
      Componente de software que ejecuta o gestiona procesos específicos, como un motor de base de datos (MySQL) o un motor de renderizado (como V8 en JavaScript). Procesa tareas críticas y optimiza el rendimiento. En programación, es el núcleo que impulsa una aplicación.

      Ensamblador (Assembler)
      Lenguaje de bajo nivel que traduce instrucciones mnemónicas en código máquina ejecutable por el procesador. Cada instrucción corresponde a una operación específica del hardware. Es usado en sistemas embebidos o para optimizar código crítico.

      Entrada (Input)
      Es cualquier dato que el usuario o sistema proporciona a un programa para que lo procese. Puede ser introducido mediante teclado, archivos, sensores, una red, API, pantalla táctil u otros dispositivos. Se maneja con funciones específicas según el lenguaje. La entrada es fundamental para la interacción con el usuario. La validación de entradas es crucial para evitar errores o vulnerabilidades como inyecciones SQL.

      Error
      Es una falla en el código que impide que un programa funcione correctamente, ya sea por bugs (errores de lógica), excepciones (datos inesperados) o problemas externos (falta de memoria). Puede ser de tipo sintáctico, lógico o de ejecución. Detectar y manejar errores es esencial para un software robusto. Existen herramientas como depuradores y excepciones para gestionarlos.

      Feature
      Es una mejora o nueva funcionalidad agregada a un software o aplicacion, puede ser un modulo o un componente que añade valor al producto resolviendo un problema o una necesidad en particular. Puede ser alto tan simple como un boton para guardar o algo mas complejo como un nuevo algoritmo de busqueda.

      Fork
      Es la creacion de una copia independiente de un repositorio de codigo existente, generalmente en plataformas como github o gitlab. Esto permite a un desarrollador experimentar y hacer cambios libremente sin afectar al proyecto original. Los desarrolladores usan forks para contribuir a proyectos open-source, realizando cambios en su propia rama y luego proponiendo un pull request al proyecto original para fusionar los cambios en caso de ser aceptados.

      Framework
      Un framework o marco de trabajo es un conjunto de herramientas, librerias, convenciones predefinidas y buenas practicas que facilita el desarrollo de aplicaciones proporcionando una base reutilizable para tareas comunes. Los desarrolladores extienden el framework con codigo personalizado siguiendo patrones como MVC (Modelo Vista Controlador) para organizar la logica de la aplicacion. Elegir un framework adecuado acelera el desarrollo pero requiere de aprendizaje de aPIs y mejores practicas para evitar dependencias excesivas y mantener la escalabilidad. Algunos ejemplos populares incluyen .NET, Django, Angular o Spring.

      GIT
      Es un sistema de control de versiones distribuido, es de codigo abierto, usado para rastrear los cambios en el codigo fuente durante el desarrollo de software. Permite a multiles desarrolladores colaborar en el mismo proyecto sin sobreescribir el trabajo de los demás, mantiene un historial completo de todas las modificaciones realizadas. Se pueden crear ramas, fusionar cambios, revertir versiones de forma segura. Es ampliamente usado en plataformas com github promoviendo colaboracion open-source.

      Kubernetes
      A menudo abreviado com k8s, es un sistema de orquestacion de contenedores de codigo abierto, creado por google, se utiliza para automatizar el despliegue, escalado y gestion de aplicaciones empaquetadas en contenedores como Docker a traves de un conjunto de nodos. Mejora la eficiencia y portabilidad del codigo. Es esencial para arquitecturas de microservicios, donde ayuda a gestionar recursos dinamicamente y asegurar alta disponibilidad en sistemas de nube y microservicios.

      Phishing
      En un contexto de ciberseguridad el phishing es una tecnica de ingenieria social utilizada para engañar a los desarrolladores o usuarios para robar credenciales de acceso, contraseñas o datos bancarios. Los desarrolladores deben implementar medidas con filtros anti-phishing para evitar estos ataques, por ejemplo validacion de correos o autenticacion multifactor. Una de las maneras mas utilizadas por los atacantes es crear sitios o correos electronicos falsos que imitan lo mas posible a los legitimos para que el usuario ingrese sus credenciales y el sitio los envia a una base de datos del atacante.

      *serán explicadas y agregados nuevos términos

      Loading

      INSTALL_PARSE_FAILED_MANIFEST_MALFORMED

      Error INSTALL_PARSE_FAILED_MANIFEST_MALFORMED

      La etiqueta <intent-filter> se usa para que otras aplicaciones puedan abrir nuestra aplicación por medio de un Intent, normalmente no había problema hasta la versión de Android 11 si la etiqueta del Activity contenía la etiqueta Intent-Filter se tomaba la propiedad android:exported con valor verdadero, sin importar que se incluyera en la etiqueta del Activity

      Pero desde la versión de Android 12 y posteriores se necesitara poner explícitamente la propiedad android:exported en verdadero, de no ponerla entonces tendremos el siguiente error.

      Error:

      Launching 'app' on No Devices.
      Installation did not succeed.
      The application could not be installed: INSTALL_PARSE_FAILED_MANIFEST_MALFORMED
      
      List of apks:
      [0] 'D:\Documentos\DESARROLLO\ANDROID\Random\app\build\outputs\apk\debug\app-debug.apk'
      Installation failed due to: 'null'
      Retry
      

      Solución:

      Como se menciono antes, el ejecutar la aplicación sin la propiedad android:exported en dispositivos Android 11 e inferiores no tendrán problema pero si queremos que nuestra aplicación se ejecute en dispositivos Android 12 y posteriores se tiene que agregar dicha propiedad con valor verdadero

      Si se agrega la propiedad con valor falso no marcara error pero no se ejecutará, por lo que tiene que ser verdadero

      <activity
        android:name=".MainActivity"
        android:exported="true"
        android:screenOrientation="portrait"
        android:theme="@style/AppTheme.NoActionBar">
          <intent-filter>
             <action android:name="android.intent.action.MAIN" />
             <category android:name="android.intent.category.LAUNCHER" />
          </intent-filter>
      </activity>

      Loading