logoTh!nk Again


OpenGL en Ubuntu

Posted in C/C++, OpenGL, Tutoriales, ubuntu by admin on the August 13th, 2009

Para compilar programas que utilicen openGL, necesité instalar primero

sudo apt-get install build-essential freeglut3-dev

El build-essential instalará las cosas que necesitas para compilar c++ y usar los makefiles. Por otro lado freeglut3-dev te proporcionará las bibliotecas que necesitas para crear programas openGL.

Inspiración

Este ejemplo crea un humanoide utilizando paralelepipedos que puedes girar y escalar con las letras ‘w’, ‘a’, ’s’ y ‘z’, la combinación de cualquiera de estas letras con la tecla realizará la operación inversa.

#include <iostream>
//#include <Windows.h>
#include <GL/glut.h>
#include <cstdlib>
//sample input:
//    {1, 1, -1},{1, 0, -1},{1, 0, 0},{1, 1, 0}
//    {0, 1, -1},{0, 0, -1},{0, 0, 0},{1, 0, 0}
// We are using the Standard Template Library namespace
using namespace std;

#define VERTICES    8
#define FACES      6

float angleX = 0.0f;
float angleY = 0.0f;
float angleZ = 0.0f;
float transZ = -10.0f;

float   g_fCubeCoords[8][3];

void initGraphics(int argc, char* argv[]);
void startRendering();
void reshape(int w, int h);
void keyboard(unsigned char key, int x, int y);
void display();

void dibujaCubof(float width,float height, float depth){
    //calcula 8 vertices
    double mid_w= width/2.0, mid_h=height/2.0, mid_d=depth/2.0;
    g_fCubeCoords[0][0]= mid_w;g_fCubeCoords[0][1]= mid_h;g_fCubeCoords[0][2]= mid_d;
    g_fCubeCoords[1][0]= mid_w;g_fCubeCoords[1][1]= mid_h;g_fCubeCoords[1][2]=-mid_d;
    g_fCubeCoords[2][0]= mid_w;g_fCubeCoords[2][1]=-mid_h;g_fCubeCoords[2][2]=-mid_d;
    g_fCubeCoords[3][0]= mid_w;g_fCubeCoords[3][1]=-mid_h;g_fCubeCoords[3][2]= mid_d;   
    g_fCubeCoords[4][0]= -mid_w;g_fCubeCoords[4][1]= mid_h;g_fCubeCoords[4][2]= mid_d;
    g_fCubeCoords[5][0]= -mid_w;g_fCubeCoords[5][1]= mid_h;g_fCubeCoords[5][2]=-mid_d;
    g_fCubeCoords[6][0]= -mid_w;g_fCubeCoords[6][1]=-mid_h;g_fCubeCoords[6][2]=-mid_d;
    g_fCubeCoords[7][0]= -mid_w;g_fCubeCoords[7][1]=-mid_h;g_fCubeCoords[7][2]= mid_d;
    glBegin(GL_QUADS);
            /// Front face
            glVertex3fv(g_fCubeCoords[0]);  glVertex3fv(g_fCubeCoords[1]);
            glVertex3fv(g_fCubeCoords[2]);  glVertex3fv(g_fCubeCoords[3]);

            /// Back face
            glVertex3fv(g_fCubeCoords[4]);  glVertex3fv(g_fCubeCoords[5]);
            glVertex3fv(g_fCubeCoords[6]);  glVertex3fv(g_fCubeCoords[7]);

            /// Left face
            glVertex3fv(g_fCubeCoords[0]);  glVertex3fv(g_fCubeCoords[3]);
            glVertex3fv(g_fCubeCoords[7]);  glVertex3fv(g_fCubeCoords[4]);

            /// Right face
            glVertex3fv(g_fCubeCoords[1]);  glVertex3fv(g_fCubeCoords[5]);
            glVertex3fv(g_fCubeCoords[6]);  glVertex3fv(g_fCubeCoords[2]);

            /// Top face
            glVertex3fv(g_fCubeCoords[0]);  glVertex3fv(g_fCubeCoords[4]);
            glVertex3fv(g_fCubeCoords[5]);  glVertex3fv(g_fCubeCoords[1]);

            /// Bottom face
            glVertex3fv(g_fCubeCoords[3]);  glVertex3fv(g_fCubeCoords[2]);
            glVertex3fv(g_fCubeCoords[6]);  glVertex3fv(g_fCubeCoords[7]);
        glEnd();
}

int main(int argc, char* argv[])
{
    initGraphics(argc, argv);
    startRendering();
    return 0;
}

void initGraphics(int argc, char* argv[])
{
    glutInit( &argc, argv );    // Start GLUT with command line arguments
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB )// Set up the display mode
    glutInitWindowSize( 500, 500 );  // Set window init size
    glutInitWindowPosition( 0, 0 );  // Set window init position
    glutCreateWindow( "Humanoide con cubos" )// Create the window with the string as its name

    // GLUT rendering functions
    glutReshapeFunc(reshape);
    glutKeyboardFunc(keyboard);
    glutDisplayFunc( display );  // Set up pointer functions
}

void startRendering()
{   
    glEnable(GL_DEPTH_TEST);
    // Start rendering
    glutMainLoop();
}

void reshape(int w, int h)
{
    glViewport(0, 0, (GLsizei)w, (GLsizei)h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(100.0f, (GLfloat)w/(GLfloat)h, 0.1, 100);
}

void display()
{
    static int i = 0;

    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glPushMatrix();
        glTranslatef(0.0f, 0.0f, transZ);
        glRotatef(angleX, 1.0f, 0.0f, 0.0f);
        glRotatef(angleY, 0.0f, 1.0f, 0.0f);
        glRotatef(angleZ, 0.0f, 0.0f, 1.0f);
        //torso
        glColor3f(.3,.9,0);
        dibujaCubof(3,4,1);
        //pierna izquierda
        glColor3f(0.0f,0.5f,0.1f);
        glTranslatef (1,-3.5,0);       
        dibujaCubof(1,3,1);     
        //pierna derecha
        glTranslatef(-2,0,0);
        dibujaCubof(1,3,1);
        //espinillas
        glTranslatef(0,-3,0);
        dibujaCubof(1.5,3.5,1.5);
        glTranslatef(2,0,0);
        dibujaCubof(1.5,3.5,1.5);       
        //PIES
        glColor3f(1,1,1);
        glTranslatef(.25,-2,.25);
        dibujaCubof(2,.5,2);   
       
        glTranslatef(-2.5,0,0);
        dibujaCubof(2,.5,2);
        //cabeza
        glTranslatef(1.25,11.5,0);
        dibujaCubof(2,2,2);
        //brazos
        glColor3f(0.0f,0.5f,0.1f);
        glTranslatef(2.75,-2,-.25);
        dibujaCubof(2.5,1,1);
        glTranslatef(-5.5,0,0);
        dibujaCubof(2.5,1,1);
        //codos
        glColor3f(1,1,1);
        glTranslatef(-1.75,0,0);
        dibujaCubof(1,1.4,1.4);
        glTranslatef(9,0,0);
        dibujaCubof(1,1.4,1.4);
        //manos
        glColor3f(0.0f,0.5f,0.1f);
        glTranslatef(1,0,0);
        dibujaCubof(1,1,1);
        glTranslatef(-11,0,0);
        dibujaCubof(1,1,1);
       glPopMatrix();

    glutSwapBuffers();
}

void keyboard(unsigned char key, int x, int y)
{
    switch(key)
    {
        case 27:
            exit(0);
        case 'w':
            angleX += 1.0f;
            break;
        case 'W':
            angleX -= 1.0f;
            break;
        case 's':
            angleZ += 1.0f;
            break;
        case 'S':
            angleZ -= 1.0f;
            break;
        case 'a':
            angleY += 1.0f;
            break;
        case 'A':
            angleY -= 1.0f;
            break;
        case 'z':
            transZ += 0.1f;
            break;
        case 'Z':
            transZ -= 0.1f;
            break;
        default:
            break;
    }
    glutPostRedisplay();
}

Para compilar y ejecutar el ejemplo ‘humanoide.cpp’ utilizamos este par de línea.

g++ -o humanoide humanoide.cpp -lglut -lGLU -lG
./humanoide

Cómo instalar fuentes .otf en Ubuntu

Posted in ubuntu by admin on the August 12th, 2009

iQ font – When driving becomes writing / Full making of

En Make Online me encontré con este divertido proyecto (puedes bajar la fuente aquí). Despues de ver el video quisé usar esta fuenta en el OpenOffice, pero resulta que no soporta las fuentes .otf (OpenType).

La solución que encontré es transformarla a .ttf, copiarla a la carpeta de fuentes y al final reconstruir el caché de fuentes.

Inspiración

Instrucciones
Paso 1. Crear una archivo otf2ttf.sh y pegar el siguiente código.

#!/usr/local/bin/fontforge
# Quick and dirty hack: converts a font to truetype (.ttf)
Print("Opening "+$1);
Open($1);
Print("Saving "+$1:r+".ttf");
Generate($1:r+".ttf");
Quit(0);

Nota: No te olvides de darle permisos de ejecución al script

chmod +x otf2ttf.sh

Paso 2. Instalar fontforge

sudo apt-get install fontforge

Paso 3. Ejecutar la siguiente línea de comando para realizar la conversión.

fontforge -script otf2ttf.sh FONTNAME.otf

Paso 4. Copiar el archivo FONTNAME.ttf a /usr/share/fonts
Paso 5. Reconstruir el caché de fuentes

sudo fc-cache -f -v

Twitter integrado en Pidgin

Posted in Tutoriales, ubuntu by admin on the July 5th, 2009

El plugin microblog-purple permite integrar un cliente twitter a tu Pigdin, con el que podrás leer los mensajes más recientes y postear, todo como si se tratase de un chat.

En Ubuntu Intrepid, añadimose al repositorio (Sistema -> Administración -> Orígenes del software) la siguiente línea:

deb http://ppa.launchpad.net/sugree/ubuntu intrepid main

Después de recargar la lista de paquetes, instalamos con la siguiente línea:

sudo apt-get install pidgin-microblog

Basado en este post

¿Cómo eliminar la contraseña de tus archivos PDF?

Posted in Tutoriales, ubuntu by admin on the July 5th, 2009

Solo si conoces el password del PDF del que quieres eliminarlo, puedes usar la herramienta de línea de comandos pdftops y ps2pdf para liberar tu PDF de sus cadenas.

1. Instala pdftops. En Ubuntu, puedes escribir:

apt-get install xpdf-utils

2. Instala ps2pdf (parece que ya se incluye por default en Ubuntu)
3. Convierte el PDF a un archivo postscript, usando el password:

pdftops -upw file.pdf

4. Convierte el postscript resultante (file.ps) de regreso a un PDF:

ps2pdf .ps

Post original @townx

Esta fue la forma larga, si no les funciona pueden probar con qpdf,
1. Instalan con la línea:

sudo apt-get install qpdf

2. Eliminan la contraseña con:

qpdf --password=tu_password --decrypt archivo_original.pdf archivo_sin_password.pdf

Flickrfs: montar tu cuenta Flickr de Yahoo! en tu escritorio

Posted in Tutoriales, ubuntu by admin on the July 5th, 2009


Acostumbraba almacenar las imágenes que utilizo en este blog en una cuenta de google pages, pero como ésta ya no es una opción, tuve la necesidad de buscar otra manera de hacerlo. Aquí es donde el servicio Flickr de Yahoo! entra en escena. Después de hacer el upgrade del Ubuntu 8.04 al Intrepid 8.10, encontré en los repositorios: Flickrfs.

Hechos:

  • Flickrfs es un sistema de archivos virtual que se monta en tu máquina como si fuera otra partición más. Una vez que se montó, obtiene toda la información sobre las imágenes hospedadas en tu cuenta de flickr y los muestra como archivos.
  • Facilmente puedes copiar fotos de tu máquina a la partición montada y automaticamente se cargarán a tu cuenta de flickr. De forma similar puedes copiar los archivos montados a tu máquina local y éstos serán descargados.
  • Flickrfs usa FUSE (Filesystem in USErspace).
  • Todos los archivos montados tiene un meta archivo asociado, el cual proporciona acceso al título, descripción, tags e información de licensia. Modificar cualquiera de estos campos y guardarlos causará que también se actualicenen el servidor.

Se instala con esta línea

sudo apt-get install flickrfs

Después creamos una carpeta en blanco en donde se montará nuestra cuenta de Flickr, por ejemplo:

mkdir ~/FlickrDownloads/

y ejecutamos flickrfs con la siguiente línea

flickrfs ~/FlickrDownloads/

Se abrirá un navegador que mostrará una imagen parecida a esta

Después de autorizar el acceso de flickrfs y si todo sale bien, el siguiente mensaje se mostrará en la consola.

Authorization complete. Sets are being populated in the background. Please wait... Sets have been populated. Done.

Dentro de la carpeta ~/FlickrDownloads/sets se pueden crear los nuevos álbumes.

Mas información en el blog de Manish Rai Jain

¿Como crear tus propios ringtones con el audio de los videos de youtube?

Posted in Tutoriales, ubuntu by admin on the June 19th, 2009


Si has googleado mucho y no encunetras el ringtone que buscas…  y además estás cansado de los sitios en donde te piden registrar hasta el nombre de tu perro entonces este post es para tí.

Los usuarios linux sabemos que al reproducir videos como los de youtube se crea un archivo temporal flv en la carpeta /tmp y esta es la clave de todo el proceso. Extraemos del .flv el audio, lo editamos y lo guardamos como mp3.

Estos son los pasos que seguí para hacer el proceso, ¡no son más de 10 minutos!

1. Busca en youtube algún video con el audio que buscas.
2. Deja cargar el video y copia el archivo temporal que está /tmp.
3. Renombra el archivo como file.flv
4. Instala el convertidor de flv a ogg con la siguiente línea

sudo apt-get install ffmpeg2theora

5. Extrae el audio del archivo flv con el comando

ffmpeg2theora "file.flv" 

6. Ahora tienes un archivo de audio con el mismo nombre del flv: “file.ogg”

7. Instala Audicity si quieres solo una sección del audio con la siguiente línea.

sudo apt-get install audacity

8. En Audicity abre el archivo “file.ogg”, selecciona la parte del audio que quieres, luego Editar->Recortar, después Archivo->Exportar selección… , escoje el fomato mp3 y listo!.

¿Cómo usar Foxit Reader en Ubuntu?

Posted in Tutoriales, ubuntu by admin on the June 17th, 2009

Por mucho tiempo he estado usando el Evince como visor de documentos PDF. Hasta hoy tuve la necesidad de hacer notas sobre un libro (en PDF) y recordé que con Foxit Reader es posible, lo malo es que solo es para güindous. Descargué el Foxit Reader aquí y lo ejecuté con Wine y bualá, ahora puedo hacer notas y subrayar mis PDFs. El único inconveniente es que marca la esquina superior derecha de las páginas con una leyenda mientras el producto no esté registrado, lo cuál no me molesta del todo.

Lo segundo fue establecer FoxReadear como visor predeterminado en Ubuntu, este script que encontré aquí (tutorial completo) hace el trabajo.

#!/bin/bash
# Purpose: To convert Linux-style filename to Windows-style to pass as an argument
# to wine when starting Foxit Reader
Filename="z:"${1//\//\\}
#assuming you use the default installation folder for Foxit in Wine
App='eval wine "/home/dennys/shared_folder/FoxitReader30_enu/Foxit Reader.exe" "'$Filename'"'
$App

bajar script

Solo hay que cambiar la linea ‘eval wine….’ con la ruta del ejecutable “Foxit Reader.exe”, después elegir un archivo PDF, click-derecho “Abrir con otra Aplicacion”, seleccionar el script “foxit.sh” y ya. Ahora podras visualizar tus documentos en FoxitReader con un doble-click.