Publi

  • Iteradores y generadores en PHP o por qué deberíamos utilizar yield más a menudo [con ejemplos]

    Es uno de los grandes desconocidos de PHP. Una de esas características que, estando presentes en otros lenguajes no son tan ampliamente utilizadas como deberían. De hecho, en PHP, ¿cuántas veces hemos iterado con datos que tenemos en memoria? Es decir, recorremos los elementos de un array uno a uno y realizando operaciones con cada uno de ellos. Entonces pueden pasar varias cosas, puede que los recorramos todos, o puede que cuando se cumpla una determinada condición decidamos que no vamos a recorrer más.… Leer artículo completo

  • Operador coma. Cómo incorporarlo a nuestro día a día con muchos ejemplos en C

    El operador coma. ¿Cómo empezar a usarlo?
    Seguro que lo has visto cientos de veces por ahí, pasando desapercibido en multitud de programas hechos en C. Es más, incluso el primer día que empezaste a ver programación os visteis las caras y casi no te diste cuenta. Incluso puede que lo hayas utilizado sin siquiera ser consciente de lo que hace en realidad.

    Otros muchos sí que sabréis de qué va este operador, y me gustaría que los que sí sabéis de qué va, sugirierais más ejemplos en los comentarios.… Leer artículo completo

  • Cómo saber si existe una función en Bash, saber qué estamos ejecutando y más

    photo-1457317680121-ef12e98979e8

    En nuestra historia como programadores, hacemos infinidad de llamadas a funciones propias, de terceros, de biblioteca, a otros programas a un alias, etc Y si queremos que nuestros scripts sean lo más robustos posible, debemos tener claro antes de la ejecución que aquello que llamamos se puede ejecutar o dar opciones si algún comando o función no existe.

    Por ejemplo, nuestro script necesita hacer una llamada a wget de este tipo:

    wget -O salida http://totaki.com

    Pero queremos hacer que sea compatible con otros sistemas, por ejemplo, con cURL, y no podemos cambiar uno por otro, pues con curl sería con o minúscula:

    curl -o salida http://totaki.com

    Nuestro script podrá ser:

    1
    2
    3
    4
    5
    6
    7
    8
    if [ -n "$(which wget)" ]; then
        wget -O salida http://totaki.com
    elif [ -n "$(which curl)" ]; then
        curl -o salida http://totaki.com
    else
        echo "No puedo descargar el fichero"
        exit 1
    fi

    De modo que probamos la existencia de diferentes programas y utilizamos el que tengamos a disposición.… Leer artículo completo

  • Cómo procesar múltiples argumentos de entrada en scripts para Bash

    photo-1455540904194-fc101941273a_r

    Los argumentos de entrada de un programa nos sirven para modificar ligeramente el comportamiento de un programa dentro de las opciones que nos permita su desarrollador. Y, sobre todo, siempre que trabajamos con programas para consola, es muy buena idea permitir que nuestros usuarios puedan utilizar funciones extras o especificar sus propios parámetros de trabajo sin necesidad de modificar el programa.

    Si trabajáis con lenguajes como C o C++ podéis leer algo de información al respecto:

    Pero, cuando hacemos algún script en Bash para línea de comandos, también puede resultar muy útil, tanto para especificar archivos de entrada, como las propias opciones de nuestro programa.… Leer artículo completo

  • Bucles y cursores en MySQL con ejemplos

    Hace mucho tiempo que quería escribir sobre esto. Y aunque es recomendable no abusar de los bucles en MySQL, es más, a veces no son necesarios, y siempre hay que buscar una solución que no los use, a veces no la vamos a encontrar y será en esos casos cuando debamos utilizarlos.

    Veamos un bucle muy sencillo, parecido a un for de los de toda la vida, en el que contamos del 1 al 9:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    DELIMITER $$
    CREATE PROCEDURE simple_loop ( )
    BEGIN
      DECLARE counter BIGINT DEFAULT 0;
     
      my_loop: LOOP
        SET counter=counter+1;

        IF counter=10 THEN
          LEAVE my_loop;
        END IF;

        SELECT counter;

      END LOOP my_loop;
    END$$
    DELIMITER ;

    cuando hagamos:

    1
    CALL simple_loop();

    Veremos algo como esto:

    +———+
    | counter |
    +———+
    | 1 |
    +———+
    1 row in set (0.01 sec)

    +———+
    | counter |
    +———+
    | 2 |
    +———+
    1 row in set (0.01 sec)

    +———+
    | counter |
    +———+
    | 3 |
    +———+
    1 row in set (0.01 sec)

    +———+
    | counter |
    +———+
    | 4 |
    +———+
    1 row in set (0.01 sec)

    +———+
    | counter |
    +———+
    | 5 |
    +———+
    1 row in set (0.01 sec)+———+
    | counter |
    +———+
    | 6 |
    +———+
    1 row in set (0.01 sec)

    +———+
    | counter |
    +———+
    | 7 |
    +———+
    1 row in set (0.01 sec)

    +———+
    | counter |
    +———+
    | 8 |
    +———+
    1 row in set (0.01 sec)

    +———+
    | counter |
    +———+
    | 9 |
    +———+
    1 row in set (0.01 sec)

    Query OK, 0 rows affected (0.01 sec)

    Vemos que el código que iteraremos está entre LOOP…END LOOP, lo que aparece justo antes (my_loop) es una etiqueta para nombrar ese bucle.… Leer artículo completo

  • Preincremento y postincremento (x++ != ++x)

    Hace unos días un alumno de clases particulares me preguntó la diferencia entre estos dos; me pareció una pregunta interesante ya que los únicos usos que había visto eran como única sentencia:

    a++;
    ++a;

    En este uso no hay diferencia, puesto que hagamos las cosas en el orden que las hagamos el resultado será igual; aunque en este ejemplo tampoco se tiene clara la idea del orden de las operaciones. Pero veamos otro ejemplo:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <stdio.h>

    int main(int argc, char *argv[])
    {
      int a=10;
      int b;

      b=a++;
      printf("a=%d\nb=%d\n", a, b);
    }

    Vemos que estamos realizando un postincremento de a, o lo que es lo mismo, incrementamos la variable a después de las demás operaciones (asignar a b el valor de a).… Leer artículo completo