Publi

  • Enlazado dinámico en C (dynamic linking) I: Introducción

    Algo que nos abre un mundo de posibilidades a la hora de realizar nuestros programas es la forma de enlazar los archivos objeto en nuestro binario definitivo. Ésta puede ser dinámica o estática.

    La forma estática es la que se utiliza desde el primer momento que se empieza a programar: hemos creado varios archivos .c y queremos utilizar funciones de otro archivo dentro del archivo principal, con el objetivo de dividir el código en partes y no trabajar desde el mismo archivo.… Leer artículo completo

  • Monitorizar el sistema y obtener gráficas de uso

    Cuando tenemos un servidor bajo nuestro control, es muy importante saber cómo vamos de recursos. Si hemos contratado un VPS, por ejemplo, debemos saber cuándo es hora de ampliarlo, o de contratar algo más pequeño porque vamos sobrados de recursos… o incluso poder comprobar que una parada del servicio se debe a un pico de uso del sistema. Esto también nos puede ayudar para comprobar cuándo nuestro server se ha parado debido a un kernel panic o algo parecido.… Leer artículo completo

  • Introduciendo datos al servidor MySQL desde CSV con ejemplos (importar desde CSV)

    Esto nos resultará muy util a la hora de cargar datos en nuestra base de datos. imaginemos que tenemos una tabla como esta:

    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE Testing.NewTable (
        Id BIGINT,
        Nombre VARCHAR(100),
        Email VARCHAR(100),
        Telefono VARCHAR(100)
    )
    ENGINE=MyISAM;

    por ahora vacía, pero tenemos todos los datos que necesitamos en un archivo CSV como este:

    Caso más simple

    1;Antonio;antonio@dominio.com;123456789
    2;Armando;armando@dominio.com;234567891
    3;Carlos;carlos@dominio.com;345678912
    4;Ceferino;cefe@dominio.com;456789123
    5;Cipriano;cipri@dominio.com;567891234

    El primer ejemplo es fácil, simplemente hacemos:

    1
    2
    3
    LOAD DATA INFILE '/tmp/nombres.csv'
      INTO TABLE Testing.
    Leer artículo completo
  • Ver la fecha de dmesg en formato humano

    Cuando ejecutamos el comando dmesg, normalmente la fecha y la hora viene dada en un formato extraño, unos números decimales normalmente largos, indescifrables que nos pueden traer de cabeza cuando queremos saber cuándo sucedió el evento que estamos leyendo.

    [280213.568809] type=1701 audit(1360483429.151:991): auid=4294967295 uid=1000 gid=1000 ses=4294967295 pid=20049 comm=»chromium-browse» reason=»seccomp» sig=0 syscall=4 compat=0 ip=0x7f2f734d9205 code=0x50000
    [280213.568815] type=1701 audit(1360483429.151:992): auid=4294967295 uid=1000 gid=1000 ses=4294967295 pid=20049 comm=»chromium-browse» reason=»seccomp» sig=0 syscall=4 compat=0 ip=0x7f2f734d9205 code=0x50000
    [280213.568819] type=1701 audit(1360483429.151:993): auid=4294967295 uid=1000 gid=1000 ses=4294967295 pid=20049 comm=»chromium-browse» reason=»seccomp» sig=0 syscall=4 compat=0 ip=0x7f2f734d9205 code=0x50000
    [280213.568822] type=1701 audit(1360483429.151:994): auid=4294967295 uid=1000 gid=1000 ses=4294967295 pid=20049 comm=»chromium-browse» reason=»seccomp» sig=0 syscall=4 compat=0 ip=0x7f2f734d9205 code=0x50000
    [280213.568826] type=1701 audit(1360483429.151:995): auid=4294967295 uid=1000 gid=1000 ses=4294967295 pid=20049 comm=»chromium-browse» reason=»seccomp» sig=0 syscall=4 compat=0 ip=0x7f2f734d9205 code=0x50000
    [280213.570694] type=1701 audit(1360483429.151:996): auid=4294967295 uid=1000 gid=1000 ses=4294967295 pid=20049 comm=»chromium-browse» reason=»seccomp» sig=0 syscall=21 compat=0 ip=0x7f2f734d9957 code=0x50000
    [280213.570701] type=1701 audit(1360483429.151:997): auid=4294967295 uid=1000 gid=1000 ses=4294967295 pid=20049 comm=»chromium-browse» reason=»seccomp» sig=0 syscall=91 compat=0 ip=0x7f2f734d95a7 code=0x50000
    [280214.706376] type=1701 audit(1360483430.291:998): auid=4294967295 uid=1000 gid=1000 ses=4294967295 pid=20049 comm=»chromium-browse» reason=»seccomp» sig=0 syscall=2 compat=0 ip=0x7f2f734d96b0 code=0x50000
    [280217.461365] type=1701 audit(1360483433.047:999): auid=4294967295 uid=1000 gid=1000 ses=4294967295 pid=20049 comm=»chromium-browse» reason=»seccomp» sig=0 syscall=2 compat=0 ip=0x7f2f734d96b0 code=0x50000
    [280217.461376] type=1701 audit(1360483433.047:1000): auid=4294967295 uid=1000 gid=1000 ses=4294967295 pid=20049 comm=»chromium-browse» reason=»seccomp» sig=0 syscall=2 compat=0 ip=0x7f2f734d96b0 code=0x50000

    Tenemos varios modos de hacer esto:

    Un argumento

    Vale, todo esto podemos simplificarlo, si hacemos

    $ dmesg -T
    [dom feb 10 08:57:39 2013] type=1701 audit(1360483429.151:991): auid=4294967295 uid=1000 gid=1000 ses=4294967295 pid=20049 comm=»chromium-browse» reason=»seccomp» sig=0 syscall=4 compat=0 ip=0x7f2f734d9205 code=0x50000
    [dom feb 10 08:57:39 2013] type=1701 audit(1360483429.151:992): auid=4294967295 uid=1000 gid=1000 ses=4294967295 pid=20049 comm=»chromium-browse» reason=»seccomp» sig=0 syscall=4 compat=0 ip=0x7f2f734d9205 code=0x50000
    [dom feb 10 08:57:39 2013] type=1701 audit(1360483429.151:993): auid=4294967295 uid=1000 gid=1000 ses=4294967295 pid=20049 comm=»chromium-browse» reason=»seccomp» sig=0 syscall=4 compat=0 ip=0x7f2f734d9205 code=0x50000
    [dom feb 10 08:57:39 2013] type=1701 audit(1360483429.151:994): auid=4294967295 uid=1000 gid=1000 ses=4294967295 pid=20049 comm=»chromium-browse» reason=»seccomp» sig=0 syscall=4 compat=0 ip=0x7f2f734d9205 code=0x50000
    [dom feb 10 08:57:39 2013] type=1701 audit(1360483429.151:995): auid=4294967295 uid=1000 gid=1000 ses=4294967295 pid=20049 comm=»chromium-browse» reason=»seccomp» sig=0 syscall=4 compat=0 ip=0x7f2f734d9205 code=0x50000
    [dom feb 10 08:57:39 2013] type=1701 audit(1360483429.151:996): auid=4294967295 uid=1000 gid=1000 ses=4294967295 pid=20049 comm=»chromium-browse» reason=»seccomp» sig=0 syscall=21 compat=0 ip=0x7f2f734d9957 code=0x50000
    [dom feb 10 08:57:39 2013] type=1701 audit(1360483429.151:997): auid=4294967295 uid=1000 gid=1000 ses=4294967295 pid=20049 comm=»chromium-browse» reason=»seccomp» sig=0 syscall=91 compat=0 ip=0x7f2f734d95a7 code=0x50000
    [dom feb 10 08:57:40 2013] type=1701 audit(1360483430.291:998): auid=4294967295 uid=1000 gid=1000 ses=4294967295 pid=20049 comm=»chromium-browse» reason=»seccomp» sig=0 syscall=2 compat=0 ip=0x7f2f734d96b0 code=0x50000
    [dom feb 10 08:57:43 2013] type=1701 audit(1360483433.047:999): auid=4294967295 uid=1000 gid=1000 ses=4294967295 pid=20049 comm=»chromium-browse» reason=»seccomp» sig=0 syscall=2 compat=0 ip=0x7f2f734d96b0 code=0x50000
    [dom feb 10 08:57:43 2013] type=1701 audit(1360483433.047:1000): auid=4294967295 uid=1000 gid=1000 ses=4294967295 pid=20049 comm=»chromium-browse» reason=»seccomp» sig=0 syscall=2 compat=0 ip=0x7f2f734d96b0 code=0x50000

    Aunque en algunos sistemas no encontraremos este argumento.… Leer artículo completo

  • Generando fotogramas de vídeo en C con frei0r (y MLT) [Parte I – Introducción]

    frei0r es una API Sencilla para crear efectos de vídeo capaz de generar vídeo, filtrarlo y generar transiciones entre dos o tres fuentes de vídeo. Lo realmente interesante de esta API es que la utilizan otras APIS más grandes para generar parte de sus efectos (como FFMPEG (hay que compilarlo con soporte frei0r), MLT, GStreamer, etc) y es usado además por aplicaciones de vídeo com Lives, Open Movie Editor y por supuesto, está presente en aplicaciones que utilizan MLT como KDEnlive, OpenShot o ShotCut.… Leer artículo completo

  • 5 consejos para internacionalizar nuestros programas con gettext [PHP]

    Hace unos meses publicaba un artículo para hacer traducciones con gettext en nuestras aplicaciones, ahora vamos a ampliar aquello con algunos consejos útiles y trucos.

    1 – Conocer globalmente la locale

    No todo es gettext(), que usaremos para mensajes de la interfaz, puede que incluyamos textos desde base de datos y necesitemos tener a mano en todo momento esa locale, además de mucha más información sobre nuestro proyecto. Para ello, una buena forma es crear una clase estática que almacene esa información.… Leer artículo completo

  • Automatizar efectos para crear vídeos en GIMP con script-fu

    Tal vez hayamos utilizado GIMP es más de una ocasión, es un gran programa para retoque fotográfico en Linux. Por otro lado, para Linux no existen demasiados programas para creación de vídeo y efectos especiales, y los que hay son muy limitados.

    Por eso, se puede dar el caso de que quisiéramos aplicar un efecto de GIMP dentro de un vídeo, pero no sólo en un fotograma estático (que importamos la imagen dentro del vídeo y listo), sino en una animación, modificando ligeramente el comportamiento del efecto fotograma a fotograma.… Leer artículo completo

  • Magia en Bash 50 ejemplos en una sola linea (o dos)

    Bash es una de las herramientas más potentes que tenemos a nuestro alcance, aunque no sólo de bash trata el artículo, sino de trucos para consola, one-liner como dirían muchos (aunque habrá algunos two-liners) que podemos utilizar y pueden hacernos la vida un poco más fácil:

    Cadenas de texto

    Trim

    Es una herramienta que utilizaremos para recortar nuestra cadena basándonos en los a la ìzquierda y a la derecha, en este caso nos basaremos en los espacios, que es uno de sus usos más comunes (así podemos obtener la cadena limpia tanto por delante como por detrás.… Leer artículo completo

  • Conocer la velocidad de descarga de nuestra conexión desde terminal

    A la hora de hacer un test de velocidad, muchas veces recurrimos a páginas que ofrecen aplicaciones Flash para hacer el test de velocidad, muchas veces Flash nos puede resultar incómodo, otras veces, estamos en un ordenador tan antiguo que no tira bien de Flash.

    Estos tests, suelen descargar un fichero relativamente grande, y dividen tamaño del archivo descargado por el tiempo empleado en su descarga, con lo que nos devuelven los Mb/s a lo que hemos descargado dicho archivo; suelen medir la velocidad de un conjunto muy complejo de elementos que están funcionando a la vez (por mencionar algunos de los más importantes):

    • El servidor que nos manda la información: Si el servidor está saturado, tal vez no nos mande la información al máximo de su velocidad
    • La conexión del servidor: Si la velocidad de subida del servidor es más pequeña que la velocidad de bajada del ordenador a analizar (por ejemplo si hacemos que nuestro ordenador envíe el test a casa de un amigo, el test no saldrá bien), si el proveedor de servicios ha penalizado la transferencia del servidor (a lo mejor por consumo excesivo de ancho de banda), o si el servidor tiene muchas peticiones simultáneas, tiene que repartir su ancho de banda entre todos.
    Leer artículo completo
  • Numerar los resultados de un SELECT en MYSQL

    Este ejemplo puede tener muchas utilidades. Por ejemplo, que queramos generar automáticamente campos ID (sin autoincrement), tanto empezando en 1 como empezando en el número que queramos o realizar alguna operación matemática con ese número; en definitiva vamos a introducir un número incremental a cada resultado que nos devuelva.

    Imaginamos que tenemos una tabla `Emails` donde tengo correos electrónicos y nombres de varios amigos. Para crear la estructura, copiar y pegar en MySQL:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    DROP SCHEMA IF EXISTS `PoesiaBinaria` ;
    CREATE DATABASE IF NOT EXISTS `PoesiaBinaria` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

    USE `PoesiaBinaria`;

    CREATE TABLE `Emails` (
           `Email` VARCHAR(100) NOT NULL,
           `Nombre` VARCHAR(200) NOT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

    INSERT INTO `Emails` (`Nombre`, `Email`) VALUES ('Pedro', 'pedro@misamigos.com');
    INSERT INTO `Emails` (`Nombre`, `Email`) VALUES ('Javier', 'javier@misamigos.com');
    INSERT INTO `Emails` (`Nombre`, `Email`) VALUES ('Gaspar', 'gaspar@misamigos.com');
    INSERT INTO `Emails` (`Nombre`, `Email`) VALUES ('Maria', 'maria@misamigos.com');
    INSERT INTO `Emails` (`Nombre`, `Email`) VALUES ('Sandra', 'sandra@misamigos.com');
    INSERT INTO `Emails` (`Nombre`, `Email`) VALUES ('Andrea', 'andrea@misamigos.com');
    INSERT INTO `Emails` (`Nombre`, `Email`) VALUES ('Clara', 'clara@misamigos.com');
    INSERT INTO `Emails` (`Nombre`, `Email`) VALUES ('Andres', 'andres@misamigos.com');

    Ahora puedo extraer datos de dicha tabla:

    1
    SELECT * FROM `Emails`;

    Que me devuelve:

    +——–+———————-+
    | Email | Nombre |
    +——–+———————-+
    | Pedro | pedro@misamigos.com |
    | Javier | javier@misamigos.com |
    | Gaspar | gaspar@misamigos.com |
    | Maria | maria@misamigos.com |
    | Sandra | sandra@misamigos.com |
    | Andrea | andrea@misamigos.com |
    | Clara | clara@misamigos.com |
    | Andres | andres@misamigos.com |
    +——–+———————-+
    8 rows in set (0.00 sec)

    Ahora bien, para numerar los resultados podemos hacer lo siguiente:

    1
    2
    SET @numero=0;
    SELECT @numero:=@numero+1 AS `posicion`, `Emails`.
    Leer artículo completo