lunes, 31 de diciembre de 2012

Apache para drupal 7 en Linux (Problemas con Clean URL)

Hace algún tiempo me he empezado a interesar en Drupal 7. Honestamente me ha gustado mucho, la idea esta bien planteada. La documentación esta bien y el soporte de la comunidad. En futuras entradas hablare de los módulos. Por ahora quiero hablar un poco sobre los requisitos necesarios y sobre todo de Apache y su configuración.

Verán instalar Drupal 7 es un juego de ninos. Podrían buscar en Internet miles de entradas de como instalarlo. Por eso no me parece útil referirme al tema.

Una vez instalado ya tienen su sistema instalado en localhost. Y digamos que quieren ingresar a la pagina de autentificación de ususario.
Deberian acceder a la siguente pagina:

http://127.0.0.1/kcontrol/user

Pero sorpresa, SORPRESA!!!
La pagina no existe. Bienvenido al problema de los cleanURL.
Para poder acceder esta pagina deberian usar:

http://127.0.0.1/kcontrol/?q=/user

Porque?
El .htaccess de Apache es un archivo que te permite escribir reglas especializadas para que los clean url funcionen en Drupal 7. Por defecto no vienen configuradas en nuestro Apache de linux mediante de los repositorios (sudo apt-get install apache2)

Por eso vamos a hacer un par de ajustes para que sirvan:

1. Primer paso instalar apache y todas las dependencias:

#!/bin/bash
sudo apt-get install apache2 php5 libapache2-mod-php5 php5-gd php5-dom php5-pgsql


Note que yo uso Postgrest SQL. Por eso el paquete php5-pgsql pero para los mysql adictos debería ser php5-mysql

2. Modificar el archivo /etc/apache2/sites-available/default
Remplazar:
"AllowOverride none" por "AllowOverride All"


3. Habilitar el modulo de rewrite rules

#!/bin/bash
sudo a2enmod rewrite
sudo service apache2 restart

Listo!!!

miércoles, 30 de mayo de 2012

Convertir el color de una imagen a transparente con bash...

Hace tiempo atrás me había enfrentado a la tarea de quitar un color de una imagen en BMP y sustituirla por transparencia.

Nota: Por razones de derechos de autor no puedo poner las imágenes, pero puedo poner el link donde están:

http://www.reinerstilesets.de/

Para recrear lo que quiero hacer es algo como esto:
Cambiar el cafe y ponerlo trasparente
 

Esas imágenes son geniales para programar juegos con SDL. Ya que necesitamos un color key que podamos "sacrificar". Pero si lo queremos usar en algún lenguaje que soporte transparencia como Java.

R// Muy fácil dirán unos, abrís GIMP y seleccionas con Magic Choose el color deseado lo cortas y lo salvas.

Es verdad, pero hacerlo para 1000 imágenes...
VERDAD? que no es tan fácil.

La solución a nuestros problemas es simplemente un script en bash que hagarra todas las imágenes las convierta y borre las originales.

El comando que necesitamos es este:

convert -transparent 'RGB()' imagenOrigen.bmp imagenDestino.png

El script quedaria

#!/bin/bash
FILES=`find $1 | grep bmp`
for f in $FILES
do
    nf=`echo ${f//bmp/png}` #replace all
    echo $nf
    convert -transparent 'RGB(97,68,43)' $f $nf
    rm $f
done

Y para usarlo basta llamar el script y darle el folder con todas las imagenes

viernes, 20 de enero de 2012

El meollo de las librarias y el proceso de linkeo en C++

Uno de los compiladores más completos que cumple con todas las normas ISO de C++ Gcc sobre linux. Y quiero compartir lo que he aprendido en los últimos años de programación.
Lo primero que siempre me costo es el linkeo y que es este condenado proceso:
Bueno el linkeo es el paso de anexar bibliotecas a nuestro código objeto (Source code compilado) generando una imagen binaria.
Un ejemplo hiper sencillo. El clásico holamundo.cpp

//holamundo.cpp
#include <iostream>
using namespace std;
int main() {
    cout << "Hola Mundo" << endl;
    return 0;
}
./hola


El comando genera en silencio un binario con la salida de hola (Parametro -o) del sorce code (seguido de g++)
Para correrlo simplemente usamos

g++ holamundo.cpp -o hola

Este archivo utiliza una librería implícita que es la iostream. Por ende el linkeo se da correctamente.
Pero imagina que queremos hacer algo mas complejo. Algo que necesite de librerías adicionales para trabajar. Bueno que tal si creamos una librería súper sencilla para servir de ejemplo. Con esto se aclararan muchas dudas. Pero lo primero.
Nota: La librería que vamos a crear es conocida como librería estática. Esta es un poco mas pesada. que una dinámica. Y se encuentra en ubicaciones no estandar.( /usr/include y /usr/lib). La dificultad para crear una biblioteca dinámica es nula. Pero lo dejare para futuras entradas.

//koza.h
#ifndef MENSAJE_H
#define MENSAJE_H
int getMessage();
#endif
 
//koza.cpp
#include <iostream>
#include "koza.h"
int getMessage(){
    return 25;
}

Ahora si a crear nuestra biblioteca.

g++ -c koza.cpp -o libkoza.o
ar rcs libkoza.a libkoza.o

Ahora si. La hablada. El primer comando crea un archivo objeto de nuestro source sin linkear. (comando -c). La salida (comando -o) es libkoza.o. Esto es un estándar para bibliotecas. Siempre deben empezar con lib#Nombre#.a (En el caso de las librerías estáticas).
Ahora si tenemos nuestra libreria y nuestro archivo de inlcusion.
Simulemos un ambiente de mas o menos de esta forma.
Primero nuestro archivo de ejemplo para que utilice la biblioteca.

//mostrar.cpp
#include <iostream>
#include "koza.h" //Se incluye la cabecera de esta forma porque es bilioteca estatica (dinamica es con <>)
using namespace std;
int main(){
    cout << getMessage() << endl;
    return 0;
}

Simulemos la siguiente estructura de archivos.
/home/koza/ejemplo/mostrar.cpp
/home/koza/ejemplo/include/koza.h
/home/koza/ejemplo/lib/libkoza.a
ahora si a compilar

g++ /home/koza/ejemplo/mostrar.cpp -I/home/koza/ejemplo/include/ -L/home/koza/ejemplo/lib/ -lkoza

Ahora si que sucede.
El Parámetro -I le dice la ruta de los archivos de inlcusion.
El Parámetro .L le dice la ruta de los archivos de librerías
y el comando -lkoza -> La librería a incluir es libkoza.a PORQUE? Pues por el estándar. el busca el nombre de la librería después del -l#NAME según el nombre libkoza.a.
Ese fue un ejemplo muy troglodita.
Veamos algo mas útil.
Nota: Debemos tener instaladas las bibliotecas de QT4.
Vamos a compilar un ejemplo de holamundoqt.cpp

//holamundoqt.cpp
#include <qapplication>
#include <qpushbutton>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    QPushButton hello("Hello world!");
    hello.resize(100, 30);
    hello.show();
    return app.exec();
}

Qt es una librería para hacer muchas cosas, entre ellas interfaces gráficas.
Bueno es hora de compilar el ejemplo de arriba. Como verán se ocupan un montón de librerías. Entonces a jugar.

g++ holamundoqt.cpp -o hola -I/usr/include/qt4 -I/usr/include/qt4/QtGui -L/usr/lib/qt4 -lQtCore -lQtGui

Hay una herramienta que nos ayuda mucho a la hora de realizar linkers de nuestros programas.
Es la poderosa pkg-config.
Simplemente es una herramienta que ayuda a la hora de completar los comandos de compilación. Generando los parámetros -I -L -l necesarios para compilar.
Para conocer los paquetes instalados usamos:

pkg-config --list-all

El nombre que se genera a la izquierda es el paquete que podemos usar.
En el ejemplo de qt de arriba el siguiente comando

pkg-config --cflags --libs QtGui

Muestra la siguiente salida.
-DQT_SHARED -I/usr/include/qt4 -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtCore -lQtGui -lQtCore
Es precisamente todos los comandos que escribimos arriba. Haciendo uso de esta herramienta y de los pipes. El programa de holamundoqt lo podemos compilar tambien de esta forma:

g++ holamundoqt.cpp -o hola `pkg-config --cflags --libs QtGui`

AEM hablemos del arquetipo 11

Cuando creamos un proyecto con AEM. Siempre es importante saber que arquetipo estamos usando. Pues esto me determinara que source, herramien...