MSI102, Tarea 1

Seguridad

En su definición mas amplia, seguridad significa Ausencia de peligro o riesgo; Sensación total de confianza que se tiene en algo o alguien. 1

En el contexto de seguridad informática y/o seguridad cibernética, el concepto de seguridad se enfoca en proteger los sistemas y redes de daños o robo de hardware, software e información, así como de evitar o minimizar el deterioro o desvío de los servicios que estos proveen. 2

Relación entre Seguridad e Informatica

La seguridad informática es toda una rama de la seguridad cibernética, generalmente abreviada como Infosec (por su nombre en ingles Information Security) y, similarmente al punto anterior, se enfoca en evitar o minimizar el acceso, uso, destrucción, modificación, etc. de información tangible o intangible. A diferencia de la seguridad cibernética, Infosec se enfoca exclusivamente en la información. 3

El hecho de enfocarse exclusivamente en información podría minimizar esta area, pero esto es completamente alejado de la realidad pues al formar parte del area de control de riesgos cubre una gran cantidad de areas mediante diferentes procesos. Algunos de los procesos incluyen:

  • Identificar la información y elementos relacionados, así como potenciales vulnerabilidades y amenazas.
  • Evaluar riesgos.
  • Decidir cómo actuar ante los riesgos, ya sea evitándolos o minimizándolos.
  • Définir e implementar los contrôles de seguridad apropiados.
  • Monitoreo de actividades y ajustar las medidas según se requiera.

Principales medios de almacenamiento, ventajas y desventajas

Semiconductores

Memoria RAM, Memorias Flash (Memorias USB, MicroSD, etc.), SSD, RFID y Smartcards, etc.

Ventajas

  • Tamaño. Al ser extremadamente miniaturizables pueden emplearse en una gran cantidad de aplicaciones civiles, medicas, militares, etc.
  • Precio. Relativamente económicos dependiendo de la aplicación, principalmente como medio externo/portátil (Memorias Flash).
  • Velocidad. Alta velocidad de lectura y escritura. Modelos especializados en lectura o escritura rápida.

Desventajas

  • Precio. Algunas aplicaciones mas especializadas pueden ser extremadamente costosas dependiendo de la capacidad requerida (SSD).
  • Acceso. Dependiendo del tipo de memoria y aplicación usada, puede tener limitantes en la forma en que se escribe o lee información, por ejemplo, los RFID.
  • Limite de usos. Las Memorias Flash tienen un numero limitado de usos (ciclos de borrado) que, aunque alto, debe tomarse en consideración (aproximadamente 100,000 ciclos por bloque).
  • Volátil. En algunos casos, pueden ser borradas con uso de rayos X.

Magnéticos

Discos Duro, Floopy Disk (obsoleto), Cinta Magnetica, etc.

Ventajas

  • Precio. Económicos, principalmente los Discos Duros.
  • Capacidad. Capacidades muy grandes, especialmente los Discos Duros.
  • Redundancia. Pueden usarse en grupos para crear copias automáticas, generando así unidades de almacenamiento redundantes.

Desventajas

  • Velocidad. La información se guarda de forma secuencial y dependen de elementos mecánicos por lo que el acceso es extremadamente lento en comparación con los semiconductores.
  • Frágil. En el caso de las cintas magnéticas, pueden ser fácilmente destruidas a temperaturas altas, mal uso, unidades de lectura defectuosas, etc.
  • Volátil. En el caso de los Discos Duros, es relativamente sencillo dañarlos o destruirlos, ya sea con imanes potentes o con medios físicos (movimientos bruscos, abriéndolos, taladros, etc.).

Opticos

CD, DVD, Blu-ray

Ventajas

  • Precio. Extremadamente económicos.
  • Resistentes. En comparación con los medios magnéticos y semiconductores, la información almacenada en un disco óptico no es susceptible a daños por medios eléctricos, electrónicos o incluso rayos X.

Desventajas

  • Velocidad. La información se guarda de forma secuencial y dependen de elementos mecánicos por lo que el acceso es extremadamente lento en comparación con los semiconductores. Ademas de esto los discos ópticos son portátiles por lo que están limitados a cierta velocidad ya que si se sobre pasa esta pueden sufrir daños o simplemente no se pueden leer de forma correcta.
  • Frágil. Si no se manejan con cuidado, es muy fácil dañar permanente mente un disco óptico. Ademas de esto, también están expuestos a pudrirse debido a la oxidación por defectos de fabricación o mal uso.

Principales medios de almacenamiento en la nube, costos, ventajas y desventajas

Contrario a la creencia popular, no todos los servicios en la nube están pensados para hacer respaldos; la principal funcionalidad de un servicio de almacenamiento en la nube es la sincronización y almacenamiento de información. Dependiendo del uso que se requiera pueden usarse otros servicios mas especializados como respaldos, distribución de contenido multimedia, distribución geográfica, etc. 4

Todos los precios abajo en Dólares Estadounidenses. Planes personales.

IDrive

  • Ventajas: Facilidad de configuración, Precio, Flexibilidad de uso, Integración, Velocidad.
  • Desventajas: Interface Web, No es ilimitado.

Precios:

  • 5GB: $0
  • 2TB: $52.12/primer año
  • 5TB: $74.62/primer año

Sugar Sync

  • Ventajas: Aplicaciones, Integration, Seguridad.
  • Desventajas: Precio, Colaboración.

Precios:

  • 5GB: $0
  • 100GB: $7.5/mes
  • 250GB: $9.99/mes
  • 500GB: $18.95/mes
  • 1000GB: $55/mes

Dropbox

  • Ventajas: Facilidad de uso, Aplicaciones, Integración, Colaboración, Historial.
  • Desventajas: Precio.

Precios:

  • 2GB: $0
  • 2TB: $120/año
  • 3TB: $200/año

OneDrive

  • Ventajas: Interface, Integración.
  • Desventajas: Menos almacenamiento gratuito.

Precios:

  • 5GB: $0
  • 100GB: $2/mes
  • 1TB: $70/año

Box

  • Ventajas: Facilidad de uso, Sincronización, Colaboración, Almacenamiento gratuito.
  • Desventajas: Precio, Colaboración, Configuración.

Precios:

  • 10GB: $0
  • 100GB: $10/mes

Google Drive

  • Ventajas: Almacenamiento gratuito, Colaboración, Integración.
  • Desventajas: Privacidad, Compatibilidad.

Precios:

  • 15GB: $0
  • 100GB: $20/año
  • 200GB: $30/año
  • 2TB: $100/año

iCloud Drive

  • Ventajas: Integration, Interface.
  • Desventajas: Compatibilidad, Facilidad de uso, Colaboración.

Precios:

  • 5GB: $0
  • 50GB: $1/mes
  • 200GB: $3/mes
  • 2TB: $10/mes

Amazon S3

Precios:

  • Almacenamiento: $0.021/GB/mes
  • Descarga: $0.05+/GB

Backblaze B2

Precios:

  • Almacenamiento: $0.005/GB/mes
  • Descarga: $0.01/GB

Google Cloud

Precios:

  • Almacenamiento: $0.020/GB/mes
  • Descarga: $0.08+/GB

Microsoft Azure

Precios:

  • Almacenamiento: $0.018+/GB/mes
  • Descarga: $0.05+/GB

  1. Diccionario General de la Lengua Española Vox, macOS 10.15.3 
  2. https://en.wikipedia.org/wiki/Computer_security 
  3. https://en.wikipedia.org/wiki/Information_security 
  4. https://www.pcmag.com/picks/the-best-cloud-storage-and-file-sharing-services 

MSI101, Tarea 5

Requerimientos para la base de datos de un supermercado

Los elementos de una base de datos de un supermercado pueden ser muchos y muy variados dependiendo de las necesidades de la misma. Algunas elementos que podríamos considerar para una base de datos de un supermercado son: Personal de Operación, Personal Administrativo, Personal de Intendencia, Asistencia, Tiendas, Cajas, Recibos, Productos, Inventario, Promociones, etc.

Para efectos prácticos, este ejercicio se enfocara de forma breve en en Empleados, Productos y Recibos.

Empleados

  • ID
  • Nombres
  • Apellidos
  • Tienda

Asistencias

  • ID
  • Empleado
  • Entrada
  • Salida

Tienda

  • ID
  • Nombre
  • Dirección
  • Administrador

Cajas

  • ID
  • Tienda

Recibos

  • ID
  • Fecha
  • Caja
  • Cajero

Productos-Recibo

  • Producto
  • Cantidad
  • Recibo

Productos

  • Nombre
  • Descripción
  • Precio

Inventario

  • Producto
  • Tienda
  • Fecha
  • Cantidad

Entidades y relaciones de la base de datos de un supermercado

Principales elementos que necesitan una normalización de la base de datos

La normalización de una base de datos consiste en extraer los valores duplicados de una tabla en multiples tablas y generar las relaciones entre estas. En el caso de la base de datos del supermercado, algunos de los elementos que requirieron normalización para evitar duplicación fueron:

Empleados, Tienda, Caja, Productos, Productos en Inventario y Productos por recibo.

Crear una base de datos con al menos 200 entidades de contenido

La base de datos fue creada usando MySQL v4. Se adjunta el archivo SQL con la misma.

Supermercado.sql

MSI101, Tarea 4

Bases de datos

Una base de datos1 es, en el contexto más amplio, una colección organizada de datos. Si nos enfocamos en el area de sistemas computacionales el termino base de datos generalmente se usa como sinónimo de lo que se conoce como Sistema de Administración de Base de Datos (DMBS por sus siglas en ingles, Data Base Management System).

Un DMBS es un programa que permiten la interacción de los usuarios para capturar, consultar y realizar diversas operaciones con los datos contenidos en una o más bases de datos. Dependiendo de la implementación de dicho DBMS y la forma en la que están almacenados estos datos, un DBMS puede estar compuesto por varios programas especializados. En general, a la asociación de una base de datos con respectivo DBMS se le conoce como Modelo de Base de Datos.

Las bases de datos y sus DBMS pueden clasificarse dependiendo de su modelo, tipo de computadora en la que se ejecutan, lenguaje de consulta utilizado y su diseño interno. La clasificación más general de bases de datos incluye las bases de datos de navegación, relacionales, y post-relacionales.

Las bases de datos de navegación (1960’s, obsoletas) fueron las primeras en existir y se caracterizaban por necesitar de variables globales para mantener el estado de las mismas, requerir relaciones entre todos los registros, y por leer los registros de forma secuencial.

Con la mejora del hardware y software (19070’s) surgieron las bases de datos relacionales, las cuales permiten la abstracción de datos en diferentes tablas y la creación de relaciones entre dichos datos.

Finalmente las bases de datos post-realcionales son las mas nuevas y se caracterizan generalmente por no usar el mismo modelo de datos que una relaciona, esto es, en lugar de usar tablas con registros y columnas, se enfocan en otros paradigmas como llave-valor o basadas en documentos.

Elementos de una base de datos de una Universidad

Los elementos de una base de datos de una universidad pueden ser muchos y muy variados dependiendo de las necesidades de la misma. Algunas elementos que podríamos considerar para una base de datos de una universidad son: Personal Docente, Personal Administrativo, Otro Personal, Alumnos, Pagos, Planes de estudio, Materias, Cursos, Calificaciones, Asistencias y Participación.

Para efectos prácticos, este ejercicio se enfocara de forma breve en en maestros, materias, cursos y alumnos.

Personas

  • ID
  • Nombre
  • Apellidos

Maestros

  • ID de Persona

Alumnos

  • ID de Persona

Materias

  • ID
  • Nombre
  • Descripción

Cursos

  • ID
  • Descripción
  • Fecha de Inicio
  • Fecha de Fin

Maestros-Materias

  • ID de Maestro
  • ID de Materia

Cursos-Materias-Maestros

  • ID de Curso
  • ID de Materia
  • ID de Maestro

Cursos-Alumnos

  • ID de Curso
  • ID de Alumno

Calificaciones

  • ID de Curso
  • ID de Materia
  • ID de Alumno
  • Calificación

Relaciones

Principales consultas

  • Agregar un Maestro
    • Listar Personas
    • Listar Materias
    • Agregar Maestro
    • Agregar Materia a Maestro
  • Agregar un Alumno
    • Listar Personas
    • Agregar Alumno
  • Agregar un Curso
    • Listar Materias
      • Listar Maestros que dan Materia
    • Agregar Curso
    • Agregar Maestros y Materias a Curso
  • Inscribir Alumno en Curso
    • Listar Alumnos
    • Listar Cursos
    • Agregar Cursos-Alumnos
  • Agregar Calificación
    • Listar Cursos
    • Listar Materias en Curso
    • Listar Alumnos en Curso
    • Agregar Calificación

  1. https://en.wikipedia.org/wiki/Database 

MSI101, Tarea 3

Ensayo: ¿Qué es la Programación Orientada a Objetos?

La Programación Orientada a Objetos (POO) es un paradigma basado en la idea de objetos que tienen diferentes atributos y comportamientos. Dichos objetos pueden interactuar con otros objetos exponiendo algunos de sus comportamientos y atributos mientras mantienen el resto ocultos e inaccesibles del mundo exterior.1

En la POO existen diferentes conceptos que son clave para el entendimiento y uso de la misma. Los mas importantes son:

Clase: Plantilla (receta) en la que se define la estructura (propiedades) y comportamiento (métodos) que sera después usada para crear objetos (instancias).

Propiedad: Posición en la memoria de la computadora en la que se pueden almacenar valores conocidos o desconocidos y que pueden cambiar durante la ejecución de un programa.

Método: Grupo de instrucciones agrupadas de tal forma que permiten ser reutilizadas multiples veces dentro del mismo programa.

Objeto: Instancia de una clase.

Encapsulación: Técnica mediante la cual se evita que variables o lógica de la clase puedan ser usadas (leídas, modificadas) fuera de la misma de forma directa.

Composición: El uso de objetos dentro de otros objetos.

Herencia: Capacidad de definir nuevas clases (subclases) a partir de otras ya existentes. En muchos casos las subclases pueden no solo definir nuevas propiedad y métodos, sino cambiar el comportamiento de las ya existentes en la clase original.

Polimorfismo: Permite que diferentes subclases realicen diferentes comportamientos a partir de un mismo método definido en la superclase. Un ejemplo es el calculo del perímetro y area de diferentes figuras geométricas, la super clase solo define el nombre de los métodos y la forma a regresar el valor, y las subclases definen la lógica para calcular los resultados a partid de sus diferentes valores y formulas.

Diferencias con la programación estructurada

En programación estructurada el código se organiza generalmente en funciones y módulos, los cuales son después exportados o compartidos con otras funciones y módulos. Cuando se quiere reutilizar y/o modificar el comportamiento de una función se puede hacer mediante diferentes técnicas como mixin, currying, hooks y lambdas, por mencionar algunos.

Ejercicios

  1. Utilizando el lenguaje de programación de tu elección definir 4 clases y que en al menos 2 de estas se maneje la herencia.
  2. Demostrar cómo se crea un objeto en el lenguaje de programación seleccionado por el estudiante y cómo se accede a los métodos.
  3. Definir al menos un programa en el que se muestre 4 de los principales conceptos de la programación orientada a objetos y se pueda ejecutar en el lenguaje de programación Java.
/**
 * Main
 */
public class Main {

  // Demuestra composición al usar otros objetos dentro de un objeto.
  public static void main(String[] args) {

    Humano erick = new Humano("Erick");
    erick.habla();

    System.out.println("---");

    Perro masha = new Perro("Masha");
    masha.habla();
  }
}
/**
 * Humano
 */

// Demuestra herencia al usar una super clase
public class Humano extends Mamifero {
  public Humano(String nombre) {
    String[] extremidades = { "2 piernas", "2 brazos" };

    this.numExtremidades = 4;
    this.extremidades = extremidades;
    this.nombre = nombre;
  }
}
/**
 * Perro
 */

// Demuestra herencia al usar una super clase
public class Perro extends Mamifero {
  public Perro(String nombre) {
    String[] extremidades = { "4 patas" };

    this.numExtremidades = 4;
    this.extremidades = extremidades;
    this.nombre = nombre;
  }

  // Demuestra polimorfismo al modifica el comportamiento de un método
  // y manteniendo compatibilidad con el mismo.
  public void habla() {
    System.out.println("Ruf! Ruf!");
    super.habla();
    System.out.println("Ruf! Ruf!");
  }
}
/**
 * Mamifero
 */
public class Mamifero {

  // Demuestra encapsulacion al mantener las propiedades protegidas del uso
  // directo por otras clases.
  protected String nombre;
  protected int numExtremidades;
  protected String[] extremidades;

  public void habla() {
    System.out.println("Hola, mi nombre es " + this.nombre);
    System.out.println("Tengo " + this.numExtremidades + " extremidades: " + String.join(",", this.extremidades));
  }
}

  1. https://en.wikipedia.org/wiki/Object-oriented_programming 

MSI101, Tarea 2

Resumen

Variables1

Una variable es una posición en la memoria de la computadora en la que se pueden almacenar valores conocidos o desconocidos y que pueden cambiar durante la ejecución de un programa. Dependiendo del tipo de lenguaje los valores que pueden almacenar las variables pueden ser de diversos tipos (números, valores booleanos, cadenas de texto, referencias a otras variables, funciones, etc.) o de un solo tipo definido al momento de definir dicha variable.

Constantes

Una constante, como su nombre lo indica, es un valor predefinido y que no puede ser modificado durante la ejecución del programa. Las constantes son de gran utilidad, generalmente empleadas con los límites de determinados tipos de dato (número más grande o más chico que se puede usar) o constantes matemáticas (Pi), y también son especialmente útiles al definir valores que se utilizan en grandes bases de código, o para configurar determinados comportamientos de un programa al compilarlo.

Operadores2

Los operadores son los que nos permiten realizar diferentes tipos de operaciones con los valores (variables, constantes) de nuestro programa. Sin los operadores un programa seria de muy poco uso. Existen diferentes tipos de operadores y la forma de usarlos es generalmente constante entre diferentes lenguajes de programación. Algunos tipos de operadores que existen son: aritméticos (+, -, *, /), de comparación (>, <, ==, >=, <=), lógicos (AND o &&, OR o ||), binarios ( &, |, <<, >>), de asignación (=, +=, -=, *=, etc.)

Los operadores ademas de su tipo también pueden ser clasificados por la cantidad de parámetros que necesitan para ser utilizados. Los operadores unitarios (unary) solo requieren un parámetro y pueden colocarse antes o después del mismo (-x, y++). Los operadores binarios, requieren dos elementos, son los más comúnmente utilizados (a + b, x = y), y finalmente el operador ternario (?:), solo disponible en algunos lenguajes, que requiere de tres elementos (a ? b : c).

Condicionales3

Un condicional es una estructura de los lenguajes de programación que nos permite realizar (o no) determinadas acciones dependiendo de alguna condición, como puede ser el valor en una variable (o la falta del mismo), el resultado de la ejecución de una función, etc.

La forma más común de condicional es if la cual es seguida de una expresión cuyo resultado debe evaluarse como verdadero o falso. En muchos casos la ejecución de un if puede ser seguida de else la cual permite ejecutar instrucciones en caso que el resultado de la expresión haya sido falso. Es posible usar otro if dentro de un else para crear condiciones más elaboradas, pero la mayoría de los lenguajes proporcionan una estructura adicional, else if, la cual permite crear una bifurcación de varias ramas (if, else if, else if, ..., else).

Ciclos4

Un ciclo o bucle permite la ejecución repetida de un bloque de código mientras se cumplan (o no) determinadas condiciones. Los bucles más comunes en los lenguajes de programación son for y while; dependiendo del lenguaje de programación pueden existir otros ciclos relativamente comunes como do while y foreach, pero estos son generalmente atajos de sintaxis de los ciclos básicos.

La diferencia principal entre for y while es que el primero se usa generalmente cuando se conoce el numero de veces que se debe ejecutar el bloque de código; en el caso del segundo es más comúnmente usado cuando no conocemos el numero de veces que se debe repetir el bloque, pero conocemos la condición que nos va a decir cuando parar.

Funciones5

Una función es un grupo de instrucciones agrupadas de tal forma que permiten ser reutilizadas multiples veces dentro del mismo programa. La funciones pueden servir para generalizar ciertos bloques de código al permitir pasarles diferentes valores. Una función puede ser tan corta o tan larga como sea necesario pero generalmente se considera una buena practica el hacer funciones pequeñas y que realicen una sola tarea. Una función puede usarse para simplificar otros bloques de código y puede o no regresar el resultado de su ejecución.

Algoritmo

Solicitar primer numero
Si el valor recibido no es un numero, solicitar nuevamente
Solicitar segundo numero
Si el valor recibido no es un numero, solicitar nuevamente
Imprimir resultado de sumar los numeros recibidos

Pseudocódigo

REPETIR
    LEE n1
MIENTRAS n1 no sea numero
REPETIR
    LEE n2
MIENTRAS n2 no sea numero
IMPRIME n1 + n2

Diagrama

Programa

const readline = require("readline");
const numbers = 2;

function reader(prompt) {
  return new Promise((resolve, reject) => {
    const rl = readline.createInterface({
      input: process.stdin,
      output: process.stdout
    });

    rl.question(`${prompt}: `, input => {
      rl.close();
      const value = Number(input);
      input.trim() && Number.isFinite(value) ? resolve(value) : reject();
    });
  });
}

async function main() {
  const values = [];

  for (let i = 0; i < numbers; i++) {
    do {
      try {
        values[i] = await reader(`Give me a number [${i + 1}]`);
      } catch (error) {
        console.log("Invalid input, please try again");
      }
    } while (values[i] === undefined);
  }

  console.log(
    `The result is: ${values.reduce((result, current) => result + current, 0)}`
  );
}

main();

  1. https://en.wikipedia.org/wiki/Variable_(computer_science) 
  2. https://en.wikipedia.org/wiki/Operator_(computer_programming) 
  3. https://en.wikipedia.org/wiki/Conditional_(computer_programming) 
  4. https://en.wikipedia.org/wiki/Control_flow#Loops 
  5. https://en.wikipedia.org/wiki/Subroutine 

MSI101, Tarea 1

Tarea 1

MSI101 Fundamentos de Programación y Base de Datos
Universidad Ducens

Ensayo

Entregar un ensayo definiendo que es la programación para el estudiante.

¿Qué es la programación?

Dependiendo del contexto, la palabra programación puede tomar diferentes significados, desde el hecho de programar una cita con el dentista, pasando por programar el código correcto en un control universal para controlar diferentes equipos electrónicos en el hogar, y obviamente el tema que nos concierne, el hacer que una computadora realice una tarea determinada.

En un contexto general, podemos definir programación cómo la acción de resolver un problema o una tarea mediante una serie de instrucciones o pasos ordenados que produzcan resultados consistentes. Programación, en el contexto de las Ciencias de la Computación es, según el Diccionario Oxford de la Lengua Inglesa “El proceso de escribir y probar programas de computadora”; así mismo, el Diccionario de la Real Academia Española (RAE) la define como “Elaborar programas para su empleo en computadoras”.

Como podemos ver existe un punto en común entre estas definiciones incluso al ser en idiomas diferentes, este es la palabra programa. Pero entonces ¿qué es un programa? Si buscamos su definición en el RAE encontraremos lo siguiente: “Conjunto unitario de instrucciones que permite a una computadora realizar funciones diversas, como el tratamiento de textos, el diseño de gráficos, la resolución de problemas matemáticos, el manejo de bancos de datos, etc.”, por lo tanto, tomando nuestra definición general y aplicándola en el contexto de CS podemos decir que la programación es ”La elaboración de una serie de instrucciones que permite a una computadora realizar funciones diversas”.

Ahora bien, desde mi punto de vista, la programación no solo implica saber escribir dichas instrucciones para resolver el problema sino que va mucho mas allá, ya que para poder resolver un problema debemos primero entenderlo, analizar lo que se debe hacer y como se debe hacer, se debe conocer los resultados o al menos como validar que estos sean correctos, y como asegurar que los resultados sigan siendo correctos después de realizar cambios a las instrucciones iniciales.

Algoritmos

Definir un algoritmo para las siguientes actividades: Cocinar Hot Cakes, Preparar un Banquete, Salir de Viaje, Estudiar.

Cocinar Hot Cakes

Fuente: https://www.marthastewart.com/338185/basic-pancakes

  • Obtener ingredientes:
    • 1 taza de harina
    • 2 cucharadas de azúcar
    • 2 cucharaditas de polvo para hornear
    • 1/2 cucharadita de sal
    • 1 taza de leche
    • 2 cucharadas de mantequilla sin sal derretida
    • 1 huevo grande
    • 1 cucharada de aceite vegetal
  • Obtener utensilios:
    • 1 recipiente pequeño
    • 1 batidor de globo
    • 1 recipiente mediano
    • 1 sartén grande
    • 1 cuchara
    • 1 espátula
    • 1 plato
  • En el recipiente pequeño mezcla con el batidor de globo el harina, azúcar, polvo para hornear y sal.
  • En el recipiente mediano mezcla con el batidor de globo la leche, mantequilla y el huevo.
  • Agrega al recipiente mediano los ingredientes secos que están en el recipiente pequeño y mezcla brevemente.
  • Calienta el sartén grande a fuego medio. Humedece el interior del sartén con un poco de aceite.
  • Vierte de 2 a 3 cucharadas de la mezcla en el sartén usando la cuchara para extender la mezcla en forma circular.
  • Cocina hasta que la superficie tenga algunas burbujas y algunas de ellas se han abierto (aproximadamente 2 minutos).
  • Voltea con cuidado el hotcake con una espátula y cocina hasta que la parte inferior se vea cafe claro (aproximadamente 2 minutos).
  • Retira el hotcake del sartén y colócalo en un plato.
  • Repite los pasos anteriores hasta que se termine la mezcla.

Preparar un Banquete

  • Solicitar el numero de personas para el banquete, la fecha y el menu deseado.
  • Confirmar si hay personas con requerimientos especiales, en cuyo caso se deberá solicitar la cantidad de personas y sus menus.
  • Uno o dos días antes del banquete comprar los ingredientes para la elaboración de todos los tiempos del menu.
  • De seis a ocho horas antes del banquete iniciar la elaboración de los platillos.

Salir de Viaje

  • Decidir el destino, la fecha y la duración del viaje.
  • Dias (o incluso meses) antes de la fecha del viaje investigar si hay requisitos especiales, como visas, vacunas, reservaciones, etc.
  • Cotizar y reservar los diferentes medios de transporte (avión, tren, barco, etc.).
  • Cotizar y reservar el hospedaje en el/los destinos del viaje.
  • Dias (o semanas) antes del viaje investigar el clima promedio para las fechas del viaje.
  • Según el clima en el/los destinos comprar ropa adecuada que haga falta.
  • Un par de días antes del viaje preparar la maleta con la ropa, artículos de aseo personal y accesorios necesarios. Preferentemente hacer una lista de lo que se guardó en la maleta para revisar al regreso que no se olvide nada.
  • El día del viaje, un par de horas antes de salir, revisar que no se olviden documentos necesarios para el viaje (identificaciones, pasaportes, visas, tarjetas de crédito, etc.).

Estudiar

  • Decidir el tema a estudiar.
  • Recopilar material de estudio.
  • Preparar el lugar de estudio, cómodo, sin distracciones, y con todo lo necesario a la mano.
  • Preparar material de apoyo, como libreta de apuntes, bolígrafo, etc.
  • Si el material de estudio es en formato digital, cerrar programas que puedan distraer y poner los dispositivos en modo no molestar.
  • Leer detenidamente el material de estudio escrito.
  • Ver / escuchar el material de estudio multimedia.
  • Hacer ejemplos basados en el material estudiado para reafirmar los nuevos conocimientos.

Pseudocódigo

Pasar los algoritmos definidos en el punto anterior a pseudocódigo.

Cocinar Hot Cakes

DEFINE Ingredientes = [ 
    "1 taza de harina", 
    "2 cucharadas de azúcar", 
    "2 cucharaditas de polvo para hornear", 
    "1/2 cucharadita de sal", 
    "1 taza de leche", 
    "2 cucharadas de mantequilla sin sal derretida", 
    "1 huevo grande", 
    "1 cucharada de aceite vegetal" 
]

DEFINE Utensilios = [ 
    "1 recipiente pequeño", 
    "1 batidor de globo", 
    "1 recipiente mediano", 
    "1 sartén grande", 
    "1 cuchara", 
    "1 espátula", 
    "1 plato"
]

OBTENER Ingredientes
OBTENER Utensilios

CON "recipiente pequeño", "batidor de globo" COMO "utensilios" EN Utensilios 
Y CON "harina", "azúcar", "polvo para hornear", "sal" COMO "ingredientes" EN Ingredientes:
  MEZCLA "ingredientes" CON "utensilios" COMO "ingredientes secos"

CON "recipiente mediano", "batidor de globo" COMO "utensilios" EN Utensilios 
Y CON "leche", "matequilla", "huevo" COMO "ingredientes" EN Ingredientes:
  MEZCLA "ingredientes" CON "utensilios" COMO "ingredientes húmedos"

CON "recipiente mediano", "batidor de globo" COMO "utensilios" EN Utensilios 
Y CON "ingredientes secos", "ingredientes humedos" COMO "ingredientes":
  MEZCLA(brevemente) "ingredientes" CON "utensilios" COMO "mezcla"

CON "sartén grande" COMO "sartén", "cuchara", "espátula", "plato" EN Utensilios 
Y CON "aceite" EN Ingredientes:
  MIENTRAS hay "mezcla"
    APLICA(poco) "aceite" EN "sartén"
    CALIENTA(medio) "sartén"
    MIENTRAS hay espacio EN "sartén":
      VIERTE(circular) "mezcla" CON "cuchara" EN "sartén" COMO "hotcake"
    SI hay burbujas EN "hotcake" Y algunas burbujas están abiertas
      VOLTEA(cuidado) "hotcake" CON "espátula"
    SI parte inferior EN "hotcake" ES cafe claro
      RETIRA "hotcake" DE "sartén" EN "plato"

Preparar un Banquete

SOLICITAR "numero de personas"
SOLICITAR "fecha"
SOLICITAR "menu"
SOLICITAR "requerimientos especiales"
SI "requerimientos especiales":
  SOLICITAR "numero de personas"
  SOLICITAR "menus"
SI AHORA = "fecha" - 2 dias:
  COMPRAR ingredientes en [ "menu", "requerimientos especiales"."menu" ]
SI AHORA =  "fecha" - 8 horas:
  ELABORAR [ "menu", "requerimientos especiales"."menu" ]

Salir de Viaje

SOLICITAR "destino"
SOLICITAR "fecha"
SOLICITAR "duración"
SI AHORA < "fecha" - 1 mes:
  RESERVA "transporte"
  RESERVA "hotel"
  COMPRA "ropa adecuada"
  COMPRA "accesorios"
SI AHORA = "fecha" - 2 dias:
  PREPARA "maleta"
  RECOPILA "lista" DE "maleta"
SI AHORA = "fecha":
  VERIFICA "identificaciones", "pasaportes", "visas", "tarjetas de credito" EN "maleta"

Estudiar

DECIDIR "tema"
RECOPILAR "material de estudio"
PREPARAR "lugar de estudio"
PREPARAR "material de apoyo"
SI "material de estudio" ES digital:
    CERRAR programas
    ACTIVAR DND
LEER | VER | ESCUCHAR (detenidamente) "material de estudio"
PRACTICAR "ejemplos" DE "material de estudio"

Diagramas

Crear el diagrama de cada algoritmo definido en el punto anterior.

Cocinar Hot Cakes

Preparar un Banquete

Salir de Viaje

Estudiar

Clasificación de los Lenguajes de Programación Actuales

Dada la amplitud de la pregunta, solo se puede proporcionar una respuesta igual de amplia.

Algunas formas de clasificar a los lenguajes de programación actuales son:

Bajo Nivel1

Proveen poca o nula abstracción de la arquitectura y lenguaje de maquina. Se denominan de “bajo” nivel dado que sus instrucciones son muy similares (sino idénticas) a las instrucciones de la arquitectura del procesador para el que son programadas.

Ejemplos de lenguajes de bajo nivel: Código de maquina, Language ensamblador.

Alto Nivel2

Implementan abstracciones de alto nivel, proveyendo de palabras clave (generalmente en Inglés), variables, operadores, etc. que evitan o esconden los detalles del lenguaje de maquina, registros, memoria, la arquitectura del procesador, etc.

Ejemplos de lenguajes de alto nivel: Python, Java, Perl, PHP, JavaScript, etc.

Fuertemente Tipados3

Lenguajes de alto nivel en el que el sistema de tipos cuenta con una serie de reglas estrictas que son validadas a la hora de compilar.

Ejemplos de lenguajes fuertemente tipados: C, Java.

Debilmente Tipados3

Lenguajes de alto nivel con sistemas de tipos mas flexibles los cuales permiten almacenar y/o convertir automáticamente en tiempo de ejecución diferentes tipos de datos.

Ejemplos de lenguajes débilmente tipados: PHP, JavaScript.

Compilados4

Languajes cuyo código fuente es traducido a un archivo en lenguaje de maquina para luego ser distribuido y utilizado en forma binaria. La definición es algo vaga pues en teoría cualquier lenguaje de programación puede ser compilado e interpretado.

Ejemplos de lenguajes compilados: C, C++, Java, Go, Rust, Swift.

Interpretados5

Lenguajes cuyos programas son distribuidos generalmente en forma de código fuente y sus instrucciones son ejecutadas por un interprete linea por linea al ser ejecutados. En la actualidad muchos lenguajes interpretados son realmente híbridos, esto es, compilados a un modo intermedio optimizado para el motor que lo va a terminar compilando y ejecutando.

Ejemplos de lenguajes interpretados: JavaScript, PHP, Lisp, Ruby, Tcl, etc.

Transcompilados6

Lenguajes que son traducidos a otro lenguaje de programación antes de ser compilados o interpretados. Generalmente se consideran “super sets” del lenguaje de destino que agregan funcionalidad no existente o simplifican el exceso de código necesario para realizar determinadas tareas.

Ejemplos de lenguajes transcompilados: TypeScript, Flow, Elm, ClojureScript, CoffeeScript, etc.


  1. https://en.wikipedia.org/wiki/Low-level_programming_language 
  2. https://en.wikipedia.org/wiki/High-level_programming_language 
  3. https://en.wikipedia.org/wiki/Strong_and_weak_typing 
  4. https://en.wikipedia.org/wiki/Compiled_language 
  5. https://en.wikipedia.org/wiki/Interpreted_language 
  6. https://en.wikipedia.org/wiki/Source-to-source_compiler 

Automation with CLI and Node

In this article you will read about my love and experience about automation, the experiences I have had for several years with different teams, a real live case of automation, and how I solved it from manual process to a personal tool, to a sharable CLI tool for my team.


If you have had a tech discussion with me or you listen to my podcast (in Spanish 🇲🇽), you’ll most likely know I love automation. Almost every time I have to do something manually, I’ll find a way to do it as automated as possible, so I do not have to keep repeating the same things over and over again. That is what computers are for, right? Do repetitive tasks, do it fast, and do it right.

Over the years, I’ve seen two kinds of people, those of us who love automation, and the rest of the world who don’t care at all. Surprisingly, it is the same with tech- and non-tech-savvy people, I would love to say all my co-workers on my different jobs are automation lovers, but the reality is that most of them are on the other side of the coin.

One thing I have noticed about the tech-savvy people is that we usually like using tools to do our job. I have some excellent automation tools on my belt: Shell Scripts, Automator, Alfred, Keyboard Maestro (my favorite) to mention some and recently I’ve had the opportunity to save myself much time on a task we have to do regularly. In a nutshell, every time we finish a feature, we need to hand over the feature to our QA team so they can validate it, but given the complexity of the project and the build pipeline, there is no easy way to know when a feature will be deployed to a testing environment. Someone has to find the latest commit SHA manually and then go into the CI/CD tool, look at the most recent build, open the build log, and verify what the latest commit used was. So I decided to put on my Automator hat (as if I ever took it off, 🤣) and do something about it.

For the sake of this story/demo, let’s say that for some reason I need to go to a GitHub repo to get the most recent commit SHA, who did it, and the CI/CD status, and that there are no APIs available to me to accomplish this task. I know there are APIs for GitHub, but bear with me, it is only for demo purposes.

The first step was to manually do what I needed to do, but not the usual repetitive, almost automated way; instead, I did pay close attention to all my actions, clicks, etc. Once I figured out what I was doing, I went ahead with the first automation step.

My first automated take at this was to use Keyboard Maestro. I was able to automate Safari to open a new tab, go to the URL I needed, using JavaScript get the information I needed from the website and show a notification and put it on the clipboard so I could paste it later on another place.

And when run, it looks like this:

After some testing and a couple of real-life uses, I noticed one thing. I do not need to authenticate to this page to grab the information, so I do not need Safari (or KM).

const request = require('request');
const cheerio = require('cheerio');

const url = 'https://github.com/microsoft/vscode/commits/master';

request.get(url, (error, response, body) => {
    const $ = cheerio.load(body);

    const author = $('.commit-author')
        .first()
        .text();

    const build = $('.commit-indicator summary')
        .first()
        .attr('class')
        .replace('text-', '')
        .replace('color-yellow-7', 'yellow');

    const sha = $('.sha')
        .first()
        .text()
        .trim();

    console.log(`Author ${author}, Build: ${build}, SHA: ${sha}`);
});

Again, success. I was able to get the same information from the terminal (or from KM if I want to skip the terminal altogether).

Then, I realized this could be slightly harder to share because a single script has no package.json attached to it, so my next thought was to create a repo on our internal Git and share the tool bur wait, if I am already doing a repo and a script, why no open the gate to more contributions from my co-workers? So I went one step further and instead of just doing a script, I went ahead and created a simple CLI tool.

A quick search took me to oclif, a Node.js CLI Framework from Heroku. Very handy, and easy to understand, and it uses TypeScript, so I tested it immediately (spoiler alert, loved it). After quickly following their getting started guide I was able to add a new command (I went with the multi command version) and almost entirely copy/paste my script’s code.

import { Command } from '@oclif/command';
import cheerio from 'cheerio';
import cli from 'cli-ux';
import request from 'request-promise-native';

const url = 'https://github.com/microsoft/vscode/commits';

export default class LatestSha extends Command {
  static description = 'get the author, build status, and sha of the latest commit of a given branch';

  static args = [{ name: 'branch' }];

  async run() {
    const { args } = this.parse(LatestSha);
    const branch = args.branch || 'master';

    let body = '';

    cli.action.start('loading commit data');

    try {
      body = await request.get(`${url}/${branch}`);
      cli.action.stop('done\n');
    } catch (error) {
      cli.action.stop('fail\n');
      this.error('unable to load commit data from GitHub');
      this.error(error);
      this.exit(1);
    }

    try {
      const $ = cheerio.load(body);

      const author = $('.commit-author')
        .first()
        .text();

      const build = $('.commit-indicator summary')
        .first()
        .attr('class')
        .replace('text-', '')
        .replace('color-yellow-7', 'yellow');

      const sha = $('.sha')
        .first()
        .text()
        .trim();

      this.log(`Author ${author}, Build: ${build}, SHA: ${sha}`);
    } catch (error) {
      this.error('unable to read commit info from GitHub');
      this.error(error);
      this.exit(1);
    }
  }
}

After linking the cli tool using npm link I can simply run it as any other CLI tool:

[email protected]:~
➤ demo-tool latest-sha
loading commit data... done

Author aeschli, Build: green, SHA: c8f0b1c

The full demo-tool code is in a GitHub repo if you want to take a look 👀.

In the end, happy automator 🤓 shares tool with now happier co-workers 👏🏻.


Photo by Franck V. on Unsplash

Web Workers Embebidos

Recientemente en la oficina estuve trabajando con algunos problemas de rendimiento en unos componentes con tareas pesadas para el procesador, y entre las lluvias de ideas que tuvimos para solucionar los mismos salió el tema de los Web Workers; debo de confesar que usarlos siempre me ha dado curiosidad pero a la fecha no había tenido oportunidad mas que de probarlos en un par de ocaciones y solo por experimentar.

Continue reading “Web Workers Embebidos”