Uso de Profiles en Spring-boot
Distintas formas de manejar de los profiles con spring-boot para personalizar las ejecuciones:
1 – Establecer el profile en la property spring.profiles.active. Esto lo que hace es que si por ejemplo le establecemos el profile prof1 la aplicación irá a buscar la configuración al application-prof1.properties.
//file: application.properties spring.profiles.active = prof1
2 – Podemos en ejecución decirle a una clase que utilice un profile distinto al marcado. Utilizando para ello la anotación @ActiveProfiles
@SpringBootTest @ActiveProfiles("prof2") class Example2ProfileTest { ... }
3 – Puedes definir beans en función de un profile utilizando la anotacion @Profile en la clase que vas a definirlos.
A continuación, un ejemplo de como se genera un bean en función de si el profile es prof3 u otro con un test de prueba.
@Profile("prof3") @Configuration public class Prof3Configuration { @Bean public String helloWorld() { return "Hello World prof3"; } } @SpringBootTest @ActiveProfiles("prof3") class Example3ProfileTest { @Resource(name = "helloWorld") private String helloWorld; @Test void dummyTest() { Assertions.assertEquals(helloWorld, "Hello World prof3"); } }
@Profile("!prof3") @Configuration public class NotProf3Configuration { @Bean public String helloWorld() { return "Hello World other not prof3"; } } @SpringBootTest @ActiveProfiles("other") class ExampleNot3ProfileTest { @Autowired private String helloWorld; @Test void dummyTest() { Assertions.assertEquals(helloWorld, "Hello World other not prof3"); } }
4 – Se puede utilizar la property spring.profile.include para incluir profiles adicionales a la ejecución:
//application.properties spring.profiles.include=prof4a,prof4b //application-prof4a.properties custom.hello.world.4a=Hello World prof4a custom.hello.world.4b=x //application-prof4b.properties custom.hello.world.4b=Hello World prof4b
@SpringBootTest class Example4ProfileTest { @Value("${custom.hello.world.4a}") private String customHelloWorld4a; @Value("${custom.hello.world.4b}") private String customHelloWorld4b; @Test void dummyTest() { Assertions.assertEquals(customHelloWorld4a, "Hello World prof4a"); Assertions.assertEquals(customHelloWorld4b, "Hello World prof4b"); } }
5 – Uso de profiles de maven junto con los de Spring-Boot
prof1 true prof1 prof5 prof5 ... src/main/resources true
//application.properties spring.profiles.active=@spring.profiles.active@
@SpringBootTest class Example5ProfileTest { @Value("${custom.hello.world}") private String customHelloWorld; @Value("${spring.profiles.active}") private String profileActive; @BeforeEach public void beforeMethod() { assumeTrue( profileActive.equals("prof5")); } @Test void dummyTest() { Assertions.assertEquals(customHelloWorld, "Hello World prof5"); } }
Al contruir con maven podemos indicar un profile definido en el pom.xml o bien no poner ninguno y que coje el indicado como default «prof1»
mvn clean test -Pprof5
Gestión de múltiples versiones de pyton en Ubuntu
– Paso previo, añadir software-properties-common y repositorio.
sudo apt install software-properties-common sudo add-apt-repository ppa:deadsnakes/ppa
– Instalación de las versiones de python: 3.10 y 2.7.
sudo apt install python3.10 python3.10 --version sudo apt install python2.7 python3.7 --version
– Configuración de ubuntu para facilitar el cambio de una version a otra.
//Creas enlaces simbolicos con update-alternatives sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1 sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.10 2 //Menu para seleccionar la version elegida sudo update-alternatives --config python //comprobar la versión activa python --version
Url dinámicas con react
Podemos parametrizar las urls en React. Esto nos va a permitir tener url dinámicas en función a unos parametros. Para ver su funcionamiento se muestra un ejemplo:
1 – Definición de parámetros en la url
Dado un route, podemos indicar los parámetros como en el ejemplo :category y :type
2 – Utilización de esos parámetros en el componente invocado
La forma de recoger luego esos párametros seria con useParams.
import { useParams } from "react-router-dom" ... const { category } = useParams() ...
Hooks de React: useState y useEffect
Para poder utilizar estos hooks lo primero es importarlos.
import React, { useState, useEffect } from 'react';
– useState: se trata de una función que crea una variable donde se puede almacenar el estado del componente. Acepta un valor inicial para esa variable y devuelve un array con dos elementos, el valor de la variable y la función para modificarla.
const [isLoading, setIsLoading] = useState(false);
– useEffect: se usa para la inicialización o modificación de variables, llamadas a APIs, etc. La llamada a useEffect acepta una función como argumento que se ejecuta por defecto cuando el componente se renderiza por primera vez, y después cada vez que el componente se actualice o cuando se modifique alguno de los argumentos pasados como parámetros (en el ejemplo category y type).
useEffect(() => { const fetchDataTxt = async () => { setIsLoading(true); try { const result = await axios("http://" + window.location.host + "/" + category + "/" + type + "/description.txt"); setData(result.data); }catch(err){ console.log("error http://" + window.location.host + "/" + category + "/" + type + "/description.txt"); } setIsLoading(false); }; fetchDataTxt(); }, [category, type]);
React tips and tricks
– React Developer Tools: Herramienta para depurar el código. Es un plugin que se instala en el navegador: Chrome, Firefox.
– Simple React Snippets: Plugin para el VSCode que te facilita mucho el desarrollo.
– Fragmentos: Es muy común que un componente devuelva múltiples elementos. La forma más cómoda de hacerlo es con los tag <> </>
class Columns extends React.Component { render() { return ( <> <td>Hello</td> <td>World</td> </> ); } }
– React Bootstrap: Framework de bootstrap adaptado a React. https://react-bootstrap.github.io/
npm install react-bootstrap bootstrap@5.1.3
– Axios: Axios es un cliente HTTP ligero basado en el servicio $http que se puede utilizar con react. Documentación 1 – Documentación 2
npm install axios
Uso de dangerouslySetInnerHTML en React
Esta función te permite incrustar html directamente con React. Se utiliza en lugar de innerHTML.
const App = () => { const data = 'lorem ipsum'; return ( dangerouslysetinnerhtml={{__html: data}} ); } export default App;
Git Actions de GitHub (Parte 4)
Continuamos con algún ejemplo de GitHub Action
workflow.yml: se compila un proyecto que tiene como dependencia otro proyecto perteneciente a otro repositorio (además, se le indica que utilice una rama concreta).
name: Compile with other repo dependency //Evento que desencadenará el workflow on: [push] //Se definen unas variables de entorno para acceder //al repositorio donde esta la dependencia que necesitamos. env: //nombre del repositorio DEPENDENCY_REPOSITORY: "roberto-pf/Example-Git-Actions" //directorio en el que vamos a trabajar DEPENDENCY_PATH: "Example-Git-Actions" //rama del repositorio DEPENDENCY_REF: "example-2" jobs: compile-mvn: runs-on: ubuntu-latest steps: //Tarea que hace un checkout del repositorio - uses: actions/checkout@v2 //Tarea que instalar java 11 - name: Set up JDK 1.11 uses: actions/setup-java@v1 with: java-version: 1.11 //Tarea que hace un checkout del repositorio con la dependencia necesaria - name: Checkout cross repo uses: actions/checkout@v2 with: repository: ${{env.DEPENDENCY_REPOSITORY}} path: ${{env.DEPENDENCY_PATH}} ref: ${{env.DEPENDENCY_REF}} //Instalamos en el directorio .m2 esa dependencia - name: Build with Maven repo roberto-pf/Example-Git-Actions project example2-gitactions-model working-directory: ./Example-Git-Actions/example2-gitactions-model run: | mvn -B install --file pom.xml //Ya podemos construir el proyecto - name: Build with Maven repo roberto-pf/Example-Git-Actions-II project example2-gitactions run: mvn -B package --file example2-gitactions/pom.xml
Nota: Repositorio Github
Git Actions de GitHub (Parte 1)
Las GitHub Actions te permiten automatizar tareas en tu proyecto: despliegues, ejecución de test,… Se dispone de múltiples acciones en el Marketplace de GitHub que se pueden utilizar. Si bien, también se puede desarrollar acciones propias.
Para crearlas es tan sencillo como crear el directorio .github/workflows/ en tu repositorio y dentro de dicho directorio se colocarían los ficheros yml que contienen las actions.
Para probar su funcionamiento me he creado un proyecto sencillo en GitHub y le he añadido las siguientes actions:
1 – echo example workflow.yml: Ejecuta el comando echo
//Nombre del workflow name: Execute echo command //Evento que desencadenará el workflow on: [push] //lista de trabajos a realizar jobs: //Job a ejecutar echo: //Máquina en la que se va a ejecutar el job runs-on: ubuntu-latest //Lista de steps/tareas a realizar dentro del job steps: //Tarea a ejecutar. Tiene un name con la descripción y un run con el comando a ejecutar. - name: test echo run: echo "Testing echo"
2 – mvn example workflow.yml: Ejecuta un mvn package
//Nombre del workflow name: Build and test of Java Project //Evento que desencadenará el workflow on: [push] //Configuración por defecto. defaults: run: //Se indica el directorio desde donde se ejecutarán los jobs. working-directory: example1-gitactions //lista de trabajos a realizar jobs: //Job a ejecutar build: //Máquina en la que se va a ejecutar el job runs-on: ubuntu-latest //Lista de steps/tareas a realizar dentro del job steps: //Tarea que hace un checkout del repositorio - uses: actions/checkout@v2 //Tarea que instala en la máquina java 11 - name: Set up JDK 1.11 uses: actions/setup-java@v1 with: java-version: 1.11 //tarea que ejecuta un mvn package - name: Build with Maven run: mvn -B package --file pom.xml

Nota: Repositorio Github
VmWare: tips and tricks
He migrado unas maquinas virtuales VmWare que tenía con Windows XP a Windows 7. Para ello, he creado las nuevas máquinas con windows 7 y luego les he añadido los discos duros de las de XP para de forma amigable luego ir pasando lo que me interesa nada mas antes de borrer dichos discos. También, me he encontrado una serie de errores.
Añadir disco duro existente
1 – Se puede hacer desde la opción de Editar configuración. Desde ahí en la pestaña Hardware virtual, se hace click en el botón Agregar nuevo dispositivo.
2 – Seleccionar Disco duro existente en el menú desplegable. Y se abre un cuadro de diálogo para seleccionar un archivo *.wmdk.
3 – Si estaba creado con otra versión VmWare te pedirá que le conviertas el formato.
4 – Al iniciar la máquina virtual te saldrá el nuevo disco con todo su contenido.
Error: Taking ownership of this virtual machine failed
Cuando al iniciar una máquina virtual da este error y no arranca. Se soluciona eliminando el diretorio *.lck que encontraras dentro del directorio donde está esa máquina.
Esto puede pasar si al apagar la máquina ha pasado algo y se ha quedado ahí.
Error: VMware Workstation Unrecoverable Error (vcpu-0)
En este enlace hay una recopilación de todas las posibles soluciones a este error en función de lo que esté dando problemas. Listado:
– Method 1: Updating the VMware Workstation application
– Method 2: Disabling / Uninstalling another organization’s virtualization software
– Method 3: Enabling Secure Virtual Machine (SVM) or Intel Virtualization Technology from BIOS/UEFI
– Method 4: Disabling simultaneous multithreading (SMT) in the BIOS/UEFI
– Method 5: Reverting to the default clocking frequencies
– Method 6: Modifying the VMX file
Anet 8 – Problema medir temperatura.
Un error muy común en la placa de la Anet 8 es que al medir la temperatura con los thermistores desconectados nos de una temperatura alta en lugar de 0º. Con ellos quitados siempre debe darnos medida de 0º.
Este problema es porque o la resistencia o el condensador (casi seguro éste) que conforman el circuito de medida se ha estropeado. Esto es muy fácil que pase en la cama, si el cable de tensión toca en algún momento alguno de los cables del thermistor.
Para solucionarlos necesitamos conocer el esquema de como está formada la placa, que podemos descargar de aquí.
Y podemos ver que los circuitos para tomar la temperatura son los siguientes:

El circuito de la temperatura del extrusor esta formado por una resistencia (R41) de 4,7kOhms y un condesador (C47) de 15uF
El circuito de la temperatura de la cama esta formado por una resistencia de 4,7kOhms (R37) y un condesador (C43) de 4,7uF.
Los podemos localizar en la placa aquí.


Para saber que componente es el estropeado hay que medirlos quitados de la placa, de otro modo es prácticamente imposible saberlo. De todas formas, lo más normal es que la pieza a cambiar sea el condesandor (como se vió en el post anterior se corresponde con un capacitor cerámico SMD 0805).
Si nos fijamos en el circuito es fácil ver que el polo positivo del condensador va pegado a la resistencia. En el caso de la resistencia no influye su colocación.
Categorias
- adobe (2)
- agile (1)
- Alfresco (1)
- Android (26)
- Angular (6)
- angularjs (10)
- apache (1)
- axis (2)
- Bases de datos (14)
- Bootstrap (1)
- C# (3)
- Cámara (1)
- chrome (3)
- Codeigniter (2)
- Control de Versiones (2)
- CSS (25)
- CVS (1)
- Django (9)
- Django Rest Framework (1)
- DNS (1)
- Docker (1)
- dominio (1)
- eclipse (5)
- Entity Framework (2)
- ETL (1)
- Firefox (6)
- flash (1)
- freecad (1)
- Git (12)
- GitHub (4)
- Groovy (1)
- Handlebars (1)
- hibernate (4)
- hosting (1)
- HTML (50)
- HTML 5 (26)
- Impresión 3D (9)
- Inkscape (1)
- IOS (2)
- ireports (3)
- Java (43)
- Javascript (55)
- JBoss (3)
- JPA (2)
- JQuery (20)
- Json (7)
- JSP (5)
- Lamp (1)
- lean (1)
- linkedin (1)
- LINQ (1)
- linux (13)
- Livecycle (1)
- log (1)
- microcontroladores (1)
- MongoDB (4)
- MySQL (8)
- Node.js (5)
- OC4J (1)
- Openshift (2)
- Oracle (5)
- Patrones de Diseño (1)
- Photoshop (2)
- php (20)
- PostgreSQL (1)
- python (19)
- rabbitmq (1)
- Raspberry PI (13)
- Raspherry PI (5)
- React (6)
- seguridad (3)
- Selenium (3)
- Sencha Touch (1)
- Sin categoría (25)
- Spring (16)
- spring-boot (3)
- SQL (7)
- SQLServer (1)
- struts (2)
- SVN (1)
- Talend (1)
- Tomcat (5)
- unity (3)
- Visual Studio Code (2)
- vmware (5)
- Web Services (11)
- windows (18)
- wordpress (10)
- Xiaomi (1)
- xml (2)
Trabajos Realizados
- App Android – Autoka Fr
- App Android – Cartelera Cántabra
- App Android – Gramática y Vocabulario Ingles
- App Android – Hoja de Gastos
- App Android – Hotel Torre Cristina
- App Android – OcioEnjoy
- App Android – Visor CardBoard
- App Firefox – Managapp
- DiamanteBomba – DisasterCode
- Generador de Partes de Trabajo
- GitHub – Android Web Generator
- GitHub – Dynamic Angular Gallery
- GitHub – Dynamic React Gallery
- GitHub – Sotilizator
- GitHub – SpringAngularJS
- GitHub – Swiper Dynamic Angular Gallery
- HazParejas – DisasterCode
- RompeCabezas – DisasterCode
- Unity Game – English Couple
- Unity Game – Kill Wasp
- WordPress – El Buen Apicultor
- WordPress – El Cajón de los Retales
- WordPress – El Vestidito Azul
- WordPress – Feuchas
- WordPress – Fragua de Navajas Ponce
- WordPress – Humor a las Tres
- WordPress – Photo Places