Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Teoría
REST definición:
1.- REST (Representational State Transfer) es un estilo arquitectónico utilizado en el diseño
de sistemas distribuidos que se basa en los principios de la web y que se utiliza
principalmente en el desarrollo de servicios web y aplicaciones web.
Principios de REST
Los principios fundamentales de REST incluyen:
1. Arquitectura cliente-servidor: en la que el cliente y el servidor son sistemas
independientes que se comunican a través de una interfaz uniforme.
2. Separación de preocupaciones: en la que las diferentes preocupaciones (como el
almacenamiento de datos, la lógica de negocios y la presentación de datos) se
separan en capas distintas, lo que mejora la flexibilidad y la escalabilidad del
sistema.
3. Interfaz uniforme: en la que la interfaz de un servicio web o una aplicación web sigue
un conjunto de convenciones y restricciones comunes, lo que facilita la
interoperabilidad entre sistemas.
4. Estado de transferencia representacional (REST): en el que los datos que se
transfieren entre el cliente y el servidor son representados como recursos que
pueden ser identificados y manipulados mediante identificadores uniformes de
recursos (URIs) y operaciones estándar de HTTP, como GET, POST, PUT y
DELETE.
5. Sistema sin estado: en el que cada solicitud que hace el cliente al servidor contiene
toda la información necesaria para realizar la solicitud y el servidor no mantiene
ningún estado entre solicitudes.
204 No Content (sin contenido): se utiliza para indicar que la solicitud se ha completado
correctamente, pero la respuesta no contiene ningún contenido.
300 Multiple Choices (opciones múltiples): se utiliza para indicar que la solicitud tiene más
de una respuesta posible. El servidor incluirá una lista de opciones y el cliente debe
seleccionar una.
400 Bad Request (solicitud incorrecta): se utiliza para indicar que la solicitud realizada por el
cliente es incorrecta o mal formada. Esto puede deberse a una sintaxis incorrecta o a
parámetros de solicitud inválidos.
401 Unauthorized (no autorizado): se utiliza para indicar que la solicitud no ha sido
autorizada. El cliente debe proporcionar credenciales válidas para acceder al recurso
solicitado.
403 Forbidden (prohibido): se utiliza para indicar que el servidor ha entendido la solicitud,
pero se niega a cumplirla. Esto puede deberse a que el cliente no tiene los permisos
necesarios para acceder al recurso solicitado.
404 Not Found (no encontrado): se utiliza para indicar que el recurso solicitado no se ha
encontrado en el servidor. Esto puede deberse a que la URL solicitada es incorrecta o el
recurso ha sido eliminado.
500 Internal Server Error (error interno del servidor): se utiliza para indicar que ha ocurrido
un error en el servidor mientras procesaba la solicitud. Esto puede deberse a un error en el
código del servidor o a problemas con la configuración del servidor.
Los verbos idempotentes son aquellos que pueden ser ejecutados varias veces sin
que se modifiquen los resultados de la operación, en otras palabras, realizar la misma
operación varias veces produce el mismo resultado que realizarla una sola vez.
● HEAD: es similar a GET, pero solo solicita las cabeceras del recurso, no su cuerpo.
Como no tiene efecto en el recurso, también se considera un verbo idempotente.
Los patrones de diseño no son códigos completos, sino que son modelos abstractos que
describen la estructura y el comportamiento de los objetos y las clases involucradas en el
problema. Los patrones de diseño permiten a los desarrolladores de software crear software
más eficiente y flexible, ya que pueden utilizar soluciones probadas en lugar de reinventar la
rueda cada vez que se enfrentan a un problema común de diseño.
Además, los patrones de diseño promueven una mejor organización y estructura del código,
lo que facilita la comprensión, el mantenimiento y la escalabilidad del software.
mvn install: Este comando de Maven compila el proyecto y empaqueta el código fuente en
un archivo .jar o .war, y luego lo instala en el repositorio local de Maven. Este comando
también descarga cualquier dependencia necesaria para compilar y ejecutar el proyecto.
mvn package: Este comando de Maven compila el proyecto y empaqueta el código fuente
en un archivo .jar o .war, pero no lo instala en el repositorio local de Maven. Este comando
es útil para construir el proyecto sin tener que instalarlo en el repositorio local.
mvn -U: Este comando de Maven obliga a Maven a actualizar las dependencias del
proyecto, incluso si ya se han descargado en el repositorio local de Maven. Este comando
es útil si hay actualizaciones de dependencias que no se reflejan en la versión actual del
proyecto.
INFO: El nivel de registro INFO se utiliza para registrar información útil sobre el
funcionamiento del software que puede ser de interés para el usuario final o el equipo de
soporte. Los mensajes de registro INFO son útiles para seguir el flujo de ejecución del
software y para proporcionar información relevante para la solución de problemas.
git status: Este comando muestra el estado actual del repositorio de Git, incluyendo los
archivos que han sido modificados, eliminados o agregados al repositorio desde la última
confirmación.
git log: Este comando muestra el historial de confirmaciones (commit) del repositorio,
incluyendo el autor de cada confirmación, la fecha y la hora de la confirmación, y el mensaje
de confirmación asociado.
git branch: Este comando muestra una lista de ramas disponibles en el repositorio,
incluyendo la rama actual en la que se encuentra el usuario. Este comando también puede
ser utilizado para crear, eliminar y cambiar de ramas.
git remote: Este comando muestra una lista de repositorios remotos configurados para el
repositorio local, incluyendo la URL de cada repositorio remoto.
git diff: Este comando muestra las diferencias entre dos versiones del código, como la
diferencia entre la versión actual y la última confirmación, o entre dos ramas diferentes.
Lopez Hernandez Luis Ricardo
Evidencia de estudio para Certificacion ASO
Comandos básicos de Git (clone, add, checkout, commit, push, pull)
● git clone: Este comando se utiliza para crear una copia local de un repositorio
remoto. La sintaxis básica de este comando es "git clone <URL del repositorio>". Por
ejemplo, "git clone https://github.com/user/repo.git" clonaría un repositorio llamado
"repo" propiedad del usuario "user" en GitHub.
● git add: Este comando se utiliza para agregar archivos al área de preparación
(staging area) para ser incluidos en la próxima confirmación. La sintaxis básica de
este comando es "git add <nombre del archivo>". Por ejemplo, "git add archivo.txt"
agregará el archivo "archivo.txt" al área de preparación.
● git commit: Este comando se utiliza para confirmar los cambios realizados en el
repositorio. La sintaxis básica de este comando es "git commit -m 'mensaje de
confirmación'". Por ejemplo, "git commit -m 'Agregado archivo.txt'" confirmaría los
cambios realizados en el archivo "archivo.txt" con el mensaje "Agregado archivo.txt".
● git checkout: Este comando se utiliza para cambiar entre ramas o para restaurar
archivos a una versión anterior del repositorio. La sintaxis básica de este comando
es "git checkout <rama o hash de confirmación>". Por ejemplo, "git checkout master"
cambiaría a la rama principal del repositorio.
● git push: Este comando se utiliza para enviar los cambios confirmados en el
repositorio local al repositorio remoto. La sintaxis básica de este comando es "git
push <nombre del repositorio remoto> <rama>". Por ejemplo, "git push origin master"
enviaría los cambios confirmados en la rama principal del repositorio local al
repositorio remoto llamado "origin".
● git pull: Este comando se utiliza para actualizar el repositorio local con los cambios
realizados en el repositorio remoto. La sintaxis básica de este comando es "git pull
<nombre del repositorio remoto> <rama>". Por ejemplo, "git pull origin master"
actualizaría la rama principal del repositorio local con los cambios realizados en el
repositorio remoto llamado "origin".
Lopez Hernandez Luis Ricardo
Evidencia de estudio para Certificacion ASO
Archivo de configuración - Docker file
Dockerfile es un archivo de texto plano que se utiliza para definir los pasos necesarios para
crear una imagen de Docker. La imagen de Docker es un paquete autónomo que contiene
todo lo necesario para ejecutar una aplicación, incluyendo el código, las bibliotecas y las
dependencias.
● FROM: Esta instrucción se utiliza para especificar la imagen base que se utilizará
como punto de partida para construir la nueva imagen. Por ejemplo, "FROM
ubuntu:20.04" especifica que la nueva imagen se basará en la imagen de Ubuntu
20.04.
● COPY: Esta instrucción se utiliza para copiar archivos desde el host al contenedor
de la imagen durante el proceso de construcción. Por ejemplo, "COPY app.py /app/"
copiaría el archivo "app.py" desde el host al directorio "/app/" dentro del contenedor.
● EXPOSE: Esta instrucción se utiliza para especificar los puertos que deben ser
expuestos por la imagen. Por ejemplo, "EXPOSE 8080" especifica que la imagen
debe exponer el puerto 8080.
Son anotaciones que se utilizan para definir el papel que cumple una clase en una
aplicación. Los estereotipos se utilizan en el marco de inversión de control (IoC) de Spring
para indicar cómo se debe tratar una clase dentro del contexto de la aplicación.
● @Service: es una anotación que se utiliza para marcar una clase como un servicio
de la aplicación. Esta anotación indica que la clase se encarga de la lógica de
negocio de la aplicación y que es un componente importante de la misma.
● @Repository: es una anotación que se utiliza para marcar una clase como un
repositorio de datos. Esta anotación indica que la clase se encarga de la
comunicación con la capa de persistencia de la aplicación y que es un componente
importante de la misma.
Lopez Hernandez Luis Ricardo
Evidencia de estudio para Certificacion ASO
IoC Spring
La inyección de dependencias (DI) es una técnica que se utiliza para proveer las
dependencias de una clase desde el exterior, en lugar de que la clase las cree
internamente. En Spring, la DI se lleva a cabo mediante el contenedor de Spring, que
inyecta las dependencias en las clases que lo necesitan.
En resumen, el IoC de Spring es una técnica que se utiliza para reducir el acoplamiento
entre los componentes de una aplicación, lo que permite una mayor flexibilidad y
escalabilidad. El contenedor de Spring implementa el IoC mediante el uso de un conjunto de
interfaces y clases que permiten la configuración y administración de los objetos en la
aplicación, incluyendo la inyección de dependencias y los estereotipos de Spring.
Lopez Hernandez Luis Ricardo
Evidencia de estudio para Certificacion ASO
Archivo de configuración de Spring config.xml, applicationContext.xml y
business-service.xml
Los Anti-patrones son soluciones comunes pero inefectivas o incluso perjudiciales para
problemas en el diseño de software. Estos patrones son una especie de anti-patrones de
diseño y se deben evitar en la medida de lo posible. A continuación, se presentan algunos
ejemplos de Anti-patrones con ejemplos gráficos:
2. Singleton Abusivo: Este Anti-patrón se refiere al uso excesivo del patrón Singleton. Esto
puede llevar a problemas de acoplamiento y dificultades para probar y mantener el código.
Blob (masa de código) es un patrón anti-diseño en el que una sola clase o módulo se
vuelve extremadamente grande y difícil de entender o mantener. En general, esto ocurre
cuando los desarrolladores agregan más y más funcionalidad a una clase o módulo sin
separarla en componentes más pequeños y manejables.
```java
public class Persona {
private String nombre;
private int edad;
En este ejemplo, la clase "Persona" tiene dos atributos "nombre" y "edad", que se
mantienen privados. Los métodos "set" y "get" se utilizan para acceder y actualizar los
valores de estos atributos.
2. Herencia: Permite que una clase herede los atributos y métodos de otra clase. La clase
heredada se llama subclase y la clase de la que se hereda se llama superclase. Por
ejemplo:
```java
public class Vehiculo {
private int velocidad;
En este ejemplo, la clase "Coche" es una subclase de la clase "Vehiculo". La clase "Coche"
hereda los atributos y métodos de la clase "Vehiculo" y también agrega un nuevo atributo
"numeroPuertas" y los métodos "set" y "get" para acceder y actualizar ese atributo.
3. Polimorfismo: Permite que una clase tenga múltiples formas o comportamientos. Esto se
logra mediante la implementación de métodos con el mismo nombre en diferentes clases.
Por ejemplo:
```java
public class Animal {
public void hacerSonido() {
System.out.println("El animal hace un sonido.");
}
}
```java
public abstract class Figura {
public abstract double calcularArea();
}
```java
public class Calculadora {
public int sumar(int a, int b) {
return a + b;
}
En este ejemplo, la clase "Calculadora" tiene tres métodos llamados "sumar", pero cada uno
tiene una lista de parámetros diferente. El primer método suma dos enteros, el segundo
método suma dos números de punto flotante y el tercer método suma tres enteros.
La sobrecarga de métodos en Java permite que los programas sean más flexibles y
legibles, ya que se pueden utilizar nombres de métodos intuitivos y descriptivos,
independientemente de los diferentes tipos de datos o la cantidad de argumentos que se
necesiten para realizar una operación específica.
Lopez Hernandez Luis Ricardo
Evidencia de estudio para Certificacion ASO
Diferencia entre interfaz y clase abstracta
La diferencia principal entre una interfaz y una clase abstracta en la programación orientada
a objetos es cómo se utilizan y cómo definen la estructura y el comportamiento de las clases
que las implementan. A continuación, se describen las diferencias clave entre una interfaz y
una clase abstracta con ejemplos:
Interfaz:
- Una interfaz en Java es una colección de métodos abstractos (sin implementación) y
constantes. No puede contener variables de instancia ni métodos concretos.
- Las interfaces se utilizan para definir un conjunto de métodos que una clase debe
implementar. Representan un contrato que una clase debe cumplir.
- Una clase puede implementar múltiples interfaces.
- Las interfaces permiten lograr la abstracción pura y la separación de la implementación del
comportamiento.
- Los métodos en una interfaz son implícitamente públicos y abstractos, y las constantes
son implícitamente públicas, estáticas y finales.
Ejemplo de interfaz:
```java
public interface Vehiculo {
void acelerar();
void frenar();
}
En este ejemplo, la interfaz "Vehiculo" define dos métodos, "acelerar" y "frenar". La clase
"Coche" implementa la interfaz "Vehiculo" y proporciona una implementación concreta de los
métodos definidos en la interfaz.
Clase abstracta:
- Una clase abstracta en Java es una clase que no se puede instanciar directamente y se
utiliza como base para otras clases. Puede contener métodos abstractos (sin
implementación) y métodos concretos (con implementación).
- Las clases abstractas se utilizan para definir una estructura común y compartir
comportamiento entre múltiples clases relacionadas.
- Una clase puede heredar de una sola clase abstracta.
Lopez Hernandez Luis Ricardo
Evidencia de estudio para Certificacion ASO
- Las clases abstractas permiten definir métodos concretos (con implementación) y
proporcionar una implementación básica para los métodos abstractos.
```java
public abstract class Animal {
private String nombre;
En este ejemplo, la clase "Animal" es una clase abstracta que tiene un constructor y un
método concreto "dormir", junto con un método abstracto "hacerSonido". La clase "Perro"
hereda de la clase "Animal" y proporciona una implementación concreta del método
abstracto "hacerSonido".
En resumen, la principal diferencia entre una interfaz y una clase abstracta es que una
interfaz solo contiene métodos abstractos y no puede contener implementaciones, mientras
que una clase abstracta puede contener tanto métodos abstractos como métodos concretos
y se utiliza como una base para otras clases relacionadas. Las interfaces se utilizan para
definir contratos y lograr la abstracción
Polimorfismo, definición
Polimorfismo: Permite que una clase tenga múltiples formas o comportamientos. Esto se
logra mediante la implementación de métodos con el mismo nombre en diferentes clases.
Lopez Hernandez Luis Ricardo
Evidencia de estudio para Certificacion ASO
Modificadores de acceso
1. Public:
- Los miembros declarados como públicos son accesibles desde cualquier lugar, ya sea
desde dentro de la misma clase, desde una clase en el mismo paquete o desde una clase
en un paquete diferente.
- Se utiliza para declarar miembros que deben ser accesibles desde cualquier lugar.
- Ejemplo:
```java
public class Ejemplo {
public int numeroPublico;
public void metodoPublico() {
// Código aquí
}
}
```
2. Private:
- Los miembros declarados como privados solo son accesibles desde dentro de la misma
clase.
- Se utiliza para declarar miembros que solo deben ser accesibles desde dentro de la propia
clase.
- Ejemplo:
```java
public class Ejemplo {
private int numeroPrivado;
private void metodoPrivado() {
// Código aquí
}
}
```
3. Protected:
- Los miembros declarados como protegidos son accesibles desde dentro de la misma
clase, desde una clase en el mismo paquete y desde una subclase en un paquete diferente.
- Se utiliza para declarar miembros que deben ser accesibles desde la propia clase, las
clases del mismo paquete y las subclases en diferentes paquetes.
- Ejemplo:
Lopez Hernandez Luis Ricardo
Evidencia de estudio para Certificacion ASO
```java
public class Ejemplo {
protected int numeroProtegido;
protected void metodoProtegido() {
// Código aquí
}
}
```
4. Default (package-private):
- Los miembros declarados sin ningún modificador de acceso (sin "public", "private" o
"protected") son accesibles desde dentro de la misma clase y desde cualquier clase en el
mismo paquete.
- Se utiliza para declarar miembros que deben ser accesibles solo desde dentro del mismo
paquete.
- Ejemplo:
```java
class Ejemplo {
int numeroDefault;
void metodoDefault() {
// Código aquí
}
}
```
En resumen, los modificadores de acceso son palabras clave que se utilizan para controlar
el acceso a los miembros de una clase. El uso adecuado de los modificadores de acceso es
fundamental para garantizar la encapsulación y la seguridad de la información en una
aplicación.
Lopez Hernandez Luis Ricardo
Evidencia de estudio para Certificacion ASO
Colecciones Java (ThreeMap, SortedMap, List etc )
En Java, las colecciones son estructuras de datos que se utilizan para almacenar y
manipular grupos de objetos. Las colecciones proporcionan una forma eficiente y flexible de
trabajar con grupos de elementos, permitiendo la agregación, eliminación y búsqueda de
elementos de forma dinámica. Java proporciona varias interfaces y clases para trabajar con
colecciones, incluyendo TreeMap, SortedMap, List y otras. A continuación, describimos
brevemente algunas de estas interfaces y clases.
1. TreeMap:
- TreeMap es una implementación de la interfaz SortedMap que almacena los elementos en
orden ascendente o descendente.
- Permite la adición y eliminación de elementos, la búsqueda por clave, la iteración y otros
métodos que se esperan de un mapa.
- Los elementos se ordenan según su orden natural o utilizando un comparador
personalizado.
- Ejemplo:
```java
SortedMap<Integer, String> treeMap = new TreeMap<>();
treeMap.put(2, "dos");
treeMap.put(1, "uno");
treeMap.put(3, "tres");
System.out.println(treeMap); // Imprime {1=uno, 2=dos, 3=tres}
```
2. SortedMap:
- SortedMap es una interfaz que extiende la interfaz Map y ordena los elementos por clave.
- Proporciona un subconjunto de los métodos de TreeMap, incluyendo la adición,
eliminación y búsqueda de elementos, la iteración y otros métodos que se esperan de un
mapa.
- Ejemplo:
```java
SortedMap<Integer, String> sortedMap = new TreeMap<>();
sortedMap.put(2, "dos");
sortedMap.put(1, "uno");
sortedMap.put(3, "tres");
System.out.println(sortedMap); // Imprime {1=uno, 2=dos, 3=tres}
```
3. List:
- List es una interfaz que extiende la interfaz Collection y se utiliza para almacenar una
secuencia de elementos.
- Permite la adición y eliminación de elementos, la búsqueda por índice, la iteración y otros
métodos que se esperan de una lista.
- Los elementos se ordenan por orden de inserción y se pueden acceder por índice.
- Ejemplo:
Lopez Hernandez Luis Ricardo
Evidencia de estudio para Certificacion ASO
```java
List<String> lista = new ArrayList<>();
lista.add("uno");
lista.add("dos");
lista.add("tres");
System.out.println(lista); // Imprime [uno, dos, tres]
```
1. docker run: Este comando se utiliza para crear y ejecutar un contenedor a partir de una
imagen. Por ejemplo, el siguiente comando creará y ejecutará un contenedor a partir de la
imagen de Ubuntu:
2. docker ps: Este comando se utiliza para listar todos los contenedores en ejecución. Por
ejemplo, el siguiente comando muestra todos los contenedores en ejecución en el sistema:
`docker ps`
3. docker stop: Este comando se utiliza para detener un contenedor en ejecución. Por
ejemplo, el siguiente comando detiene el contenedor con el ID "123456789":
4. docker build: Este comando se utiliza para construir una imagen a partir de un archivo
Dockerfile. Por ejemplo, el siguiente comando construirá una imagen a partir de un archivo
Dockerfile ubicado en el directorio actual:
5. docker push: Este comando se utiliza para subir una imagen a un registro de Docker.
Por ejemplo, el siguiente comando sube una imagen etiquetada "mi-imagen" al registro de
Docker Hub:
6. docker pull: Este comando se utiliza para descargar una imagen desde un registro de
Docker. Por ejemplo, el siguiente comando descarga la imagen etiquetada "mi-imagen"
desde el registro de Docker Hub:
Estos son solo algunos de los comandos más comunes utilizados en Docker. Hay muchos
más comandos disponibles para administrar y configurar los contenedores de Docker.
Lopez Hernandez Luis Ricardo
Evidencia de estudio para Certificacion ASO
PowerMock
PowerMock es una biblioteca de pruebas unitarias para Java que permite escribir pruebas
de manera más fácil y efectiva. Esta biblioteca se enfoca en pruebas de código que son
difíciles de probar debido a su complejidad o dependencias externas.
PowerMock proporciona una serie de características adicionales para Java que no están
disponibles en otras bibliotecas de pruebas, como la capacidad de:
Estas características son muy útiles en situaciones en las que se necesita realizar pruebas
unitarias de código que dependen de código externo o que son difíciles de probar debido a
la complejidad del código.
PowerMock se integra con otros frameworks de pruebas populares en Java, como JUnit y
TestNG, lo que lo hace fácil de usar en proyectos existentes.
En resumen, PowerMock es una biblioteca de pruebas unitarias para Java que ofrece
características adicionales para probar código complejo o dependiente de código externo.
Su capacidad para mockear métodos estáticos, finales y constructores, así como métodos
privados y clases concretas, lo hace útil en situaciones en las que otras bibliotecas de
pruebas no son suficientes.
Lopez Hernandez Luis Ricardo
Evidencia de estudio para Certificacion ASO
Comandos Linux
Practica (simulador)