Hola, que tal!!
Hoy vamos a aprender a crear interfaces gráficas usando Python y GTK, bien para ello es necesario tener conocimientos de python a nivel "intermedio", trabajar un poco con POO, entre algunas otras cosas.

Bien para ello necesitaremos tener Python, yo uso actualmente la versión 2.7 y con esa trabajaré, también es necesario tener las librerías para poder trabajar con GTK, para ello si eres usuario de windows puedes bajar los archivos binarios desde la web oficial, (te recomiendo el paquete all-in-one installer, ahi viene todo lo necesario para usar pyGTK, y descarga el paquete apropiado ya sea python 2.6 o 2.7, etc... ), y si eres usuario de GNU/Linux, probablemente en tu distribución las librerías ya estén instaladas... o por lo menos eso dice en la web oficial xD



Una vez instaladas las librerías, ahora si es hora de programar ;D
Bien para ello abrimos nuestro editor favorito, (IDLE de Python, Bloc de notas, VIM, NANO, Notepad++ etc.. ) y escribiremos lo siguiente:

#!/usr/bin/env python

#Importamos las librerias Necesarias de GTK
import pygtk
pygtk.require("2.0")
import gtk

class Base:
def __init__(self):
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.window.show()

def main(self):
gtk.main()

if __name__=="__main__":
base = Base()
base.main()

Y bien tratare de explicar el code...

Las lineas:
#!/usr/bin/env python

#Importamos las librerias Necesarias de GTK
import pygtk
pygtk.require("2.0")
import gtk

Son para llamar al interprete de Python, después tenemos en la cuarta linea la importación de la librería pyGTK, también decimos que requerimos de la versión 2.0, e importamos la librería gtk, no se asusten en realidad esto no es importante de entender, simplemente deben saber que es para poder trabajar con GTK...

Después tenemos las lineas:

class Base:    
def __init__(self):
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.window.show()

def main(self):
gtk.main()

Creamos una clase llamada "Base", en ella vamos a escribir las funciones, la primera:

def __init__(self):
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.window.show()

Bien, en esta parte como dije al inicio ya debemos de saber un poco de Python, asi que solo explicare los objetos que se crean:

        
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.window.show()

En la primera linea creamos una ventana, asignamos a la variable self.window el valor gtk.Window(gtk.WINDOW_TOPLEVEL) , con esto ya creamos la ventana, despues en la segunda linea hacemos que se muestre...

Después creamos una función llamada main, ahí se almacenará gtk.main(), que posteriormente llamaremos a esta función con las siguientes lineas:


if __name__=="__main__":
base = Base()
base.main()


Si necesitan ayuda sobre estas lineas recomiendo visitar este link, talvez ahí se aclare su duda :D
Y bien con eso ya tenemos nuestra primer ventana... pueden probar el code desde su terminal haciendo:


python interfaz1.py



Bien, si se dan cuenta, al dar click en cerrar, la terminal se ve como si siguiera corriendo el proceso, es decir no se a terminado, no se cerró el programa, bien para ello vamos a agregar  unas lineas al code, asi que apretaremos en la terminal CTR+C y veremos algo como esto:


Ahora si editaremos el code...
Vamos a crear una función "destruir", o asi la llamare yo, en realidad puede tener cualquier nombre, pero es recomendable que a la hora de escribir código sea entendible :D

Bien escribiremos antes de:


def __init__(self):
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.window.show()


Las siguientes lineas:


class Base:
#Creamos la funcion Destruir
def destruir(self,widget, data="None"):
gtk.main_quit()

def __init__(self):
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.window.show()
#Agregamos esta linea
self.window.connect("destroy",self.destruir)

Como podemos ver también agregamos una linea en la función __init__ esto para que cuando se haga click en el botón cerrar se llame a la función destruir y se cierre la ventana correctamente, es IMPORTANTE que a la linea:

self.window.connect("destroy",self.destruir)

se le pase como parámetros "destroy" coma (,) seguidamente de la función para destruir la ventana (self.desruir)...
Ahora si si probamos el code veremos que ya no nos sucede que, la terminal seguía como si aun hubiera un proceso corriendo, esto es porque ahora SI SE CIERRA el proceso correctamente :D

Asi que el codigo finalmente nos queda algo como:


En rojo están las lineas que agregamos...
Y bien esta es nuestro primer programa con Python y GTK, realmente es algo sencillo, después veremos algunas funciones mas para personalizar la ventana, como tamaño, titulo, etc...

Finalmente el código nos quedó así:

#!/usr/bin/env python

#Importamos las librerias Necesarias de GTK
import pygtk
pygtk.require("2.0")
import gtk

class Base:
def destruir(self,widget, data="None"):
gtk.main_quit()

def __init__(self):
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.window.show()
self.window.connect("destroy",self.destruir)

def main(self):
gtk.main()

if __name__=="__main__":
base = Base()
base.main()


Si se preguntan que editor usé, se llama VIM...
¿Alguna duda? Comenta!!
Salud[OS]
[Z]tuX
Bien, como podemos saber en Python El famoso Switch de C/C++, Java, Pascal, etc... no existe, pero podemos simularlo.¿Como podemos hacer esto?Bien pues en Python podemos hacer uso de los famosos Diccionarios, para ello crearemos un diccionario llamado "switch" y dentro de el van las opciones, para dejar mas claro esto podemos ver el siguiente ejemplo:

def ztux():
print "ZtuX"
def blog():
print "Blog"
def programacion():
print "Programacion"

def main():
while True:
switch={1:ztux,
2:blog,
3:programacion,
}
print """Elige una Opcion
[1] ZtuX
[2] Blog
[3] Programacion
"""
opc = input("> ")
switch[opc]()

main()
¿Facil no?¿Dudas? Comenta!!
Hola que tal.... hoy estaba aburrido así que me puse a jugar con Python y pues estoy creando una librería para trabajar con vectores...
Aun empecé y la verdad no se si después la continué, son libres de tomar el code y modificarlo xD

Aquí el code
#Libreria ZVectores - by [Z]tuX
import math

class punto3D(object):
def __init__(self,x=0,y=0,z=0):
self.x=x
self.y=y
self.z=z
def __str__(self):
return "Vector ["+str(self.x)+","+str(self.y)+","+str(self.z)+"]"
def modulo(self):
return math.sqrt(self.x+self.y+self.z)
def show(self):
return self.x,self.y,self.x
#SUMA DE DOS VECTORES
def __add__(self,point):
return punto(self.x+point.x,self.y+point.y,self.z+point.z)
#RESTA DE DOS VECTORES
def __sub__(self,point):
return punto(self.x-point.x,self.y-point.y,self.z-point.z)
#COMPARAMOS DOS VECTORES
def __cmp__(self,point):
if self.x==point.x and self.y==point.y:
return 0

class punto2D(punto3D):
def __init__(self,x=0,y=0):
punto3D.__init__(self,x,y)

#OPERACIONES CON 2 VECTORES
class opc_ptos(object):
'''Opera dos Vectores'''
def __init__(self,x,y,z,a,b,c):
self.x=x
self.y=y
self.z=z
self.a=a
self.b=b
self.c=c
def pp(self):
'''Producto Punto'''
return (self.x*self.a)+(self.y*self.b)+(self.z*self.c)
def pc(self):
'''Producto Cruz'''
i=(self.y*self.c)-(self.z*self.b)
j=-((self.x*self.c)-(self.z*self.a))
k=(self.x*self.b)-(self.y*self.a)
return i,j,k

En este sencillo tutorial, les enseñaré el uso de la herramienta 2to3 de Python.
Si no te familiarizas todavía con la versión 3 esta herramienta te guiará en ello :)



By KodeInfect
Link Video
Hola que tal!
Anteriormente ya había hecho esta "Agenda", lo que hice ahora fue mejorarla (Ohhh :O.... xD)
Bien que tiene de nuevo... pues si usaron la versión anterior de mi "Agenda" podrán notar algunos cambios, bien aquí la lista de las mejoras:
[+]Se agrego el campo E-mail

[+]Se mejoro la lectura de los Contactos

[+]Se mejoro la búsqueda de los contactos
Entre otras cosillas mas... :)

Bien para usar esta agenda necesitan usar la librería que nos ayudara a conectar con MySQL, para ello usaremos los siguientes comandos:

apt-get install python-mysqldb

En fedora sería algo como:
yum install MySQL-python.i686

También es necesario haber creado la base de datos con el Nombre que quieran, solo importante dentro de la tabla crear los campos "nombre" , "telefono" e "mail", primero nos logeamos en MySQL y despues creamos la DataBase...

#[1]DESPUES DE -u INTRODUCIMOS EL USER
#[2]DAMOS ENTER E INTRODUCIMOS LA PASS
mysql -u root -p;
create database contactos;
use contactos;
create table contactos(nombre varchar(50),pass varchar(25),mail varchar(30));

Eso seria la base de datos para poder hacer funcionar nuestro "Programa"...
También pueden crear esta tabla desde su navegador, ya depende de cada quien, para mi es mas rápido en la consola :D

Bien después de crear la base de datos con la tabla respectiva es posible usar la agenda.
Bien pues aquí el code:


#!/usr/bin/Python

###########################
#AGENDA EN PYTHON V 1.5 #
#BY [Z]tuX #
#http://ztux.blogspot.com/#
###########################

import MySQLdb, os

def agregar(server,user,passwd,bd):
db = MySQLdb.connect(server,user,passwd,bd)
cursor = db.cursor()
name = raw_input('[+]Nombre: ')
telefono = raw_input('[+]Telefono: ')
mail= raw_input('[+]E-Mail: ')
cursor.execute("insert into contactos (nombre,telefono,mail) values ('%s','%s','%s')"%(name,telefono,mail))
print 'Datos agregados correctamente...'
cursor.fetchall()
cursor.close()
raw_input("> Press Enter...")
run()
def ver (server,user,passwd,bd):
try:
db = MySQLdb.connect(server,user,passwd,bd)
ztux = db.cursor()
ztux.execute("select * from %s "%(bd))
a = ztux.fetchall()
for i in a: #Se crea una lista en la variable i
if i=='':
print "No hay contactos..."
else:
print '[+]Nombre:',i[0],'\n[+]Telefono:',i[1],'\n[+]E-Mail:',i[2],"\n----------" #Mostramos La lista
ztux.close()
raw_input("> Press Enter...")
run()
except:
print '[*]Error al conectar a la base de Datos...\n'
run()

def buscar(server,user,passwd,bd):
try:
db = MySQLdb.connect(server,user,passwd,bd)
buscar = raw_input('[+]Nombre del contacto: ')
ztux = db.cursor()
ztux.execute("select * from %s where nombre='%s'"%(bd,buscar))
a = ztux.fetchall()
for i in a:
print '[+]Nombre:',i[0],'\n[+]Telefono:',i[1],'\n[+]E-Mail:',i[2]
ztux.close()
raw_input("> Press Enter...")
run()
except:
print '[*]Error al conectar a la base de Datos...\n'
run()

def editar(server,user,passwd,bd):
try:
db = MySQLdb.connect(server,user,passwd,bd)
print '[1]Nombre\n[2]Telefono\n[3]E-mail\n[+]Regresar'
opc =raw_input('Que desas editar: ')
if opc=='1':
editar = raw_input('[+]Nombre del contacto a editar: ')
cambiar = raw_input('[+]Escribe el nuevo nombre del contacto: ')
ztux = db.cursor()
ztux.execute("update %s set nombre='%s' where nombre='%s'"%(bd,cambiar,editar))
ztux.close()
print 'Contacto Actualizado...'
raw_input("> Press Enter...")
run()
elif opc=='2':
editar = raw_input('[+]Nombre del contacto a editar: ')
cambiar = raw_input('[+]Escribe el nuevo numero del contacto: ')
ztux = db.cursor()
ztux.execute("update %s set telefono='%s' where nombre='%s'"%(bd,cambiar,editar))
ztux.close()
print 'Contacto Actualizado...'
raw_input("> Press Enter...")
run()
elif opc=='3':
editar = raw_input('[+]Nombre del contacto a editar: ')
cambiar = raw_input('[+]Escribe el nuevo e-mail del contacto: ')
ztux = db.cursor()
ztux.execute("update %s set mail='%s' where nombre='%s'"%(bd,cambiar,editar))
ztux.close()
print 'Contacto Actualizado...'
raw_input("> Press Enter...")
run()
elif opc=='+':
run()
else:
print 'Opcion Incorrecta...'
run()

except:
print '[*]Error al conectar a la base de Datos...\n'
raw_input("> Press Enter...")
run()

def borrar(server,user,passwd,bd):
try:
db = MySQLdb.connect(server,user,passwd,bd)
borrar = raw_input('[+]Nombre del contacto: ')
ztux = db.cursor()
ztux.execute("delete from %s where nombre='%s'"%(bd,borrar))
ztux.close()
print '[+]Contacto borrado con exito...'
raw_input("> Press Enter...")
run()
except:
print '[*]Error al conectar a la base de Datos...\n'

def run():
os.system('clear') #Cambiar "clear" por "cls" si Usas Windows
print '-------------------------'
print ' Agenda by [Z]tuX '
print 'http://ztux.blogspot.com/'
print ' ztux.ztux@gmail.com '
print '-------------------------'
print '''[1] Agregar contacto
[2] Ver contactos
[3] Buscar Contacto
[4] Editar Contacto
[5] Borrar contacto
[0] Salir
''' #CONFIGURAR AQUI#
server='localhost' #Servidor MySQL
user='root' #Usuario MySQL
passwd='chucho' #Passwd MySQL
bd='contactos' #Base de Datos
#################
opc = raw_input('> ')
if opc =='1':
agregar(server,user,passwd,bd)
elif opc =='2':
ver(server,user,passwd,bd)
elif opc =='3':
buscar(server,user,passwd,bd)
elif opc=='4':
editar(server,user,passwd,bd)
elif opc=='5':
borrar(server,user,passwd,bd)
elif opc=='0':
return 0
else:
print '[*]Opcion Incorrecta...'
run()
run()
Eso es todo, probado con Python 2.7...Salud[OS]
Bueno... Hace poco en se publicó en Toorcon 12 el polémico complemento de Firefox, Firesheep, y digo polémico porque en muchas webs se a tratado este complemento como una herramienta magníficamente efectiva en su misión de conseguir contraseñas (especialmente de Facebook, Twitter, etc...).

La verdad es que lo que hace esta herramienta antes también se podía hacer de un "modo manual"y más complicado para aquellos que no tienen conocimiento amplio de informática (Hacking), pero con Firesheep esta tarea queda reducida a simplemente instalar dicho complemento, abrir Firefox y listo!

Al iniciar sesión en un sitio web uno ingresa nombre de usuario y contraseña. Entonces el servidor checkea si la cuenta es correcta y nos devuelve una linda cookie que es usada por el navegador para que la próxima vez que ingreses a tu web no tengas que ingresar nombre de usuario y contraseña denuevo (muy práctico la verdad). Hoy en día hay muchas webs que cifran usuario y contraseña pero no la cookie, por eso mismo es que son vulnerables a HTTP session hijacking ("sidejacking") que es cuando un atacante consigue la cookie de un usuario, lo que les permite hacer cualquier cosa que el usuario puede hacer en un sitio web en particular. En una red inalámbrica abierta, las cookies circulan sin ser cifradas, por lo cual quedan indefensas ante un ataque sidejacking.

Bueno, toda esa explicación es solo para que sepan lo que hace Firesheep. Y ahora les entro a mostrar la herramienta:

Una vez que instalamos Firesheep en Firefox (al descargar la extensión *.xpi pongan "abrir con Firefox"). Aparecerá na nueva barra en la izquierda del Firefox, si no  pensetaña Ver ->  Panel lateral -> Firesheep. Nos conectamos a cualquier Red Wifi abierta y hacemos click en "Start Capturing":


Tan Pronto como se logeen usuarios que usen la misma red Wifi abierta, van a empezar a aparecer imágenes con el nombre del logeado:

Esa sería la herramienta Firesheep, sin duda bastante útil (tanto con fines malévolos como lícitos).

Descarga de Firesheep:
http://codebutler.github.com/firesheep/
*Los usuarios de Windows tienen la obligación de instalar WinPcap.

Source de un blog Amigo: KodeInfect's Blog


Descripción:

Este texto escrito por dos grandes autores fué concebido para un primer curso de diseño de compiladores. Se pone especial énfasis en la resolución de problemas universalmente encontrados en el diseño de un lenguaje traductor, con independencia de las máquinas fuente u objetivo.

Contenido:

1. Introducción a la compilación.
2. Un compilador sencillo de una pasada.
3. Análisis léxico.
4. Análisis sintáctico.
5. Traducción dirigida por sintaxis.
6. Verificación de tipos.
7. Ambientes durante la ejecución.
8. Generación de código intermedio.
9. Generación de código.
10. Optimación de código.
11. ¿Desea escribir un compilador?
12. Repaso de algunos compiladores.
Apéndice A: Un proyecto de compilador.
Bibliografía.
Vocabulario técnico bilingüe.
Índice de materias.

Información del Libro:

Nombre del Libro: Compiladores, Principios, Técnicas Y Herramientas
Autores: Alfred V. Aho - Ravi Sethi : At&T Bell Laboratories. Murray Hill, New Jersey - Jeffrey D. Ullman : Stanford University
Edición: 1990
Formato: .pdf
Compresión: .rar
Número de Páginas: 803 Páginas
Idioma: Español
Tamaño: 107 MB

Descargar libro del dragon rojo

Fuente : LibrosTown
Bien, un problema con el que me encontre cuando programabá mi antigua web (que por cierto ya no esta activa u.u) fue que la hora estaba mal configurada, me aparecia la hora del hosting donde estaba alojada la web y no la hora de mi país xD.

Por eso con esta pequeña configuración podemos dejar nuestro reloj configurado a nuestro gusto... Bien para ello usaremos la siguiente línea:

date_default_timezone_set("Mexico/General");
Con esta línea estaremos configurando la hora que querramos que aparesca en la web... Y bueno aqui dejo la lista de la configuración de cada país.





Y Bueno aquí un ejemplo de como usarlo xD
  <?php
require ('pages/footer.php');
date_default_timezone_set("Mexico/General");
$day = date(d);
$month= date(m);
$year = date(y);
$hora = date("h:i:s");
echo "Welcome / Bienvenido / Willkommen";
echo $day."/".$month."/".$year.";
echo "Hour: ".$hora.";
echo "You are in: ".$titulo.";
?>

Salud[OS]Und Gutn Nacht!!!
Llegan noticias de Linux Mint, esta vez positivas: la modificación de Ubuntu tendrá un shell de escritorio propio llamado Cinnanom, pensado para ofrecer una verdadera “experiencia clásica” de calidad, sin perder tampoco las mejores características de GNOME Shell por el camino.


Según publican en Web Upd8, Cinnanom es un fork de Gnome Shell iniciado por Clement Lefebvre, líder del proyecto Linux Mint, el cual se encuentra en sus primeras fases de desarrollo. Se basa en algunas de las características ofrecidas por MGSE (Mint GNOME Shell Extensions), pero se supone que el objetivo final es el de crear su propia interfaz de escritorio.

Una imagen de este Cinnanom la tenéis en la cabecera, y si os fijáis ya no se utiliza la barra superior de GNOME Shell -parte de Linux Mint 12 e innecesaria para muchos usuarios-, y la bandeja de sistema vuelve a donde siempre, mientras que el menú/vista de actividades seguirá presente.

Y de momento no hay mucho más que contar, pero la noticia desde luego es interesante. Porque seguir insistiendo en GNOME 2 con Mate no tenía ningún futuro, y las cuatro extensiones de MGSE estaban bien para salvar la vez, pero poco más. Así pues, Linux Mint se posiciona de nuevo con independencia de su entorno (entorno tecnológico, que no de escritorio). ¿Cómo lo veis?

Source 
Bien... hace ya tiempo que programé esta sencilla aplicación... Es un editor de textos muy básico escrito en Delphi... tal vez a algunos les sirva de ejemplo... así que dejo el code y el rar con todos los archivos generados por el compilador...


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, StdCtrls;

type
TForm1 = class(TForm)
Memo1: TMemo;
MainMenu1: TMainMenu;
Archivo1: TMenuItem;
Abrir1: TMenuItem;
Guardar1: TMenuItem;
Cerrar1: TMenuItem;
SaveDialog1: TSaveDialog;
OpenDialog1: TOpenDialog;
Guardar2: TMenuItem;
Edicin1: TMenuItem;
Cortar1: TMenuItem;
Copiar1: TMenuItem;
Pegar1: TMenuItem;
Acercade1: TMenuItem;
Acercade2: TMenuItem;
Nuevo1: TMenuItem;
procedure Cerrar1Click(Sender: TObject);
procedure Guardar1Click(Sender: TObject);
procedure Abrir1Click(Sender: TObject);
procedure Guardar2Click(Sender: TObject);
procedure Acercade2Click(Sender: TObject);
procedure Nuevo1Click(Sender: TObject);
procedure Cortar1Click(Sender: TObject);
procedure Copiar1Click(Sender: TObject);
procedure Pegar1Click(Sender: TObject);
private
{ Private declarations }
strArchivo: String;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Abrir1Click(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
Memo1.Lines.LoadFromFile(OpenDialog1.FileName);
strArchivo := OpenDialog1.FileName;
end;
end;

procedure TForm1.Acercade2Click(Sender: TObject);
begin
ShowMessage('Editor de Textos' +#13+'By [Z]tuX 2011'+#13'Creado en Delphi');
end;

procedure TForm1.Cerrar1Click(Sender: TObject);
begin
Form1.Close;
end;

procedure TForm1.Copiar1Click(Sender: TObject);
begin
Memo1.CopyToClipboard;
end;

procedure TForm1.Cortar1Click(Sender: TObject);
begin
Memo1.CutToClipboard;
end;

procedure TForm1.Guardar1Click(Sender: TObject);
begin
if SaveDialog1.Execute Then
begin
Memo1.Lines.SaveToFile(SaveDialog1.Filename);
strArchivo := SaveDialog1.FileName;
end;
end;

procedure TForm1.Guardar2Click(Sender: TObject);
begin
if strArchivo = '' then
Guardar1Click(self)
else
Memo1.Lines.SaveToFile(strArchivo);
end;


procedure TForm1.Nuevo1Click(Sender: TObject);
begin
if Memo1.Text <> '' then
if Application.MessageBox('¿Guardar Texto Actual?','Atención' ,
MB_ICONQUESTION OR MB_YESNO ) = ID_YES then
Guardar2Click( Self );
Memo1.Clear;
end;

procedure TForm1.Pegar1Click(Sender: TObject);
begin
Memo1.PasteFromClipboard;
end;

end.

Bien aqui dejo el RAR con los archivos de este programa, por si quieren hechar un vistazo al code...
DESCARGA: http://www.mediafire.com/?cmxubc9f05htt2k

Captura:
 Salud[OS]
Hace poco que los desarrolladores de GIMP anunciaron novedades acerca de la próxima gran actualización de la aplicación, cuya espera se ha hecho -y se sigue haciendo- muy larga. De momento, ya esta aquí GIMP 2.7.4.



 El pasado agosto se publicó GIMP 2.7.3, versión de desarrollo que no obstante se ofrecía para su instalación a los usuarios con más ganas de probar nuevas características, como el modo de ventana única o los grupos de capas, entre otras.
Mientras tanto llega GIMP 2.7.4, que básicamente presenta pequeñas mejoras a nivel de interfaz de usuario (que se notarán especialmente en Mac OS X) además de correcciones. Dependiendo de los errores que se reporten a partir de esta versión, será la última de la rama 2.7 o no, antes de que se lancen las RC de GIMP 2.8 (lo que podría suponer más retraso todavía). Podéis encontrar más información en el anuncio oficial.

Para conseguir GIMP 2.7.4 deberéis acudir a los canales propios que ofrezca vuestra distribución, aunque tocará esperar un poco a que actualicen (ahora mismo no ha llegado ni a Arch Linux). Los usuarios de Ubuntu podéis utilizar el siguiente PPA, donde ya está disponible:

sudo add-apt-repository ppa:matthaeus123/mrw-gimp-svn
sudo apt-get update
sudo apt-get install gimp

Ahora solo toca esperar al lanzamiento de GIMP 2.8, cuya fecha de liberación se apuntaba al próximo 25 de enero.
Source

 
Bien, hace tiempo que programe en Python este pequeño "programa", que sirve para encriptar palabras... Talvez les sirva de ejemplo... y tenia ya este code aqui en el blog, pero hice unos cambios al source y bien pues asi quedó...

#!/usr/bin/python
# -*- coding:UTF-8 -*-
import sys, base64, hashlib, hmac
from string import maketrans

#Codificacion con maketrans
ZtuX=maketrans("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789","mab1c2z3k4h5f6s7p8i9y0rewqQW]RT[UI$%A(D-G)JK Z#CVB/M@&\*.;_^{}")
#Decodificación con makeTrans
Ztux=maketrans("mab1c2z3k4h5f6s7p8i9y0rewqQW]RT[UI$%A(D-G)JK Z#CVB/M@&\*.;_^{}","abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")

def _md5(palabra):
return hashlib.md5(palabra).hexdigest()
def code_base64(palabra):
return base64.b64encode(palabra)
def decode_base64(palabra):
return base64.b64decode(palabra)
def ztux(palabra):
return palabra.translate(ZtuX)
def dztux(palabra):
return palabra.translate(Ztux)
def sha1(palabra):
return hashlib.sha1(palabra).hexdigest()
def sha256(palabra):
return hashlib.sha256(palabra).hexdigest()
def sha384(palabra):
return hashlib.sha384(palabra).hexdigest()
def sha512(palabra):
return hashlib.sha512(palabra).hexdigest()
def Hmac(palabra):
return hmac.new(palabra).hexdigest()
def no_vocales(palabra):
resultado = ''
for elemento in palabra:
if elemento not in "aeiouAEIOU":
resultado = resultado + elemento
return resultado

def help():
print """
==============================================
[Z]tuX
==============================================
Visita: http://ZtuX.blogspot.com/
==============================================
[+] Modo de uso: encrypt.py [Palabra] [Hash]
[+] Ejemplo: encrypt.py Encriptar_esto -md5

-h Muestra esto en pantalla
-v Muestra la Version del Programa
-o Muestra otras funciones

-md5 Codifica en MD5
-sha Codifica en sha1
-sha256 Codifica en sha256
-sha384 Codifica en sha384
-sha512 Codifica en sha512
-hmac Codifica en hmac

-base64 Codifica en base64
-dbase64 Decodifica en base64
"""
def otros():
print '''
==============================================
[O]TROS
==============================================
-novoc Elimina las vocales de una palabra
-ztux Codifica en ZtuX
-dztux Decodifica ZtuX
'''

#SENTENCIAS [MENU]
def run():
ver='2.6'
if (len(sys.argv)==1) or sys.argv[1].lower()=="-h" or sys.argv[1].lower()=="--help":
help()
elif sys.argv[1]=='-o' or sys.argv[1]=='--others':
otros()
elif sys.argv[1].lower()=='-v' or sys.argv[1].lower()=='--version':
print "Cript version: " + ver + "\nAutor: [Z]tuX"
elif (len(sys.argv)>3):
print "ERROR...\nModo de uso: cript.py [Palabra] [Hash]"
elif sys.argv[2].lower()=='-md5':
palabra=sys.argv[1]
print 'Texto Codificado: %s'%_md5(palabra)
elif sys.argv[2].lower()=='-base64':
palabra=sys.argv[1]
print 'Texto Codificado: %s'%code_base64(palabra)
elif sys.argv[2].lower()=='-dbase64':
palabra=sys.argv[1]
print 'Texto Decodificado: %s'%decode_base64(palabra)
elif sys.argv[2].lower()=='-ztux':
palabra=sys.argv[1]
print 'Texto Codificado: %s'%ztux(palabra)
elif sys.argv[2].lower()=='-dztux':
palabra=sys.argv[1]
print 'Texto Decodificado: %s'%dztux(palabra)
elif sys.argv[2].lower()=='-sha':
palabra=sys.argv[1]
print 'Texto Codificado: %s'%sha1(palabra)
elif sys.argv[2].lower()=='-sha256':
palabra=sys.argv[1]
print 'Texto Codificado: %s'%sha256(palabra)
elif sys.argv[2].lower()=='-sha384':
palabra=sys.argv[1]
print 'Texto Codificado: %s'%sha384(palabra)
elif sys.argv[2].lower()=='-sha512':
palabra=sys.argv[1]
print 'Texto Codificado: %s'%sha512(palabra)
elif sys.argv[2].lower()=='-hmac':
palabra=sys.argv[1]
print 'Texto Codificado: %s'%Hmac(palabra)
elif sys.argv[2].lower()=='-novoc':
palabra=sys.argv[1]
print 'Texto Sin Vocales: %s'%no_vocales(palabra)
else:
print 'Debes indicar Palabra y Hash a Encriptar...'
print 'Para mas informacion teclea -h o --help'

#INICIO DEL PROGRAMA
run()

#[E]nD
#[Z]tuX
Salud[OS]!Guten Tag!!
Bien...Estaba hace rato trabajando con esta "Calculadora de Matrices"Apenas empecé a codear y bien dejo lo que llevo xD!!
//#/==================================\
//# Calculadora de matrices en C
//# CODED BY [Z]tuX
//# http://ztux.blogspot.com/
//# ztux.root[at] googlemail [dot] com
//#\==================================/
#include [stdio.h]
#include [stdlib.h]

int A11,A12,A13,A21,A22,A23,A31,A32,A33,opc;
int B11,B12,B13,B21,B22,B23,B31,B32,B33;
int C11,C12,C13,C21,C22,C23,C31,C32,C33;

void menu()
{
printf("Calculadora de Matrices (Matriz de 3x3)\n");
printf("[1]Suma de Matrices\n");
printf("[2]Multiplicacion de Matrices\n");
printf("[3]Matriz por un Escalar\n");
printf("[4]Transpuesta de Una Matriz\n");
printf("Selecciona Una Opcion:\n>");
scanf("%d",&opc);
}
//[1]Suma de Matrices
int suma()
{
printf("MATRIZ A:\n");
printf("A11: "); scanf("%d",&A11);
printf("A12: "); scanf("%d",&A12);
printf("A13: "); scanf("%d",&A13);

printf("A21: "); scanf("%d",&A21);
printf("A22: "); scanf("%d",&A22);
printf("A23: "); scanf("%d",&A23);

printf("A31: "); scanf("%d",&A31);
printf("A32: "); scanf("%d",&A32);
printf("A33: "); scanf("%d",&A33);
system("CLS");

printf("MATRIZ B:\n");
printf("B11: "); scanf("%d",&B11);
printf("B12: "); scanf("%d",&B12);
printf("B13: "); scanf("%d",&B13);

printf("B21: "); scanf("%d",&B21);
printf("B22: "); scanf("%d",&B22);
printf("B23: "); scanf("%d",&B23);

printf("B31: "); scanf("%d",&B31);
printf("B32: "); scanf("%d",&B32);
printf("B33: "); scanf("%d",&B33);

system("CLS");
C11=A11+B11; C12=A12+B12; C13=A13+B13;
C21=A21+B21; C22=A22+B22; C23=A23+B23;
C31=A31+B31; C32=A32+B32; C33=A33+B33;
printf("RESULTADO:\n");
printf("[ %d,%d,%d]\n",C11,C12,C13);
printf("[ %d,%d,%d]\n",C21,C22,C23);
printf("[ %d,%d,%d]\n",C31,C32,C33);
return 0;
}
//[2]Multiplicacion de Matrices
int multiplicacion_matrices()
{
printf("MATRIZ A:\n");
printf("A11: "); scanf("%d",&A11);
printf("A12: "); scanf("%d",&A12);
printf("A13: "); scanf("%d",&A13);

printf("A21: "); scanf("%d",&A21);
printf("A22: "); scanf("%d",&A22);
printf("A23: "); scanf("%d",&A23);

printf("A31: "); scanf("%d",&A31);
printf("A32: "); scanf("%d",&A32);
printf("A33: "); scanf("%d",&A33);
system("CLS");

printf("MATRIZ B:\n");
printf("B11: "); scanf("%d",&B11);
printf("B12: "); scanf("%d",&B12);
printf("B13: "); scanf("%d",&B13);

printf("B21: "); scanf("%d",&B21);
printf("B22: "); scanf("%d",&B22);
printf("B23: "); scanf("%d",&B23);

printf("B31: "); scanf("%d",&B31);
printf("B32: "); scanf("%d",&B32);
printf("B33: "); scanf("%d",&B33);

system("CLS");
C11=(A11*B11)+(A12*B21)+(A13*B31);
C12=(A11*B12)+(A12*B22)+(A13*B32);
C13=(A11*B13)+(A12*B23)+(A13*B33);

C21=(A21*B11)+(A22*B21)+(A23*B31);
C22=(A21*B12)+(A22*B22)+(A23*B32);
C23=(A21*B13)+(A22*B23)+(A23*B33);

C31=(A31*B11)+(A32*B21)+(A33*B31);
C32=(A31*B12)+(A32*B22)+(A33*B32);
C33=(A31*B13)+(A32*B23)+(A33*B33);

printf("RESULTADO:\n");
printf("[ %d,%d,%d]\n",C11,C12,C13);
printf("[ %d,%d,%d]\n",C21,C22,C23);
printf("[ %d,%d,%d]\n",C31,C32,C33);
return 0;
}

//[3]Matriz por un Escalar
int escalar()
{
printf("Escalar:"); scanf("%d",&opc);
printf("MATRIZ:\n");
printf("A11: "); scanf("%d",&A11);
printf("A12: "); scanf("%d",&A12);
printf("A13: "); scanf("%d",&A13);

printf("A21: "); scanf("%d",&A21);
printf("A22: "); scanf("%d",&A22);
printf("A23: "); scanf("%d",&A23);

printf("A31: "); scanf("%d",&A31);
printf("A32: "); scanf("%d",&A32);
printf("A33: "); scanf("%d",&A33);
system("CLS");

C11=A11*opc; C12=A12*opc; C13=A13*opc;
C21=A21*opc; C22=A22*opc; C23=A23*opc;
C31=A31*opc; C32=A32*opc; C33=A33*opc;
printf("RESULTADO:\n");
printf("[ %d,%d,%d]\n",C11,C12,C13);
printf("[ %d,%d,%d]\n",C21,C22,C23);
printf("[ %d,%d,%d]\n",C31,C32,C33);

return 0;
}
//[4]Transpuesta de Una Matriz
int transpuesta()
{
printf("MATRIZ:\n");
printf("A11: "); scanf("%d",&A11);
printf("A12: "); scanf("%d",&A12);
printf("A13: "); scanf("%d",&A13);

printf("A21: "); scanf("%d",&A21);
printf("A22: "); scanf("%d",&A22);
printf("A23: "); scanf("%d",&A23);

printf("A31: "); scanf("%d",&A31);
printf("A32: "); scanf("%d",&A32);
printf("A33: "); scanf("%d",&A33);
system("CLS");

C11=A11; C12=A21; C13=A31;
C21=A12; C22=A22; C23=A32;
C31=A13; C32=A23; C33=A33;
printf("MATRIZ A:\n");
printf("[ %d,%d,%d]\n",A11,A12,A13);
printf("[ %d,%d,%d]\n",A21,A22,A23);
printf("[ %d,%d,%d]\n",A31,A32,A33);

printf("MATRIZ TRANSPUESTA DE A:\n");
printf("[ %d,%d,%d]\n",C11,C12,C13);
printf("[ %d,%d,%d]\n",C21,C22,C23);
printf("[ %d,%d,%d]\n",C31,C32,C33);
}

int opcion(int opc)
{
switch (opc)
{
case 1:
suma();
break;
case 2:
multiplicacion_matrices();
break;
case 3:
escalar();
break;
case 4:
transpuesta();
break;
default:
printf("OPCION INCORRECTA[!]");
}
return 0;
}

//MAIN

int main()
{
//Variable
menu();
opcion(opc);
return 0;

}
NOTA:Las librerias van dentro de < > y no de [ ]... Solo que blogger me detecta los < > como etiquetas HTML xD
Ando con la idea loca de tener todo en la terminal si me dio mi momento geek :D no estoy loco solo que quiero integrar todo en la terminal asi trabajo, con un todo en uno. ademas me molesta el face con su molesto chat :P

Mcabber es un cliente jabber desde consola lanzado bajo una licencia GNU GPL. Instalación:snifer@snifer:~$ sudo apt-get install mcabber
  Bueno ahora que esta instalado procedemos con la configuracion
snifer@snifer:~$ mkdir ~/.mcabber
Creamos  el directorio posteriormente creamos el archivo de configuración, con esto crearemos el archivo...

touch ~/.mcabber/mcabberrc
Ahora lo que toca es brincar al directorio .. y comenzaremos.. con la edicion
snifer@snifer:~$ cd ~/.mcabber
------------------------------------------------------------------------------------------------ 00:59:21
snifer@snifer:~/.mcabber$ ls
mcabberrc
------------------------------------------------------------------------------------------------ 00:59:23
snifer@snifer:~/.mcabber$ gedit mcabberrc 
Luego editamos... con el amado gedit. el archivo mcabberrc.


Nota: si pones tu pass cuando inicies de manera automatica se conectara
Luego entramos a la configuración mejor dicho al programa poniendo en la consola mcabber despues de esto ya tendremos ..


  Aqui hablando con un amigo del face... :D

 Escribir comandos: Todos los comando tiene este formato /COMANDO donde COMANDO es la orden a usar, algunos comandos:
/say_to USUARIO MENSAJE : Para enviar un mensaje a algún contacto en específico
/roster unread_first : Para leer el primer mensaje de los que no se han leído
/roster unread_next : Para leer el siguiente mensaje de los que no se han leído
/roster search USUARIO : Para buscar algún contacto
/alias ALIAS = COMANDO OPCION : Para crear alias de los comandos que más se usen
/help : Para ver los comandos existentes
/quit : Para salir Su guia esta  aquí.  Source