Herramientas/Utilidades

SVN – Añadir ficheros recursivamente

Para añadir ficheros de forma recursiva, por línea de comando, tienes dos maneras de hacerlo:

  • Moverte de carpeta en carpeta donde sepas que se han añadido ficheros nuevos y usar (algo bastante tedioso si tienes un gran árbol):
    svn add *
  • Ponerte en la raíz y ejecutar:
    svn add --force * --auto-props --parents --depth infinity -q

    De esta manera se añadirán todos los ficheros de todas las carpetas hija.

Después de esto, sólo queda hacer commit:

svn commit -m 'Mensaje'

Y a transferir…

Herramientas/Utilidades, Programación, XSLT

XSL – Llamada recursiva

Si necesitas iterar sobre un XML en el que los nodos son genéricos, pero siguiente un orden, como por ejemplo, este XML de entrada:

<?xml version="1.0" encoding="UTF-8"?>
<lista>
    <PARAM1>Favoritos</PARAM1>
    <PARAM2>Antonio</PARAM2>
    <PARAM3>28/03/2017</PARAM3>
    <PARAM4>2</PARAM4>
    <PARAM5>León</PARAM5>
    <PARAM6>Panthera leo</PARAM6>
    <PARAM7>Félidos</PARAM7>
    <PARAM8>Panthera</PARAM8>
    <PARAM9>El rey de la selva</PARAM9>
    <PARAM10>Lemming</PARAM10>
    <PARAM11>Lemmus lemmus</PARAM11>
    <PARAM12>Roedor</PARAM12>
    <PARAM13>Cricetidae</PARAM13>
    <PARAM14>Dicen que se suicidan</PARAM14>
</lista>

Esto puede venir como respuesta de algún WebService, como por ejemplo haría este código en Java:

public static String getAnimalesFavoritos(String username, List<Mamifero> list) {
	SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
	String date = sdf.format(new Date());
	StringBuilder sb = new StringBuilder();
	sb.append("<lista>\n");
	sb.append("\t<PARAM1>Favoritos</PARAM1>\n");
	sb.append("\t<PARAM2>").append(username).append("</PARAM2>\n");
	sb.append("\t<PARAM3>").append(date).append("</PARAM3>\n");
	sb.append("\t<PARAM4>").append(list.size()).append("</PARAM4>\n");
	int i = 5;
	for (Mamifero elem : list) {
		sb.append("\t<PARAM" + i + ">").append(elem.getNombre()).append("</PARAM" + i + ">\n");
		sb.append("\t<PARAM" + (i + 1) + ">").append(elem.getNombreLatin()).append("</PARAM" + (i + 1) + ">\n");
		sb.append("\t<PARAM" + (i + 2) + ">").append(elem.getFamilia()).append("</PARAM" + (i + 2) + ">\n");
		sb.append("\t<PARAM" + (i + 3) + ">").append(elem.getEspecie()).append("</PARAM" + (i + 3) + ">\n");
		sb.append("\t<PARAM" + (i + 4) + ">").append(elem.getDescripcion()).append("</PARAM" + (i + 4) + ">\n");
		i += 5;
	}
	sb.append("</lista>");
	return sb.toString();
}

Para ello, se puede aplicar una plantilla XSL como la siguiente:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:user="urn:my-scripts" version="1.0" exclude-result-prefixes="msxsl user">
    <xsl:template match="/lista">
        <xsl:variable name="lista" select="PARAM1" />
        <xsl:variable name="username" select="PARAM2" />
        <xsl:variable name="dateTime" select="PARAM3" />
        <xsl:variable name="numero" select="PARAM4" />
        <animales>
            <tipoLista>
                <xsl:value-of select="$lista" />
            </tipoLista>
            <userName>
                <xsl:value-of select="$username" />
            </userName>
            <dateTime>
                <xsl:value-of select="$dateTime" />
            </dateTime>
            <mamíferos>
                <xsl:call-template name="animal">
                    <xsl:with-param name="node" select="." />
                    <xsl:with-param name="count">
                        <xsl:value-of select="1" />
                    </xsl:with-param>
                    <xsl:with-param name="cursor">
                        <xsl:value-of select="5" />
                    </xsl:with-param>
                    <xsl:with-param name="max">
                        <xsl:value-of select="$numero" />
                    </xsl:with-param>
                </xsl:call-template>
            </mamíferos>
        </animales>
    </xsl:template>
    <xsl:template name="animal">
        <xsl:param name="node" />
        <xsl:param name="count" />
        <xsl:param name="cursor" />
        <xsl:param name="max" />
        <mamífero>
            <nombre>
                <xsl:value-of select="$node/*[name() = concat('PARAM', $cursor)]" />
            </nombre>
            <nombreLatin>
                <xsl:value-of select="$node/*[name() = concat('PARAM', $cursor + 1)]" />
            </nombreLatin>
            <familia>
                <xsl:value-of select="$node/*[name() = concat('PARAM', $cursor + 2)]" />
            </familia>
            <especie>
                <xsl:value-of select="$node/*[name() = concat('PARAM', $cursor + 3)]" />
            </especie>
            <descripción>
                <xsl:value-of select="$node/*[name() = concat('PARAM', $cursor + 4)]" />
            </descripción>
        </mamífero>
        <xsl:if test="$count &lt; $max">
            <xsl:call-template name="animal">
                <xsl:with-param name="node" select="$node" />
                <xsl:with-param name="count">
                    <xsl:value-of select="$count+1" />
                </xsl:with-param>
                <xsl:with-param name="cursor">
                    <xsl:value-of select="$cursor+5" />
                </xsl:with-param>
                <xsl:with-param name="max">
                    <xsl:value-of select="$max" />
                </xsl:with-param>
            </xsl:call-template>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>

Donde se utiliza una llamada a una función de manera recursiva.
Es importante que se pase el número de “animales” que se van a enviar, ya que es la única forma que tiene la función de saber cuándo parar.

El XML resultante sería el siguiente:

<?xml version="1.0" encoding="UTF-8"?>
<animales>
    <tipoLista>Favoritos</tipoLista>
    <userName>Antonio</userName>
    <dateTime>28/03/2017</dateTime>
    <mamíferos>
        <mamífero>
            <nombre>León</nombre>
            <nombreLatin>Panthera leo</nombreLatin>
            <familia>Félidos</familia>
            <especie>Panthera</especie>
            <descripción>El rey de la selva</descripción>
        </mamífero>
        <mamífero>
            <nombre>Lemming</nombre>
            <nombreLatin>Lemmus lemmus</nombreLatin>
            <familia>Roedor</familia>
            <especie>Cricetidae</especie>
            <descripción>Dicen que se suicidan</descripción>
        </mamífero>
    </mamíferos>
</animales>
Herramientas/Utilidades, Java, Programación, Uncategorized

Java – Comprobar si un texto está en formato JSON

Método para comprobar si un texto está en formato JSON:

import com.fasterxml.jackson.databind.ObjectMapper;
public static boolean isJSONValid(String jsonInString) {
    try {
        final ObjectMapper mapper = new ObjectMapper();
        mapper.readTree(jsonInString);
        return true;
    } catch (IOException e) {
        return false;
    }
}

ObjectMapper se encuentra en la librería jackson-databind-2.7.4.jar

Por supuesto hay mil formas más de hacerlo. Más adelante pondré otras librerías.

Herramientas/Utilidades, Linux

Instala Spotify en Ubuntu 15.04

 Si quieres instalar Spotify en Ubuntu, a partir de la versión 15.04 no es suficiente con seguir las instrucciones que da la propia página de Spotify. El problema surge porque Spotify usa unas librerías que a partir de las versión 15.04 ya no vienen instaladas por defecto, sino que viene una versión más avanzada de las mismas. Supongo que esto se arreglará con la siguiente versión de Spotify para Linux, pero mientras, habrá que hacer esto: 1. Añade el respositorio:

sudo add-apt-repository “deb http://repository.spotify.com stable non-free”

2. Añade la clave pública de seguridad:

sudo apt-key adv –keyserver keyserver.ubuntu.com –recv-keys 94558F59

3. Refresca los repositorios:

sudo apt-get update

(Hasta aquí, igual que las instrucciones de la web de Spotify. A partir de ahora cambia un poco) 4. Instala el cliente de Spotify:

sudo apt-get install spotify-client spotify-client-qt

5. Descarga e instala la librería que falta:

libgcrypt11 for 64-bit OS

libgcrypt11 for 32-bit OS

Con esto ya debería funcionar perfectamente Spotify para Linux.

Spotify Premium - Linux Preview_007

Fuente

Herramientas/Utilidades, Linux

Reproduce contenido Flash en el navegador Chromium de Ubuntu

Una de las principales pegas de usar Ubuntu es que, al abrir ciertas páginas web, no funciona el contenido flash. La solución para poder visualizarlo en el navegador Chromium es la siguiente:

1. Abre el Centro de Software de Ubuntu:

Centro de software de Ubuntu_001

2. Dale a Editar -> Orígenes del Software…:

Menú_004

3. Asegúrate de que tienes la casilla de Multiverso activada en la sección de repositorios de Ubuntu:

Software y actualizaciones_002

4. Instala pepperflashplugin-nonfree:

Centro de software de Ubuntu_005

5. Y ya debería estar listo. Reinicia el navegador Chromium y prueba alguna web que use flash, como por ejemplo, loteriasyapuestas.es. Prueba a jugar la Quiniela o algún otro juego. En vez de aparecer el mensaje de error de que no hay flash, debería aparecer algo como esto (el funcionamiento normal :D):

Loterías y apuestas

Fuente

Herramientas/Utilidades

FreeCAD: la alternativa opensource a AutoCAD

Si eres usuario de AutoCAD, esta entrada te puede ser útil.

Existe una alternativa opensource (vamos, que es gratis), FreeCAD.

No creo que llegue al altísimo nivel del AutoCAD, pero seguro que a más de un usuario le es suficiente para las tareas que realiza.

Además, si te gusta programar, aquí puedes aportar en forma de trabajo nuevas herramientas a FreeCAD o reparación de errores.

FuenteFreeCAD

Herramientas/Utilidades

¿Cuál es la mejor forma de cargar el móvil?

Artículo de Microsiervos:

Mobile-Charging-How-To
Foto (cc) Takashi Hososhima

En Digital Trends, Expert Advice on How to Avoid Destroying your Phone’s Battery,

Lo que más daña las baterías son los ciclos de carga, entendiendo como tales cuando la batería pasa de estar totalmente descargada a estar totalmente cargada. Todas las baterías tienen un número limitado de ciclos de carga.Lo más adecuado para las baterías de iones de litio esmantenerlas con entre el 50 y el 80% de su carga, suficiente para que los iones sigan activos. Hacer pequeñas cargas de la batería a lo largo del día mantiene los iones en movimiento. No es lo más práctico pero es lo más adecuado.

Sobre si es conveniente dejar el móvil cargado durante toda la noche, según el mismo artículo, «dejarlo enchufado toda la noche no dañará la batería de forma significativa», ya que el teléfono detecta cuándo está cargado e interrumpe la carga para evitar una sobrecarga de la batería.

Sin embargo, según Battery University, enlazado en los comentarios del mimsmo artículo,

Durante la carga el móvil debe estar apagado.Esto permite que la batería alcance el nivel de carga y que la carga finalice por completo sin que el consumo del dispositivo distorsione el ciclo de carga provocando mini-ciclos de recarga. Además, en las baterías de litio es mejor hacer cargas parciales que cargas completas al 100%.

# Enlace Permanente