First post
I think nobody is reading this post at moment its published, you will be get drunk and desiring go out with friends. Really you don't think the first thing I will do on 2007 is sitting down to post, it's programmed. Well,
Happy 2007
I think nobody is reading this post at moment its published, you will be get drunk and desiring go out with friends. Really you don't think the first thing I will do on 2007 is sitting down to post, it's programmed. Well,
Happy 2007
| 28 de December de 2006, a las 19:48 |
Un año más, y si no el último casi, estoy en las vacaciones de navidad, si esa época en que te venden felicidad por todos los costados. Dejando aparte mi espíritu antinavideño (y anticristiano en general), lo importante es que no hay clases y que puedo dedicar mi tiempo en cosas útiles tales como estudiar, meterle más caña a Python, probar cosillas en el servidor, salir por ahí... Pero vaya contradicción ahora que tengo más tiempo es cuando menos hago, aún no me he sentado ni un sólo día a estudiar, Python desde de antes de nochebuena (creo) no he vuelto a leer ningún capítulo más del Learning Python, salir... si bueno algo salgo pero ya no como antes. La verdad es que siempre me pasa igual cuanto más agobiado estoy y más se supone que tengo que estudiar, en época de exámenes, es cuando más me paro a probar esto y lo otro.
En fin que ya no se ni lo que escribo, lo que hay que hacer para rellenar el blog...
Feliz falsedad a todos y próspero año nuevo.
| 9 de December de 2006, a las 21:38 |
C++, Programación, Qt No hay comentarios »
En septiembre comencé a desarrollar una sencilla aplicación de gestión de almacén para el gabinete de estética de mi prima. En un principio pensé en hacerlo en Java, pues era el lenguaje que estudié el año pasado. Pero el desarrollo de interfaces gráficas para este lenguaje no me resultaba demasiado cómodo. Así que decidí hacerlo con C++ utilizando Qt, retomando así un lenguaje y una librería que se me habían quedado un poco pendientes.
El programa en sí es bastante sencillo (de momento), estará lleno de bugs, mal diseñado... también hay que tener en cuenta que es lo primero más o menos serio que hago en el campo de la programación.
Como ya he dicho utilizo Qt (4.2) no solo para las interfaces sino en general. Utilizo las estructuras de datos que vienen con la librería, las clases de acceso a bases de datos... SQLite fue mi elección ya que como no va a ser una base de datos de tamaño excesivo pensé que estaría bien, además para las copias de seguridad basta con copiar el fichero de la base de datos a un lugar seguro.
En fin, que ya tengo digamos una primera versión utilizable del programa, aunque no funciona como me gustaría si que por lo menos "funciona". La gestión de productos es un poco tediosa y tal. Pero bueno para empezar ya se puede manejar toda la información que creemos que es necesaria.
El código del programa se puede obtener mediante subversion:
Para la versión en desarrollo:
svn co http://svn.inbatu.com/almacen/trunk almacen
Para la primera versión que he considerado "estable" (más bien funcional):
svn co http://svn.inbatu.com/almacen/branches/almacen-0.5
Bueno y unas capturas de pantalla (un poco feas):
![]() |
![]() |
![]() |
Ejem, quizá falte maquear un poco más las cosas. El pedazo de hueco blanco de la ventana principal es un textarea que puse para rellenar, más adelante quiero poner una lista de albaranes en su lugar.
| 1 de December de 2006, a las 22:52 |
General, Personal 8 comentarios »
Esta tarde ni corto ni perezoso he visto un muñeco del Slash muy guapo, y bastante barato, no me he podido resistir y me lo he comprado.
El nivel de detalles es impresionante, lleva la pua, una Gibson Les Paul, con las cuerdas de nilon, la marca Gibson en la pala, también cadenas, el pañuelo colgando, sus chapas... Ah y además lleva un Marshall
Dejo unas fotillos, aunque no se aprecian muy bien los detalles.
![]() |
![]() |
![]() |
| 3 de November de 2006, a las 20:45 |
GNU/Emacs No hay comentarios »
Los comandos que pongo aquí son de la forma C-x, M-x, esto quiere decir, en el caso de C-x que debemos pulsar la tecla CONTROL y a la vez la tecla x. En el caso de M-x debemos pulsar la tecla META (ALT ó ESC) y a la vez la tecla x. Bueno, una vez aclarado esto paso a listar un resumen de los comandos básicos.
Nota: Entre paréntesis pondré el nombre largo del comando por ejemplo find-file, que se corresponde con el atajo C-x C-f, con lo cual podremos ejecutar este comando o bien mediante el atajo o bien haciendo M-x find-file RETURN.
Nota: Emacs se mueve entre páginas usando un delimitador de página (que se define mediante la variable page-delimiter). En el modo texto el delimitador de página (no imprimible) se puede insertar mediante C-q C-l (L minúscula), que insertará ^L que aunque parezcan dos carácteres es uno solo.
Este comando es útil cuando por ejemplo estamos editando en consola y el kernel nos tira mensajes, con este comando emacs redibuja la pantalla con la información del buffer. También nos es útil si estamos editando una porción de texto que nos aparece al final del display, usamos este comando y nos centra la línea actual, así vemos lo que tenemos por encima y por debajo.
| 3 de November de 2006, a las 15:25 |
C++, Programación 1 comentario »
Mediante el uso de la palabra clave friend podemos permitir el acceso a miembros privados o protegidos de una clase a funciones que no pertenecen a esa clase o a permitir el acceso a otras clases. Veremos dos casos ejemplo, declarando una función como friend dentro de la interfaz pública de una clase y declarando una clase como amiga.
Cuando declaramos una función como friend en una clase estamos indicando que esa función tendrá acceso a los miembros privados de la clase, pero la función en cuestión no forma parte del ámbito de la clase. Veamos un ejemplo:
Supongamos que tenemos una clase que representa un número racional como un par de números enteros. Queremos que este tipo nuevo se pueda usar de igual forma que int, double,... así:
Racional r(2,3); cout << r << endl;
Para poder hacer esto necesitamos sobrecargar el operador de inserción binario operator<<:
class Racional { friend ostream &operator<<(ostream &out, const Racional &r); public: Racional(int numerador, int denominador); ~Racional(); // ... };
De esta manera la función friend obtiene acceso completo a los miembros de Racional. La implementación de esta función se haría, fijándonos en que no pertenece al ámbito de la clase:
ostream &operator<<(ostream &out, const Racional &r) { // Acceso a los miembros privados de Racional para mostrar r. // ... return out; }
Podríamos haber declarado la función como no friend, entonces tendríamos que usar métodos públicos get(), set() para obtener los valores, usando friend podemos acceder directamente a los miembros, y además la función forma parte de la interfaz pública de la clase Racional.
Además de declarar una función no miembro como friend, podemos declarar funciones miembro de otras clases como friend, así como otras clases como clases amigas.
Las clases amigas se usan en casos donde una clase está íntimamente ligada a otra. Por ejemplo supongamos que tenemos una clase Punto que representa una coordenada, y una clase ColeccionPunto que guarda una lista de puntos. Como la colección quizá necesite manipular objetos Punto, podemos declarar ColeccionPunto como amiga de la clase Punto:
// Clase Punto class Punto { friend ColeccionPunto; public: Punto(double x, double y) : m_x(x), m_y(y) { } ~Punto(); // ... private: double m_x; double m_y; };
Como la clase ColeccionPunto esta declarada como friend, puede acceder a los datos internos de cualquier objeto Punto. Una cosa importante es que esta amistad no es mútua, aunque ColeccionPunto puede acceder a Punto no se da el caso inverso. Además la amistad no es heredable, las clases que deriven de ColeccionPunto no podrán acceder a Punto. El principio detrás de esto es que la amistad no se concede de forma implícita sino que cada clase debe especificar de forma explícita sus amigos.
| 15 de October de 2006, a las 14:25 |
Debian, GNU/Linux No hay comentarios »
Conforme terminamos lo explicado en la primera parte nuestro repositorio no utiliza firmas. Para ello deberemos firmar los Release con gpg, para lo cual necesitamos habernos creado una clave.
Simplemente hemos de ejecutar el siguiente comando:
gpg --gen-key
Nos hará una serie de preguntas, entre ellas nos pedira un passphrase, que sera la clave privada.
Más adelante necesitaremos importar la clave pública para usar el repositorio, la exportamos con el siguiente comando:
gpg -a --export > clave_publica.gpg
Ahora que ya poseemos una clave para firmar el repositorio tenemos que firmar los Release de cada uno de los directorios:
cd dists/sarge gpg -bao Release.gpg Release cd main/binary-i386 gpg -bao Release.gpg Release
Esto nos pide el passphrase que introdujimos al generar la clave, y nos genera un fichero Release.gpg. Pues bien una vez hemos firmado todos los ficheros Release ya tenemos firmado el repositorio.
Ahora lo único que nos falta es importar la clave pública exportada anteriormente en cada una de las máquinas que utilizan el repositorio:
apt-key add clave_publica.gpg
Si no hacemos este último paso el apt de cada máquina no reconocerá como firmados los Release
| 14 de October de 2006, a las 17:59 |
Debian, GNU/Linux No hay comentarios »
En este post voy a explicar cómo crear un repositorio para alojar nuestros propios paquetes .deb . Para ello necesitaremos tener instalado el paquete apt-utils que seguramente ya lo estará.
Antes que nada deberemos crear un directorio raíz donde se hallará el resto de directorios y ficheros. Por ejemplo creamos el directorio /var/repo.
Una vez creado el raíz habrá que crear dentro de el la estructura de directorios, por ejemplo para la distribución sarge creamos la siguiente estructura:
/dists /dists/sarge /dists/sarge/contrib /dists/sarge/contrib/binary-i386 /dists/sarge/contrib/source /dists/sarge/main /dists/sarge/main/binary-i386 /dists/sarge/main/source /dists/sarge/non-free /dists/sarge/non-free/binary-i386 /dists/sarge/non-free/source
Donde vemos que primero se crea el directorio dists, donde luego habrá un directorio por cada distribución (en nuestro caso solo sarge). Dentro de la distribución (sarge) tendremos las diferentes secciones, main para paquetes libres, non-free para paquetes no libres, y contrib para paquetes libres que dependen de otros paquetes que no lo son.
Una vez creadas las secciones creamos un directorio para los binarios, binary-<arquitectura> en este caso como serán exclusivamente para arquitectura i386 solo necesitaremos binary-i386, y un directorio para los fuentes, source.
Una vez creada la estructura ya podemos alojar nuestros paquetes. Para ello tenemos que copiar los .deb correspondientes a paquetes binarios en los directorios binary-i386 de cada sección. Si además queremos distribuir los fuentes copiaremos los ficheros .dsc -diff.tar.gz .orig.tar.bz en los directorios source.
En cada directorio binary-i386 y source necesitamos un fichero Release cuyo contenido sería el siguiente:
Archive: stable
Component: main
Origin: <Tu nombre u organizacion>
Label: <Una etiqueta descriptiva>
Architecture: <Arquitectura de tu procesador o "source"
para los directorios de fuentes>
Necesitamos dos ficheros de configuración:
Ambos ficheros los pondremos en el directorio raíz del repositorio. Y su contenido sería el siguiente:
APT::FTPArchive::Release::Origin "Tu nombre u organizacion"; APT::FTPArchive::Release::Label "Etiqueta descriptiva"; APT::FTPArchive::Release::Suite "stable"; APT::FTPArchive::Release::Codename "sarge"; APT::FTPArchive::Release::Architectures "i386 source"; APT::FTPArchive::Release::Components "main contrib non-free"; APT::FTPArchive::Release::Description "Descripcion detallada";
Dir {
ArchiveDir ".";
CacheDir ".";
};
Default {
Packages::Compress "gzip bzip2";
Sources::Compress "gzip bzip2";
Contents::Compress "gzip bzip2";
};
BinDirectory "dists/sarge/main/binary-i386" {
Packages "dists/sarge/main/binary-i386/Packages";
Contents "dists/sarge/Contents-i386";
SrcPackages "dists/sarge/main/source/Sources";
};
BinDirectory "dists/sarge/contrib/binary-i386" {
Packages "dists/sarge/contrib/binary-i386/Packages";
Contents "dists/sarge/Contents-i386";
SrcPackages "dists/sarge/contrib/source/Sources";
};
BinDirectory "dists/sarge/non-free/binary-i386" {
Packages "dists/sarge/non-free/binary-i386/Packages";
Contents "dists/sarge/Contents-i386";
SrcPackages "dists/sarge/non-free/source/Sources";
};
Tree "dists/sarge" {
Sections "main contrib non-free";
Architectures "i386 source";
};
Default {
Packages {
Extensions ".deb";
};
};
Una vez tenemos los ficheros de configuración adecuados a nuestras necesidades hemos de ejecutar un par de comandos, los cuales podemos meter en un script llamado por ejemplo update-archive.sh:
#!/bin/sh
apt-ftparchive generate apt-ftparchive.conf
apt-ftparchive -c apt-dapper-release.conf release dists/dapper/
>dists/dapper/Release
Una vez hemos puesto los paquetes dentro de los directorios correspondientes de su sección ejecutamos el script update-archive.sh, obteniendo una salida como la siguiente:
$ ./update-archive.sh dists/sarge/main/binary-i386: 21 files 42.7MB 2s dists/sarge/contrib/binary-i386: 0 files 0B 0s dists/sarge/non-free/binary-i386: 4 files 114MB 5s dists/sarge/main/binary-i386/: 21 files 42.7MB 0s dists/sarge/contrib/binary-i386/: 0 files 0B 0s dists/sarge/non-free/binary-i386/: 4 files 114MB 0s dists/sarge/main/source/: 2 pkgs in 0s dists/sarge/contrib/source/: 0 pkgs in 0s dists/sarge/non-free/source/: 0 pkgs in 0s Done Packages, Starting contents. Done. 314MB in 50 archives. Took 7s
Después de los pasos anteriores ya podemos utilizar el repositorio modificando el fichero /etc/apt/sources.list:
Este post es prácticamente una traducción de un howto cuyo link es este.
En un próximo post pondré como añadir nuestra firma al repositorio con gpg.
| 24 de April de 2006, a las 16:05 |
Java, Programación No hay comentarios »
Pues ya que lo estoy dando en clase, me ha dado por probar un poco con swing. El resultado es un pequeño, sencillo y poco usable programa que me he hecho para gestionar libros, mediante una base de datos mysql.
En concreto usando JDBC con el driver de mysql. Tiene muchos fallos y no funciona demasiado bien, pero ahi esta.
| 24 de April de 2006, a las 15:50 |
Pues sí, me salio una oferta y no la pude dejar pasar. El cacharro en cuestión es un HP Pavilion ze4930ea (1.5Ghz, 512 RAM, 40 Gb de disco, tarjeta wireless Intel PRO Wireless 2200...).
Empecé poniendole una Ubuntu Breezy, pero la tarjeta inalámbrica me daba muchos fallos (kernel panic), despues probé una fedora core 5 y más de lo mismo. Compilando el driver a mano, con ndiswrapper y nada. Al final he puesto una Ubuntu Dapper y va a las mil maravillas.