martes, 31 de marzo de 2015

Alfa AWUS036H en Fedora 21

Al intentar usar mi Alfa AWUS036H en Fedora 21 me encontré con problemas de desconexión, inestabilidad y mal funcionamiento.


Para corregirlo solo benes instalar el paquete dkms-rtl818x 
Lo puedes instalar desde aqui:

ftp://ftp.pbone.net/mirror/ftp.freshrpms.net/pub/freshrpms/pub/dag/redhat/9/en/i386/RPMS.dag/dkms-rtl818x-1.0.1b-1.nodist.rf.noarch.rpm

domingo, 29 de marzo de 2015

Fix dompdf genera un PDF corrupto Laravel

Haciendo una prueba con dompdf para Laravel 5 me encontré con que la libreria generaba un PDF corrupto que no se podia leer y Chrome me indicaba "No se pudo cargar el documento PDF".



Me puse a revisar el binario del fichero con Okteta y me di cuenta que dentro del PDF generado se colaba un mensaje de error que indicaba "date(): It is not safe to rely on the system's timezone ..."



Esto ocurre porque la zona horaria no está configurada dentro del fichero php.ini
Basta con editar el fichero /etc/php.ini (Ese es el directorio en Fedora)


Luego buscar el apartado [Date] y editar el campo date.timezone
Colócale tu zona horaria correspondiente. 
Como soy de venezuela debo colocar: America/Caracas


Guardas, reinicias apache con service httpd restart



Y listo, el PDF se genera bien



Este fue el código de prueba que usé:

<?php 
require '../vendor/autoload.php';
define('DOMPDF_ENABLE_AUTOLOAD', false);
require_once '../vendor/dompdf/dompdf/dompdf_config.inc.php';
$html= "<!DOCTYPE html>".
"<html>".
"<head>".
"<title>PULEINA</title>".
"</head>".
"<body>".
"<h1>HOLA!</h1>".
"</body>".
"</html>";
$dompdf = new DOMPDF();
$dompdf->load_html($html);
$dompdf->render();
$dompdf->stream("sample1.pdf");
?>



Autocompletado de ruta de directorios y ficheros en Sublime Text

Si quieres que Sublime Text autocomplete la ruta de ficheros y directorios a medida que los vas escribiendo debes instalar el plugin AutoFileName. 


Para hacerlo buehhh coño ya te di el nombre del plugin, ahora instalalo con Package Control. Si no tienes Package Control instalado debes instalarlo XD 



domingo, 22 de marzo de 2015

Mostrar errores de PHP en Apache2 (Fedora)

Debes modificar el fichero  /etc/php.ini y cambiar el valor del campo display_error de  Off a On



Luego reinicias apache con
service httpd restart

Ahora podrás ver que muestra los errores de PHP


viernes, 20 de marzo de 2015

Corrección ortográfica libreoffice en Fedora 21

Debes instalar el pack de idioma en español
Desde consola:
yum install libreoffice-langpack-es

Cargar imágenes en memoria ram Qt (QImageReader)

Cuando queremos hacer uso intensivo y repetitivo de imágenes no es recomendable leer de disco cada vez que se valla a usar. La solución ideal es guardar la imagen en memoria ram y luego usarla cuando se requiera. Para ello podemos usar la clase QImageReader: 

// Ejemplo:
    QImageReader reader;
    reader.setFileName("imagen.jpg");
    QSize imageSize = reader.size();
    imageSize.scale(ui->label->size(), Qt::KeepAspectRatio);
    reader.setScaledSize(imageSize);
    QImage image = reader.read();
    QPixmap * pixmap = new QPixmap(QPixmap::fromImage(image));    

    label->setPixmap(pixmap);

Ahora cada vez que se quiera usar imagen.jpg no se leerá de disco sino que se buscara directamente de memoria lo cual repercute directamente en el rendimiento de la aplicación.

domingo, 15 de marzo de 2015

Listar ficheros y carpetas con Qt

SI queremos saber los nombres de los ficheros y carpetas dentro de un directorio debemos usar la clase QDir con el método entryList()

QStringList lista=QDir("./Graficos").entryList();

// Imprime todos los ficheros y subdirectorios del directório "Graficos"
qDebug()<<lista;

Ejemplo libconfig con QtCreator: Leer y escribir en el fichero de configuración

En esta entrada veremos un ejemplo de uso de libconfig en linux para trabajar con ficheros de configuración. Usaremos QtCreator como ide.

Lo primero es instalar el paquete libconfig

Desde debian:
apt-get install libconfig

Desde fedora:
yum install libconfig libconfig-devel


Luego debemos linkear la librería desde nuestro IDE. Para ello damos clic derecho al titulo del proyecto y luego en Add Library. Luego colocamos la dirección de el fichero libconfig.so. 
Por lo general está en /usr/lib64/libconfig.so si es un so de 64 bits
Por lo general está en /usr/lib/libconfig.so     si es un so de 32 bits


Puedes hacer el paso anterior de forma manual agregando la siguiente linea a tu fichero .pro
LIBS += -lconfig

Para este ejemplo utilizamos el siguiente fichero de configuración (example.cfg):

// Nombre
nombre = "Libros, Películas y mas";

// Inventario
inventario =
{
  libros = ( { titulo  = "Treasure Island";
              autor = "Robert Louis Stevenson";
              precio  = 29.99;
              qty    = 5; },
            { titulo  = "Snow Crash";
              autor = "Neal Stephenson";
              precio  = 9.99;
              qty    = 8; }
          );

  peliculas = ( { titulo = "Brazil";
               media = "DVD";
               precio = 19.99;
               qty = 11; },
             { titulo = "MEMEMTO";
               media = "VHS";
               precio = 18.99;
               qty = 5; }
           );
};





Este código lee el fichero, muestra su contenido y cambia el valor de la preferencia 'nombre' a Totona.

#include <stdio.h>
#include <stdlib.h>
#include <libconfig.h>


/* Este ejemplo lee el fichero de configuracion example.cfg
 * y muestra su contenido
 */
int main(int argc, char **argv)
{
    static const char *output_file = "updated.cfg";
    static const char *input_file  = "example.cfg";
    config_t cfg;
    config_setting_t *setting;
    const char *str;

    config_init(&cfg);

    /* Lee el fichero, si hay error lo muestra y sale */
    if(! config_read_file(&cfg, input_file))
    {
        fprintf(stderr, "%s:%d - %s\n", config_error_file(&cfg),
                config_error_line(&cfg), config_error_text(&cfg));
        config_destroy(&cfg);
        return(EXIT_FAILURE);
    }    
    

    /* Obtenemos el nombre. */
    if(config_lookup_string(&cfg, "nombre", &str))
        printf("nombre: %s\n\n", str);
    else
        fprintf(stderr, "No hay un campo 'nombre' en example.cfg.\n");

    /* Mostramos todos los libros del inventerio. */
    setting = config_lookup(&cfg, "inventario.libros");
    if(setting != NULL)
    {
        int count = config_setting_length(setting);
        int i;

        printf("%-30s  %-30s   %-6s  %s\n", "titulo", "autor", "precio", "QTY");

        for(i = 0; i < count; ++i)
        {
            config_setting_t *libro = config_setting_get_elem(setting, i);

            const char *titulo, *autor;
            double precio;
            int qty;

            if(!(config_setting_lookup_string(libro, "titulo", &titulo)
                 && config_setting_lookup_string(libro, "autor", &autor)
                 && config_setting_lookup_float(libro, "precio", &precio)
                 && config_setting_lookup_int(libro, "qty", &qty)))
                continue;

            printf("%-30s  %-30s  $%6.2f  %3d\n", titulo, autor, precio, qty);
        }
        putchar('\n');
    }

    /* Muestra todas las peliculas en inventario. */
    setting = config_lookup(&cfg, "inventario.peliculas");
    if(setting != NULL)
    {
        unsigned int count = config_setting_length(setting);
        unsigned int i;

        printf("%-30s  %-10s   %-6s  %s\n", "Titulo", "Media", "Precio", "QTY");
        for(i = 0; i < count; ++i)
        {
            config_setting_t *movie = config_setting_get_elem(setting, i);

            const char *titulo, *media;
            double precio;
            int qty;

            if(!(config_setting_lookup_string(movie, "titulo", &titulo)
                 && config_setting_lookup_string(movie, "media", &media)
                 && config_setting_lookup_float(movie, "precio", &precio)
                 && config_setting_lookup_int(movie, "qty", &qty)))
                continue;

            printf("%-30s  %-10s  $%6.2f  %3d\n", titulo, media, precio, qty);
        }
        putchar('\n');
    }
    
    /** Actualizamos el valor del nombre **/    
    config_setting_t *root,*nombre;

    root = config_root_setting(&cfg);
    nombre=config_setting_get_member(root,"nombre");

    // Cambiamos el valor del nombre y le colocamos
    config_setting_set_string(nombre,"Totona");

    /* Escribimos el fichero de salida*/
    if(! config_write_file(&cfg, output_file))
    {
        fprintf(stderr, "Error escribiendo en el fichero.\n");
        config_destroy(&cfg);
        return(EXIT_FAILURE);
    }

    fprintf(stderr, "Se ha actualizado el fichero %s y se ha guardado en: %s\n",
            input_file,output_file);


    config_destroy(&cfg);
    return(EXIT_SUCCESS);
}



Links de interés:
http://jpmens.net/2009/09/17/reading-configuration-files-with-libconfig/

sábado, 14 de marzo de 2015

Ajustar imagen a Qlabel en Qt

Para hacer que una imagen se ajuste al tamaño de un QLabel se debe modificar su stylesheet.

Para ello se le da botón secundario al label desde el editor de UI



Luego se agrega la siguiente lineal:
border-image: url(:/URL_DE_LA_IMAGEN) 0 0 0 0 stretch stretch;



y Listo

Antes

Despues

Si lo quiere hacer desde código deberías hacer:

label->setStyleSheet("border-image: url(:/URL_DE_LA_IMAGEN) 0 0 0 0 stretch stretch;");.