Featured Post

Docklet para controlar el Brillo de la pantalla

Pues bien, he escrito otro pequeño Docklet para gnome-do, esta vez se trata de un control de brillo para la pantalla. Al igual que el Docklet anterior, el código está comentado y cualquier duda que surja pueden pegar el comentario y responderé lo mas pronto posible. En esta ocasión fue necesario...

Read More

Docklet para controlar el Brillo de la pantalla

Posted by admin | Posted in Desarrollo, hacks | Posted on 01-09-2009

Tags: , ,

9

Pues bien, he escrito otro pequeño Docklet para gnome-do, esta vez se trata de un control de brillo para la pantalla. Al igual que el Docklet anterior, el código está comentado y cualquier duda que surja pueden pegar el comentario y responderé lo mas pronto posible.

En esta ocasión fue necesario implementar la interface de Dbus que permite controlar el brillo de la pantalla(esto lo mostraré en un post futuro), así también, se implementó el método Scrolled de la clase abstracta AbstractDockletItem, el cual nos permite utilizar el scroll del mouse como un control de nuestro Docklet, en este caso para subir o bajar la intensidad del brillo de pantalla.

Su uso es simple, nos posicionamos sobre el ícono del Docklet y con el scroll del mouse subimos o bajamos la intensidad del brillo de la pantalla.

para instalar, copiar los archivos Brigness.dll y Brightness.dll.mdb a la ruta:

[cc lang="bash"]/usr/local/lib/gnome-do/plugins/[/cc]

Anexo los archivos del proyecto o los compilados:

Proyecto en MonoDevelop

Archivos Compilados(dll, dll.mdb)

Creando un Docklet para Docky de Gnome-do

Posted by admin | Posted in Desarrollo, hacks | Posted on 25-08-2009

Tags: , ,

7

Hace unos días tuve la curiosidad de ver el código fuente de gnome-do, sobre todo de los docklets, y viendo que no era tan difícil decidí hacer un pequeño ejemplo, y dado que aún no existe documentación para desarrollar docklets pensé que sería una buena idea publicar la manera en que se puede desarrollar un docklet sencillo.

El Docklet que escribí es un simple sensor de temperatura para el procesador, muestra un termómetro que cambia su nivel de acuerdo a la temperatura obtenida del archivo:
[cc lang="bash"]/proc/acpi/thermal_zone/THM/temperature[/cc]
También cuando se posiciona el puntero del mouse sobre el Docklet muestra la temperatura actual del procesador en °C.

Debido a la falta de documentación tuve que descargar el branch del repositorio de gnome-do y ver el código de los docklets ya implementados para así tener una idea de como se implementaban.

Para comenzar, debemos crear una nueva solución en Monodevelop, para lo cual hacemos Archivo/Nueva Solución -> C# ->Librería, y ponemos un nombre, yo lo nombré MyDocklet. presionamos Adelante, nos aparecerá una pantalla de Funcionalidades del proyecto, a la cual solo le damos Aceptar. La estructura de la solución se ha creado, ahora tenemos que agregar los Recursos que necesitamos para nuestro Docklet, estos son: iconos(en el caso de usar los propios), y una archivo xml que describiré mas adelante.

Para este caso yo agregué 7 iconos que corresponden a cada nivel del termómetro. El archivo xml  deberá llevar el nombre del proyecto MyDocklet.addin.xml y su contenido es el siguiente:
[cc lang="xml"]
id="MyDocklet"
namespace="Do"
version="1.0"
name="My Docklet"
description="Example of docklet"
author="Angel Perez"
category="Docklet"
>









[/cc]

En la sección los siguientes campos son los importantes:

  • id : el cual deberá tener el nombre del proyecto
  • namespace: el espacio de nombres que deseamos usar, en este caso al tratarse de un proyecto para gnome-do, pues el espacio de nombres a utilizar es Do
  • Category: en gnome-do existen 2 tipos de plugins, los “normales” y los Docklets, usaremos Docklets.

En Runtime se importan los assemblies necesarios, en este caso solo importaremos el dll de nuestro docklet: MyDocklet.dll

En Dependencies se añade el id de la Interface Docky, “Interface.Linux.Docky” en mi caso usé la versión 1.0

En Extension, path lo dejamos tal cual y en el tipo de docklet ponemos el nombre de nuestro proyecto de esta manera “MyDocklet.MyDocklet”

Una vez agregados los recursos debemos agregar las referencias que utilizaremos, eso depende de cada Docklet, sus capacidades y funcionalidades, en este caso el docklet solo hace referencia a librerías básicas y son las siguientes:

  • Do.Interface.Linux
  • Do.Interface.Linux.Docky
  • Do.Platform
  • gdk-sharp
  • gtk-sharp
  • glib-sharp
  • Mono.Cairo
  • System
  • System.Core

Sopas, ya tenemos todo para codificar, a continuación el código del docklet, el cual está comentado:

[cc lang="csharp"]
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Text.RegularExpressions;

using Gdk;
using Gtk;
using Cairo;

using Do.Platform;
using Do.Interface;
using Docky.Interface;
using Docky.Interface.Menus;

namespace MyDocklet{
//heredamos del clase abstracta AbstractDockletItem que nos permitirá implementar el docklet
//y que a su vez hereda de AbstractDockItem
public class MyDocklet : AbstractDockletItem{
//Ruta al archivo log de temperatura
const string LogTemperature = “/proc/acpi/thermal_zone/THM/temperature”;
int MaxTemperature; //temperatura máxima del termometro
int MinTemperature; //temperatura mínima
int CurrentTemperature; //temperatura actual del procesador
Regex number_regex; //expresión regular que se usará para detectar enteros

//Redefinimos Nombre del Docklet. Contenido en Clase abstrata
public override string Name {
get { return “My Docklet”; }
}

//Constructor, inicializamos variables y temporizador
public MyDocklet() {
MaxTemperature = 45;
MinTemperature = 30;
number_regex = new Regex (”[0-9]+”); //se inicializa la expresión regular
GetTemperature(); //se obtiene la temperatura actual del procesador
//Agregamos a un timer el método GetTemperature, para que sense
//la temperatura cada 3 segundos
GLib.Timeout.Add (3 * 1000, GetTemperature);
}

//Método que accede al log de temperatura
bool GetTemperature(){
if (!File.Exists(LogTemperature)) {//si no existe el log
SetText (”No Thermometer Found”);
CurrentTemperature = 0;
MaxTemperature = 0;
MinTemperature = 0;
//metodo perteneciente a clase abstracta que redibuja el icono
RedrawIcon ();
return true;
}
//si existe el log
try{
//lee el log de temperatura
using ( StreamReader reader = new StreamReader(LogTemperature) ){
if (!reader.EndOfStream) {
string line = reader.ReadLine ();
if ( line.StartsWith (”temperature”)){
try {//expresion regular para obtener los grados centrigrados
CurrentTemperature = Convert.ToInt32 (number_regex.Matches (line) [0].Value);
} catch { }
}
}
}
}catch { }
//Método de la clase abstracta que nos permite agregar texto al tooltip del Docklet
//este aparece cada vez que se posiciona el mouse sobre el docklet
SetText (”Temperature: ” + CurrentTemperature + “°C”);
//se redibuja el icono
RedrawIcon ();
return true;
}

//dependiendo del maximo y minimo de temperatura se calcula la escala[1-7]
//para así selecionar el icono que debera dibujarse
int GetScale(){
int diffMaxMin = MaxTemperature – MinTemperature;
int diffCurMin = CurrentTemperature – MinTemperature;
if (diffCurMin <= 0) return 1;

float step = ((float)diffMaxMin)/((float)7);
int scale = (int)(diffCurMin/step)+1;
if(scale > 7) scale = 7;

return scale;
}

//Método de la clase abstracta que obtiene el icono de nuestro docklet
//en caso de iconos personalizados es necesario reimplementarlo
//si se usan iconos definidos en el sistema solo basta implementar el metodo ge
//para Icon y ahi definir el nombre de los iconos del sistema.
protected override Surface MakeIconSurface (Cairo.Surface similar, int size) {
Surface tmp_surface = similar.CreateSimilar (similar.Content, size, size);
//Dependiendo de la escala se coloca un icono diferente para el termometro
string icon = “termo” + GetScale()+”.png@”;
using (Context cr = new Context (tmp_surface)) {
using (Gdk.Pixbuf pbuf = IconProvider.PixbufFromIconName (icon + GetType().Assembly.FullName, size)) {
CairoHelper.SetSourcePixbuf (cr, pbuf, 0, 0);
cr.Paint ();
}
}
return tmp_surface;
}
}
}
[/cc]

una vez que se ha codificado el docklet, nos vamos a Proyecto/Construir Solución, si todo va bién no debe marcar errores, ahora en la carpeta de nuestro proyecto, se creó la carpeta bin/Debug/, en esta se encuentra 2 archivos: MyDocklet.dll y MyDocklet.dll.mdb, esto es todo lo que necesitamos, ahora solo falta copiarlos al directorio en donde se encuentran los plugins de gnome-do, para esto, suponiendo que en nuestra terminal ya nos ubicamos en el directorio bin/Debug de nuestro proyecto, hacemos lo siguiente con privilegios de root:

[cc lang="bash"]cp MyDocklet.* /usr/local/lib/gnome-do/plugins/[/cc]

ahora reiniciamos gnome-do y activamos nuestro docklet y debemos verlo funcionar

Para poder desarrollar el Docklet lo importante es la herencia que se hace de la clase abstracta AbstractDockletItem, misma que hereda de AbstractDockItem, la primer en si solo contiene la definición del atributo Name y su método Get, mismos que deben reimplementarse para que contengan y devuelvan el nombre del docklet, la clase AbstractDockItem es la que contiene la mayoría de los métodos que debemos reimplementar para el Docklet. Algunos de los que reimplementé son los siguientes:

  • Name: Nombre del Docklet
  • MakeIconSurface : la cual reimplementé debido a que quería establecer un icono personalizado, si hubiese querido utilizar un icono de los que ya se encuentran definidos en el sistema, no es necesario implementar este método, solo basta con agregar e implementar el atributo Icon y su método Get, en el cual se definirían solo los nombres de los iconos del sistema y no sus extensiones.

un ejemplo para icono del sistema sería:
[cc lang="csharp"]
protected override string Icon {
get {
if (Muted || CurrentVolume == 0)
return “audio-volume-muted”;
if (CurrentVolume < 33)
return "audio-volume-low";
if (CurrentVolume < 66)
return "audio-volume-medium";
return "audio-volume-high";
}
}
[/cc]
Este ejemplo hace uso de los iconos del sistema usados en el control de volumen, así no es necesario implementar el método MakeIconSurface.

Otros métos utilizados fueron:

  • RedrawIcon( ): utilizado para refrescar el icono del Docklet.
  • SetText(string a): utilizada para agregar texto al tooltip del docklet, el cual aparece cuando el mouse se posiciona por encima del docklet.

Dejo el Link para el Proyecto en Mono, los Archivos Compilados y los fuentes svg de Los Iconos.

Como ya comenté, no existe documentación aún, y lo poco que muestro aquí lo obtuve por leectura de código del proyecto y algunas pruebas. Si desean saber mas sobre la clases abstractas aquí estan las ligas de su código fuente: AbstractDockletItem, AbstractDockItem

saludos!

Carta Abierta a Carlos Slim

Posted by chechenio | Posted in Opinión | Posted on 27-02-2009

Tags: , ,

7

Te pongo la ponencia que dio esta investigadora en el Foro “Qué hacer para crecer” que convocó el gobierno mexicano a través del Poder Legislativo. En este evento Carlos Slim, entre otros, dijo que México estaba al borde de la quiebra y Denis Dresser fue muy clara en cuanto a lo que en verdad sucede en México…y en el mundo.

Espero que los enriquezca.

Denise Dresser

Febrero 15, 2009

Carta Abierta a Carlos Slim

Estimado Ingeniero: Le escribo este texto como ciudadana. Como consumidora. Como mexicana preocupada por el destino de mi país y por el papel que usted juega en su presente y en su futuro. He leído con detenimiento las palabras que pronunció en el Foro “Qué hacer para crecer” y he reflexionado sobre sus implicaciones. Su postura en torno a diversos temas me recordó aquella famosa frase atribuida al presidente de la compañía automotriz General Motors, quien dijo: “lo que es bueno para General Motors es bueno para Estados Unidos”. Y creo que usted piensa algo similar: lo que es bueno para Carlos Slim, para Telmex, para Telcel, para el Grupo Carso es bueno para México. Pero no es así. Usted se percibe como solución cuando se ha vuelto parte del problema; usted se percibe como estadista con la capacidad de diagnosticar los males del país cuando ha contribuido a producirlos; usted se ve como salvador indispensable cuando se ha convertido en bloqueador criticable. De allí las contradicciones, las lagunas y las distorsiones que plagaron su discurso y menciono las más notables.

Usted dice que es necesario pasar de una sociedad urbana e industrial a una sociedad terciaria, de servicios, tecnológica, de conocimiento. Es cierto. Pero en México ese tránsito se vuelve difícil en la medida en la cual los costos de telecomunicaciones son tan altos, la telefonía es tan cara, la penetración de internet de banda ancha es tan baja. Eso es el resultado del predominio que usted y sus empresas tienen en el mercado. En pocas palabras, en el discurso propone algo que en la práctica se dedica a obstaculizar….

Magento para ecommerce

Posted by chechenio | Posted in e-Commerce | Posted on 27-02-2009

Tags: , ,

7

En la actualidad existen diversos CMS (Sistemas manejadores de contenido) los cuales tienen como objetivo ayudar y mejorar la experiencia de los usuarios, tanto para crear nuevos artículos como para no depender directamente del alguien que sepa programación.

Un CMS maneja diversas bases de datos, un espacio de gestión del sistema y muchas otras ventajas que se pueden usar. Normalmente un CMS está enfocado a creación de páginas web.

Crear el diseño puede requerir ayuda de alguien que si sepa de programación, sin embargo el trabajo es mínimo comparado con el desarrollo de un sistema de ésta magnitud. Cuando el CMS esté trabajando su mantenimiento se vuelve relativamente fácil, ya que ingresar nuevos documentos, artículos y demás cosas que se requieran se lleva a cabo en muy pocos pasos y sin necesidad de acceder al código.

En éste caso, Magento, es un CMS enfocado para tiendas virtuales o conocido tambien como e-commerce  y tiene como características:

- manejo de diversos idiomas

- manejo de múltiples tiendas virtuales

- manejo de artículos por categorias

- manejo de pago electrónico

- uso de estadísticas de ventas

- manejo de usuarios

solo por mencionar algunas, sin embargo es un gestor realmente muy completo, ya que tiene integrados cosas tales como: los más vendidos, ofertas temporales, búsquedas rápidas, y sobre todo el manejo del carrito de compras (lo cual no podía faltar).

Inclusive en la página principal de éste proyecto : http://www.magentocommerce.com existen tutoriales para su correcto manejo y administración.

Así mismo se puede ver una tienda demo en la cual se ve a grandes rasgos el entorno que se puede usar para la interacción con el cliente: http://demo.magentocommerce.com

Crear un diseño es relativamente fácil en cuanto a código se refiere, sin embargo (como en mi caso) el uso de colores, imágenes y demás se vuelve un poco complicado por mi falta de experiencia en ése ramo.

Las características que se requieren para su uso son:

  • Sistema Operativo:
    • Linux x86, x86-64
  • Servidor Web:
    • Apache 1.3.x
    • Apache 2.0.x
    • Apache 2.2.x
  • Navegadores soportados:
    • Microsoft Internet Explorer 6 y mayores
    • Mozilla Firefox 2.0 y mayores
    • Apple Safari 2.x
    • Google Chrome
    • El plugin Adobe Flash debe estar instalado.
  • Características de PHP:
    • 5.2.0 o mayor
    • Extensiones Requeridas:
      • PDO_MySQL
      • simplexml
      • mcrypt
      • hash
      • GD
      • DOM
      • iconv
      • SOAP (if Webservices API is to be used)
    • Safe_mode off
    • Memory_limit 32M or more
  • MySQL:
    • 4.1.20
    • InnoDB

Recordar: no hay necesidad de reinventar la rueda, si ya está hecho, ¿por que no utilizarlo?. Además está liberado bajo una licencia OSL.

Visual Attack to steganographic images

Posted by admin | Posted in Esteganografia, Estegoanálisis | Posted on 06-02-2009

Tags: , , ,

6

The easiest way for detect some hidden messages with sequential LSB is know as Visual Attack. When this attack is realized show a pattern where the hidden message is located.

This method is applied in each component color of image’s pixels, and depending of LSB value is applied a bit mask. This bit mask discovers the zone with hidden data, shown as a pattern of colors in the output image.

The important points about of Visual Attack:

  • Try to discover the existence of hidden data, using a computer or the human eyes.
  • The computer decomposes the image in bit layers
  • Any distortion in the layer LSB could be indicate the existence of secret information
  • This inspection could be successful when the data are inserted on smooth areas with pixel values near to saturation

The algorithm is basically this:
[cc lang="python"]
for each pixel in Image
for each color_component in pixel
if ( color_component & 0×01 ) equal to 1 then
color_component = 255
else
color_component = 0
[/cc]

The algorithm in python

[cc lang="python"]
#! /usr/bin/env python
import Image
import sys

if __name__==”__main__”:
if len(sys.argv) >1:
print “Imagen recibida: ” + sys.argv[-1]

im=Image.open(sys.argv[-1])
xsize,ysize = im.size
for x in range(0,xsize):
for y in range(0,ysize):
r,g,b=im.getpixel((x,y))
r = 256 if ( r&0×01 is 1 ) else 0
g = 256 if ( g&0×01 is 1 ) else 0
b = 256 if ( b&0×01 is 1 ) else 0
im.putpixel((x,y),(r,g,b))
im.show()
else:
print “Debe ingresar como parametro el nombre de la imagen!!!”

[/cc]

reference: “LaSalle2008″ Dr. Roberto Gómez Cárdenas