Configurar Impresora/Escaner en Fedora

En estos días me tocó configurar una Impresora/Escaner Epson en mi Fedora.

El proceso fue bastante sencillo, pero dejo aquí anotada mi experiencia para futura referencia y por si alguien se encuentra frente a la misma tarea.

Comencemos!

Continue reading

Posted in Fedora, Hardware | 1 Comment

Hoja de Helecho en Cython

A modo de prueba de concepto aproveché un ratito libre para implementar uno de los trabajos obligatorios que asignamos a los alumnos en una de mis materias en Facultad.

El trabajo consiste en desarrollar un programa que dibuja un conjunto de Fractales mediante un sistema iterativo de funciones. La siguiente imagen muestra el programa corriendo para una configuración que corresponde a una Hoja de Helecho:


Hoja de Helecho

Hoja de Helecho. Los cálculos del fractal fueron realizados en Cython y el resultado fue dibujado con Pygame.



La novedad de esta aplicación consistió en que si bien la prototipé en Python, me tomé un momento para portarla a Cython, con el fin de determinar si podía llegar a notar una mejora en la performance. Cython no es más que una variación de Python que permite anotar las variables con tipos de datos C. En vez de generar código interpretado, Cython compila el módulo a C y crea una biblioteca compartida.

La optimización principal para el Fractal consistió en reemplazar el uso de una lista de Python de 10.000 elementos (utilizada para almacenar los puntos calculados) por un array de C. Por menos que esto parezca, el evitar tener que usar la lista de Python mejoró la performance general del cálculo en un 11%, aproximadamente.

Dentro de todo, 11% no está mal, sobre todo si tenemos en cuenta que el único cambio fue la declaración de la lista (y escribir un archivo de setup). El compilador de Cython se encargó del resto.

Creo que por más que se encuentre en sus primeras versiones, Cython ofrece mucho potencial para optimizar aplicaciones Python. Todo lo que uno debe hacer es dedicar algo de tiempo para encontrar las porciones críticas en performance en su código, anotar las variables apropiadas con tipos de datos C, y dejar que Cython se encargue del resto.

Posted in Computación Gráfica, Programacion, Python | 1 Comment

Instalar Driver de NVIDIA en Fedora 12

En un post anterior comentaba sobre mi intención de actualizar mi Sistema Operativo de un avejentado Ubuntu 8.10 a un nuevo Fedora 12 y como mi plan original se había visto interrumpido debido al reporte de un bug relacionado al uso de placas de video de NVIDIA sobre Fedora.

Finalmente, cuando leí que se había encontrado una solución al problema, decidí continuar con la instalación, pensando en utilizar el driver por defecto que trae la distribución (el driver “nouveau”) e instalar manualmente el driver propietario de NVIDIA cuando fuera necesario.

Ayer, finalmente el momento llegó y decidí emprender la instalación.

Desafortunadamente, el proceso fué un poco más complicado de lo que esperaba, dejando un par de veces mi computadora colgada en una pantalla negra tras rebootear.

A continuación listo lo pasos que funcionaron para mi, si bien puede que no funcionen en otros casos. En cualquier instancia, si decides instalar el driver propietario de NVIDIA, ten a mano un DVD de Fedora para iniciar el “Modo Reparación” en caso de que (como yo) termines con una pantalla negra.

Los siguientes pasos asumen que tienes configurados los repositorios de RPM Fusion. Si no los has configurado, puedes encontrar instrucciones aquí.

Instalación:

    • Agregar el driver nouveau a la Blacklist de modprobe. De ahora en más estará prohibido cargar este driver.
    su -c "echo blacklist nouveau >> /etc/modprobe.d/blacklist.conf"
    • Instalar el módulo de Kernel “kmod-nvidia”:
    su -c "yum install kmod-nvidia"
    • Agregar el siguiente texto al final de la línea del Kernel en el menú de GRUB: nouveau.modeset=0 vga=0×31B. Para ello debemos editar /boot/grub/menu.lst:
    su -c "vim /boot/grub/menu.lst"
    • Rebootear.

      El tercer paso es de particular importancia, ya que olvidarme de esto fué lo que causó que termine en una pantalla negra.

      Es importante revisar que la instalación del módulo concluya sin problemas, ya que de lo contrario, habiendo prohibido el driver nouveau, el sistema no tendrá driver alguno de video que utilizar.

      Las siguientes guías me ayudaron a resolver este asunto:

      Posted in Fedora, Tutoriales | 1 Comment

      Rendering de Modelos de Quake 2

      Durante la semana pasada aproveché un par de días de ocio para trabajar en un proyecto personal.

      La idea consistía en cargar un modelo de popular juego de 1996 1997 de Id Software “Quake 2” y dibujarlo en la pantalla.

      El Quake 2 consistió en uno de mis juegos favoritos en la saga (que actualmente se compone de 4 juegos) y cargar sus modelos 3D y verlos animados fué como un viaje instantáneo a un pasado nostálgico.

      El formato que utiliza el Quake 2 para sus modelos consiste en un archivo binario muy fácil de leer desde código C o C++.

      En este archivo se definen una serie de vértices y triángulos del modelo organizados en “keyframes”: una serie de poses que permiten dibujar el modelo con animación. El archivo también referencia cero o más texturas en formato PCX a utilizarse como “piel” del modelo, en terminología del Quake 2.

      Una vez que el modelo y su textura se encuentran cargados en memoria, utilizo OpenGL y GLUT para dibujarlo.

      Les dejo un video que subí a YouTube con el renderer en acción. El video fue generado dibujando 10 frames por segundo y sin interpolar entre keyframes, lo cual hace que la animación sea un poco tosca y no tan suave como se podría haber hecho.




      Disculpen por el final algo trunco, pero YouTube al parecer le cortó un par de segundos del final.

      Esperen más información en los próximos días 😉

      Posted in C++, Computación Gráfica, OpenGL, Quake | 3 Comments

      Máquina del Tiempo: Trivial HTTP Daemon

      Hace ya varios años, por allá, por el 13 de Marzo de 2006, publicaba en uno de mis viejos blogs discontinuados un programa Java que implementaba un servidor Web sencillo.

      Por aquellos tiempos había estado leyendo sobre cómo funcionaba el protocolo HTTP. HTTP me había parecido que era extremadamente sencillo, sobre todo considerando que es una de las tecnologías fundamentales de Internet, fue as qué decidí probar si realmente era tan sencillo como parecía haciendo un programa prueba de concepto.

      Este artículo es una copia del post realizado en el 2006 en el cual se anunciaba el proyecto, se publicaba un archivo zip conteniendo el programa y se explicaba cómo usarlo.

      De momento únicamente tengo el código compilado. Si a alguien le resulta interesante, puedo buscar el fuente y publicarlo aquí. Si no quieren leer todo el artículo, encontrarán la descarga sobre el final del mismo.

      Sin más, dejo el resto del post original del 2006 a continuación.

      Continue reading

      Posted in Máquina del Tiempo, Networking, Programacion | Comments Off on Máquina del Tiempo: Trivial HTTP Daemon

      Fedora 13 (Goddard) Liberado

      La nueva versión de Fedora, Fedora 13, acaba de ser liberada.

      Esta nueva versión incluye muchas características nuevas que apuntan a todo tipo de usuarios incluyendo: usuarios finales, administradores de sistemas y desarrolladores.

      Entre las nuevas características, puedes encontrar:

      • Mejores drivers de video Open Source tanto para placas NVIDIA como ATI.
      • Python 2.6 y Python 3.0 preinstalados para facilitar la migración de aplicaciones.
      • SystemTap 1.0: una utilidad para realizar trazas de la interacción de aplicaciones Python con el Sistema Operativo.
      • Configuración automática de impresoras mediante la Instalación automática de drivers.
      • y más.

      Pueden encontrar un resumen visual en una única página aquí y un video introductorio comentando el release aquí.

      Posted in Fedora, Linux, Sistemas Operativos | Comments Off on Fedora 13 (Goddard) Liberado

      Crear Bibliotecas Estáticas con GCC

      Hoy estuve revisando cómo crear bibliotecas estáticas para programas C y C++, de forma de poder “empaquetar” código objeto en forma de una Biblioteca reutilizable.

      (An English version of this Post can be found here.)

      Crear una biblioteca estática es muy sencillo y consiste, a grandes razgos, en los siguientes dos pasos:

      1. Compilar el código fuente en código objeto.
      2. Recopilar todo el código objeto en un archivo que representa la Biblioteca.

      Supongamos que tenemos un programa C sencillo como el que se presenta a continación:

      /** algebra.h **/
      
      #ifndef ALGEBRA_H
      #define ALGEBRA_H
      
      typedef struct
      {
      	float x, y, z;
      } Vec3;
      
      void vec3Init(Vec3* v, float x, float y, float z);
      
      float dot(Vec3* a, Vec3* b);
      
      #endif //ALGEBRA_H
      /** algebra.c **/
      
      #include "algebra.h"
      
      void vec3Init(Vec3* v, float x, float y, float z)
      {
      	v->x = x;
      	v->y = y;
      	v->z = z;
      }
      
      float dot(Vec3* a, Vec3* b)
      {
      	return a->x * b->x + a->y * b->y + a->z * b->z;
      }

      Crearemos una biblioteca estática con los siguientes dos comandos:

      gcc -static -c algebra.c -o algebra.o
      ar -rcs libalgebra.a algebra.o

      Por favor nota que hemos denominados nuestra Biblioteca “libalgebra.a”. Esto no es casualidad; El nombre debe comenzar con “lib” y terminar con “.a” para que pueda ser linkeado con gcc en un programa.

      Ahora que se encuentra pronta nuestra Biblioteca, podemos redistribuirla junto con el header algebra.h para que otros programadores puedan hacer uso de ella en sus programas.

      Para ilustrar esto desarrollamos un pequeño programa C que incluya el header y sea linkeado contra nuestra Biblioteca:

      #include <stdio.h> /* printf */
      #include "algebra.h" /* Incluimos nuestro header */
      
      int main()
      {
      	Vec3 a;
      	Vec3 b;
      	vec3Init(&a, 1.0f, 2.0f, 3.0f);
      	vec3Init(&b, 3.0f, 2.0f, 1.0f);
      	printf("<a,b> = %.2f\n", dot(&a,&b));
      }

      Nota como hacemos un uso liberal de tipos de datos y funciones que habíamos definido en nuestra Biblioteca. Para que este programa compile, solo necesitamos que el header esté presente; Para linkearlo, debemos utilizar el flag de gcc “-l” (L minúscula, sin comillas).

      gcc main.c -L. -lalgebra
      $ ./a.out
      <a,b> = 10.00

      Dado el flag “-lalgebra”, GCC comenzará a buscar un archivo denominado “libalgebra.a” (de aquí la imporancia en el nombre utilizado para la Biblioteca). El flag “-L” le indica a GCC donde se encuentra este archivo.

      Espero que les sea útil.

      Posted in C++, Programacion | 1 Comment

      Como Configurar (algo de) Privacidad en Facebook

      Ultimamente hay un gran descontento con Facebook, debido a los cambios más recientes -y retroactivos- a su Política de Privacidad. Es bien sabido que el nivel de privacidad por defecto de Facebook ha ido cambiando a lo largo de los años, volviéndose cada vez permisivo, pero los últimos cambios realmente son aterradores para las personas que valoran su Privacidad.

      La última actualización a la Política de Privacidad (que es ahora un 28% más larga que la Constitución de los Estados Unidos) hace que toda la información de los usuarios sea pública en Internet para cualquiera, incluso para personas que no disponen de una cuenta en Facebook. Los únicos elementos que están a salvo por ahora son las fotos y las publicaciones en el muro. Absolutamente todo lo demás (incluyendo tu lista de amigos, páginas de las que eres “fan” y redes, entre otros) puede ser visto por cualquiera con una conexión a Internet y en cualquier momento.

      El New York Times publica hoy aquí una representación gráfica de todas las opciones de Facebook a las que uno tiene que acceder para poder configurar un nivel de privacidad relativamente razonable. Si bien no explican exactamente qué configurar, el diagrama puede ser utilizado a modo de Mapa para navegar por las opciones y apagar todo lo que uno considera peligroso.

      Dejo el diagrama a continuación.


      Configuración de Privacidad en Facebook, tomado de http://www.nytimes.com/ interactive/2010/05/12/ business/facebook-privacy.html el 13 de Mayo de 2010.



      Una característica que he encontrado sumamente útil al momento de configurar el acceso es hacer uso de Listas de Amigos (grupos), donde se pueden asignar distintos niveles de acceso a tu información en base a grupos de personas. Claro que esto únicamente tiene sentido si aplicamos algunas restricciones al perfil y no si por defecto toda nuestra información es visible a todos nuestros amigos -o peor- a todas nuestras Redes.

      Les recomiendo buscar alguna guía sobre “10 opciones que hay que configurar en Facebook” para poder obtener un nivel adecuado de privacidad.

      Posted in Privacidad, Tweaking | 1 Comment

      Polimorfismo en C++

      Hoy descubrí un característica interesante sobre como funciona el polimorfismo en C++. Estaba obteniendo un mensaje de error del compilador (del linker, en realidad) que nunca había recibido antes.

      (An english version of this post can be found here)

      En mi código disponía de un fragmento similar al que presento a continuación, donde se define una clase abstracta “Base” y la clase “Derived” que hereda de esta mediante herencia pública. En C++ existen tres tipos distintos de herencia: Herencia Pública, Herencia Protegida y Herencia Privada. A los efectos de este artículo, lo que necesitan saber es que la Herencia Pública es similar a la que encontramos en otros lenguajes, como Java, C# u Objective-C.

      #include <iostream>
      using std::cout;
      using std::endl;
      
      class Base
      {
      	public:
      		Base();
      		virtual ~Base();
      		virtual void printClassName() = 0; // =0 significa "abstract"
      };
      
      class Derived : public Base
      {
      	public:
      		Derived();
      		virtual ~Derived() { }
      		virtual void printClassName();
      
      };
      
      Base::Base()
      {
      	this->printClassName();
      }
      
      Base::~Base()
      {
      }
      
      Derived::Derived() : Base()
      {
      }
      
      Derived::~Derived()
      {
      }
      
      void Derived::printClassName()
      {
      	cout << "\"Derived\"" << endl;
      }
      
      int main()
      {
      	Derived* d = new Derived();
      	delete d;
      	return 0;
      }
      

      Ávidos conocedores de patrones de diseño probablemente hayan notado que este fragmento es una implementación del patrón Factory Method, donde tenemos una invocación a un método virtual, abstracto en la clase padre, que imprime el nombre de la clase que estamos instanciando.

      El problema de este fragmento es que cuando invocamos el compilador, obtenemos el siguiente mensaje de error:

      ale@syaoran factory]$ g++ main.cpp -Wall
      Undefined symbols:
        "Base::printClassName()", referenced from:
            Base::Base()  in ccNxv98U.o
            Base::Base()  in ccNxv98U.o
      ld: symbol(s) not found
      collect2: ld returned 1 exit status
      

      Efectivamente, GCC nos advierte que no existe una implementación para el método abstracto “printClassName” y aborta!

      ¿Por qué sucede esto? El problema radica en la forma en que C++ maneja la herencia. Cuando se instancia un objeto cuya clase deriva de otra clase, primero se invoca el constructor de la clase base y luego se invoca el constructor de la clase derivada. Esto implica que el objeto derivado literalmente no existe hasta que se haya terminado de construir el objeto base “interior”.

      En el caso de C++, esto implica que la tabla virtual (utilizada en tiempo de ejecución para aplicar polimorfismo) para el objeto derivado no es creada hasta que la construcción del objeto base se haya creado. Como nosotros estamos invocando un método abstracto dentro del constructor de la clase base, el GCC asume que se invocará la implementación del método en la clase base. Dado que éste no existe (ya que es abstracto), el linker tira un error.

      Peor aún, si el método no fuese abstracto (pero sí virtual), el polimorfismo no funcionaría, invocando la implementación en la clase base y no en la clase derivada.

      ¿Cómo solucionamos este problema?

      La solución, afortunadamente, es sencilla. Simplemente debemos tomar como regla general el siguiente enunciado:

      “Nunca invocar métodos virtuales sobre objetos parcialmente construidos”.

      Para reparar nuestro programa anterior, lo que haremos entonces, es remover la invocación al método virtual del constructor. Dónde ponerlo es una cuestión que, dependiendo de la aplicación, puede ser en un lugar u otro. Una opción que nos permite no cambiar demasiado el diseño es separar el proceso de construcción de un objeto en dos fases: una donde todos los constructores base se ejecutan y una donde se invoque un método especial init() desde el constructor la clase derivada que termine de inicializar el objeto. Esto nos permitirá trabajar una vez que toda la tabla de métodos virtual se encuentre creada.

      Nuestro ejemplo reparado se vería de la siguiente forma:

      #include <iostream>
      using std::cout;
      using std::endl;
      
      class Base
      {
      	public:
      		Base();
      		virtual ~Base();
      		virtual void init();
      		virtual void printClassName() = 0; // =0 significa "abstract"
      };
      
      class Derived : public Base
      {
      	public:
      		Derived();
      		virtual ~Derived();
      		virtual void printClassName();
      };
      
      Base::Base()
      {
      	//Invocación movida a init()
      }
      
      Base::~Base()
      {
      }
      
      void Base::init()
      {
      	printClassName();
      }
      
      Derived::Derived() : Base()
      {
      }
      
      Derived::~Derived()
      {
      }
      
      void Derived::printClassName()
      {
      	cout << "\"Derived\"" << endl;
      }
      
      int main()
      {
      	Derived* d = new Derived();
      	d->init();
      	delete d;
      	return 0;
      }
      

      Esta versión del código compila y linkea sin problemas. Al ejecutarla, felizmente obtenemos los siguientes resultados:

      [ale@syaoran factory]$ ./a.out
      "Derived"
      

      Restaría probar como resuelven este problema otros lenguajes de programación orientados a objetos. Lo dejo como ejercicio para el lector 😉

      Posted in C++, Programacion | Comments Off on Polimorfismo en C++

      ¿Netbooks en vía de extinción? -predicciones

      Leo en Gizmodo sobre la impresionante forma en que las ventas de Netbooks se han desacelerado en el trascurso de tan solo un año. Realmente quedé sorprendido al ver la siguiente gráfica que aquí les copio:


      Crecimiento en las ventas de Netbooks

      Como se puede ver en la gráfica (tomada de este artículo en Gizmodo) el crecimiento en las ventas pasó de un 641% en Julio de 2009 a no más de un 5% en Abril del 2010.

      Aparentemente la postura de Steve Jobs, quien sentenció a los Netbooks como “buenos para nada”, se ve apoyada por evidencia en el mercado.

      Con una pantalla pequeña, un teclado difícil de usar y prestaciones de Hardware un tanto limitadas para el estándar de desarrollo de aplicaciones de hoy en día (que difícilmente hacen un buen uso de los recursos), los Netbooks probablemente debieron su boom a la novelería y a su bajo precio.

      De acuerdo con Gizmodo, los Netbooks serán reemplazados por las Tablet PC’s (como el iPad). Si bien el cambio en el factor Hardware me parece sumamente interesante, personalmente encuentro fascinante lo que podría pasar en el factor Software, donde los sistemas operativos (a diferencia de como ocurrió con los Netbooks), podrían no ser sistemas desarrollados con un PC de escritorio en la mente, sino orientados a una interfaz táctil.

      Sin ir demasiado lejos, podemos ver esto en el iPad, para el cual Apple optó por hacer uso de iPhone OS en vez de Mac OS X. Más evidencia sobre esta posibilidad puede encontrarse viendo el caso de HP, quienes compraron Palm y ahora disponen del Web OS para utilizar en futuros productos, o bien, también podemos ver el Google Chrome OS, la oferta de Google para usuarios que trabajan “en la nube” y el hecho de que recientemente adquirieran a la empresa que desarrollar el BumpTop.

      Pienso que de aquí en más probablemente los Netbooks no desaparezcan del todo, sino que siga existiendo una cierta oferta reducida, sin embargo, de ahora en más considero la atención se enfocará sobre las Tablet PC’s y el modelo de distribución de aplicaciones mediante tiendas, bien al estilo AppStore.

      Posted in Hardware | Comments Off on ¿Netbooks en vía de extinción? -predicciones