Plugin de GIMP – Resynthesizer

Hay algunos plugins que todo usuario de GIMP debe tener instalados, uno de ellos es el plugin Resynthesizer que ofrece generación de texturas para hacer un relleno inteligente de áreas de una imagen o, por ejemplo, para eliminar personas u objetos. La función de este plugin es similar a la opción de ‘content aware fill‘ de Photoshop.

En Debian se puede instalar este plugin como parte del paquete gimp-plugin-registry. Para otras distros o sistemas operativos puedes buscar en la página de GIMP Plugin Registry o bajar el código desde GitHub.

La configuración básica del plugin en el menú Filtros > Mapa > Resintetiza requiere algunos pasos avanzados pero al instalar el plugin también se instala un script que ofrece una interfaz más sencilla que debe ser suficiente para la mayoría de los casos.

Para usar el script basta con seleccionar el área de la imagen que queremos borrar y después seleccionamos el menú Filtros > Realzar > Sintetiza selección. El script funciona usando el área alrededor de la selección para generar una textura que reemplace la selección original. Ten en cuenta que el script no hace magia y que, dependiendo de la imagen, es posible que sea necesario ajustar los parámetros o aplicar el filtro gradualmente a pequeñas partes hasta obtener el resultado deseado. A continuación algunas imágenes de prueba antes y después de aplicar el filtro:

Desaventuras en la tierra de Linux, parte 9

¿Otro post en la serie de Desaventuras tan pronto?. En realidad el contenido de este post iba a ser mencionado en el anterior post de la serie pero el post anterior terminó siendo más largo de lo que esperaba así que no quise extenderlo más. Así que, ¿de qué puede tratarse esta vez? Principalmente Firefox pero también sobre la disponibilidad del software free, open source en Linux.

Read More

Desaventuras en la tierra de Linux, parte 8

Hace poco instalé una nueva impresora en mi PC, se trata de una impresora HP LaserJet Pro M402n. Sin imaginarlo, tratar de instalarla revelaría nuevo material para escribir un post más en esta serie de Desaventuras en la que escribo acerca de todos esos detalles que hacen que Linux no sea aún apto para usuarios comunes y corrientes. Por lo regular, es perfectamente comprensible que Linux tenga sus detalles siendo un esfuerzo de colaboración open source realizado por miles de voluntarios dispersos por todo el mundo. Pero a veces me topo con algunos detalles que, desde mi punto de vista, son imperdonables, esos son el tipo de detalles que alimentan esta serie de posts.

Read More

aganar.com.mx

aganar.com.mx es un página autorizada para participar en línea en los sorteos de Pronósticos para la asistencia pública, la página incluso es recomendada directamente desde la página oficial de Pronósticos para la asistencia pública. Mi problema con la página de aganar.com.mx es el hecho de que, mientras que participar en los sorteos se puede hacer de forma anónima en cualquier agencia de Pronósticos, la página requiere para el registro todos tus datos: nombre completo, fecha de nacimiento, dirección, teléfono… algo no está bien.

De acuerdo, suena lógico que la página requiera algunos de tus datos para hacer los depósitos en caso de resultar ganador pero los datos que requiere siguen pareciendo excesivos. Veamos cómo va a tratar tu información personal la página:

2017-03-30-122025_1366x768_scrot

Vaya… esa sí que es información contradictoria. Yo no sé qué piensen ustedes pero yo no puedo confiar en una página como esta. Creo que seguiré comprando mis boletos de Pronósticos de la forma tradicional.

Tarea de programación: cola dinámica

Un visitante del sitio me pidió ayuda con su tarea de programación sobre una cola dinámica en lenguaje C. El programa debía tener la opción de desplegar el contenido de la cola además de permitir agregar y quitar elementos de la cola.

Este es el código con las correcciones necesarias para que funcione y corra en Linux; también debería correr en Windows para usuarios que no estén usando el Turbo C de los años  90s, aunque debería ser sencillo hacerlo funcionar con unas cuantas modificaciones mínimas.

Espero que este post sea de ayuda para los estudiantes que siempre buscan ayuda para este tipo de tareas de programación. Seguramente seguiré haciendo posts de este tipo de acuerdo a las solicitudes de tareas mas recurrentes :P.

// Tarea de programación - Cola dinámica
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

typedef struct nodo {
    int valor;
    struct nodo *siguiente;
} nodo;

nodo *cola = NULL, *ultimo = NULL;

/*
 * Esta función agrega un nuevo elemento a la cola, recibe como
 * parámetro el valor que se agregará a la cola; los nuevos elementos
 * siempre se agregan al final.
 */
int agregar(int valor) {
    nodo *n = (nodo *)malloc(sizeof(nodo));
    n->valor = valor;
    n->siguiente = NULL;

    printf("Agregando el elemento %d a la cola...\n", valor);
    if (cola == NULL && ultimo == NULL) {
        cola = n;
        ultimo = n;
    }
    else {
        ultimo->siguiente = n;
        ultimo = n;
    }

    return 0;
}

/*
 * Esta función quita un elemento de la cola, no recibe ningún
 * parámetro porque en una cola siempre se quita el elemento que
 * está al inicio.
 */
int quitar() {
    if (cola == NULL && ultimo == NULL) {
        printf("La cola está vacía, no se puede quitar ningún elemento.\n");
        return 0;
    }
    else if (cola == ultimo) {
        int valor = cola->valor;
        free(cola);
        cola = NULL;
        ultimo = NULL;
        printf("Se ha quitado el elemento %d de la cola.\n", valor);
        printf("La cola ha quedado vacía.\n");
    }
    else {
        nodo *n = cola;
        cola = n->siguiente;
        printf("Se ha quitado el elemento %d de la cola.\n", n->valor);
        free(n);
    }
}

/*
 * Muestra la cola.
 */
void mostrar() {
    nodo *n = cola;
    if (n == NULL) {
        printf("La cola está vacía.\n");
        return;
    }

    printf("Mostrando la cola...\n");
    while (n != NULL) {
        printf("\t%d\n", n->valor);
        n = n->siguiente;
    }
}

int main() {
    printf("Este programa muestra el funcionamiento de una cola dinámica.\n");
    printf("- Presiona A para insertar un nuevo elemento a la cola.\n");
    printf("- Presiona Z para quitar un elemento de la cola.\n");
    printf("- Presiona P para mostrar la cola.\n");
    printf("- Presiona Q para salir.\n");

    char key;
    while ((key = toupper(getchar())) != 'Q') {
        switch (key) {
        case 'A':
            agregar(rand());
            break;
        case 'Z':
            quitar();
            break;
        case 'P':
            mostrar();
            break;
        }
    }
    return 0;
}

Programar tareas con anacron

Linux cuenta con la utilidad cron para programar tareas. cron puede usarse incluso por usuarios normales (no administradores) mediante el comando crontab. Sin embargo, las tareas programadas con cron requieren que la PC esté encendida las 24 horas, es decir, si una tarea está programada para ejecutarse a las 12:00 a.m. pero la PC no está encendida en ese momento, entonces la tarea no se ejecutará. Para este tipo de casos existe anacron, un comando de Linux que permite programar tareas que se ejecutarán cuando sea posible mientras la PC esté encendida y no necesariamente a una hora específica. Es decir, anacron no funciona para tareas que deben ejecutarse a una hora exacta (para eso debe usarse cron), sino para tareas que deben ejecutarse diariamente, semanalmente o mensualmente independientemente del tiempo que pase encendida la PC (anacron ejecutará las tareas tan pronto como sea posible cuando detecte que éstas deben ejecutarse).

Por razones obvias, anacron es ideal para PCs de escritorio que no están encendidas las 24 horas. Sin embargo, a diferencia de cron, la configuración predeterminada de anacron no puede ser modificada por usuarios normales. Si puedes modificar la configuración como root, entonces no hay mayor problema y puedes usar el archivo predeterminado de anacron localizado en /etc/anacrontab (aunque debes notar que las tareas programadas se ejecutarán también como root). Para usuarios normales también es posible configurar anacron siguiendo algunos pasos descritos a continuación.

Read More