Latest entries

Como hacer copias de seguridad en PostgreSQL

written by uve

19 June 2010

Ahora vamos a ver como realizar copias de seguridad de una base de datos en PostgreSQL. Para ello existe un comando que se llama pg_dump que nos permite hacer un volcado de una base de datos a un fichero, para posteriormente restaurarlo. La sintaxis básica es:

pg_dump [opciones] [base de datos]

Full entry >>

Arreglillos varios

written by uve

19 June 2010

Esta noche me he tomado un rato de descanso y he aprovechado para arreglar un par de cosillas más del blog (aunque todavía no hay comentarios... ya llegarán Antares).

Full entry >>

Breves: Autodescubrir RSS en los navegadores

written by uve

19 June 2010

Los navegadores web de última generación permiten la subscripción automática a fuentes RSS o Atom de nuestro. Para ello necesitamos indicarle al navegador el link.

Full entry >>

Enteros de mayor precisión en Java

written by uve

17 June 2010

Ahora mismo estoy desarrollando una práctica en la que necesito generar números de 128 bits y escribirlos en un fichero en formato decimal, formato hexadecimal y formato binario.

Empecé jugueteando con C++, y mi sorpresa fue que un long long int utiliza 64 bits bajo una arquitectura de 64 bits. Como el estándar de C/C++ no especifica el tamaño de los tipos de datos esperaba que la últimas versiones del compilador (g++ para ser concretos) utilizasen mayor precisión. Tras esto descarté C++. Existen librerías, como GMP, que nos permiten trabajar con datos de mayor precisión, pero no dispongo de tiempo para investigar.

Lo siguiente en venirme a la cabeza fue Python. La ventaja (y en este caso desventaja) de usar Python es que Python utiliza precisión arbitraria. Esto es, que tú asignas a una variable un entero y te puedes despreocupar. Python asigna dinámicamente el tipo de dato int a la variable, pero si esta crece, en lugar de producir un overflow, le asigna el tipo de dato long y continúa con la ejecución. A partir de ahí, el tipo de dato long crece (reserva de memoria automática) en función de la precisión que necesite. Esto me impide limitar los enteros a 128 bits :(

La opción por la que he optado: Java.

Full entry >>

Personalizar la clave primaria en Django

written by uve

5 June 2010

Supongamos que tenemos la necesidad de utilizar una primary key personalizada en un modelo. O simplemente, supongamos que tenemos el capricho de cambiar el nombre de la clave primaria. Sea como sea, partimos de esta situación:

class Article(models.Model):
    id = models.AutoField(primary_key=True)
    ...

Con el hecho de que definamos una primary key, estamos indicando a Django que no cree una clave primaria por defecto. Al utilizar AutoField, se asignará automáticamente el identificador entero que corressponda. ¿Qué problema tiene esto?

Full entry >>

Nueva aplicación : django-browsers

written by uve

3 June 2010

En cuatro ratillos que he conseguido sacar en estos días he desarrollado una aplicación para Django que se llama django-browsers. Faltan aún algunos detalles para poder sacar la versión 0.1, pero me gustaría tenerla lista para el 20 de Junio. De todas formas me complace poder presentarla.

Esta aplicación está pensada para promocionar y promover el uso de navegadores web que cumplan los estándares (HTML5, CSS3, ...) y tratar de pasar página a la época de Internet Explorer.

Full entry >>

Una de iteradores en C++

written by uve

29 May 2010

Ayer, mi colega Antares me planteó un problema (y yo no sé decir que no a los problemas). Está desarrollando un contenedor en el cuál necesita tener iteradores e iteradores constantes para recorrer los elementos. Probando los iteradores constantes, utilizó el siguiente código:

Contenedor c;
for(Contenedor::const_iterator it = c.begin(); it != c.end(); ++it)
{
    ...
}

Pero el compilador arrojaba el siguiente error:

contenedor.cpp:474: error: conversion from ‘Contenedor::iterator’ to non-scalar type ‘Contenedor::const_iterator’ requested
contenedor.cpp:474: error: no match for ‘operator!=’ in ‘ite != Contenedor::end()()’
contenedor.h:226: note: candidates are: bool Contenedor::const_iterator::operator!=(const Contenedor::const_iterator&) const

Full entry >>

Breves: Inicializar una variable a infinito en C

written by uve

29 May 2010

Ahora, de forma análoga a como Inicializar una variable a infinito en C++, vamos a ver como podemos hacer esto en C. Partimos del mismo ejemplo, supongamos un programa que acepta por entrada estándar un número indeterminado de números reales (pudiendo no introducir ninguno) y queremos que se devuelva el menor de todos los números introducidos. En caso de que no se introduzca ninguno, el programa informará de ello.

Full entry >>

Breves: Inicializar una variable a infinito en C++

written by uve

29 May 2010

En algunas ocasiones, nos encontramos con que necesitamos inicializar una variable al mayor valor posible. Por ejemplo, supongamos un programa que acepta por entrada estándar un número indeterminado de números reales (pudiendo no introducir ninguno) y queremos que se devuelva el menor de todos los números introducidos. En caso de que no se introduzca ninguno, el programa informará de ello.

Full entry >>

Funciones con lista de argumentos variables en C

written by uve

26 May 2010

Hoy voy a explicar brevemente como podemos escribir una función en C con un número de parámetros variables. Esto no es muy habitual, pero en algunas ocasiones puede resultar interesante.

Como ejemplo vamos a implementar una función que concatene un número variable de cadenas de texto.

Full entry >>

Forzar la administración Django a usar SSL

written by uve

22 May 2010

Django ofrece un panel de administración de forma automática. Voy a explicar brevemente como podemos forzar que todo lo que se realice a través del panel de administración vaya a través de una conexión segura: SSL.

Para ello vamos a hacer uso del módulo rewrite que ofrece Apache. Este módulo nos permite reescribir las peticiones antes de que se procesen. Esto se suele utilizar mucho en PHP para que la URI sea más bonita, cosa que en Django no es necesario.

Full entry >>

Apache2: Invalid command 'SSLEngine'

written by uve

21 May 2010

Llevo un par de días investigando el tema de Certificados Digitales, SSL y HTTPS. Aprovechando que tengo que hacer un trabajo acerca de las Autoridades de Certificación (CA) y los Certificados Digitales estoy añadiendo un certificado para el blog. Y como no, ¡menudo problema!

$ sudo service apache2 restart
 * Restarting web server apache2
Syntax error on line 10 of /etc/apache2/sites-enabled/ssl:
Invalid command 'SSLEngine', perhaps misspelled or defined by a module not included in the server configuration
[fail]

Full entry >>

Breves: Forzar la lectura de un entero en C++

written by uve

11 May 2010

Cuando estamos programando en C++ y leemos un entero por terminal, nadie garantiza que realmente se lea. Imaginemos lo siguiente:

int entero;
cin >> entero;

Y cuando se ejecuta el programa, el usuario escribe una 'a'. ¿Qué ocurre? Pues que el programa se sigue ejecutando y el entero no se ha leído.

Full entry >>

Breves: Leer de cin después de cerrarlo en C++

written by uve

11 May 2010

Vamos a ponernos en contexto. Estaba escribiendo un programita en C++ el cuál hace uso de una función que lee desde un flujo (en este caso cin) hasta que encuentra EOF. Escribiendo en terminal podemos simular un fin de fichero pulsando Ctrl+D, pero como consecuencia, también cierra el flujo o lo que es lo mismo, ya no podemos seguir leyendo más datos a través de cin. Todo intento de lectura dará un error.

Full entry >>

Breves: Cómo saber si un campo es nulo con JDBC

written by uve

3 May 2010

Cuando en una tabla se permiten columnas con valores nulos, es necesario checkear que realmente tienen un valor antes de utilizarlo para evitar un java.lang.NullPointerException.

Full entry >>

La teoría es cuando crees saber algo, pero no funciona.
La práctica es cuando algo funciona, pero no sabes por qué.
Los programadores combinan la teoría y la práctica:
Nada funciona y no saben por qué.