miércoles, 28 de septiembre de 2011

La guerra entre Narcotraficantes y Zetas en México


Esto es algo de lo que se vive en México, véanlo y que cada quién formule su propia opinión acerca de Narcotraficantes y Zetas.



jueves, 15 de septiembre de 2011

Packs de Wallpappers que vendrán en Ubuntu y Lubuntu 11.10

Hace poco mencioné en el blog que ya se habían elegido los wallpappers en un grupo en Flickr para el nuevo Ubuntu 11.10, ahora se han publicado 6 wallpappers ganadores para la versión ligera, Lubuntu:

Las imagenés para Lubuntu son ligeras pero bonitas

Bonita selección para Oneric Ocelot

Enlaces
Descarga el pack de Wallpappers para Lubuntu 11.10
Las imagenes las encuentras al descomprimir el archivo en:
/ubuntu-artwork-0.17/usr/share/lubuntu/wallpapers 


Descarga 44 Wallpappers que traerá Ubuntu 11.10

martes, 13 de septiembre de 2011

Feliz dia del programador!

Yo no sabía que existía éste día hasta hoy, Felicidades a todos aquellos programadores que hacen nuestra vida diaria más fácil y entretenida, gracias por los juegos aplicaciones etc. etc... 
Felicidades también a los noveles y a quienes apenas empezamos o lo hacen por entretenimiento.

Les dejo unos chistes gráficos para pasar el rato:


lunes, 12 de septiembre de 2011

Mi primera aplicación en Python: Calculadora de Ingeniería Económica

Desde hace tiempo había leído de este maravilloso lenguaje, sus ventajas sobre los demás como su facilidad, que es libre y sobre todas las cosas que es multiplataforma. Sin duda es el ideal para comenzar a programar, he aquí un ejemplo.

Investigando un poco y con ayuda de algunos tutoriales pude hacer mi primera aplicación gráfica en python. Por el momento no es la gran cosa, pero espero tener tiempo y sobre todo paciencia para terminar un proyecto personal, me gustaría hacer algo así como una suite para Ingenieros multiplataf, para los que conozcan WinQSB sería algo paracido, con herramientas para diferentes áreas como Investigación de Operaciones e Ingeniería Económica por mencionar sólo algunos.

Algunos botones aún no funcionan, pero ya resuelve operaciones como en el ejemplo.

El código fue escrito con ayuda de wxGlade y SPE Stani's Python Editor que puedes encontrar en el Centro de Software Ubuntu, el libro Python para todos, un tutorial de Ubuntu Life, y una calculadora básica en Python.
Para resolver un problema de este tipo por ejemplo en Excel o alguna calculadora científica se necesita teclear algo como esto :
VA= 1500*((.14*(1+.14)^5)/(((1+.14)^5)-1) 
Hay muchas más posibilidades de equivocarse, algo que no te puede pasar por ejemplo en un examen final...

Aquí el código:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# generated by wxGlade 0.6.3 on Tue Aug 16 18:36:57 2011


import wx


# begin wxGlade: extracode
# end wxGlade


class Ventana_calculadora(wx.Frame):
    def __init__(self, *args, **kwds):
        # begin wxGlade: Ventana_calculadora.__init__
        kwds["style"] = wx.DEFAULT_FRAME_STYLE
        wx.Frame.__init__(self, *args, **kwds)
        
        # Menu Bar
        self.Calculadora_menubar = wx.MenuBar()
        wxglade_tmp_menu = wx.Menu()
        wxglade_tmp_menu.Append(11, "Borrar", "", wx.ITEM_NORMAL)
        wxglade_tmp_menu.AppendSeparator()
        wxglade_tmp_menu.Append(22, "Salir", "", wx.ITEM_NORMAL)
        self.Calculadora_menubar.Append(wxglade_tmp_menu, "Archivo")
        wxglade_tmp_menu = wx.Menu()
        wxglade_tmp_menu.Append(55, "Acerca de", "", wx.ITEM_NORMAL)
        self.Calculadora_menubar.Append(wxglade_tmp_menu, "Ayuda")
        self.SetMenuBar(self.Calculadora_menubar)
        # Menu Bar end
        self.entrada_datos = wx.TextCtrl(self, -1, "", style=wx.TE_MULTILINE and wx.ALIGN_RIGHT)
        self.entrada_datos.SetFocus()
        self.lblEjemplo = wx.StaticText(self, -1, "Ejemplo de Entrada: 1200(VP/VF,15%,6)", style=wx.ALIGN_CENTRE)
        self.btnVPVF = wx.Button(self, -1, "VP/VF")
        self.btnVFVP = wx.Button(self, -1, "VF/VP")
        self.btnVAVF = wx.Button(self, -1, "VA/VF")
        self.btnIRetroceso = wx.BitmapButton(self, -1, wx.Bitmap("/dos/Documentos/Programacion en Phyton/Proyecto Personal/btnretroceso2.png", wx.BITMAP_TYPE_ANY), style=wx.BU_AUTODRAW)
        self.btnVPVA = wx.Button(self, -1, "VP/VA")
        self.btnVFVA = wx.Button(self, -1, "VF/VA")
        self.btnVAVP = wx.Button(self, -1, "VA/VP")
        self.btnIgual = wx.Button(self, -1, "=")
        self.btn7 = wx.Button(self, -1, "7")
        self.btn8 = wx.Button(self, -1, "8")
        self.btn9 = wx.Button(self, -1, "9")
        self.btnMas = wx.Button(self, -1, "+")
        self.btn4 = wx.Button(self, -1, "4")
        self.btn5 = wx.Button(self, -1, "5")
        self.btn6 = wx.Button(self, -1, "6")
        self.btnMenos = wx.Button(self, -1, "-")
        self.btn1 = wx.Button(self, -1, "1")
        self.btn2 = wx.Button(self, -1, "2")
        self.btn3 = wx.Button(self, -1, "3")
        self.bx = wx.Button(self, -1, "x")
        self.btnPunto = wx.Button(self, -1, ".")
        self.btn0 = wx.Button(self, -1, "0")
        self.btnComa = wx.Button(self, -1, ",")
        self.btnDivision = wx.Button(self, -1, "/")
        self.btnRaiz = wx.Button(self, -1, "Raiz")
        self.btnPotencia = wx.Button(self, -1, "Potencia")
        self.btnParentesis1 = wx.Button(self, -1, "(")
        self.btnParentesis2 = wx.Button(self, -1, ")")
        self.panel_1 = wx.Panel(self, -1)
        self.btnBorrar = wx.Button(self, -1, "Borrar")
        self.btnSalir = wx.Button(self, -1, "Salir")
        self.static_line_1 = wx.StaticLine(self, -1)
        
        #Se ponen los metodos que activa el evento de cada boton
        self.btnIgual.Bind (wx.EVT_BUTTON,self.Resolver)
        self.btn1.Bind(wx.EVT_BUTTON,self.Uno)
        self.btn2.Bind(wx.EVT_BUTTON,self.Dos)
        self.btn3.Bind(wx.EVT_BUTTON,self.Tres)
        self.btn4.Bind(wx.EVT_BUTTON,self.Cuatro)
        self.btn5.Bind(wx.EVT_BUTTON,self.Cinco)
        self.btn6.Bind(wx.EVT_BUTTON,self.Seis)
        self.btn7.Bind(wx.EVT_BUTTON,self.Siete)
        self.btn8.Bind(wx.EVT_BUTTON,self.Ocho)
        self.btn9.Bind(wx.EVT_BUTTON,self.Nueve)
        self.btn0.Bind(wx.EVT_BUTTON,self.Cero)
        self.btnIRetroceso.Bind(wx.EVT_BUTTON,self.Retroceso)
        
        self.btnVPVF.Bind(wx.EVT_BUTTON,self.VPVF)
        self.btnVPVA.Bind(wx.EVT_BUTTON,self.VPVA)
        self.btnVFVP.Bind(wx.EVT_BUTTON,self.VFVP)
        self.btnVFVA.Bind(wx.EVT_BUTTON,self.VFVA)
        self.btnVAVP.Bind(wx.EVT_BUTTON,self.VAVP)
        self.btnVAVF.Bind(wx.EVT_BUTTON,self.VAVF)
        self.btnParentesis1.Bind(wx.EVT_BUTTON,self.Parentesis1)
        self.btnParentesis2.Bind(wx.EVT_BUTTON,self.Parentesis2)
        self.btnPunto.Bind(wx.EVT_BUTTON,self.Punto)
        self.btnComa.Bind(wx.EVT_BUTTON,self.Coma)


        
        self.__set_properties()
        self.__do_layout()
        # end wxGlade
        
    def Resolver(self, evento=None):
        strCadenaEntrada=self.entrada_datos.GetValue()
        print strCadenaEntrada
        lstValores = strCadenaEntrada.split(",")
        numValor = lstValores[0].split("(")
        lstValores[0]=float(numValor[0])
        numNPeriodos=lstValores[2].split(")")
        lstValores.append(int(numNPeriodos[0]))
        print lstValores[3]
        lstValores[2]= float(lstValores[1])
        lstValores[1]=numValor[1]
        # lstValores contiene los valores por separado de la cadena de entrada
        # van en orden, ejemplo lstValores[2] es la tasa i, y lstValores[3]Periodos
        if lstValores[1]== "VF/VP" or lstValores[1]=="F/P":
            resultado=float(lstValores[0]*((1+lstValores[2])**lstValores[3]))
            self.entrada_datos.SetValue(str(resultado))
        elif lstValores[1]== "VF/VA" or lstValores[1]=="F/A":
            resultado=float(lstValores[0]*((((1+lstValores[2])**lstValores[3])-1)/lstValores[2]))
            self.entrada_datos.SetValue(str(resultado))
        elif lstValores[1]== "VP/VF" or lstValores[1]=="P/F":
            resultado=float(lstValores[0]*(1/((1+lstValores[2])**lstValores[3])))
            self.entrada_datos.SetValue(str(resultado))
        elif lstValores[1]== "VA/VF" or lstValores[1]=="A/F":
            resultado=float(lstValores[0]*(lstValores[2]/(((1+lstValores[2])**lstValores[3])-1)))
            self.entrada_datos.SetValue(str(resultado))
        
            
    def Uno (self,evento=None):
        self.entrada_datos.AppendText('1')
    def Dos (self,evento=None):
        self.entrada_datos.AppendText('2')
    def Tres (self,evento=None):
        self.entrada_datos.AppendText('3')    
    def Cuatro (self,evento=None):
        self.entrada_datos.AppendText('4')
    def Cinco (self,evento=None):
        self.entrada_datos.AppendText('5')  
    def Seis (self,evento=None):
        self.entrada_datos.AppendText('6')
    def Siete (self,evento=None):
        self.entrada_datos.AppendText('7')
    def Ocho (self,evento=None):
        self.entrada_datos.AppendText('8')
    def Nueve (self,evento=None):
        self.entrada_datos.AppendText('9')
    def Cero (self,evento=None):
        self.entrada_datos.AppendText('0')
    def VFVP (self,evento=None):
        self.entrada_datos.AppendText("VF/VP")
    def VAVP (self,evento=None):
        self.entrada_datos.AppendText("VA/VP")
    def VPVF (self,evento=None):
        self.entrada_datos.AppendText("VP/VF")
    def VPVA (self,evento=None):
        self.entrada_datos.AppendText("VP/VA")
    def VAVF (self,evento=None):
        self.entrada_datos.AppendText("VA/VF")
    def VFVA (self,evento=None):
        self.entrada_datos.AppendText("VF/VA")
    def Parentesis1 (self,evento=None):
        self.entrada_datos.AppendText("(")
    def Parentesis2 (self,evento=None):
        self.entrada_datos.AppendText(")")   
    def Punto (self,evento=None):
        self.entrada_datos.AppendText(".")
    def Coma (self,evento=None):
        self.entrada_datos.AppendText(",")
    def Retroceso (self,evento=None):
        strCadenaEntrada=self.entrada_datos.GetValue()
        self.entrada_datos.SetValue(strCadenaEntrada[:-1])
        
    def __set_properties(self):
        # begin wxGlade: Ventana_calculadora.__set_properties
        self.SetTitle("Calculadora")
        self.entrada_datos.SetFont(wx.Font(20,wx.DEFAULT, wx.NORMAL, wx.LIGHT, 0, "Purisa"))
        self.btnVPVF.SetBackgroundColour(wx.Colour(252, 255, 223))
        self.btnVFVP.SetBackgroundColour(wx.Colour(252, 255, 223))
        self.btnVAVF.SetBackgroundColour(wx.Colour(254, 255, 244))
        self.btnIRetroceso.SetBackgroundColour(wx.Colour(255, 233, 237))
        self.btnIRetroceso.SetSize(self.btnIRetroceso.GetBestSize())
        self.btnVPVA.SetBackgroundColour(wx.Colour(252, 255, 223))
        self.btnVFVA.SetBackgroundColour(wx.Colour(252, 255, 223))
        self.btnVAVP.SetBackgroundColour(wx.Colour(252, 255, 223))
        self.btnIgual.SetBackgroundColour(wx.Colour(185, 255, 196))
        self.btnMas.SetBackgroundColour(wx.Colour(228, 235, 255))
        self.btnMenos.SetBackgroundColour(wx.Colour(228, 235, 255))
        self.bx.SetBackgroundColour(wx.Colour(228, 235, 255))
        self.btnPunto.SetBackgroundColour(wx.Colour(228, 235, 255))
        self.btnComa.SetBackgroundColour(wx.Colour(228, 235, 255))
        self.btnDivision.SetBackgroundColour(wx.Colour(228, 235, 255))
        self.btnRaiz.SetBackgroundColour(wx.Colour(228, 235, 255))
        self.btnPotencia.SetBackgroundColour(wx.Colour(228, 235, 255))
        self.btnParentesis1.SetBackgroundColour(wx.Colour(228, 235, 255))
        self.btnParentesis2.SetBackgroundColour(wx.Colour(228, 235, 255))
        # end wxGlade


    def __do_layout(self):
        # begin wxGlade: Ventana_calculadora.__do_layout
        sizer_1 = wx.BoxSizer(wx.VERTICAL)
        grid_sizer_2 = wx.GridSizer(2, 4, 0, 0)
        grid_sizer_1 = wx.GridSizer(8, 4, 0, 0)
        sizer_1.Add(self.entrada_datos, 0, wx.ALL|wx.EXPAND, 10)
        sizer_1.Add(self.lblEjemplo, 0, wx.ALL|wx.EXPAND|wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0)
        grid_sizer_1.Add(self.btnVPVF, 0, wx.EXPAND, 0)
        grid_sizer_1.Add(self.btnVFVP, 0, wx.EXPAND, 0)
        grid_sizer_1.Add(self.btnVAVF, 0, wx.EXPAND, 0)
        grid_sizer_1.Add(self.btnIRetroceso, 0, wx.EXPAND, 0)
        grid_sizer_1.Add(self.btnVPVA, 0, wx.EXPAND, 0)
        grid_sizer_1.Add(self.btnVFVA, 0, wx.EXPAND, 0)
        grid_sizer_1.Add(self.btnVAVP, 0, wx.EXPAND, 0)
        grid_sizer_1.Add(self.btnIgual, 0, wx.EXPAND, 0)
        grid_sizer_1.Add(self.btn7, 0, wx.EXPAND, 0)
        grid_sizer_1.Add(self.btn8, 0, wx.EXPAND, 0)
        grid_sizer_1.Add(self.btn9, 0, wx.EXPAND, 0)
        grid_sizer_1.Add(self.btnMas, 0, wx.EXPAND, 0)
        grid_sizer_1.Add(self.btn4, 0, wx.EXPAND, 0)
        grid_sizer_1.Add(self.btn5, 0, wx.EXPAND, 0)
        grid_sizer_1.Add(self.btn6, 0, wx.EXPAND, 0)
        grid_sizer_1.Add(self.btnMenos, 0, wx.EXPAND, 0)
        grid_sizer_1.Add(self.btn1, 0, wx.EXPAND, 0)
        grid_sizer_1.Add(self.btn2, 0, wx.EXPAND, 0)
        grid_sizer_1.Add(self.btn3, 0, wx.EXPAND, 0)
        grid_sizer_1.Add(self.bx, 0, wx.EXPAND, 0)
        grid_sizer_1.Add(self.btnPunto, 0, wx.EXPAND, 0)
        grid_sizer_1.Add(self.btn0, 0, wx.EXPAND, 0)
        grid_sizer_1.Add(self.btnComa, 0, wx.EXPAND, 0)
        grid_sizer_1.Add(self.btnDivision, 0, wx.EXPAND, 0)
        grid_sizer_1.Add(self.btnRaiz, 0, wx.EXPAND, 0)
        grid_sizer_1.Add(self.btnPotencia, 0, wx.EXPAND, 0)
        grid_sizer_1.Add(self.btnParentesis1, 0, wx.EXPAND, 0)
        grid_sizer_1.Add(self.btnParentesis2, 0, wx.EXPAND, 0)
        sizer_1.Add(grid_sizer_1, 6, wx.ALL|wx.EXPAND, 0)
        grid_sizer_2.Add(self.panel_1, 1, wx.EXPAND, 0)
        grid_sizer_2.Add(self.btnBorrar, 0, wx.EXPAND, 0)
        grid_sizer_2.Add(self.btnSalir, 0, wx.EXPAND, 0)
        sizer_1.Add(grid_sizer_2, 0, wx.EXPAND, 2)
        sizer_1.Add(self.static_line_1, 0, wx.EXPAND, 0)
        self.SetSizer(sizer_1)
        sizer_1.Fit(self)
        self.Layout()
        # end wxGlade
        
# end of class Ventana_calculadora
    
if __name__ == "__main__":
    app = wx.PySimpleApp(0)
    wx.InitAllImageHandlers()
    Calculadora = Ventana_calculadora(None, -1, "")
    app.SetTopWindow(Calculadora)
    Calculadora.Show()
    app.MainLoop()




Cabe mencionar que el código aún no es perfecto, pero si deseas hacer algún comentario, modificación, o tienes duda de alguna parte del código, puedes hacerlo en los comentarios, o por medio de un correo electrónico a ubuntu.latino@gmail.com

miércoles, 7 de septiembre de 2011

Como cambiar las dependencias de un paquete .deb

Después del Centro de Software Ubuntu, los paquetes .deb son la forma más fácil de instalar programas, pero en ocasiones los paquetes .deb no se pueden instalar por que no se satisfacen las dependencias, esto es por que algunas veces los instaladores .deb hacen referencia a paquetes obsoletos, más recientes, etc.

Esto fue precisamente lo que me ocurrió cuando quise instalar Boxee desde un paquete .deb que baje de la página oficial de Boxee, en este caso la dependencia que no se satisfacía era con el paquete libxmlrpc-c3, que en Natty Narwhal cambió por libxmlrpc-c3-0.

Voy a utilizar el ejemplo del paquete deb de Boxee para explicar como cambiar las dependencias, para ello abre una terminal y ocupa los siguientes comandos:

  1. dpkg-deb -x Boxee.deb tmpdir
  2. dpkg-deb --control Boxee.deb tmpdir/DEBIAN
  3. nano tmpdir/DEBIAN/control
  4. Se te abren en la terminal las dependencias, sólo tienes que modificar las dependencias que necesites, en mi caso modifique libxmlrpc-c3 por libxmlrpc-c3-0. Guardas con Ctrl+O y cierras con Ctrl +X.
  5. dpkg -b tmpdir Boxee_modificado.deb
Se te abren en la terminal las dependencias, sólo tienes que modificar las dependencias que necesites, en mi caso modifique libxmlrpc-c3 por libxmlrpc-c3-0. 


Nota: Ten cuidado con lo que modificas, y que puedes desestabilizar tu sistema, lo más recomendable es que si vas a cambiar una dependencia, sea por un paquete más reciente para evitar errores.

Existe un script que si haces muchos cambios en las dependencias te puede servir, pero si sólo lo vas a hacer una vez, quizá no sea muy práctico, pero les dejo el enlace por si desean probar ésta segunda opción.

Enlace: Script para cambiar dependencias de paquetes .deb


Si te sirvió regalame un +1, RT, o un Me gusta aquí abajo :)