Uncategorized

Funciones y Scripts en Scilab.

SciLab, alternativa gratuita a MatLab. Uso básico

El Blog de Programación para Ingenierías

Scilab es uno de los programas y lenguajes más usados a nivel académico esto se debe a su gran potencial de calculo y sintaxis a la hora de realizar (por así llamarlo) ‘programación científica’, y por otro lado por que es la contra-parte libre al paquete de cálculo científico Matlab del que hemos hablado en este blog antes. Aunque la sintaxis entre ambos lenguajes resulta ser bastante familiar, hay qeu reconocer que Matlab en cuanto a facilidad de uso en algunos casos llega a ser superior por lo que a veces la migración hacia Scilab resulta un poco tediosa cuando estamos muy acostumbrados a trabajar en Matlab, sin embargo no es tanto el trabajo para adaptarse rápidamente a la alternativa libre.

Algo muy importante a lo hora de trabajar con estos sistemas es el hecho de poder escribir funciones o scripts en ficheros aparte además de escribir los comandos…

Ver la entrada original 1.280 palabras más

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.

Linux

Problema con Eclipse Mars en Ubuntu 16.04

Si estás teniendo problemas con Eclipse Mars en Ubuntu 16.04, en plan no te abre bien las preferencias, no hace conexiones GIT… no te desesperes más.

Por lo visto hay un error con al versión de GTK+3.

Para empezar, abre un terminal y escribe el siguiente comando:

export SWT_GTK3=0

Si te ha funcionado, puedes hacer una modificación persistente, ya que la anterior era sólo temporal. En la carpeta raíz de eclipse, edita el archivo eclipse.ini. Inserta las 2 siguientes líneas:

--launcher.GTK_version
2

Insértalas justo antes de esta línea:

--launcher.appendVmargs

Con esto ya debería funcionar correctamente 🙂


Fuente askubuntu.com

Linux

Tras instalar Ubuntu aparece al iniciar ‘Please enter passphrase for disk…’

Al instalar Ubuntu en un disco duro tipo SSD puede que se te presente este mensaje al iniciar:

http://i.imgur.com/yhtfLRd.jpg

Da igual que lo dejes en blanco o que pongas alguna contraseña porque, siempre, pero siempre siempre, te la volverá a pedir al arrancar el SO.

Googleando un poco di con la solución:

  1. Encuentra la partición que es swap:
    sudo fdisk -l

    Te aparecerá algo parecido a esto:

    sudo fdisk -l
    [sudo] password for kempe: 
    
    Disk /dev/sda: 233,8 GiB, 251000193024 bytes, 490234752 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 4096 bytes
    I/O size (minimum/optimal): 4096 bytes / 4096 bytes
    Disklabel type: gpt
    Disk identifier: B59D4149-AC8E-4B71-B51F-8926B2E82C14
    
    Device         Start       End   Sectors   Size Type
    /dev/sda1       2048    409599    407552   199M EFI System
    /dev/sda2     409640 253319775 252910136 120,6G Apple HFS/HFS+
    /dev/sda3  253321216 269320191  15998976   7,6G Linux swap
    /dev/sda4  269320192 490233855 220913664 105,3G Linux filesystem
  2. En este caso, el dispositivo es /dev/sda3. En tu caso no tiene que ser el mismo, por lo que tienes que seleccionar el que sea de tipo ‘Linux swap’.
  3. Desactiva el swap:
    sudo swapoff -a
  4. Dehabilita cryptswap:
    sudo cryptsetup remove /dev/mapper/cryptswap1
  5. Elimina la línea correspondiente de ‘/etc/crypttab’. Esta línea es en la que aparezca tu dispositivo, en mi cas ‘/etc/sda3’ Usa ‘vi’, ‘vim’ o ‘nano’ (éste es el más fácil de usar).
    sudo nano /etc/crypttap
  6. Establece la nueva área swap:
    sudo /sbin/mkswap /dev/sda3
    
    sudo swapon /dev/sda3
  7. Y, finalmente, modifica la línea fstab, reemplazando ‘/dev/mapper/cryptswap1’ por tu dispositivo, en mi caso, ‘/dev/sda3’:
    sudo nano /etc/fstab

Problemas que se me presentaron tras hacer esto:

El servicio de red inalámbrica no siempre se inicia al arrancar Ubuntu. Al menos, esto ocurre en el Dell XPS 13 (9350). Si esto sucede, basta con hacer:

sudo service networking restart && sudo service network-manager restart

Fuente – askubuntu.com