jueves, 17 de marzo de 2016

Kde Kate con React.js y Syntaxis Hightlight

Para los que me siguen en el blog, saben que mi entorno de escritorio favorita es KDE. Y para desarrollo web en especial para Javascript utilizo Kate.
Resulta que React.js esta muy de modo hoy en día, entonces me di a la tarea de investigar y aprender un poco.
Para mi sorpresa, React.js tiene una sintaxis algo "Jodida". Y no se puede interpretar como Javascript normal.
Entonces tome el Synstaxis Higtlight de Javascript que viene por defecto en Kate y lo edite para que funcione con React.js
(Por cosas como estas amo el software libre).

Simplemente tiene que colocar este archivo:





  
    
       break 
       case 
       catch 
       const 
       continue 
       debugger 
       default 
       delete 
       do 
       else 
       finally 
       for 
       function 
       if 
       in 
       instanceof 
       new 
       return 
       switch 
       this 
       throw 
       try 
       typeof 
       var 
       void 
       while 
       with 
    
    
       class 
       enum 
       export 
       extends 
       import 
       super 

      
       implements 
       interface 
       let 
       package 
       private 
       protected 
       public 
       static 
       yield 
    
    
       Infinity 
       NaN 
       false 
       null 
       true 
       undefined 
    
    

      
      
      
        
      

      
        
        
        

        
        
        
        
        

        
        
        

        
        
        
        
        
        
        

        
        

        
        
        

        
        

        
        

        

        
        

      

      
        
        
        
        
        
        
      

      
        
        
        
        
      

      
        
        
      

      
        
        
        
        
        
        
      

      
        
        
        
      
      
        
        
        
      

      
        
        
      
      
        
        
        
      

      
        
        
        
        
        
        
        
        
      
      
        
        
        
      
      
        
      
      
        
      

      
        
        
      

      
        
        
        
        
        
        
      
      
        
        
        
        
        
        
     
     
        
        
     


    
    
      
      
      
      
      
      

      
      
      
      
      
      

      
      
      
      
      
      
      

      
      

    
  
  
    
      
      
    
    
  


con el nombre. react.xml.

En el folder: ~/.kde/share/apps/katepart/syntax/

Nota: Esta es la primera versión del asunto.
Supongo que la tendré que ir madurando. Cualquier Feedback sera mas que bienvenido.

domingo, 4 de octubre de 2015

Instalar Nvidea Dirver/Steam en Debian 8


Pasos:

1. Agregar el el repositorio al administrador de paquetes
sudo nano /etc/apt/sources.list
#deb http://http.debian.net/debian/ jessie main contrib non-free
sudo apt-get update

 2. Activar multiarquitectura
sudo dpkg --add-architecture i386
sudo apt-get update

3. Instalar el paquete:
sudo apt-get install libgl1-nvidia-glx:i386
sudo apt-get install steam


4. Crear el archivo:

/etc/X11/xorg.conf.d/20-nvidia.conf

Con el contenido:

Section "Device"
        Identifier "My GPU"
        Driver "nvidia"
EndSection

5. Reiniciar

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`

martes, 18 de octubre de 2011

Algunos trucos con el httpd.conf y php.init

Php en su archivo de configuración tiene una serie de atributos interesantes. Muchos de los cuales en mi vida he visto y otros que no les presto mucha importancia. Curiosamente hace un par de semanas atrás, mi jefe directo me asigno una misión bastante peculiar. Tenia que hacer funcionar local un aplicación. No voy a rondar en detalles. Si los quieren leer pueden verlos aquí.

En mi búsqueda de hacer funcionar dicha aplicación me tope con algunas variables en los archivos de configuración en el php y en el apache que quiero compartir por aca:
 
Primer truco

Uno muy interesante es poder anular los warning en php.
Usando la variable siguente en el php.init:

error_reporting = E_ALL & ~E_NOTICE

Esto le dice al Php que muestre los errores, pero no los warning o Notice como se les conoce. Entonces imaginemos que en el php creamos un array o tratamos de acceder alguna variable global y después simplemente tratamos de acceder sus datos con un índice que no existe.

Ejemplo:

echo $_REQUEST["email"]; 

Si esta variable no se encuentra configurada en el php.init, el warning es mostrado.

Sin embargo puede presentar problemas intensos de hackeo. Yo no recomendara utilizarlos.

Segundo Truco

Otro truco que si me parece mas util de usar es el: auto_prepend_fileauto_append_file. Estos son archivos que se cargan al inicio de cualquier script y despues de cualquier otros script en su orden respectivamente.

Un ejemplo seria algo asi como:
auto_prepend_file = /home/sites/koza/phpdefines.php

Esta variable auto carga o auto ejecuta este script antes de cualquier ejecusion. Es equivalente a:

inlcude('/home/sites/koza/phpdefines.php');

En el incio de cualquier script.

Tercer Truco

Ejecutar los script en php en archivos con extensión html. Al inicio pensé que esto seria de lo mas trivial del mundo. Honestamente confieso que me tomo más tiempo del que pensé. Realmente es trivial, pero encontrar el lugar para poner la configuración fue lo que me tomo mucho tiempo. Nota: Se puede hacer esto un archivo .httpaccess. Sin embargo no logre hacerlo funcionar por eso prefiero dejarlo como un nota (De que en teoría es posible).


En el archivo de configuración de apache (httpd.conf)

Buscamos la línea:

AddType application/x-httpd-php

Y le agregamos al final .htm y .html

Quedando algo asi como:

AddType application/x-httpd-php .htm .html

Esto es muy útil por razones de seguridad. Escondiendo en que esta programado la aplicación porque en el browser se vera simplemente .html en los scripts que en realidad son php. Pienso que es una excelente practica de configuración del los servidores.

Cuarto Truco.

Los virtual host, las configuración https y el /etc/hosts. Estos chicos pueden hacer una verdadera epifanía si no se sabe configurar bien. Hagamos algo básico y general. Los archivos hosts son archivos especializados dentro de los sistemas operativos (/etc/hosts para linux, unix y derivados) -> notese el s al final. Este archivo "simula" la llamada de un dominio remplazando por un ip previamente configurado.

Ejemplo:
127.0.0.1 koza.com

Si en el browser abro la dirección www.koza.com en realidad el archivo hosts se encarga de cargar mi servidor local.

Quinto Truco.

Los virtual Host son una noble invención, junto con el archivo host pueden hacer grandes hazanas.
Daremos por un hecho que existe en el archivo host la configuración anteriormente dada.

Entonces podemos construir de koza.com un mundo de reglas virtuales de nuestro sitio como:


        ServerName cruiser.koza.com
        UseCanonicalName Off
        DocumentRoot /home/sites/koza/htdocs/

    SetEnv SITE_LINK_URL http://www.google.com


En la configuracón arriba establecida le estamos diciendo al apache (Con ayuda del host file) que la proxima vez que alguien acceda a cruiser.koza.com su configuración personalizada va a usar Document Root en la carpeta /home/sites/koza/htdocs y que va a tener una variable de entorno personalizada llamada SITE_LINK_URL. Podemos hacer uso de esta en Php asi:

define("SITE_LINK_URL", $_SERVER["SITE_LINK_URL"]);

domingo, 9 de octubre de 2011

A que te Hackeo!!!

Esa fue mi reacción, cuando con mirada frenética y sin menor contemplación una base de datos requería para realizar un encargo inusual de mi jefe inmediato. Este me había solicito echar ha andar local un proyecto web, de la forma que fuera sin importar lo medios. Solo contaba con un FTP.  

Notas: Para evitar cualquier problema evitare nombres, definiciones o cualquier cosa que me pueda llevar a la orca.

En este mundo hay personas que uno simplemente no les puede decir No o darse el lujo de quedarles mal. Para mi una de esas personas es mi Jefe. Lo curioso no es porque sea mi jefe, no es porque sea mi mejor amigo o alguien al que le deba mucho. Es porque simplemente es alguien que me supo ganar como aliado, es alguien que antepone la persona antes que un puesto, un titulo o nombramiento. Alguien que yo respeto, que sabe me apoya en mi ideas locas, que toma en cuenta mi opinión no importa lo ocupado que este. Alguien de admirar.

Y hay empieza mi viaje oscuro, llevándome por el sendero de la devastación informática, a invocar las poderosas magias negras y arcanas del Hackeo Ético. Mi enigmática hazaña empieza con lo mas básico. Un Ftp "abierto de patas", como la puta piedrerita de la linea del tren. Casi desnuda y sin menor seguridad. Completamente irresistible (Sarcasmo negro). La misión que Vega me encomendó es que de una carpeta en un FTP X, lograra descargar un sitio Web (HTML, JS, CSS, PHP) y tratara de correr dicho proyecto en local.

Resulta que dicho proyecto tenia, SSL, Base de datos y unas configuraciones en Php que solo Dios sabe. Ya me conocen, cuando algo es realmente "pichudo", es donde mas me motivo. El reto, las cosas difíciles es algo que me apasiona.
Me di a la tarea de descargar los script y analizarlos en mi computadora local. Después de luchar un rato y simplemente convencido de que la única manera que lograría cumplir con mi misión era entrando por SSH al FTP. Buscar la base de datos, los Certificados SSL en Apache, ademas de la configuraciones de los directorios virtuales.


Tenía la primera regla de oro del hackeo a mi favor. Muchas veces el hackeo es algo que funciona por pura y real oportunidad. No es como en las películas, que tienen equipos de codificación o cosas asi. Aveces hackear es algo tan sencillo como robar el password o asumirlo (abs123, cumpleaños, cédula). También son cosas mas avanzadas como debilidades en el software. Por lo general cuando se descubre una debilidad en un software son un par de días (al menos en software libre) para encontrar el parche de seguridad. Pero el hacker que logra encontrar dicho fallo, se vuelve muy famoso o simplemente tiene un par de días para hacker todo lo que pueda. 

NOTA:
No se crean lo de las películas. No todos los software se pueden hackear. Hay algunos que son super seguros y al menos que encuentren un fallo de seguridad o logren robar un password no lo alcanzaran. Se imagina que existiera un hacker que pudiera romper cualquier seguridad. Podría acceder al banco que quisiera, comprar con tarjetas de crédito robadas. Digamos que seria la persona mas poderosa en el mundo.

Resulta que este FTP que les hablo, estaba tan mal configurado que me permitía llegar a Raíz de un directorio UNIX. YAHOOO, tenia la oportunidad que cualquiera hacker desearía. Una mala configuración en un software. Solo necesitaba ver como lograr entrar a servidor por SSH. No dure mucho en pensar que la solucion estaba en:

ssh-keygen -t rsa

El RSA generado lo subí al directorio del home del FTP. Después cuando ejecute el SSH, BINGO. Estaba dentro del servidor para hacer lo que me viniera en gana. Lo primero, la base de datos. Necesitaba buscarla. Con tan mala suerte que la base no estaba instalada en el Mysql del server. Después de hacer algo de magia con un par de comando, encontre un respaldo en SQL (Otra caseria oportunista exitosa). Simplemente lo importe en mi computadora con el siguiente comando:


mysql -u koza basededatosx << backup.sql

Y descargue todos los archivos que necesitaba buscando los comandos por ssh y despues pasarlos a mi servidor local.

Las próxima entrada será; Lo que aprendí en php.init y el httpd.conf en mis días de hacker... No se las pierdan.

martes, 27 de septiembre de 2011

Upload de QPixmap a Php

Hoy tuve que enfrentarme a la tarea de subir una imagen desde un Programita en C++ a un Script en web de PHP.
Al inicio pensé que no seria complicado pero después de un rato me di cuenta que era la tarea era "infernal".
Mi primera opción fue usar CURL, pero despúes de varios intento fallidos me decline por QT.
Qt tiene una serie de clases para manejo de Network. Sin embargo la mayoría a quedado obsoleta dejando muy pocas en juego.
Al final me decidí por hacerlo con QNetworkAccessManager. Veamos código primero y despúes la explicación.

Prueba Conceptual:

Form en HTML

Enviar un nuevo archivo:

Codigo PHP para subir imagenes

$target_path = "uploads/";

$target_path = $target_path . basename( $_FILES['userfile']['name']); 

if(move_uploaded_file($_FILES['userfile']['tmp_name'], $target_path)) {
    echo "The file ".  basename( $_FILES['userfile']['name']). " has been uploaded";
} else{
    echo "There was an error uploading the file, please try again!";
}

Nota:
No mucho que explicar aca, un form que sube cualquier cosa. Esto se lo manda al PHP y lo salva en una carpeta de upload.

Ahora lo que intenso hacer es simular el request del browser con C++ con QT.

void UploadManager::upload(QString url, QPixmap img){
    QNetworkAccessManager *manager = new QNetworkAccessManager(this);
    connect(manager, SIGNAL(finished(QNetworkReply*)),
    this, SLOT(downloadFinished(QNetworkReply*)));
    QByteArray bytes;
    QBuffer buffer(&bytes);
    buffer.open(QIODevice::WriteOnly);
    img.save(&buffer, "PNG");
    QByteArray multipartform;
    QString crlf("\r\n");
    QString boundaryStr("---------------------------109074266748897678777839994");
    QString boundary="--"+boundaryStr+crlf;
    QString filename = "test.png";
    multipartform.append(boundary.toAscii());
    multipartform.append(QString("Content-Disposition: form-data; name=\"userfile\"; filename=\"" + filename + "\"" + crlf).toAscii());
    multipartform.append(QString("Content-Type: text/plain" + crlf + crlf).toAscii());
    multipartform.append(bytes);
    multipartform.append(QString(crlf + "--" + boundaryStr + "--" + crlf).toAscii());
    QNetworkRequest request;
    request.setUrl(QUrl(QString("http://127.0.0.1/PruebasConceptuales/upload/subearchivo.php")));
    request.setHeader(QNetworkRequest::ContentTypeHeader, "multipart/form-data; boundary=" + boundaryStr);
    manager->post(request, multipartform);
}

Explicación:

Básicamente, lo que hacemos es construir el Request que usa Firefox. Se sabe que cuando se va a subir una imagen el Archivo pasa por un proceso de Base64. Curiosamente el QPixmap simplemente lo convierto en un flujo de Bits (lineas 5 - 8). Y con eso basta para subir. Despúes seguidamente hacemos otro Array de Bits con el cual empezamos a meter todos los datos para simular el post (Lineas 8 -18). Creamos un QNetworkRequest y le decimos al QNetworkAccessManager que use el request y que le pase todos los datos con manager->post(request, multipartform);

Cualquier consulta no duden en comentar :P

lunes, 26 de septiembre de 2011

Kde - Dolphin - Symbolik Link Gui

Hoy saque el rato para hacer un par de Desktop entries que me permitirán hacer los symbolic linnk.

Ya saben el clasico:

ln -s <Origen> <destino>

La cuestión es que por razones meramente laborales, últimamente he tenido que ejecutar ese condenado comando ya varias veces. No es difícil simplemente es medio cansado escribir esas enormes direcciones.

Buscando en el repo y "googleando" tope con tan mala suerte que no encontré ningún GUI. Curiosamente hay un proyecto de symbolic link para "Guindos". Aqui le pueden echar una mirada.

Bueno entonces, me decidí a hacer mi propia versión del asunto. En vista de que un programita en C++ cumpliría mis expectativas, pensé que no seria adecuado ya que estar buscando dos path con un FileChooser es bastante irritante. Sin embargo era mejor que escribir los path a mano. (Vean kompare como ejemplo)

Entonces la inspiración me llego con Dolphin, si pudiera usar el menu contextual para generar orígenes y destinos. Hasta el momento no se como hacer plugin para Dolphin (No se si se puede) pero si había usado los desktop entries para expandir las opciones del menú contextual.

Bueno, entonces manos a la obra.

Como funciona?

Desktop entrie es un archivo especial en los escritorios X definido por FreeDesktop. Es un simple archivo de texto que define reglas y la ejecución de comandos.

Para que funcionen en KDE se puede poner en dos lugares:

/usr/share/kde4/services/ServiceMenus/

/home/<User>/.kde/share/kde4/services/

Y con solo ponerlos ahí basta. Cuando Dolphin refresque estos entries agregara el comportamiento definido en los menus contextuales.

Yo necesitaba habilitar la opción de origen a cualquier cosa, archivos, carpetas.
Entonces la definición fue asi:


[Desktop Entry]
Type=Service
X-KDE-ServiceTypes=KonqPopupMenu/Plugin,inode/directory,all/all,all/allfiles
X-KDE-Submenu=Symbolic Links
X-KDE-AuthorizeAction=shell_access
Actions=lnorigin;

[Desktop Action lnorigin]
Name=Origin
Icon=/opt/resources/SymboliclinkOrigin.png
Exec=bash /opt/scripts/services/lnorigin.sh %f

El script simplemente salva %f  en un archvio temporal en home:

#!/bin/bash
echo $1 > /home/koza/.lnorigin.txt

El asunto con el Destino fue diferente. El menú contextual de Dolphin solo debía mostrar la opción cuando se estuviera apuntando a una carpeta. Esto se debe a que en la carpeta me va a pedir el nombre (Utilice el comando KDialog). Mi definición y el script que hace el truco por abajo fue así:

[Desktop Entry]
Type=Service
X-KDE-ServiceTypes=KonqPopupMenu/Plugin,inode/directory
X-KDE-Submenu=Symbolic Links
X-KDE-AuthorizeAction=shell_access
Actions=lndesteny;

[Desktop Action lndesteny]
Name=Destiny
Icon=/opt/resources/SymboliclinkDesteny.png
Exec=bash /opt/scripts/services/lndesteny.sh %f


#!/bin/bash
path=$1
if [ -f /home/koza/.lnorigin.txt ]
then
    name=$(kdialog --title "Destiny Name" --inputbox "What name do you want?")
    ln -s `cat /home/koza/.lnorigin.txt` $1/$name
else
    kdialog --error "Destiny is not setted"
fi

Notas:
Queda de mas decir que la ubicación de la imagen, la ubicación donde se va a correr el script y otras cosas deben ser ajustados.

PD: Los archivos desktop entries pueden tener cualquier nombre pero con extensión .desktop.

Si tienen problemas comenten abajo y si esto es como muy solicitado puedo hacerme un script de instalación.

Actualización:

Descubri que la manera mas rapida para refrescar los desktop entries (inclusive imagenes) es atravez del comando siguente:

#!/bin/bash
kbuildsycoca4

domingo, 25 de septiembre de 2011

Qt + manipulación de imágenes

Como muchos de mis "seguidores" saben. Yo adoro C++ y QT cuando a programación en linux respecta. La cancha esta bastante clara para mi.

1. Qt tiene mejor documentación ( assistant - Programa de ayuda)
2. Es nativo en c++
3. El 90% de todo tiene ejemplos en codigo
4. El IDE QDevelop es una maravilla.

En fin muchas cosas que algún día escribiré una entrada sobre por que QT es "chiva".Sin embargo no opaca GTK aunque a titulo personal no me gusta.

Hoy he estado haciendo pruebas conceptuales (Pequeños programas) para desarrollar un programa para mi mama.

En mi viaje me encontré con la manipulación de imagen.
Ya había usado manipulación de imágenes anteriormente en QT, algo bastante sencillo pero me daba la idea de por donde buscar. Además en lo de manipulación de imágenes se respecta yo tengo mucha experiencia en Java.

Qt tiene varios clases de manipulación de imágenes para distintos niveles.

QImage:
Esta provee de un set de métodos para manipulación a nivel de Pixel.

QImage ImageDialog::verticalrotation(QImage source_image){
    QImage new_image(source_image.width(), source_image.height(), source_image.format());
    int height_subtraction = source_image.height() - 1;
    for(int x = 0; x < source_image.width(); ++x)
        for(int y = 0; y < source_image.height(); ++y)
            new_image.setPixel(x, height_subtraction - y, source_image.pixel(x, y));
    return new_image;
}
QPixmap:
Esta provee una serie de métodos para realizar transformación de nivel mas alto. Puede ser rotaciones, dimensionar, cortar partes de images, entre otras.
//Corta una sección de una imagen más grande 
QPixmap test = QPixmap(QString::fromUtf8("/home/koza/47411-bigthumbnail.jpg"));
QPixmap chunk = test.copy(10,10,100,100);
label->setPixmap(chunk);
QPainter:
Esta clase provee manipulación de utilitarios. Metodos como dibujar texto, eclipces, rectangulos. Es muy semejante a Ghaphics2D de java.
QPixmap pic(QPixmap::fromMimeSource( "camera.png" ));
QPainter paint;
paint.begin(&pic);
paint.setPen( Qt::blue );
paint.drawText( rect(), AlignCenter, string);
paint.end(); 
mPixLbl->setPixmap(pic);

Convertir de un tipo a otro es relativamente sencillo.  No voy a poner los detalles acá. Sin embargo es bueno comentar que existe una serie de clases para manipulación de imágenes.

Solo resta decir que escoger la clase adecuada depende de lo que se quiera programar.

domingo, 18 de septiembre de 2011

Eyeos -> Unable to search all data matching $transferObject from database

Todo empezó hablando con un compañero del trabajo que es tan entusiasta en programación y de tema en tema empezamos a "fachentiar" sobre las famosas cloud. Fue donde le comente un poco sobre este sistema (EyeOs). Es muy impresionante y open source. De hecho me encanta el Api. Es un engine muy curioso el que desarrollaron.

En la oficina yo uso KDE 4. El problema es que KDE viene por defecto con Mysql, dando problemas cuando tienes que usarlo para otra aplicación como WordPress o EyeOS. Para mayores detalles se puede acceder aca. En la instalación es sencillo, simplemente le establecemos el socket Unix de la siguiente forma:

:home/koza/.local/share/akonadi/socket-sabrina/mysql

Pero cuando tratas de crear una cuenta veras el siguiente problema:

Unable to search all data matching $transferObject from database

Esto se debe a un problema con la conexión a la base de datos de mysql.

Pero si yo veo el esquema de la base de datos con el GUI de mysql?
Si es verdad. La instalación se lleva a cabo de forma exitosa. Pero la instalación usa un código muy diferente al de la aplicación para su funcionamiento productivo. Los scripts de instalación son basicamente desechados una vez la aplicación esta configurada.

Entonces me puse a travesear el código. Muy claro, muy limpio, soy un fan de los desarrolladores de esta aplicación. En mi investigación el script GenericDao.php en el método getConnection esta la magia.
Se implemento usando la clase PDO. (Esto es algo generico de PHP para ecapsular las conexiones a las bases de datos). Entonces el truco es más sencillo de lo que creen. Basta simplemente con abrir settings.php. En la definición de la variable SQL_CONNECTIONSTRING hay que agregar la declaración del unix_socket al string de conexión.


define('SQL_CONNECTIONSTRING', 'mysql:host=localhost;dbname=eyeos;unix_socket=<Ubicación de socket>');

Este seria para mi caso:

define('SQL_CONNECTIONSTRING', 'mysql:host=localhost;dbname=eyeos;unix_socket=/home/koza/.local/share/akonadi/socket-sabrina/mysql.socket'); 

Espero les sirva. Cualquier consulta comenten :P

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...