Category: Programación

Actualizar los Submódulos Git de un Proyecto

Cuando tenemos proyectos muy grandes en los que usamos librerías de terceros y estamos usando Git como gestor de versiones, suele ser habitual añadir dichas librerías como submódulos. Esto nos permite que cuando clonamos el proyecto, las librerías también se descarguen. No obstante, la actualización de los módulos no se realiza mediante el comando "pull" del proyecto principal y deberemos realizar un "pull" para cada submódulo que tengamos.

Para realizar el comando "pull" en cada uno de los módulos lo más sencillo es recurrir al siguiente comando:

git submodule foreach git pull origin master

El comando "submodule" junto con el comando "foreach" nos permite ejecutar comandos para cada uno de los submódulos de un proyecto. En este caso ejecutamos el comando "git pull origin master" para traernos los cambios de cada submódulo y tenerlos todos en la ultima versión de la rama "master".

En caso de querer revertir la acción puedes usar el comando "update" para actualizar el árbol de submódulos de manera consistente con el estado almacenado en el proyecto principal. Esto quiere decir nos deshará los cambios realizados.

git submodule update

Internamente en el proyecto principal, para cada submódulo se guarda el commit concreto con el que se trabaja, razón por la que es posible revertir los cambios.

Este comando puede salvarnos, en el caso de que hayamos cambiado la URL remota donde apunta el submódulo y nos coja los cambios de la antigua ubicación. O simplemente puede servirnos para volver a la versión que teníamos, tras haber probado los nuevos cambios del submódulo y no estar contentos con ellos.

En cualquier caso, si por alguna razón hemos cambiado la URL remota de un submódulo en el archivo ".gitmodules", necesitaremos ejecutar el comando "sync" para que sincronice la URL remota con la configuración del archivo ".gitmodules".

git submodule sync

Tras la ejecución del comando podemos volver a ejecutar el comando:

git submodule foreach git pull origin master

Y veremos que los cambios corresponden a la ubicación correcta del submódulo.

Para más información sobre los distintos comandos para los submódulos, consulta la siguiente referencia:

https://git-scm.com/docs/git-submodule

 

Breve Introducción a las Expresiones Regulares

Una de las herramientas más potentes y a la vez más avanzadas que puede tener cualquier persona que "flirtee" con código y tratamiento de texto, son las expresiones regulares. Una aplicación directa de las expresiones regulares es la detección de patrones dentro de textos o la validación de los mismo de acuerdo a un patrón.

Dicho más formalmente, las expresiones regulares son un lenguaje para la descripción de lenguajes. Una expresión regular define un lenguaje. Por ejemplo, la expresión regular /[a-z]+/ define el lenguaje formado por las cadenas que consisten en repeticiones de una o mas letras minúsculas.

En el ejemplo la expresión sólo nos encontraría aquellas palabras que tuviesen todas las letras en minúsculas. En este conjunto por consiguiente se excluirían todos los nombres propios, las primeras palabra tras un punto por ir escribirse en mayúsculas o incluso aquellas palabras que van todas sus letras en mayúsculas. Para ello basta incluir en la expresión anterior el conjunto de la mayúsculas, pudiendo aparecer ninguna mayúscula o n mayúsculas del conjunto de las letras mayúsculas. La expresión quedaría tal que así /[A-Z]*[a-z]+/. A continuación se adjuntan un par de tablas con la sintaxis que define las expresiones regulares. Puede ayudaros a entender mejor las dos que os he presentado y puede ayudaros a generar otras nuevas.

 

Algunos metasímbolos usados en las expresiones regulares

*El elemento precedente debe aparecer 0 o más veces
+El elemento precedente debe aparecer 1 o más veces
.Un carácter cualquiera excepto salto de línea
?Operador unario. El elemento precedente es opcional
{n}Que coincida exactamente n veces
{n,}Que coincida al menos n veces
{n,m}Que coincida al menos n veces y no mas de m
|O uno u otro
^Comienzo de línea
$Fin de línea
.Cualquier carácter que no sea el retorno de carro
[...]Conjunto de caracteres admitidos
[^...]Conjunto de caracteres no admitidos
-Operador de rango
(...)Agrupación
\Escape
\nRepresentación del carácter fin de línea
\tRepresentación del carácter de tabulación

 

Abreviaturas para las clases más comunes en las expresiones regulares

CódigoSignificado
\d[0-9] Dígitos del 0 al 9
\D[^0-9] Carácter que no sea un dígito
\w[a-zA-Z0-9_] Carácter alfanumérico
\W[^a-zA-Z0-9_] Carácter no alfanumérico
\s[ \t\n\r\f] Espacio en blanco
\S[^ \t\n\r\f] Carácter que no es un espacio en blanco

 

No obstante la definición de estas expresiones, dependiendo de la dificultad del patrón a definir, puede no siempre ser trivial. A esto se le suma la experiencia que pueda tener cada uno para definir dichas expresiones.  Por eso herramientas como RegExr me parecen imprescindibles: una herramienta online para aprender, construir y probar expresiones regulares.

RegExr: http://regexr.com

RegExr_screenshot

Algunas de las características más destacadas de RegExr son:

  • Resultados actualizados en tiempo real, mientras tecleas
  • Información detallada de cada expresión cuando pasas sobre ella
  • Extensa batería de ejemplos y chuletas
  • Deshacer y Rehacer muy sencillo
  • Puedes compartir tus patrones y expresiones y votar las del resto de la comunidad (y "favoritearlas")

Si queréis recordar/practicar expresiones regulares, o simplemente queréis aprender practicando, os animo a que hagáis algunas pruebas con la herramienta. Recordad que podéis probar a usar las dos expresiones que aparecen en esta entrada si no sabéis por donde empezar.

Resucitar un router D-Link desde el Recovery Mode

Es habitual hoy en día encontrarnos en el mercado routers actualizables. En dicha actualización, la parte del firmware del router que contiene las instrucciones de más bajo nivel que controla los circuitos eléctricos y posibilita la ejecución de instrucciones externas, es remplazada por otra que contiene mejoras para el funcionamiento del router.

Normalmente la actualización se hace por cable ethernet y se desaconseja hacerla por medios inalámbricos como el wifi. A pesar de ello podemos caer en el error o simplemente tener una actualización incorrecta. El caso que nos ocupa se centra en cómo recupera los routers de la marca D-Link de una actualización incorrecta.

Si este es tu caso, te habrás dado cuenta de que no puedes acceder al área de administración. Prueba en primer lugar a restablecer el dispositivo al estado de fábrica pulsando durante 5 segundos y espera a ver si se inicia el router y es posible acceder a la zona de administración para configurarlo. En caso contrario sigue leyendo.

Si lo de restaurar al estado de fábrica falla, probaremos con el Modo de Recuperación de Emergencia (Emergency Recovery Mode). Para ello primeramente procederemos a la descarga del firmware. Es posible que la versión del firmware que se quiere instalar no esté disponible en la web oficial de D-Link, ya que las versiones más viejas se van retirando y no es posible descargarlas. Esas versiones están accesibles desde:

https://driverscollection.com/?H=DAP-1360&By=D-Link

Es interesante este tipo de sitios, ya que ocasionalmente debido a las revisiones de hardware de los distintos modelos, versiones más nuevas del los firmwares convierten a versiones más viejas de los modelos en perfectos pisapapeles. ¡Una vergüenza que esto pase!

Una vez disponemos del firmware, tenemos que conectar el router por cable ethernet a nuestro equipo y asignarle una IP estática distinta a la  192.168.0.1 y 192.168.0.50 que corresponden a la dirección de acceso para la administración del router.

Configuracion-ip-estatica

Para configurar  la IP se accede a "Panel de control\Redes e Internet\Conexiones de red" y se selecciona "Propiedades" haciendo click con el botón derecho en el adaptador de red ethernet. Dentro de todas las opciones seleccionamos "Protocolo de Internet versión 4" y se nos mostrará una ventana que permite configurar la IP.

Ahora apagamos el router  (desconectar de la corriente) y pulsamos durante 5 segundo el botón reset mientras volvemos a encender el router (conectar a la corriente). Las luces del router parpadearán y podremos acceder a la zona de recuperación desde la dirección 192.168.0.1 y 192.168.0.50 con nuestro navegador web.  Nos aparecerá una pantalla similar a la siguiente:

D-Link_recovery-mode

Desde examinar se selecciona el firmware y se carga haciendo click en "upload". Una vez se carga el firmware, nos los notificará y se reiniciará el router.

D-Link_recovery-mode2

Una vez realizado el procedimiento deberíamos poder acceder a la zona de administración del router y configurarlo a nuestro gusto. Es recomendable que tras actualizar o cargar un nuevo firmware, se realice una restauración al estado de fábrica, ya que es posible que ciertos parámetros en las configuraciones hayan cambiado y se estén usando los que ya había antes de la actualización.

Recuerda volver a configurar el adaptador de red ethernet para que vuelva a conseguir la IP de manera automática.

Actualizar un Fork con el Proyecto Original

Actualmente es fácil crear y mantener tu código en una plataforma como GitHub usando Git. Existen también otras plataformas como Bitbucket o GitLab que también son unas buenas soluciones para mantener nuestro código usando Git. Pero si buscas otras alternativas menos extendidas y conocidas puedes consultar en AlternativeTo.

Gracias a Git resulta sencillo descargar un repositorio de otro desarrollador para poder trabajar con él. En líneas generales puedes trabajar dicho repositorio usando la URL de clonado o puedes crear un fork del repositorio, que pasa a ser una copia del repositorio bajo tu completa administración. El caso que en este artículos nos atañe toma como premisa el segundo caso.

Cuando hemos hecho un fork y queremos incluir características en nuestro fork que se añadieron en el proyecto original después de que creáramos nuestro fork, es necesario hacer un fetch de la rama que queramos del proyecto original y hacer un merge con nuestro código.

Voy a explicarlo primero por línea de comandos y luego para aquellos que uséis un cliente del estilo TortoiseGit.

Abrid el terminal o consola de comandos y situarlo en el directorio donde esté vuestro proyecto.  Cambiad a la rama con la que se desea fusionar. Por lo general, suele ser la rama master.

git checkout master

A continuación se hace un pull de la rama del proyecto original de donde se quiere fusionar.

git pull https://github.com/PROPIETARIO_ORIGINAL/REPOSITORIOORIGINAL.git NOMBRE_DEL_BRANCH

Es posible hacer primero fetch y luego un merge, que es lo mismo que hacer un pull. Si hubiera algún conflicto se resuelve y se realiza un commit.

git commit -m "mensaje"

Por último haced push a vuestro repositorio remoto y ya tendréis los cambios incluidos en vuestro repositorio remoto para que sean descargados.

git push origin master

 

Si eres usuario de  TortoiseGit, lo más fácil es añadir un remote nuevo. Con el botón derecho del ratón haced click sobre el proyecto, haced luego click en "Settings", e id a "Remote" para crear un nuevo remote  con la dirección URL del proyecto original (https://github.com/XXX/XXXX.git).

TortoiseGit-adding_new_remote

El remoto existente con el nombre origin hace referencia al repositorio original de vuestro proyecto. Nuestro nuevo remoto lo llamaremos upstream, por ser el proyecto de donde hicimos fork.

Cuando hayamos terminado le damos a "Add New/Save" y nos sugerirá hacer un fetch del nuevo remoto, o sino hacemos click con el botón derecho del ratón en el proyecto y le damos a "Fetch". Si usamos la segunda opción recordar hacer el fetch de upstream y no de origin. Una vez hecho esto sólo queda hacer merge de nuestro master de origin con el de upstream, para ello previamente hacemos un "Checkout" a master con el botón derecho del ratón y luego de nuevo el botón derecho y "Merge".

TortoiseGit-merge

Si hay algún conflicto se resuelve seleccionando los cambios que nos quedamos de cada parte (origin o upstream).

Una vez resueltos los conflictos, si los hubiera, haced un "Commit" guardar los cambios y un "Push" para subirlo al repositorio remoto.

En la ayuda de GitHub, puedes encontrar más información:

https://help.github.com