Programación
SDL 1.3 MinGW Compiled Binaries
26 feb
I’ve just compiled the SDL 1.3 sources for the MinGW compiler.
Get them here: sdl-1.3.0-5397_MinGW.7z
Be sure to check licenses and so at www.libsdl.org
Say hi @ comments if you download it
Template C++ de Singleton con atexit
11 oct
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | #ifndef __SINGLETON_ATEXIT__ #define __SINGLETON_ATEXIT__ #include "Uncopyable.h" #include <cstdlib> template<typename T> class Singleton: public uncopyable { public: static T* getInstance(){ if (__instance == NULL){ __instance = new T; std::atexit(destroy); } return __instance; } private: static void destroy(){ delete __instance; } static T* __instance; }; template<typename T> T* Singleton<T>::__instance = NULL; #endif |
1 2 3 4 5 6 7 8 9 10 11 12 13 | #ifndef UNCOPYABLE_H_ #define UNCOPYABLE_H_ class uncopyable{ // Idea from Effictive C++ by Scott Meyers protected: uncopyable() {} ~uncopyable() {} private: uncopyable(const uncopyable &); uncopyable & operator=(const uncopyable &); }; #endif |
Template C++ de Singleton con auto_ptr
11 oct
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #if !defined(__SINGLETON_AUTO_PTR__) #define __SINGLETON_AUTO_PTR__ #include <memory> #include "uncopyable.h" template <typename T> class Singleton : public uncopyable { public: static T* getInstance(){ static const std::auto_ptr<T> __instance(new T); return __instance.get(); } protected: Singleton(){}; virtual ~Singleton(){}; }; #endif |
1 2 3 4 5 6 7 8 9 10 11 12 | #ifndef UNCOPYABLE_H_ #define UNCOPYABLE_H_ class uncopyable{ // Idea from Effictive C++ by Scott Meyers protected: uncopyable() {} ~uncopyable() {} private: uncopyable(const uncopyable &); uncopyable & operator=(const uncopyable &); }; #endif |
ColladaDOM 1.4 en debian SID (64 bits)
17 jun
Descarga: collada_debian_amd64.tar.bz2
Instalación (con permisos de root):
1 2 3 | cd /usr/local tar xvfj- <path>/collada_debian_amd64.tar.bz2 ldconfig |
** nota: “path” es donde hayas bajado el archivo anterior.
Dependencias para MARS:
1 | aptitude install libpcre++-dev libpcre++0 libpcre3-dev libpcre3 libboost-filesystem-dev libtinyxml-dev |
Suerte.
Collada DOM Locales BUG
16 jun
Collada DOM is buggy, we all know, but this bug makes it unusable. Collada team is not handling locale info, so non C-compatible locale users won’t be able to use float point numbers. While C locale uses floating point numbers like “1.43″, spanish locale uses “1,43″.
One quick workaround is setting the C locale inside your code.
Use this beforce using your dae class:
1 | setlocale (LC_NUMERIC, "C"); |
ColladaDOM 1.4 deb packages i386
8 abr
Thanks, Cleto!
libcolladadom14_2.2-1_i386.deb
libcolladadom14-dev_2.2-1_i386.deb
These have no support for ZAE and are built with tinyxml instead of libxml(2).
Depends on:
1 | aptitude install libpcre++-dev libpcre++0 libpcre3-dev libpcre3 libboost-filesystem-dev libtinyxml-dev |
Compiling, add to LDFLAGS:
-lpcre -lpcrecpp -lboost_filesystem -lminizip -lcollada14dom
Spanish Note:
Estos paquetes contienen lo mismo que hay en este post, pero con dependencias y demás historias. Así no hace falta descargar el .tar.gz
ColladaDOM 1.4 en debian SID (32 bits)
8 abr
¿Quieres paquetes debian? ¡Pasa de este post y mira aquí! debian debs ColladaDOM 1.4 i386.
He tenido problemas utilizando colladadom en alguna máquina de 32 bits por culpa de libxml2 (o hasta ahí he llegado). Mientras que tras compilar con soporte de libxml2 en amd64 no he tenido ningún problema, al hacer lo mismo en 32 bits obtenía lo siguiente:
Error: Dosument is Empty
Así que he construido colladadom 1.4 (sin soporte ZAE, que a mi no me hace falta) contra tinyxml, en vez de libxml2 (por defecto en gnu/linux).
Adjunto el archivo que hay que descomprimir en /usr/local para poder usar ColladaDOM en Debian SID (a día 8 de Abril de 2010).
Para compilar, añadimos a las LDFLAGS del Makefile:
-lpcre -lpcrecpp -lboost_filesystem -lminizip -lcollada14dom
libminizip está en el tar.gz que os dejo, pero las demás dependencias las deberéis resolver de forma manual, esto es …
1 | aptitude install libpcre++-dev libpcre++0 libpcre3-dev libpcre3 libboost-filesystem-dev libtinyxml-dev |
Y eso es todo…
Happy Hacking!
Download: colladadom_sid_32bits-8April2010.tar.gz
ssh+svn en Gna.org
26 mar
Para hacer cambios en los repositorios de gna (svn commit, por ejemplo) hace falta que creemos un par clave pública/clave privada rsa para la autenticación.
Para ello, lo primero que tenemos que hacer es generar nuestra clave:
1 | ssh-keygen -t rsa |
ES IMPORTANTE QUE USEMOS UNA PASSPHRASE. ESTA PASSPHRASE SE USARÁ COMO CONTRASEÑA DE LA CLAVE, Y POR LO TANTO EN EL ACCESO AL REPOSITORIO
De este modo, se crea un par de claves en $(home)/.ssh/ :
- id_rsa – Clave privada (ojo, esta no se comparte jamás)
- id_rsa.pub – Clave pública
Si imprimimos el contenido de la clave pública:
1 2 | brue@doped[12:38:11]~/.ssh$ cat id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAqkoTVAWxq7/6TwSZVBHQSnWoAhUSlPNJaDIQ6qXjz/wDfb3VfLo7aN7T3v5QA/DpiHvsNYFbVU4+32FSh57pxUYdflgPeLTWM3414ZT7i8h4EC7sOGV9GRvvRgFtnd5LJLZXtGZPyEjal8bBzjSytMi69cojwsRXHeoR9H8gLvEXU8r37zyIS8WDg2Hi5+7tPr1OdfBS71+pL+j97bK4E7D9FWXg4FPK7Plin99Uwf1z3XvW2j+G/3xjUu/tGEhO5eLAjAOYcL3Y2OjJPdLmnfVnzAC8hgI75h2Lm1pSzq7hfCLOWuM7XL/M9DBTlN5eNJlqnEJcoQ8tESbQT7lsiQ== brue@doped |
La clave pública es:
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAqkoTVAWxq7/6TwSZVBHQSnWoA.....lsiQ== brue@doped
esto es, empieza con “ssh-rsa” y termina con “usuario@maquina” (que no es más que una descripción de la misma).
Si vamos a la web de configuración de nuestra cuenta en gna nos aparecerán las opciones asociadas a la misma. En esta ocasión nos interesa la edición de las claves SSH.
Si seleccionamos esa edición de claves, podremos introducir la nuestra (¡¡¡LA PÚBLICA!!!) como se muestra en la imagen siguiente:
En el ejemplo anterior se ven tres claves. Esto se debe a que yo tengo introducidas (atención, obviedad) tres claves: la de casa, la del trabajo y la del portátil.
Tras esto, debemos esperar a que gna actualice la bese de datos de las claves, que se realiza a través de una tarea de cron, cada tres horas (o eso dicen ellos). Así, como mucho deberíamos esperar 3 horas. Si a las 3 horas la clave no funciona, o bien hemos hecho algo mal, o algo falla con los servidores de gna (en mi caso pasó lo segundo y casi me vuelvo loco).
Para probar nuestra clave, bajaremos la rama trunk del repo del proyecto en el que estemos autorizados del siguiente modo:
1 | svn co svn+ssh://<login_gna>@svn.gna.org/svn/<proyecto>/trunk <proyecto> |
En mi caso, con M.A.R.S. he de escribir lo siguiente para bajar la rama trunk:
svn co svn+ssh://brue@svn.gna.org/svn/mars/trunk mars
Recordad que si perdéis las claves no pasa nada (mientras las “revoquéis”). Simplemente la borráis de gna y creáis una nueva siguiente desde cero el proceso
Y eso es todo.
Happy hacking!
Pausando un hilo (posix pthread) unos milisegundos.
26 mar
A menudo hace falta para la ejecución de un hilo ya que no queremos que consuma todo el tiempo de CPU, cuando, por ejemplo, hacemos un polling agresivo. Hay que tener en cuenta que sleep() no funciona puesto que para el proceso completamente.
Una posible solución es utilizar la siguiente función:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #include <sys/time.h> #include <pthread.h> ... int VideoSource::threadWait(int milliseconds){ pthread_mutex_t mutex; pthread_cond_t condition; struct timespec timewaited; struct timeval now; if(pthread_mutex_init(&mutex,NULL)) return -1; if(pthread_cond_init(&condition,NULL)) return -1; gettimeofday(&now, NULL); timewaited.tv_sec = now.tv_sec + milliseconds / 1000; timewaited.tv_nsec = now.tv_usec*1000 + (milliseconds % 1000)*1000000; return pthread_cond_timedwait(&condition, &mutex, &timewaited); } |
Ten en cuenta que los sistemas operativos no suelen ser de tiempo real y que además, en hacer los cálculos antes de la espera, se pierda un tiempo … pero bueno, puede ser útil para algunas cosas que no requieran precisión a nivel de ciclos.
![[bRue.org] [bRue.org]](http://www.brue.org/wp-content/uploads/logo_bw.png)


