Quantcast
Channel: El Mundo de Ubuntu
Viewing all 528 articles
Browse latest View live

Guia Python: asignaciones y funciones con una cantidad variable de parámetros.

$
0
0

python logoPython es un lenguaje de script desarrollado por Guido van Rossum.

Podemos codificar empleando programación lineal, estructurada y orientada a objetos (tengamos en cuenta que esta última es la que se ha impuesto en la actualidad)

Se cuenta con intérpretes de Python en múltiples plataformas: Windows, Linux, Mac etc. Se pueden desarrollar aplicaciones de escritorio como aplicaciones web. Empresas como Google, Yahoo, Nasa etc. utilizan este lenguaje para sus desarrollos (actualmente el creador de Python Guido van Rossum trabaja para Google.)

Se puede ejecutar instrucciones de Python desde la línea de comando o creando archivos con extensión *.py. Cuando uno comienza a aprender este lenguaje la línea de comandos nos provee una retroalimentación del resultado en forma inmediata.

El objetivo de este tutorial es presentar en forma progresiva los conceptos fundamentales de este lenguaje y poder analizar los problemas resueltos y codificar los problemas propuestos en este mismo sitio, sin tener que instalar en un principio el Python en su equipo (o luego de instalado poder avanzar con el tutorial en cualquier máquina conectada a internet).

python asignaciones multiples

Asignaciones múltiples.

Python permite asignaciones múltiples:

x1,x2,x3=1,2,3
print x1 # 1
print x2 # 2
print x3 # 3

Para entenderlo mejor podemos también utilizar esta sintaxis:

x1,x2,x3=(1,2,3)
print x1 # 1
print x2 # 2
print x3 # 3

Es decir lo que estamos haciendo inicializar cada una de las variables de la izquierda con las componentes homólogas (de la misma posición) de la tupla.

Esta característica es útil si tenemos que recuperar por ejemplo de una lista que contiene tuplas de dos elementos que representan puntos en el plano (x,y):

puntos=[(10,2),(4,2),(9,3)]
for x,y in puntos:
    print 'Coordenada x:%d y:%d' % (x,y)
    print '<br>'

Cada vuelta del for se almacena en x e y los valores de la tupla a procesar.

Otra aplicación muy útil es si queremos intercambiar el valor de dos variables la forma más simple es:

x=10
y=20
print x # 10
print y # 20
x,y = y,x
print x # 20
print y # 10

En una asignación pueden intervenir valores de distinto tipo (enteros, reales, string etc.):

nombre,edad,sueldo=('juan',32,1500.30)
print 'Nombre:%s Edad:%d Sueldo%10.2f' % (nombre,edad,sueldo)
      # Nombre:juan Edad:32 Sueldo 1500.30

Podemos con esto hacer que una función retorne más de un dato (por lo menos en apariencia), esto lo logramos retornando una tupla:

def sumadiferencia(x1,x2):
    suma=x1+x2
    diferencia=x1-x2
    return (suma,diferencia)

su,di=sumadiferencia(10,4)
print su # 14
print di # 6

Como vemos llamamos a una función y le asignamos el valor devuelto a dos variables.

Si queremos inicializar tres variables con el mismo valor la sintaxis que podemos utilizar es:

x1=x2=x3=10
print x1 # 10
print x2 # 10
print x3 # 10

Funciones con parámetros por defecto.

python Funciones con parámetros por defecto

Como habíamos visto una función es una estructura de programación que agrupa un conjunto de instrucciones y resuelve un problema particular. Una función puede tener parámetros, los mismos almacenan los valores que se le pasan cuando la llamamos.

En algunos casos si queremos que la función sea mas flexible podemos definir parámetros con valores por defecto. Esto nos permite llamar a la función pudiendo o no pasar datos a dichos parámetros.

Veamos con un ejemplo este concepto, vamos a desarrollar una función que reciba un dato a imprimir, con la posibilidad de indicarle el color de fuente y el color de fondo, en caso de no indicarle dichos valores la función muestra el dato con color negro y fondo blanco.

def mostrartitulo(dato,colorletra='#000',colorfondo='#fff'):
    print '<h1 style="color:'+colorletra+';background-color:'+colorfondo+'">'+dato+'</h1>'

mostrartitulo('Primer titulo')
mostrartitulo('Segundo titulo','#f00')
mostrartitulo('Tercer titulo','#f00','#000')

Como podemos ver para indicar a Python que un parámetro es por defecto debemos utilizar el operador de asignación en la declaración de la cabecera de la función junto al valor que tomará dicho parámetro en caso de no pasarlo desde donde la llamamos:

def mostrartitulo(dato,colorletra='#000',colorfondo='#fff'):

Cuando llamamos la función mostrartitulo podemos hacerlo de diferentes maneras:

mostrartitulo('Primer titulo')
mostrartitulo('Segundo titulo','#f00')
mostrartitulo('Tercer titulo','#f00','#000')

La primer llamada es pasando un único dato, es decir solo el título que debe mostrar, en este caso el segundo y tercer parámetro toman como valor el indicado en el declaración:

colorletra='#000',colorfondo='#fff'

Podemos llamar a la función mostrartitulo pasando el primer parámetro y el segundo, lo que hace que el tercer parámetro se inicialice con el indicado en la declaración de la función:

mostrartitulo('Segundo titulo','#f00')

En el ejemplo la tercer llamada a la función se hace pasando tres parámetros:

mostrartitulo('Tercer titulo','#f00','#000')

Como podemos ver los parámetros por defecto nos permiten implementar funciones más generales, con esto podemos hacer que las funciones sean útiles para mayor cantidad de situaciones.

Que pasa si queremos llamar la función indicando el primer y último parámetro, esto solo se puede hacer si al llamar la función indicamos que dato se le pasa a cada parámetro:

def mostrartitulo(dato,colorletra='#000',colorfondo='#fff'):
    print '<h1 style="color:'+colorletra+';background-color:'+colorfondo+'">'+dato+'</h1>'

mostrartitulo(dato='Primer titulo',colorfondo='#00f')

Si bien se hace más engorroso la llamada a la función al tener que indicar el nombre de cada parámetro junto al valor, nos trae como beneficio que sea aún más flexible.

Funciones con una cantidad variable de parámetros.

python Funciones con parámetros por defecto1

Otra posibilidad en la declaración de una función en Python es la definición de una cantidad variable de parámetros.

Para definir una cantidad variante de parámetros debemos antecederle el caracter asterísco (*) al último parámetro de la función.

Supongamos que necesitemos implementar una función que le enviemos una serie de enteros y nos retorne la suma de todos ellos (como mínimo le enviamos 2 y no hay un máximo de valores):

def sumar(x1,x2,*xn):
    s=x1+x2
    for valor in xn:
        s=s+valor
    return s

print sumar(1,2)
print '<br>'
print sumar(1,2,3,4)
print '<br>'
print sumar(1,2,3,4,5,6,7,8,9,10)

Lo que en realidad el lenguaje Python hace es una tupla con todos los valores de los parámetros a partir del tercero.

Luego nuestro algoritmo debe recorrer la tupla para procesar los elementos propiamente dichos, en nuestro caso con un for in y los sumamos junto al primer y segundo parámetro.

Luego cuando hacemos la llamada a la función:

print sumar(1,2)

Si pasamos solo dos parámetros la tupla se inicializa vacía, por lo que el for in no ejecuta el bloque contenido.

Si llamamos la función con 10 parámetros:

print sumar(1,2,3,4,5,6,7,8,9,10)

Luego la tupla se crea con 7 elementos.

Si te ha gustado el artículo inscribete al feed clicando en la imagen más abajo para tenerte siempre actualizado sobre los nuevos contenidos del blog:


Guia Python: implementación de módulos y funciones de uso común.

$
0
0

python logoPython es un lenguaje de script desarrollado por Guido van Rossum.

Podemos codificar empleando programación lineal, estructurada y orientada a objetos (tengamos en cuenta que esta última es la que se ha impuesto en la actualidad)

Se cuenta con intérpretes de Python en múltiples plataformas: Windows, Linux, Mac etc. Se pueden desarrollar aplicaciones de escritorio como aplicaciones web. Empresas como Google, Yahoo, Nasa etc. utilizan este lenguaje para sus desarrollos (actualmente el creador de Python Guido van Rossum trabaja para Google.)

Se puede ejecutar instrucciones de Python desde la línea de comando o creando archivos con extensión *.py. Cuando uno comienza a aprender este lenguaje la línea de comandos nos provee una retroalimentación del resultado en forma inmediata.

El objetivo de este tutorial es presentar en forma progresiva los conceptos fundamentales de este lenguaje y poder analizar los problemas resueltos y codificar los problemas propuestos en este mismo sitio, sin tener que instalar en un principio el Python en su equipo (o luego de instalado poder avanzar con el tutorial en cualquier máquina conectada a internet).

Implementación de módulos.

Cuando uno codifica un programa en Python lo almacena en un archivo con extensión *.py

Una vez instalado el Python en forma local podemos llamar un programa desde la línea de comando del sistema operativo.

Si tenemos un programa mínimo llamado: programa1.py

def holamundo():
    print('Hola Mundo')

holamundo();

Luego desde la carpeta donde hemos instalado el Python debemos ejecutarlo con la siguiente sintaxis:

c:\Python25>python c:\pruebaspython\programa1.py

Luego de esto veremos en pantalla el mensaje 'Hola Mundo'

Este archivo en Python se lo llama módulo.

Un programa pequeño puede estar formado por un único módulo, pero programas de mayor tamaño deben dividirse en distintos módulos para facilitar su mantenimiento. Cada módulo normalmente almacena un conjunto de funciones relacionadas.

La sintaxis para llamar a una función que se encuentra en otro módulo es la siguiente:

modulo1.py

def funcion1():
    print 'Función 1'   

modulo2.py

import modulo1

def funcion2():
    modulo1.funcion1()
    print 'Función 2'

funcion2()
      

Luego desde la línea de comandos ejecutamos el modulo2.py:

c:\Python25>python c:\pruebaspython\modulo2.py

Y como resultado tenemos en pantalla

Función 1
Función 2

Veremos más adelante que Python nos provee de una gran biblioteca de módulos. Recordemos que ya hemos estado utilizando la función randint que se encuentra en el módulo random:

import random

x=random.randint(1,1000)
print x

Funciones de uso común (range - type - str - dir).

Como hemos visto en el punto anterior Python agrupa las funciones en módulos que serán importados en el caso que nuestro programa los necesite. Pero hay un pequeño grupo de funciones que Python las importa de forma automática, esto quiere decir que podemos hacer uso sin tener que hacer un import.

Funciones incorporadas en Python
  • range([inicio],fin,[paso])
    La función range devuelve una lista de valores enteros, comienza con el valor pasado al parámetro [inicio], en caso de omitir este parámetro comienza en cero y finaliza con el valor indicado en el parámetro 'fin' sin incluirlo. En caso de indicar el parámetro [paso] la lista de valores crece según dicho número, sino se incrementa de a uno.

lista1=range(5,10)
print lista1  # [5, 6, 7, 8, 9]
lista2=range(10)
print lista2  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
lista3=range(-5,5)
print lista3  # [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4]
lista4=range(1,10,3)
print lista4  # [1, 4, 7]
Es muy común utilizar esta función para generar un contador con la estructura for in, por ejemplo si queremos mostrar los números del 1 al 10:

for x in range(1,11):
    print x
    print '-'

  • str(variable)
    Convierte el contenido del parámetro a cadena y lo retorna. Funciona para cualquier tipo de dato como puede ser un entero, real, tupla, lista etc.
    Muy útil cuando tenemos que generar un string a partir de un conjunto de variables heterogeneas.

x=10
y=2.5
fin=False
edades=(40,50)
print str(x) + str(y) + str(fin) + str(edades)
En el ejemplo concatenamos el contenido de cuatro variables de distinto tipo, para ello debemos llevarlas a todas a tipo string.

  • type(variable)
    Retorna el tipo de una variable.

x=10
print type(x) # <type 'int'>
y=2.5
print type(y)  # <type 'float'>
fin=False
print type(fin) # <type 'bool'>
edades=(40,50)
print type(edades) # <type 'tuple'>

  • dir(variable)
    Si pasamos como parámetro a la función dir un objeto luego nos devuelve todos los métodos que tiene definidos la clase de dicho objeto (veremos más adelante en profundidad cada uno de los métodos de la clase lista y diccionario):

lista1=[2,4,6]
print dir(lista1) #['__add__', '__class__', '__contains__', '__delattr__',
                  # '__delitem__', '__delslice__', '__doc__', '__eq__', '__ge__',
                  # '__getattribute__', '__getitem__', '__getslice__', '__gt__',
                  # '__hash__', '__iadd__', '__imul__', '__init__', '__iter__',
                  # '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__',
                  # '__reduce__', '__reduce_ex__', '__repr__', '__reversed__',
                  # '__rmul__', '__setattr__', '__setitem__', '__setslice__',
                  # '__str__', 'append', 'count', 'extend', 'index', 'insert',
                  # 'pop', 'remove', 'reverse', 'sort']
                 
dic1={'juan':44,'ana':3}
print dir(dic1)   # ['__class__', '__cmp__', '__contains__', '__delattr__', '__delitem__',
                  # '__doc__', '__eq__', '__ge__', '__getattribute__', '__getitem__', '__gt__',
                  # '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__ne__',
                  # '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__',
                  # '__str__', 'clear', 'copy', 'fromkeys', 'get', 'has_key', 'items', 'iteritems',
                  # 'iterkeys', 'itervalues', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']


Si le pasamos como parámetro el nombre de un módulo la función dir nos retorna todas las funciones definidas entre otros datos (recordemos que hemos estado utilizando la función randint para generar un valor aleatorio y como podemos ver se encuentra listado al llamar a la función dir):

import random

print dir(random) # ['BPF', 'LOG4', 'NV_MAGICCONST', 'RECIP_BPF', 'Random', 'SG_MAGICCONST',
                  # 'SystemRandom', 'TWOPI', 'WichmannHill', '_BuiltinMethodType', '_MethodType',
                  # '__all__', '__builtins__', '__doc__', '__file__', '__name__', '_acos', '_ceil',
                  # '_cos', '_e', '_exp', '_hexlify', '_inst', '_log', '_pi', '_random', '_sin',
                  # '_sqrt', '_test', '_test_generator', '_urandom', '_warn', 'betavariate',
                  # 'choice', 'expovariate', 'gammavariate', 'gauss', 'getrandbits', 'getstate',
                  # 'jumpahead', 'lognormvariate', 'normalvariate', 'paretovariate', 'randint',
                  # 'random', 'randrange', 'sample', 'seed', 'setstate', 'shuffle', 'uniform',
                  # 'vonmisesvariate', 'weibullvariate']

Función de uso común (help).

La función help tiene por objetivo ayudar al programador dando información de documentación definidas en módulos, funciones, clases etc.

Veamos que nos devuelve la función help si le pasamos como parámetro la función randint:

import random

help(random.randint) # Help on method randint in module random: randint(self, a, b)
                     # method of random.Random instance Return random integer in
                     # range [a, b], including both end points.

Podemos observar que nos informa el módulo donde se almacena, sus parámetros y el objetivo de la misma.

Nosotros podemos crear cadenas de documentación para nuestras funciones con la siguiente sintaxis:

def sumar(v1,v2):
    """El objetivo de esta funcion es realizar la
       suma de los dos valores que recibe como
       parametro y retornarlo."""
    su=v1+v2
    return su

help(sumar) # Help on function sumar in module __main__: sumar(v1, v2)
            # El objetivo de esta funcion es realizar la suma de los
            # dos valores que recibe como parametro y retornarlo.

El string que definamos inmediatamente después de la cabecera se tomará como cadena de documentación de la función. Como en este caso nuestra cadena de documentación ocupa varias líneas en Python podemos encerrarla entre triples comillas y no deberemos indicar el caracter de continuación de línea (Si la cadena de documentación es una sola línea podemos emplear una sola comillas al principio y al final)

Si utilizamos una sola comillas debemos indicar al final de cada línea que continúa:

def sumar(v1,v2):
    "El objetivo de esta funcion es realizar la \
    suma de los dos valores que recibe como \
    parametro y retornarlo."
    su=v1+v2
    return su

Podemos crear cadenas de documentación para definir objetivos del mismo.

Si tenemos un módulo mínimo llamado: modulo1.py, podemos definir las siguientes cadenas de documentación

"cadena de documentacion del modulo"

def holamundo():
    "cadena de documentacion de funcion"
    print('Hola Mundo')

Si te ha gustado el artículo inscribete al feed clicando en la imagen más abajo para tenerte siempre actualizado sobre los nuevos contenidos del blog:

Guia Python: conceptos de programación y atributos de clase.

$
0
0

python logoPython es un lenguaje de script desarrollado por Guido van Rossum.

Podemos codificar empleando programación lineal, estructurada y orientada a objetos (tengamos en cuenta que esta última es la que se ha impuesto en la actualidad)

Se cuenta con intérpretes de Python en múltiples plataformas: Windows, Linux, Mac etc. Se pueden desarrollar aplicaciones de escritorio como aplicaciones web. Empresas como Google, Yahoo, Nasa etc. utilizan este lenguaje para sus desarrollos (actualmente el creador de Python Guido van Rossum trabaja para Google.)

Se puede ejecutar instrucciones de Python desde la línea de comando o creando archivos con extensión *.py. Cuando uno comienza a aprender este lenguaje la línea de comandos nos provee una retroalimentación del resultado en forma inmediata.

El objetivo de este tutorial es presentar en forma progresiva los conceptos fundamentales de este lenguaje y poder analizar los problemas resueltos y codificar los problemas propuestos en este mismo sitio, sin tener que instalar en un principio el Python en su equipo (o luego de instalado poder avanzar con el tutorial en cualquier máquina conectada a internet).

Conceptos de programación orientada a objetos.

python Atributos de una clase

Habíamos dicho que Python nos permite combinar las metodologías de programación Lineal, Estructurada y Orientada a Objetos. A partir de este concepto mostraremos en forma sencilla la metodología de Programación Orientada a Objetos.

Se irán introduciendo conceptos de objeto, clase, atributo, método etc. y de todos estos temas se irán planteando problemas resueltos.

Prácticamente todos los lenguajes desarrollados en los últimos 15 años implementan la posibilidad de trabajar con POO (Programación Orientada a Objetos)

El lenguaje Python tiene la característica de permitir programar con las siguientes metodologías:

  • Programación Lineal: Es cuando desarrollamos todo el código sin emplear funciones.
  • Programación Estructurada: Es cuando planteamos funciones que agrupan actividades a desarrollar y luego dentro del programa llamamos a dichas funciones que pueden estar dentro del mismo archivo o en una librería separada.
  • Programación Orientada a Objetos: Es cuando planteamos clases y definimos objetos de las mismas (Este es el objetivo de los próximos conceptos, aprender la metodología de programación orientada a objetos y la sintaxis particular de Python para la POO)
Conceptos básicos de Objetos.

Un objeto es una entidad independiente con sus propios datos y programación. Las ventanas, menúes, carpetas de archivos pueden ser identificados como objetos; el motor de un auto también es considerado un objeto, en este caso, sus datos (atributos) describen sus características físicas y su programación (métodos) describen el funcionamiento interno y su interrelación con otras partes del automóvil (también objetos).

El concepto renovador de la tecnología Orientación a Objetos es la suma de funciones a elementos de datos, a esta unión se le llama encapsulamiento. Por ejemplo, un objeto página contiene las dimensiones físicas de la página (ancho, alto), el color, el estilo del borde, etc, llamados atributos. Encapsulados con estos datos se encuentran los métodos para modificar el tamaño de la página, cambiar el color, mostrar texto, etc. La responsabilidad de un objeto pagina consiste en realizar las acciones apropiadas y mantener actualizados sus datos internos. Cuando otra parte del programa (otros objetos) necesitan que la pagina realice alguna de estas tareas (por ejemplo, cambiar de color) le envía un mensaje. A estos objetos que envían mensajes no les interesa la manera en que el objeto página lleva a cabo sus tareas ni las estructuras de datos que maneja, por ello, están ocultos. Entonces, un objeto contiene información pública, lo que necesitan los otros objetos para interactuar con él e información privada, interna, lo que necesita el objeto para operar y que es irrelevante para los otros objetos de la aplicación.

python Atributos de una clase1

Declaración de una clase y creación de objetos.

La programación orientada a objetos se basa en la programación de clases; a diferencia de la programación estructurada, que está centrada en las funciones.

Una clase es un molde del que luego se pueden crear múltiples objetos, con similares características.

Un poco más abajo se define una clase Persona y luego se crean dos objetos de dicha clase.

Una clase es una plantilla (molde), que define atributos (lo que conocemos como variables) y métodos (lo que conocemos como funciones).

La clase define los atributos y métodos comunes a los objetos de ese tipo, pero luego, cada objeto tendrá sus propios valores y compartirán las mismas funciones.

Debemos crear una clase antes de poder crear objetos (instancias) de esa clase. Al crear un objeto de una clase, se dice que se crea una instancia de la clase o un objeto propiamente dicho.

Confeccionaremos nuestra primer clase para conocer la sintaxis en el lenguaje Python, luego definiremos dos objetos de dicha clase.

Implementaremos una clase llamada Persona que tendrá como atributo (variable) su nombre y dos métodos (funciones), uno de dichos métodos inicializará el atributo nombre y el siguiente método mostrará en la página el contenido del mismo.

class Persona:
    def inicializar(self,nom):
        self.nombre=nom

    def imprimir(self):
        print 'Nombre:'
        print self.nombre
        print '<br>'

persona1=Persona()
persona1.inicializar('Juan')
persona1.imprimir()

persona2=Persona()
persona2.inicializar('Ana')
persona2.imprimir()

Siempre conviene buscar un nombre de clase lo más próximo a lo que representa. La palabra clave para declarar la clase es class, seguidamente el nombre de la clase y luego dos puntos.

Los métodos de una clase se definen utilizando la misma sintaxis que para la definición de funciones.

Como veremos todo método tiene como primer parámetro el identificador self que tiene la referencia del objeto que llamó al método.

Luego dentro del método diferenciamos los atributos del objeto antecediendo el identificador self:

self.nombre=nom

Con la asignación previa almacenamos en el atributo nombre el parámetro nom, los atributos siguen existiendo cuando finaliza la ejecución del método. Por ello cuando se ejecuta el método imprimir podemos mostrar el nombre que cargamos en el primer método.

Decíamos que una clase es un molde que nos permite definir objetos. Ahora veamos cual es la sintaxis para la definición de objetos de la clase Persona:

persona1=Persona()
persona1.inicializar('Juan')
persona1.imprimir()

Definimos un objeto llamado persona1 y lo creamos asignándole el nombre de la clase.

Luego para llamar a los métodos debemos anteceder el nombre del objeto el operador . y por último el nombre del método.

En el caso que tenga parámetros se los enviamos (salvo el primer parámetro (self) que el mismo Python se encarga de enviar la referencia del objeto que se creó):

persona1.inicializar('Juan')

También podemos definir tantos objetos de la clase Persona como sean necesarios para nuestro algoritmo:

persona2=Persona()
persona2.inicializar('Ana')
persona2.imprimir()

Esto nos da una idea que si en una página WEB tenemos 2 menúes, seguramente definiremos una clase Menu y luego crearemos dos objetos de dicha clase.

Esto es una de las ventajas fundamentales de la Programación Orientada a Objetos (POO), es decir reutilización de código (gracias a que está encapsulada en clases) es muy sencilla.

Atributos de una clase.

Ahora trataremos de concentrarnos en los atributos de una clase. Los atributos son las características, cualidades, propiedades distintivas de cada clase. Contienen información sobre el objeto. Determinan la apariencia, estado y demás particularidades de la clase. Varios objetos de una misma clase tendrán los mismos atributos pero con valores diferentes.

Cuando creamos un objeto de una clase determinada, los atributos declarados por la clase son localizadas en memoria y pueden ser modificados mediante los métodos.

Plantearemos un nuevo problema para analizar detenidamente la definición, sintaxis y acceso a los atributos.

Problema: Implementar una clase que muestre una lista de hipervínculos en forma horizontal (básicamente un menú de opciones)

Lo primero que debemos pensar es que valores almacenará la clase, en este caso debemos cargar una lista de direcciones web y los títulos de los enlaces. Podemos definir dos listas paralelas que almacenen las direcciones y los títulos respectivamente.

Definiremos dos métodos: cargaropcion y mostrar.

class Menu:
    enlaces=[]
    titulos=[]
    def cargaropcion(self,en,tit):
        self.enlaces.append(en)
        self.titulos.append(tit)

    def mostrar(self):  
        for indice in range(0,len(self.enlaces)):
            print '<a href="'+self.enlaces[indice]+'">'+self.titulos[indice]+'</a>'


menu1=Menu()
menu1.cargaropcion('http://www.google.com.ar','Google')
menu1.cargaropcion('http://www.yahoo.com.ar','Yahoo')
menu1.cargaropcion('http://www.live.com.ar','Msn')
menu1.mostrar()

En este caso los atributos son de tipo listas y estamos obligados a definirlos dentro de la clase y previo a la declaración de los métodos:

enlaces=[]
    titulos=[]

Estamos definiendo dos listas vacías.

El método cargaropcion recibe el enlace y el título y los almacena al final de cada lista empleando el método append de la lista (tengamos en cuenta que Python administra las listas como objetos)

self.enlaces.append(en)
        self.titulos.append(tit)

El método que imprime todos los enlaces utiliza un for para recorrer las listas y acceder a cada elemento de las listas y mostrarlos dentro de la página:

for indice in range(0,len(self.enlaces)):
            print '<a href="'+self.enlaces[indice]+'">'+self.titulos[indice]+'</a>'

Luego creamos un objeto de la clase Menu y llamamos tantas veces al método cargaropcion como opciones tenga nuestro menú

menu1=Menu()
menu1.cargaropcion('http://www.google.com.ar','Google')
menu1.cargaropcion('http://www.yahoo.com.ar','Yahoo')
menu1.cargaropcion('http://www.live.com.ar','Msn')

Finalmente llamamos al método mostrar que imprime cada hipervínculo en la página:

menu1.mostrar()

python banner

Si te ha gustado el artículo inscribete al feed clicando en la imagen más abajo para tenerte siempre actualizado sobre los nuevos contenidos del blog:

10 Artículos Recomendados sobre Seguridad en Ubuntu.

$
0
0

ubuntu-TuxLa mayor amenaza de seguridad informática no son los programas en sì mismos, es el hombre, el usuario.

Siempre hablamos de los virus y de la seguridad informática, de cómo es muy difícil penetrar en un sistema Gnu/Linux y muy fácil entrar en Windows.

Pero difícil no significa imposible y cada vez más y más amenazas se crean para Gnu/Linux y en especial para Ubuntu, al ser uno de los sistemas más usados dentro de la familia Gnu/Linux. Los rootkits son un buen ejemplo de amenaza que se ha llegado a Ubuntu, aunque al igual que hay una forma de que llegue, siempre hay una forma de sacarlo de nuestro sistema.

Linux, y en nuestro caso Ubuntu, cuenta con algunos elementos para minimizar, neutralizar o directamente eliminar estos riesgos.

De la larga lista que hay me he tomado la atribuciòn de elegir 10, sepan disculpar los que he dejado de lado:

1.-Como recuperar una clave de root olvidada (y cambiarla), metodo 1.

clave root olvidadaPodemos encontrarnos con la situación de que hemos perdido u olvidado la contraseña de superusuario o root que creamos cuando instalamos Ubuntu y ahora nos encontramos con la poco agradable sorpresa de que no podemos administrar nuestro sistema.
En ese caso caso: què hacer?

Cuando inicias el ordenador y en el arranque muestra el pantallazo inicial, es decir el pantallazodel grub, tenemos que seleccionar editar con la letra "e" y nos apoarecerà de inmediato una ventana de edicion como lo muestran las dos imàgenes a continuaciòn:

Cliquea aquí para leer el artículo

2.- Como recuperar una clave de root olvidada, metodo 2.

clave root olvidadaPodemos encontrarnos con la situación de que hemos perdido u olvidado la contraseña de superusuario o root que creamos cuando instalamos Ubuntu y ahora nos encontramos con que no podemos administrar nuestro sistema.

Al iniciar el ordenador y cuando nos sale el Grub, seleccionamos arrancar en modo recovery (recuperación).

Nota: para los que os arranca Ubuntu directamente sin poder ver el Grub: lo haremos después de que carge la placa base pulsando escape, si no funciona pulsa shift, para entrar en el menú del grub.

Y en el menu del Grub que nos aparece, elige recovery mode (recuperación)

  • En el submenú que aparece elige "netroot" ("root" en las nuevas versiones), para colocarnos como superusuario sin contraseña.
  • Con este comando podemos solucionar el error: "Authentication token manipulation error passwd: password unchanged":
    Montamos de nuevo la raíz del sistema con permisos de escritura y lectura con el comando:

Cliquea aquí para leer el artículo

 

3.- Deborphan es una utilidad que detecta los paquetes huérfanos en Debian.

debian_logoCuando instalas un paquete éste suele tener dependencias, las cuales se instalan automáticamente.

Si desinstalas ese paquete padre, las dependencias se quedarán en el disco ocupando un espacio inútil.

A estos paquetes se les llama huérfanos (no tienen padre). Nunca está de más ver si tenemos paquetes huérfanos ocupando espacio en nuestro disco.

Deborphan es una utilidad que detecta los paquetes huérfanos.

Imagen:Nota clasica.pngEste comando es muy útil si utilizas apt o dpkg para administrar los paquetes de tu sistema. Si usas aptitude no hace falta usarlo porque él mismo se encarga de eliminar los paquetes huérfanos.

Cliquea aquí para leer el artículo

 

4.- Ubuntu Rescue Remix resulta muy útil para rescatar archivos de discos duros con problemas o defectuosos o reconstruir sistemas de archivos.

Ubuntu Rescue Remix es una recopilación de distintas utilidades para recuperación de datos montadas en un Live CD que permite el arranque del sistema.

Resulta muy útil para rescatar archivos de discos duros con problemas o defectuosos o reconstruir sistemas de archivo de discos duros formateados con distintos sistemas operativos.

Ofrece un entorno gráfico que facilita la puesta en marcha de las operaciones. Dispone también de programas para realizar “autopsias” de los problemas del disco.

Cliquea aquí para leer el artículo

 

5.- Advanced Onion Router es un excelente programa para proteger tu privacidad mientras navegas.

Advanced Onion Router

Para  entender claramente el concepto de navegar anónimamente tener que saber que son los dominios .onion.

En Tor podrás comenzar una navegación anónima simplemente introduciendo cualquier dirección o IP de la web superficial de todos los días, pero no nos engañemos más y pasemos a lo que realmente llama la atención en todo este asunto de la Deep Web.

La entrada propiamente dicha a la parte más invisible de la Deep Web se realiza a través de lo que se llama Onionland, o también -mal- denominada Darknet. Estos son sitios reglados bajo dominios del tipo .onion que tienen la particularidad de no revelar el título de su contenido en su dirección (ej. Facebook.com), sino que se lo esconde con URLs del tipo kj369k76352k3hte.onion (16 caracteres alfa numéricos).

Este protocolo (Onion Router) que Tor toma como base para su funcionamiento, será el que presente los sitios más interesantes en cuanto a anonimato en la deep web. Para acceder a ellos tendrás que saber su IP e introducirla en Tor a través de la barra de direcciones.

Cliquea aquí para leer el artículo

 

6.- Dkopp software libre para crear copias de seguridad de nuestros archivos y documentos.

dkop_1Dkopp es una interesante herramienta de seguridad que nos permitirá realizar todo tipo de respaldo de la información, archivos y documentos que tengamos almacenados en CD, DVDo Blue-ray.

De esta manera, podemos tener copias de seguridad extra para evitar que se pierdan los datos de los discos por cualquier eventualidad.

Dkopp también es utilizado para crear discos de almacenamiento, donde podemos ingresar nuestras copias de seguridad lo que aumenta el atractivo de la aplicación.

La funcionalidad de Dkopp no se limita a crear copias de seguridad y realizar almacenamiento de archivos importantes, también puede ser utilizado para realizar verificaciones de distintos tipos de copias de discos, así podemos saber si la copia de un DVD, CD o Blue-ray está bien hecha y carece de errores.

Cliquea aquí para leer el artículo

 

7.- Gcipher es una herramienta, sencilla y útil para encriptar archivos.

gciher3Suponga que quiere mandar un mensaje “cifrado” a un colega, amigo, y/o compañero de trabajo, por diversas razones que no enlistaré, necesita cierta “privacidad” para que nada más la persona a la que está dirigida dicho mensaje la lea.


Este programa se encuentra en los repositorios de Debian, Ubuntu y muy probablemente en su distribución favorita, por lo que lo animamos a testearla y al menos divertirse un momento al intercambiar mensajes, tuits o lo que se le ocurra con familiares, amigos, clientes, etc.


Cliquea aquí para leer el artículo

 

8.- FreeFileSync compara y sincroniza tus archivos sin problemas.

FreeFileSync te ayuda a gestionar tus copias de seguridad comprobando los cambios realizados en el fichero original y aplicándolos a las copias.

Puede comprobar cambios por tamaño, fecha o contenido, y sincronizarlos en modo Mirror (los cambios de una carpeta se aplican a la otra borrando lo demás), Update (copia archivos de un sitio a otro respetando la carpeta destino) y Two Way (copia nuevo contenido y actualiza el existente usando las dos carpetas como origen y destino).

FreeFileSync permite guardar la configuración de una tarea y cargarla posteriormente, así como crear un fichero CSV con una lista de los archivos presentes en una carpeta

Cliquea aquí para leer el artículo

 

9.- DuckDuckGo el motor de búsqueda que hace hincapié en la privacidad del usuario.

duckduckgoDuckDuckGo es un motor de búsqueda establecido en Valley Forge, Pensilvania, Estados Unidos, que utiliza la información de sitios de origen público (como Wikipedia) con el objetivo de aumentar los resultados tradicionales y mejorar la relevancia. La filosofía de DuckDuckGo hace hincapié en la privacidad y en no registrar la información del usuario.
Historia

Duck Duck Go fue fundada por Gabriel Weinberg, un empresario cuya última aventura The Names Database (la base de datos de nombres) fue adquirida por United Online (NASDAQ:UNTD) en el 2006 por U$S 10 millones.

Weinberg tiene una licenciatura en Física y un M.S. en Tecnología y Política en el MIT.

Cliquea aquí para leer el artículo

10.- Lightweight Portable Security.

lps_logoLightweight Portable Security (LPS-Public) nace de una iniciativa del Departamento de Defensa de los EEUU de poner en línea una distribución Linux creada bajo la dirección de su Fuerza Aérea en mancomunión con equipos del gobierno.

Lightweight Portable Security (LPS) es lo que su nombre indica, una distribución ligera, que arranca desde un CD o un dispositivo USB, y que pone el gran acento en la seguridad de la información.
Este sistema operativo funciona integralmente en la memoria RAM del computador, no monta los dispositivos locales (disco/s duro/s o rígido/s) y se asegura de no dejar ningún rastro de la actividad de los usuarios. Nada queda almacenado.

Prevista para que los empleados del Departamento de Defensa puedan utilizar cualquier equipo público en toda seguridad, el sistema propone especialmente un sistema de criptado de datos y un navegador web Firefox concebido para funcionar con las cartas de acceso CAC y PIV que el gobierno estadounidense utiliza para securizar los accesos distantes a los servidores de la administración.

Cliquea aquí para leer el artículo

Si te ha gustado el artículo inscribete al feed clicando en la imagen más abajo para tenerte siempre actualizado sobre los nuevos contenidos del blog:

Introducción a Inkscape programa de diseño vectorial.

$
0
0

inkscape-draw-freely-program-LOGOInkscape es un programa de diseño vectorial. Esto significa que los gráficos así creados se podrán escalar a cualquier tamaño sin que pierdan calidad, o reformar una vez hechos sin tener que borrar cada línea.

También tiene la capacidad de exportar lo que dibujemos a un formato de mapa de bits para utilizarlo en cualquier aplicación, como fondo de pantalla, en una página web, etc.

Inkscape se encuentra desarrollado principalmente para el sistema operativo GNU/Linux, pero es una herramienta multiplataforma.

Es una aplicación disponible en muchas lenguas, incluyendo sistemas de escritura complejos (como sistemas de escritura de derecha a izquierda como árabe, hebreo...).

Ink1.png

En esta primera imagen se puede observar la explicación de la utilidad de cada herramienta. También vemos en la parte inferior: el zoom al que estamos trabajando en este momento, la posición en la que está el mouse y un mensaje de ayuda para saber qué podemos hacer en cada momento. En la parte superior hay una barra de menús que convendría que usted mismo investigue, una barra de botones de tareas más frecuentes y una barra contextual que irá cambiando según la herramienta que usted haya seleccionado. Le muestro a continuación las posibilidades de esta barra contextual.

Detalle de los botones con la herramienta "puntero":

Ink2.png

Función de cada botón, de izquierda a derecha:

Rotar izquierda
Rotar derecha
Espejar horizontal
Espejar vertical
Enviar al fondo
Bajar una capa
Subir una capa
Enviar arriba de todo
Posición horizontal (1)
Posición vertical (1)
Ancho
Alto
Unidad de medida

(1) Del vértice superior izquierdo de la figura o lo seleccionado.

El pequeño "candado" que se ve entre "Ancho" y "Alto" es para mantener la proporcionalidad entre estas magnitudes cuando se cambia una de ellas.

Detalle de los botones con la herramienta "Editor de nodos":

Ink3.png

Función de cada botón, de izquierda a derecha:

Agregar nodo (2)
Sacar nodo (2)
Cerrar figura
Cerrar con un segmento
Sacar un segmento
Crear un corte
Cúspide
Empalme
Empalme simétrico
Convertir a recta
Convertir a curva
Objeto a curvas
Contorno a curvas

(2) Entre dos nodos seleccionados.

Detalle de los botones con la herramienta "Zoom":

Ink4.png

Función de cada botón, de izquierda a derecha:

  • Acercar
  • Alejar
  • Zoom a la selección
  • Zoom a todo
  • Zoom a la página
  • Zoom al ancho de página
  • Zoom anterior
  • Zoom siguiente
  • 100%
  • 50%
  • 200%

Detalle de los botones con la herramienta "Rectángulos":

Ink5.png

Función de cada botón, de izquierda a derecha:

  • Radio horizontal de las esquinas
  • Radio vertical de las esquinas
  • Unidad de medida
  • esquinas en punta

Detalle de los botones con la herramienta "Elipses":

Ink6.png

Función de cada botón, de izquierda a derecha:

�?ngulo de inicio (3)
�?ngulo de fin (3)
Arco o Porción
Figura cerrada

(3) Medido desde la línea horizontal sobre el lado derecho de la figura y en el sentido de las agujas del reloj.

Detalle de los botones con la herramienta "Polígonos":

Ink7.png

Función de cada botón, de izquierda a derecha:

  • Cantidad de puntas
  • Polígono o estrella
  • Distancia del centro a la cuenca de la estrella
  • Convierte en curva las caras
  • Vuelve a los valores del principio

Detalle de los botones con la herramienta "Espirales":

Ink8.png

Función de cada botón, de izquierda a derecha:

  • Vueltas del espiral
  • Aumento de radio progresivo
  • Punto interior donde comienza la espiral
  • Vuelve a los valores del principio

Detalle de los botones con la herramienta "Líneas caligráficas":

Ink9.png

Función de cada botón, de izquierda a derecha:

Máximo ancho de la pluma
Angulo de la mano
Suavidad del trazo
Lentitud del trazo
Vuelve a los valores del principio

Si te ha gustado el artículo inscribete al feed clicando en la imagen más abajo para tenerte siempre actualizado sobre los nuevos contenidos del blog:

Cómo instalar un emulador de Android en Ubuntu.

$
0
0

Este emulador lo pueden encontrar en la página oficial de Android para desarrolladores.

Pensado para desarrolladores, incluye:

Herramientas.
Ejemplos de código.
Documentación.
Permite seleccionar cuales de los anteriores desea instalarse.
Posibilidad de descargar cualquier versión del Sistema Operativo (1.6,3.0,4,etc).

Todo para apoyar el desarrollo de aplicaciones para esta plataforma. Además permite:

Navegar por internet, utilizando la conexión de tu ordenador.
Navegar por la interfaz y algunas configuraciones del dispositivo virtual.

Instalar aplicaciones (muy útil si quieres probarlas antes de instalarlas en tu gadget).

Crear varios dispositivos virtuales.

Crear y asignar tarjetas de memoria, de diferentes tamaños.
Asignar la resolución de la pantalla.

En fin, de ahora en más pasaremos a la instalación.

Para hacerlo tenemos que tener instalado previamente el JDK 6, si lo tienen instalado pueden pasar al paso 2. Si no lo tienen (o no saben) pueden instalarlo rápidamente usando el Gestor de Paquetes Synaptic buscando “openjdk-6-jdk”, lo marcan para instalar y aplican.

Después de instalar el JDK, nos disponemos a descargar el paquete de instalación del emulador desde la Pagina oficial

Descomprimimos el paquete, y accedemos a él mediante la terminal, por ejemplo:

$ cd /home/usuario/Android/android-sdk-linux/tools/

Luego, dentro del directorio debemos ejecutar:

$ ./android

Estaremos entonces viendo la pantalla del “Android SDK Manager”. En este punto podremos seleccionar las herramientas y APIs que deseemos instalar. Tan simple como marcar y darle Install Packages.

Una vez instalados los paquetes deseados nos dirigimos a Tools – Manage AVDs y allí encontraremos las opciones de creación de nuevos dispositivos. Le damos a New, y configuramos los datos necesarios para nuestro gadget virtual, nombre, versión del SO (API), tarjeta de memoria, resolución de pantalla, etc. Al finalizar damos Create AVD, y listo, ya tenemos nuestro dispositivo Android creado

Ahora podemos ver en la lista de dispositivos el que acabamos de crear. Lo seleccionamos, damos Start, seleccionamos la escala del display en caso que queramos verlo en tamaño real y empezará a correr. No se desesperen puede demorar uno o varios minutos en reaccionar la primera vez.


Para instalar aplicaciones solo debes bajar la misma con la extensión .apk, y mediante una terminal posicionarte en el directorioplataform-tools, y, con el dispositivo corriendo, ejecutar:

$ adb install nombre_aplicacion.apk

De la misma manera, para desinstalar:

$ adb uninstall nombre_aplicacion.apk

Una muy buena herramienta para probar aplicaciones, recomendado sobre todo si eres desarrollador o quieres probar aplicaciones con la seguridad de que no va a suceder nada con tu gadget.

Si te ha gustado el artículo inscribete al feed clicando en la imagen más abajo para tenerte siempre actualizado sobre los nuevos contenidos del blog:

Dota 2 un juego de campo de batalla multijugador para Linux.

$
0
0

Dota 2 es un juego de campo de batalla multijugador en linea aun en desarrollo por Valve.

El juego esta actualmente disponible para pruebas preliminares a través de la compra y sera free-to-play cuando se lance finalmente.

DotA fue creado por "Eul", un jugador como cualquiera de nosotros, quien deseaba crear un modo "Diferente" de jugar Warcraft. Eul creo el mapa para jugarlo con sus amigos y se basaba en el uso de una unica unidad por jugador, denominada "Heroe" en un mapa con 3 caminos principales que conectaban las 2 bases enemigas, en el que para ganar habia que destruir la base enemiga.

El jugador no deberia construir la base ni desarrollarla, solo tendria que preocuparse por su heroe. Yo no voy a entrar en la explicacion del modo de juego, porque es demasiado extensa y no va al caso.


Al cabo de un año el juego dejo de ser solo para jugar entre "Amigos" y se fue haciendo muy popular en internet.
En 2003, sale la expansion de Warcraft III, llamada Warcraft III: The Frozen Trone

Los jugadores esperaban una actualizacion del mapa a esta expansion por parte de Eul, pero esta nunca llego y el mapa siguio siendo desarrollado a travez del tiempo por diferentes usuarios. Desde hace ya varios años, el mapa viene siendo desarrollado por un usuario llamado "Icefrog", quien lo actualiza periodicamente y nombro a su version DotA All Stars (actualmente renombrada a simplemente "DotA" ). Actualmente el mapa se encuentra en la version 6.73c

En el primer enlace, hay una captura de pantalla (la imagen de arriba) de Steam para GNU/Linux con "Dota 2" mostrándose en la barra lateral.

Como el juego no aparece en color gris, significa que esta instalado, por lo tanto Dota 2 está, probablemente, en proceso de ser portado a GNU/Linux.

Pero desde que Dota 2 usa el motor Source, como Counter-Strike: Source, el cual ya esta disponible para GNU/Linux, es probable, considerando también la captura de pantalla anterior, que Dota 2 va a estar disponible nativamente en GNU/Linux.

dota2 brew_pubstomp

dota2 secret-shop

Dota_2_minimap

Dota_2

Dota_2 wallpaper

dota2_2

Si te ha gustado el artículo inscribete al feed clicando en la imagen más abajo para tenerte siempre actualizado sobre los nuevos contenidos del blog:

7 aplicaciones multimedia presentes en los repositorios oficiales de Ubuntu.

$
0
0

ubuntu_audioUbuntu ofrece una amplia gama de aplicaciones multimedia desde sus repositorios Main, Universe y Multiverse.

Para ayudarte a escoger al reproductor de música o el editor de vídeo más conveniente, es útil distinguir entre los reproductores de medios de comunicación ellos mismos (o 'front-ends) y los motores de reproducción (playback)(' back-ends') que utilizan. Los front ends son las aplicaciones con las que interactuas con tu escritorio.

Algunos están integrados fuertemente con los entorno de escritorio, el GNOME y KDE; otros son independientes de plataforma.

Mientras algunas aplicaciones, como Mplayer y XMMS, usan sus propios motores de reproducción, los otros aprovechan de dos de los principales Back-ends que son el gstreamer y xine. Algunos reproductores soportan tanto gstreamer como xine.

Tu decisión dependerá de la combinación de caracteríscicas, funcionamiento, opciones de formatos de medios, su entorno de escritorio y otras preferencias personales.

1.- FF-Multi Converter aplicación para convertir rápidamente archivos de video, audio, imagen y texto.


ff multiconverter logoFF-Multi Converter es una aplicación gratuita para Linux que nos permite convertir rápidamente archivos de video, audio, imagen y texto a los formatos más populares a través de su amigable interfaz gráfica.

Hoy veremos las principales características de esta nueva versión, la 1.5.0 con  los formatos que soporta y cómo instalarla en Ubuntu y Linux Mint.

La aplicación està escrita en Python y PyQt.

 

2.-Nuvola un reproductor que nos permitirá llevar GrooveShark al escritorio de Ubuntu.

NuvolaPlayerNuvola Player (anteriormente llamado Google Music Frame) es un reproductor de música para Linux que permite integrar diversos servicios de música online en tu escritorio. Ya tenemos actualización de Nuvola.
Esta versión además de añadir soporte para Precise Pangolin añade nuevas opciones de radios para streaming.
En primer lugar, debemos comentar que Nuvola antes era conocido como Google Music Frame, ya que su primer objetivo fue ofrecer una aplicación de escritorio para Google Music, sin embargo, sus desarrolladores han decidido que también sea compatible con GrooveShark, y por ello han cambiado el nombre del software.
De este modo, gracias a Nuvola, no será necesario que iniciemos nuestro navegador web para disfrutar de la música en streaming de GrooveShark en Ubuntu.

 

3.- FreetuxTV excelente aplicación para ver la TV o escuchar la radio en Ubuntu.

Si buscas una aplicación que te permita ver la televisión en directo o escuchar la radio de cualquier parte del mundo en GNU/Linux puede que FreeTuxTV te sea de gran utilidad ya que nos permite hacer esto mismo de forma sencilla.

La interfaz de FreetuxTV es muy sencilla y cuando lo iniciamos ya podremos agregar los canales en español, también podremos grabar lo que estamos viendo muy útil si quieres mantenerlo en tu equipo para verlo cuando quieras.

Para instalarlo basta agregar los PPA dedicados, es decir agregar los repositorios propios de FreeTuxTV.

Cada vez que hacemos partir el programa FreeTuxTV actualiza automaticamente la lista de los grupos que hemos seleccionado.

4.-Medusa, la mejor alternativa a AutoCAD en Linux.

De sobra nos es conocido que el rey indiscutible del CAD es AutoCad, ningún programa ha sido capaz de hacerle sombra, aunque los precios del software son, por ser amables, abusivos.
La única distribución que, desde mi punto de vista, permite trabajar de forma cómoda al estilo de AutoCad es ZWCAD que se puede adquirir por un precio inferior. Ambas distribuciones tienen el problema que no presentan versiones en Linux, aunque el futuro está en la adptación del software al Linux (por su creciente demanda en el mercado) y en la virtualización. No obstante, nos encontramos con otros programas CAD libres con los que podemos desarrollar nuestros proyectos, y en este reportaje hablamos de Medusa4 y como instalarlo en Ubuntu.

 

5.- Crea tus propios ritmos con Hydrogen (1a parte).

Hydrogen_drum_machine_iconHydrogen es un avanzado sintetizador de batería que te permite programar sencillos patrones de ritmo con resultados verdaderamente profesionales.

Hydrogen cuenta con una interfaz totalmente gráfica y relativamente fácil de usar, con soporte para simples, un secuenciador basado en patrones, múltiples capas disponibles para los diversos instrumentos y hasta 32 pistas de composición.

Pros

  • Interfaz muy visual y fácil de utilizar
  • Hasta 32 pistas

Contras

  • Algunos problema
  • Faltan algunos sonidos de batería

 

6.- Crea tus propios ritmos con Hydrogen (2a parte).

_label_

Con el kit de batería cargado por defecto en el Pattern Editor haz clic en los nombres de los instrumentos para oir su sonido. Para añadir un sonido en el patrón solo tienes que hacer clic en la rejilla donde quieras que suene y aparecerá un pequeño rombo negro como referencia.

Debajo de cada evento de percusión (rombo negro), aparecerá una linea vertical de una altura determinada. Modificando esta altura variará la dinámica del golpe percutivo. Es decir la percepción de su volumen y fuerza. Empieza con alguno de los platillos, por ejemplo el charles (Open HH,Pedal HH, Closed HH) para introducir una pulsación a corcheas, agrega a continuación otros sonidos: bombo en los tiempos fuertes del compás (1 y 3) y caja en los tiempos débiles (2 y 4).

 

7.- Workarround para usar PulseAudio y Jack de forma sencilla.

Para los que están metidos en el mundo de grabación y producción musical en GNU/Linux de seguro están más que familiarizados con JACK (una herramienta excelente), y seguramente tengan más de una placa de audio (alguna interfaz profesional, la placa de sonido onboard, el micrófono incorporado en las cámaras web, etc) y la forma más fácil de tener todas las placas en orden es a través de PulseAudio.

Después de un rato concluí con que la mejor opción es matar de lleno PulseAudio y lanzar el servidor Jack cuando se necesite. Es decir, usar siempre PulseAudio y pasar a Jack cuando lo necesitemos.

Lo primero que hay que hacer es configurar PulseAudio para que no intente iniciarse cada vez que muere. Para esto hay que crear el archivo client.conf en ~/.pulse/ y agregarle una única línea que diga autospawn=no

Si te ha gustado el artículo inscribete al feed clicando en la imagen más abajo para tenerte siempre actualizado sobre los nuevos contenidos del blog:


Cómo monitorear y analizar una red con Nagios.

$
0
0

Nagios_logo_blackNagios es un sistema de monitorización de redes de código abierto ampliamente utilizado, que vigila los equipos (hardware) y servicios (software) que se especifiquen, alertando cuando el comportamiento de los mismos no sea el deseado.

Las redes de cómputo de las organizaciones, se vuelven cada vez más complejas y laexigencia de la operación es cada vez más demandante.

Las redes, cada vez más, soportanaplicaciones y servicios estratégicos de las organizaciones. Por lo cual el análisis ymonitoreo de redes se ha convertido en una labor cada vez mas importante y de carácterpro-activo para evitar problemas.

Para prevenir errores en un sistema existe podemos utilizar un equipo que se ocupe deestar “controlado y observando” el funcionamiento de la red, esto podemos realizarlo pormedio de un software llamado Nagios.

Nagios-screenshot-8

Nagios es un sistema de monitorización de equipos y de servicios de red, escrito en C ypublicado bajo la GNU General Public License, el lenguage con el cual está desarrolladonos asegura una rápida ejecución y su licencia que lo determina como Software Libre nosasegura que siempre tendremos actualizaciones disponibles y que hay una grancomunidad de desarrolladores soportándolo.

Creado para ayudar a los administradores a tener siempre el control de qué está pasandoen la red que administran y conocer los problemas que ocurren en la infraestructura queadministran antes de que los usuarios de la misma los perciban, para así no sólo podertomar la iniciativa, sino asumir la responsabilidad de hacer que las cosas sucedan; decidir en cada momento lo que queremos hacer y cómo lo vamos a hacer, debido a que estesoftware nos permite obtener datos, interpretarlos y tomar decisiones en base a ellocomo:

Nagios-PNP-Screenshot

• Conservar y almacene datos de la red para manejar reportes y tendencias.

• Ver y analizar la red, así como el tráfico de la red a través del tiempo

• Monitorear el estado de la red en comparación a los reportes de análisis

• Generar reportes sustentados para justificar las necesidades de actualización de la redQue se puede hacer con Nagios

• Monitorización de servicios de red.

• Monitorización de los recursos de un host (carga del procesador, uso de los discos, logs del sistema) en varios sistemas operativos.

nagios captura

Entre sus características principales figuran la monitorización de servicios de red (SMTP, POP3, HTTP, SNMP...), la monitorización de los recursos de sistemas hardware (carga del procesador, uso de los discos, memoria, estado de los puertos...), independencia de sistemas operativos, posibilidad de monitorización remota mediante túneles SSL cifrados o SSH, y la posibilidad de programar plugins específicos para nuevos sistemas.

Se trata de un software que proporciona una gran versatilidad para consultar prácticamente cualquier parámetro de interés de un sistema, y genera alertas, que pueden ser recibidas por los responsables correspondientes mediante (entre otros medios) correo electrónico y mensajes SMS, cuando estos parámetros exceden de los márgenes definidos por el administrador de red.

Llamado originalmente Netsaint, nombre que se debió cambiar por coincidencia con otra marca comercial, fue creado y es actualmente mantenido por Ethan Galstad, junto con un grupo de desarrolladores de software que mantienen también varios complementos.

Nagios fue originalmente diseñado para ser ejecutado en GNU/Linux, pero también se ejecuta bien en variantes de Unix.

Nagios está licenciado bajo la GNU General Public License Version 2 publicada por la Free Software Fundation.

Instalación:

Nagios2

Si te ha gustado el artículo inscribete al feed clicando en la imagen más abajo para tenerte siempre actualizado sobre los nuevos contenidos del blog:

La campaña de financiación colectiva (crowdfunding) de Ubuntu Edge paso a paso.

$
0
0

ubuntu edgeLa campaña de financiación colectiva que Canonical puso en marcha hace una semana comenzó con gran fuerza, pero en las últimas horas el empuje de esas inversiones se ha ralentizado de forma notable.

¿Conseguirán recaudar los 32 millones de dólares que persiguen para desarrollar y fabricar sus Ubuntu Edge?

El problema reside en que la avalancha de peticiones iniciales se ha debido a los importantes descuentos que Canonical ofreció. El Ubuntu Edge se podía conseguir por 600 dólares (más 30 de gastos de envío) frente a los 830 dólares que supondrían el coste final. Esa oferta se ha visto continuada con algunas más, pero éstas son cada vez menos atractivas.

Ubuntu Edge es un proyecto crowfunding que pretende comercializar un potente smartphone que, incluso, podría servir de base para un PC y ser proyectado a pantalla completa.

Ubuntu Edge se ha propuesto revolucionar el mercado de los smartphones con el lanzamiento de un servicio financiado a través de crowfunding basado en la creación de un dispositivo que mezclaría las características de un smartphone y un PC.

Entre otras características, el terminal podría conectarse a nuestro PC y pasar de ser un teléfono móvil a la base del ordenador personal. Entre sus principales características destacarían las siguientes:


· Diseño elegante y pantalla de 4,5 pulgadas que podría ser manejada con una mano. Su resolución óptima sería de 300 ppi y estaría protegida por un cristal de zafiro, duro y resistente material que sólo puede ser dañado o rayado por un diamante.

· Hardware: su funcionamiento dependería de un procesador de 4 Gb de memoria RAM y sería capaz de almacenar datos con una capacidad máxima de 128 Gb de memoria interna. La batería utilizaría tecnología de silicio-ánodo que permite exprimir al máximo su rendimiento y contener más energía que cualquier otra batería del mismo tamaño.

· Software: con doble sistema operativo, mobile OS y Android.
Y si lo que te preocupa es que tu aplicaciones Android no son compatibles con PC, no tienes por qué. Desde el primer momento se realizaría una actualización que hará que todos los contenidos de Android sean compatibles con el sistema operativo de Ubuntu y así puedas utilizarlo también en su versión para ordenador.

Como va la campaña.
La expectación que ha generado el proyecto de Canonical ha hecho que durante los primeros días surgieran muchísimas peticiones para apoyar el desarrollo de este singular smartphone, que llegaría con Android y Ubuntu preinstalados y que estaría dotado de unas prestaciones hardware notables.

ubuntu-edge-campana-1

Dos desarrolladores quisieron seguir de cerca la evolución de la campaña de crowdfunding, y desarrollaron dos gráficos que mostraban el nivel de recaudaciones. El primero, de MoveBits, parece haber dejado de funcionar en los últimos días, algo extraño considerando que el pequeño y elegante código en Ruby parecía estar cumpliendo perfectamente al comienzo de la campaña.

El segundo apareció poco después en la página Ubuntu-Edge.info, y en este caso las estadísticas han seguido funcionando de forma continua, mostrando además como referencia una diagonal con el “objetivo” lineal de recaudación de cada día.

ubuntu-edge-campana-2

Esa situación hace que no quede claro si la campaña de financiación colectiva tendrá éxito, algo en lo que influyen varios factores. El primero, la desaparición de las atractivas ofertas (o “perks”, como los denominan en Indiegogo) iniciales por ir agotándose. En segundo, el apoyo de los medios, que supusieron también un importante impulso inicial para el proyecto.

Canonical realizó algunas ofertas adicionales para tratar de volver a reimpulsar la campaña, pero las más relevantes ya están agotadas y actualmente el Ubuntu Edge se puede conseguir a 700 dólares (si aprovechamos la opción Double Edge, en la que reservamos 2 dispositivos por 1.400 dólares), o bien 775 dólares en el caso de querer reservar solo uno. Ese segundo precio es lógicamente menos atrayente para muchos interesados que llegan algo más tarde a la campaña de financiación.

Si te ha gustado el artículo inscribete al feed clicando en la imagen más abajo para tenerte siempre actualizado sobre los nuevos contenidos del blog:

Guia Python: métodos constructores de una clase.

$
0
0
python logoPython es un lenguaje de script desarrollado por Guido van Rossum.

Podemos codificar empleando programación lineal, estructurada y orientada a objetos (tengamos en cuenta que esta última es la que se ha impuesto en la actualidad)

Se cuenta con intérpretes de Python en múltiples plataformas: Windows, Linux, Mac etc. Se pueden desarrollar aplicaciones de escritorio como aplicaciones web. Empresas como Google, Yahoo, Nasa etc. utilizan este lenguaje para sus desarrollos (actualmente el creador de Python Guido van Rossum trabaja para Google.)

Se puede ejecutar instrucciones de Python desde la línea de comando o creando archivos con extensión *.py. Cuando uno comienza a aprender este lenguaje la línea de comandos nos provee una retroalimentación del resultado en forma inmediata.

El objetivo de este tutorial es presentar en forma progresiva los conceptos fundamentales de este lenguaje y poder analizar los problemas resueltos y codificar los problemas propuestos en este mismo sitio, sin tener que instalar en un principio el Python en su equipo (o luego de instalado poder avanzar con el tutorial en cualquier máquina conectada a internet).

Métodos de una clase.

python Atributos de una clase
Los métodos son como las funciones en los lenguajes estructurados, pero están definidos dentro de una clase y operan sobre los atributos de dicha clase.
Los métodos también son llamados las responsabilidades de la clase. Para encontrar las responsabilidades de una clase hay que preguntarse qué puede hacer la clase.
El objetivo de un método es ejecutar las actividades que tiene encomendada la clase a la cual pertenece.
Los atributos de un objeto se modifican mediante llamadas a sus métodos.
Confeccionaremos un nuevo problema para concentrarnos en la definición y llamada a métodos.
Problema:Confeccionar una clase CabeceraPagina que permita mostrar un título, indicarle si queremos que aparezca centrado, a derecha o izquierda.
Definiremos dos atributos, uno donde almacenar el título y otro donde almacenar la ubicación.
Ahora pensemos que métodos o responsabilidades debe tener esta clase para poder mostrar la cabecera de la página. Seguramente deberá tener un método que pueda inicializar los atributos y otro método que muestre la cabecera dentro de la página.
Veamos el código de la clase CabeceraPagina
class CabeceraPagina:
    def inicializar(self,tit,ubi):
      self.titulo=tit
      self.ubicacion=ubi

    def graficar(self):
        print '<div style="font-size:40px;text-align:'+self.ubicacion+'">'
        print self.titulo
        print '</div>'


cabecera=CabeceraPagina()
cabecera.inicializar('El blog del programador','center')
cabecera.graficar()
La clase CabeceraPagina tiene dos atributos donde almacenamos el texto que debe mostrar y la ubicación del mismo ('center', 'left' o 'right'), nos valemos de CSS para ubicar el texto en la página.
No es obligatorio en Python definir previo a los métodos todos los atributos. Como vemos se definen e inicializan al llamar al método inicializar.
Ahora analicemos lo que más nos importa en el concepto que estamos concentrados (métodos de una clase):
def inicializar(self,tit,ubi):
        self.titulo=tit
        self.ubicacion=ubi
Un método tiene un nombre, conviene utilizar verbos para la definición de métodos (mostrar, inicializar, graficar etc.) y sustantivos para la definición de atributos (color, enlace, titulo etc.)
Un método debe tener como primer parámetro el identificador self, el mismo nos permite acceder a los atributos de la clase, además puede tener otros parámetros que inicializan atributos del objeto:
self.titulo=tit
        self.ubicacion=ubi
Luego para llamar a los métodos debemos crear un objeto de dicha clase:
cabecera=CabeceraPagina()
cabecera.inicializar('El blog del programador','center')
cabecera.graficar()
Es importante notar que siempre que llamamos a un método le antecedemos el nombre del objeto. El orden de llamada a los métodos es importante, no va a funcionar si primero llamamos a graficar y luego llamamos al método inicializar.

Método constructor de una clase.
python Atributos de una clase1
El constructor es un método especial de una clase. El objetivo fundamental del constructor es inicializar los atributos del objeto que creamos.
Básicamente el constructor remplaza al método inicializar que habíamos hecho en el concepto anterior.
Las ventajas de implementar un constructor en lugar del método inicializar son:
  1. El constructor es el primer método que se ejecuta cuando se crea un objeto.
  2. El constructor se llama automáticamente. Es decir es imposible de olvidarse de llamarlo ya que se llamará automáticamente.
  3. Quien utiliza POO (Programación Orientada a Objetos) conoce el objetivo de este método.
Otras características de los constructores son:
  • El constructor se ejecuta inmediatamente luego de crear un objeto y no puede ser llamado nuevamente.
  • Un constructor no puede retornar dato.
  • Un constructor puede recibir parámetros que se utilizan normalmente para inicializar atributos.
  • El constructor es un método opcional, de todos modos es muy común definirlo.
Veamos la sintaxis del constructor:
def __init__([parámetros]):
       [algoritmo]
Debemos definir un método llamado __init__ (es decir utilizamos dos caracteres de subrayado, la palabra init y seguidamente otros dos caracteres de subrayado).
Confeccionaremos el mismo problema del concepto anterior para ver el cambio que debemos hacer de ahora en más.
Problema:Confeccionar una clase CabeceraPagina que permita mostrar un título, indicarle si queremos que aparezca centrado, a derecha o izquierda.
class CabeceraPagina:
    def __init__(self,tit,ubi):
        self.titulo=tit
        self.ubicacion=ubi

    def graficar(self):
        print '<div style="font-size:40px;text-align:'+self.ubicacion+'">'
        print self.titulo
        print '</div>'



cabecera=CabeceraPagina('El blog del programador','center')
cabecera.graficar()
Ahora podemos ver como cambió la sintaxis para la definición del constructor:
def __init__(self,tit,ubi):
        self.titulo=tit
        self.ubicacion=ubi
Veamos como se modifica la llamada al constructor cuando se crea un objeto:
cabecera=CabeceraPagina('El blog del programador','center')
cabecera.graficar()
Es decir el constructor se llama en la misma línea donde creamos el objeto, por eso disponemos después del nombre de la clase los parámetros:
cabecera=CabeceraPagina('El blog del programador','center')
Generalmente todo aquello que es de vital importancia para el funcionamiento inicial del objeto se lo pasamos mediante el constructor.

Llamada de métodos dentro de la clase.
Hasta ahora todos los problemas planteados hemos llamado a los métodos desde donde definimos un objeto de dicha clase, por ejemplo:
cabecera=CabeceraPagina('El blog del programador','center')
cabecera.graficar()
Utilizamos la sintaxis:
[nombre del objeto].[nombre del método]
Es decir antecedemos al nombre del método el nombre del objeto y el operador punto
Ahora bien que pasa si queremos llamar dentro de la clase a otro método que pertenece a la misma clase, la sintaxis es la siguiente:
self.[nombre del método]
Es importante tener en cuenta que esto solo se puede hacer cuando estamos dentro de la misma clase.
Confeccionaremos un problema que haga llamadas entre métodos de la misma clase.
Problema:Confeccionar una clase Tabla que permita indicarle en el constructor la cantidad de filas y columnas. Definir otra responsabilidad que podamos cargar un dato en una determinada fila y columna. Finalmente debe mostrar los datos en una tabla HTML.
class Tabla:
    mat=[]
    cantfilas=0
    cantcolumnas=0

    def __init__(self,fi,co):
        self.cantfilas=fi
        self.cantcolumnas=co
        for f in range(0,fi):
            self.mat.append([])
            for c in range(0,co):
                self.mat[f].append('')

    def cargar(self,fi,col,valor):
        self.mat[fi][col]=valor

    def iniciotabla(self):
        print '<table border="1">'
   
    def iniciofila(self):
        print '<tr>'

    def mostrar(self,fi,co):
        print '<td>'
        print self.mat[fi][co]
        print '</td>'

    def finfila(self):
        print '</tr>'

    def fintabla(self):
        print '</table>'

    def graficar(self):
        self.iniciotabla()
        for f in range(0,self.cantfilas):
            self.iniciofila()
            for c in range(0,self.cantcolumnas):
                self.mostrar(f,c)
            self.finfila()
        self.fintabla()
   
tabla1=Tabla(3,4)
tabla1.cargar(0,0,1)
tabla1.cargar(0,1,2)
tabla1.cargar(0,2,3)
tabla1.cargar(0,3,4)
tabla1.cargar(1,0,5)
tabla1.cargar(1,1,6)
tabla1.cargar(1,2,7)
tabla1.cargar(1,3,8)
tabla1.cargar(2,0,9)
tabla1.cargar(2,1,10)
tabla1.cargar(2,2,11)
tabla1.cargar(2,3,12)
tabla1.graficar()
Vamos por parte, primero veamos los tres atributos definidos,el primero se trata de una lista donde almacenaremos todos los valores que contendrá la tabla HTML y otros dos atributos que indican la dimensión de la tabla HTML (cantidad de filas y columnas):
mat=[]
  cantfilas=0
  cantcolumnas=0
El constructor recibe como parámetros la cantidad de filas y columnas que tendrá la tabla, además creamos la lista con tantas filas como indica el parámetro fi e insertamos una lista en cada componente (es decir que cada componente de la lista es una lista que representa los elementos de la fila respectiva) Dentro de un for interno agregamos string vacíos a cada elemento de la lista interna:
self.cantfilas=fi
      self.cantcolumnas=co
      for f in range(0,fi):
          self.mat.append([])
          for c in range(0,co):
              self.mat[f].append('')
Otro método de vital importancia es el de cargar datos. Llegan como parámetro la fila, columna y dato a almacenar:
def cargar(self,fi,col,valor):
        self.mat[fi][col]=valor
Otro método muy importante es el graficar:
def graficar(self):
        self.iniciotabla()
        for f in range(0,self.cantfilas):
            self.iniciofila()
            for c in range(0,self.cantcolumnas):
                self.mostrar(f,c)
            self.finfila()
        self.fintabla()
El método graficar debe hacer las salidas de datos dentro de una tabla HTML. Para simplificar el algoritmo definimos otros cinco métodos que tienen por objetivo hacer la generación del código HTML propiamente dicho. Así tenemos el método iniciotabla que hace la salida de la marca table e inicialización del atributo border:
def iniciotabla(self):
        print '<table border="1">'
De forma similar los otros métodos son:
def iniciofila(self):
        print '<tr>'

    def mostrar(self,fi,co):
        print '<td>'
        print self.mat[fi][co]
        print '</td>'

    def finfila(self):
        print '</tr>'

    def fintabla(self):
        print '</table>'
Si bien podíamos hacer todo esto en el método graficar y no hacer estos cinco métodos, la simplicidad del código aumenta a medida que subdividimos los algoritmos. Esto es de fundamental importancia con algoritmos más complejos./p>
Lo que nos importa ahora ver es como llamamos a métodos que pertenecen a la misma clase:
def graficar(self):
        self.iniciotabla()
        for f in range(0,self.cantfilas):
            self.iniciofila()
            for c in range(0,self.cantcolumnas):
                 self.mostrar(f,c)
            self.finfila()
        self.fintabla()
Es decir le antecedemos la palabra self al nombre del método a llamar. De forma similar a como accedemos a los atributos de la clase.
Por último debemos definir un objeto de la clase Tabla y llamar a los métodos respectivos:
tabla1=Tabla(3,4)
tabla1.cargar(0,0,1)
tabla1.cargar(0,1,2)
tabla1.cargar(0,2,3)
tabla1.cargar(0,3,4)
tabla1.cargar(1,0,5)
tabla1.cargar(1,1,6)
tabla1.cargar(1,2,7)
tabla1.cargar(1,3,8)
tabla1.cargar(2,0,9)
tabla1.cargar(2,1,10)
tabla1.cargar(2,2,11)
tabla1.cargar(2,3,12)
tabla1.graficar()
Es importante notar que donde definimos un objeto de la clase Tabla no llamamos a los métodos iniciotabla(), iniciofila(), etc.

python banner

Si te ha gustado el artículo inscribete al feed clicando en la imagen más abajo para tenerte siempre actualizado sobre los nuevos contenidos del blog:

Los 10 artículos más leídos en El Mundo de Ubuntu en el mes de Julio 2013.

$
0
0
1.- Medusa, la mejor alternativa a AutoCAD en Linux.


De sobra nos es conocido que el rey indiscutible del CAD es AutoCad, ningún programa ha sido capaz de hacerle sombra, aunque los precios del software son, por ser amables, abusivos.
La única distribución que, desde mi punto de vista, permite trabajar de forma cómoda al estilo de AutoCad es ZWCAD que se puede adquirir por un precio inferior.

2.- Ubuntu 13.04 disponible para descarga (Información de pantalla, video, tutorial).

raring ringtail open developmentCanonical oficialmente ha publicado hoy su version 13.04 nombre en codigo “Raring Ringtail”Se están notando las ventajas de optimizar el sistema operativo para dispositivos móviles con pocos recursos.
El sistema consume menos Ram y se agiliza su utilización.
Los cambios más destacados, respecto al consumo son:
  • Se ha reducido el uso de memoria que hacían algunos paquetes, cargando datos e imágenes CSS de GTK3, sólo cuando se necesitan.
  • Se arreglaron problemas de memoria en los paquetes libdbusmenu, update-notifier, upower, whoopsie y otros más.

3.- FreetuxTV excelente aplicación para ver la TV o escuchar la radio en Ubuntu.


Si buscas una aplicación que te permita ver la televisión en directo o escuchar la radio de cualquier parte del mundo en GNU/Linux puede que FreeTuxTV te sea de gran utilidad ya que nos permite hacer esto mismo de forma sencilla.
La interfaz de FreetuxTV es muy sencilla y cuando lo iniciamos ya podremos agregar los canales en español, también podremos grabar lo que estamos viendo muy útil si quieres mantenerlo en tu equipo para verlo cuando quieras.

4.- 7 aplicaciones multimedia presentes en los repositorios oficiales de Ubuntu.

ubuntu_audioUbuntu ofrece una amplia gama de aplicaciones multimedia desde sus repositorios Main, Universe y Multiverse.
Para ayudarte a escoger al reproductor de música o el editor de vídeo más conveniente, es útil distinguir entre los reproductores de medios de comunicación ellos mismos (o 'front-ends) y los motores de reproducción (playback)(' back-ends') que utilizan. Los front ends son las aplicaciones con las que interactuas con tu escritorio.
Algunos están integrados fuertemente con los entorno de escritorio, el GNOME y KDE; otros son independientes de plataforma.

5.- DJL es un instalador de juegos que proporciona una interfaz sencilla y muchas utilidades.

djl_depotDJL es es un administrador de juegos escrito en Python, que nos permitirá instalar una gran cantidad de títulos (ver el detalle al final del post) en Linux.
Es un gestor de juegos, que nos sirve tanto para lanzar los juegos que hemos instalado con él, como para instalar juegos desde la red
He mirado los juegos disponibles en el repositorio y no me puedo quejar, están tanto los más famosos como los no tan conocidos.
Para usarlo debemos descargar la última versión, descomprimirla e instalarla.

6.- La campaña de financiación colectiva (crowdfunding) de Ubuntu Edge paso a paso.

ubuntu edgeLa campaña de financiación colectiva que Canonical puso en marcha hace una semana comenzó con gran fuerza, pero en las últimas horas el empuje de esas inversiones se ha ralentizado de forma notable.
¿Conseguirán recaudar los 32 millones de dólares que persiguen para desarrollar y fabricar sus Ubuntu Edge?
El problema reside en que la avalancha de peticiones iniciales se ha debido a los importantes descuentos que Canonical ofreció. El Ubuntu Edge se podía conseguir por 600 dólares (más 30 de gastos de envío) frente a los 830 dólares que supondrían el coste final. Esa oferta se ha visto continuada con algunas más, pero éstas son cada vez menos atractivas.

7.- Cómo instalar un emulador de Android en Ubuntu.

Este emulador lo pueden encontrar en la página oficial de Android para desarrolladores.
Pensado para desarrolladores, incluye:
Herramientas.
Ejemplos de código.
Documentación.
Permite seleccionar cuales de los anteriores desea instalarse.
Posibilidad de descargar cualquier versión del Sistema Operativo (1.6,3.0,4,etc).
Todo para apoyar el desarrollo de aplicaciones para esta plataforma. Además permite:
Navegar por internet, utilizando la conexión de tu ordenador.
Navegar por la interfaz y algunas configuraciones del dispositivo virtual.

8.- 10 Artículos Recomendados sobre Seguridad en Ubuntu.

ubuntu-TuxLa mayor amenaza de seguridad informática no son los programas en sì mismos, es el hombre, el usuario.
Siempre hablamos de los virus y de la seguridad informática, de cómo es muy difícil penetrar en un sistema Gnu/Linux y muy fácil entrar en Windows.
Pero difícil no significa imposible y cada vez más y más amenazas se crean para Gnu/Linux y en especial para Ubuntu, al ser uno de los sistemas más usados dentro de la familia Gnu/Linux. Los rootkits son un buen ejemplo de amenaza que se ha llegado a Ubuntu, aunque al igual que hay una forma de que llegue, siempre hay una forma de sacarlo de nuestro sistema.

9.- Instalar Angry Birds en Ubuntu 12.04 “Precise Pangolin”.

Angry_Birds_PlushiesAngry Birds  es un videojuego creado en 2009 por la empresa finlandesa Rovio Mobile. Desde entonces, el juego ha sido adaptado a dispositivos de pantalla táctil, como los basados en Maemo, iOS, Symbian, Java y Android.
Con más de un billón de descargas en 2012, esta aplicación quizá sea la más popular del año en la App Store de Apple. Además es también el juego más vendido de la historia en soportes móviles.
Actualmente la compañía trabaja en desarrollar versiones para PC, Xbox360, PS3, HTML5 y otras plataformas. Sin embargo, Angry Birds no es sólo un fenómeno digital: los personajes son tan populares que la empresa está empezando a comercializar juguetes físicos de los pájaros y hacia el futuro pretenden comercializar disfraces, dibujos animados y todo tipo de merchandising.

10.- Introducción a Inkscape programa de diseño vectorial.

inkscape-draw-freely-program-LOGOInkscape es un programa de diseño vectorial. Esto significa que los gráficos así creados se podrán escalar a cualquier tamaño sin que pierdan calidad, o reformar una vez hechos sin tener que borrar cada línea.
También tiene la capacidad de exportar lo que dibujemos a un formato de mapa de bits para utilizarlo en cualquier aplicación, como fondo de pantalla, en una página web, etc.
Inkscape se encuentra desarrollado principalmente para el sistema operativo GNU/Linux, pero es una herramienta multiplataforma.
Es una aplicación disponible en muchas lenguas, incluyendo sistemas de escritura complejos (como sistemas de escritura de derecha a izquierda como árabe, hebreo...).

Si te ha gustado el artículo inscribete al feed clicando en la imagen más abajo para tenerte siempre actualizado sobre los nuevos contenidos del blog:

Guia Python: herencia y método especial.

$
0
0
python logoPython es un lenguaje de script desarrollado por Guido van Rossum.

Podemos codificar empleando programación lineal, estructurada y orientada a objetos (tengamos en cuenta que esta última es la que se ha impuesto en la actualidad).

Se cuenta con intérpretes de Python en múltiples plataformas: Windows, Linux, Mac etc. Se pueden desarrollar aplicaciones de escritorio como aplicaciones web. Empresas como Google, Yahoo, Nasa etc. utilizan este lenguaje para sus desarrollos (actualmente el creador de Python Guido van Rossum trabaja para Google.)

Se puede ejecutar instrucciones de Python desde la línea de comando o creando archivos con extensión *.py. Cuando uno comienza a aprender este lenguaje la línea de comandos nos provee una retroalimentación del resultado en forma inmediata.

El objetivo de este tutorial es presentar en forma progresiva los conceptos fundamentales de este lenguaje y poder analizar los problemas resueltos y codificar los problemas propuestos en este mismo sitio, sin tener que instalar en un principio el Python en su equipo (o luego de instalado poder avanzar con el tutorial en cualquier máquina conectada a internet).

Herencia.
python Estructura condicional if-elif.
Otra característica que tiene que tener un lenguaje para considerarse orientado a objetos es la HERENCIA.
La herencia significa que se pueden crear nuevas clases partiendo de clases existentes, que tendrá todas los atributos y los métodos de su 'superclase' o 'clase padre' y además se le podrán añadir otros atributos y métodos propios.
En Python, a diferencia de otros lenguajes orientados a objetos (Java, C#), una clase puede derivar de varias clases, es decir, Python permite la herencia múltiple.

Superclase o clase padre.
Clase de la que desciende o deriva una clase. Las clases hijas (descendientes) heredan (incorporan) automáticamente los atributos y métodos de la la clase padre.

Subclase.
Clase desciendiente de otra. Hereda automáticamente los atributos y métodos de su superclase. Es una especialización de otra clase. Admiten la definición de nuevos atributos y métodos para aumentar la especialización de la clase.
Veamos algunos ejemplos teóricos de herencia:
1) Imaginemos la clase Vehículo. Qué clases podrían derivar de ella
Vehiculo

   Colectivo                Moto                    Auto
                            
                                             FordK        Renault 9
Siempre hacia abajo en la jerarquía hay una especialización (las subclases añaden nuevos atributos y métodos)
2) Imaginemos la clase Software. Qué clases podrían derivar de ella?
Software

             DeAplicacion                                        DeBase

ProcesadorTexto       PlanillaDeCalculo                          SistemaOperativo

Word   WordPerfect    Excel     Lotus123                         Linux    Windows
      
Si vemos que dos clase responden a la pregunta ClaseA "..es un.." ClaseB es posible que haya una relación de herencia.
Por ejemplo:
Auto "es un" Vehiculo
Circulo "es una" Figura
Mouse "es un" DispositivoEntrada
Suma "es una" Operacion
Ahora plantearemos el primer problema utilizando herencia en Python. Supongamos que necesitamos implementar dos clases que llamaremos Suma y Resta. Cada clase tiene como atributo valor1, valor2 y resultado. Los métodos a definir son cargar1 (que inicializa el atributo valor1), carga2 (que inicializa el atributo valor2), operar (que en el caso de la clase "Suma" suma los dos atributos y en el caso de la clase "Resta" hace la diferencia entre valor1 y valor2, y otro método mostrarresultado.
Si analizamos ambas clases encontramos que muchos atributos y métodos son idénticos. En estos casos es bueno definir una clase padre que agrupe dichos atributos y responsabilidades comunes.
La relación de herencia que podemos disponer para este problema es:
Operacion

                        Suma                              Resta
Solamente el método operar es distinto para las clases Suma y Resta (esto hace que no lo podamos disponer en la clase Operacion), luego los métodos cargar1, cargar2 y mostrarresultado son idénticos a las dos clases, esto hace que podamos disponerlos en la clase Operacion. Lo mismo los atributos valor1, valor2 y resultado se definirán en la clase padre Operacion.
En Pyton la codificación de estas tres clases es la siguiente:
class Operacion:
    def cargar1(self,v1):
        self.valor1=v1
    def cargar2(self,v2):
        self.valor2=v2
    def imprimir(self):
        print self.resultado
        print '<br>'


class Suma(Operacion):
    def operar(self):
        self.resultado=self.valor1+self.valor2


class Resta(Operacion):
    def operar(self):
        self.resultado=self.valor1-self.valor2


s=Suma()
s.cargar1(10)
s.cargar2(20)
s.operar()
print 'La suma es:'
s.imprimir()
r=Resta()
r.cargar1(10)
r.cargar2(2)
r.operar()
print 'La resta es:'
r.imprimir()
Veamos como es la sintaxis para indicar que una clase hereda de otra:
class Suma(Operacion):
Indicamos entre paréntesis el nombre de la clase padre (con esto estamos indicando que todos los métodos y atributos de la clase Operación son también métodos de la clase Suma.
Luego la característica que añade la clase Suma es el siguiente método:
def operar(self):
        self.resultado=self.valor1+self.valor2
El método operar puede acceder a los atributos heredados.
Ahora podemos decir que la clase Suma tiene cuatro métodos (tres heredados y uno propio) y 3 atributos
Si creamos un objeto de la clase Suma tenemos:
s=Suma()
s.cargar1(10)
s.cargar2(20)
s.operar()
print 'La suma es:'
s.imprimir()
Podemos llamar tanto al método propio de la clase Suma "operar()" como a los métodos heredados. Quien utilice la clase Suma solo debe conocer que métodos tiene (independientemente que pertenezcan a la clase Suma o a una clase superior)
La lógica es similar para declarar la clase Resta:
class Resta(Operacion):
    def operar(self):
        self.resultado=self.valor1-self.valor2
y la definición de un objeto de dicha clase:
r=Resta()
r.cargar1(10)
r.cargar2(2)
r.operar()
print 'La resta es:'
r.imprimir()
La clase Operación agrupa en este caso un conjunto de atributos y métodos comunes a un conjunto de subclases (Suma, Resta). No tiene sentido definir objetos de la clase Operacion.
El planteo de jerarquías de clases es una tarea compleja que requiere un perfecto entendimiento de todas las clases que intervienen en un problema, cuales son sus atributos y responsabilidades.
Método especial __str__
python Estructura de datos tipo tupla.
Podemos hacer que se ejecute un método definido por nosotros cuando pasamos un objeto a la función print o cuando llamamos a la función str.
Que sucede cuando llamamos a la función print y le pasamos como parámetro un objeto?
class Persona:
    def __init__(self,nom,ape):
        self.nombre=nom
        self.apellido=ape

per=Persona('Jose','Rodriguez')
print per
Nos muestra algo parecido a esto:
<__main__.Persona instance at 0xf9e0a60ec5872050>
Python nos permite redefinir el método que se debe ejecutar. Esto se hace definiendo en la clase el método especial __str__
En el ejemplo anterior si queremos que se muestre el nombre y apellido separados por coma cuando llamemos a la función print el código que debemos implementar es el siguiente:
class Persona:
    def __init__(self,nom,ape):
        self.nombre=nom
        self.apellido=ape
    def __str__(self):
        cadena=self.nombre+','+self.apellido
        return cadena

per=Persona('Jose','Rodriguez')
print per
Como vemos debemos implementar el método __str__ y retornar un string, este luego será el que imprime la función print:
def __str__(self):
        cadena=self.nombre+','+self.apellido
        return cadena
Esta característica definida en Python nos permite crear programas muy legibles y flexibles.
El método __str__ también se ejecuta si llamamos a la función str y pasamos como parámetro un objeto que tiene definido dicho método:
class Persona:
    def __init__(self,nom,ape):
        self.nombre=nom
        self.apellido=ape
    def __str__(self):
        cadena=self.nombre+','+self.apellido
        return cadena

per1=Persona('Jose','Rodriguez')
per2=Persona('Ana','Martinez')
print str(per1)+'-'+str(per2)  # Jose,Rodriguez-Ana,Martinez
python Estructura de datos tipo diccionario

Si te ha gustado el artículo inscribete al feed clicando en la imagen más abajo para tenerte siempre actualizado sobre los nuevos contenidos del blog:

Vmstat comando que nos permite obtener un detalle general de los procesos del CPU.

$
0
0
Vmstat es un comando que nos permite obtener un detalle general de los procesos, E/S, uso de memoria/swap, estado del sistema y actividad del CPU. Es esencial para entender que esta pasando en tu sistema, detectar cuellos de botella, etc..

Para usarlo, podemos correrlo sin parámetros, y obtendremos algo similar a esto:
La primera línea es simple, se divide en seis categorías: procesos, memoria, swap, E/S, sistema y CPU.
La segunda un detalle abierto de cada categoria superior.

Los campos mostrados en relación a los a procesos son:
r: El número de procesos ejecutables esperando para acceder al CPU.
b: El número de procesos en un estado dormido contínuo.
Los campos relacionados a la memoria son:
swpd: La cantidad de memoria utilizada.
free: La cantidad de memoria libre.
buff: La cantidad de memoria utilizada por las memorias intermedias.
cache: La cantidad de memoria utilizada como caché de páginas.
Los campos relacionados a swap son:
vmstat
si: La cantidad de memoria intercambiada desde el disco.
so: La cantidad de memoria intercambiada hacia el disco.
Los campos relacionados con E/S son:
bi: Los bloques enviados a un dispositivo de bloques.
bo: Los bloques recibidos desde un dispositivo de bloques.
Los campos relacionados al sistema son:
in: El número de interrupciones por segundo.
cs: El número de cambios de contexto por segundo.
Los campos relacionados al CPU son:
us: El porcentaje de tiempo que el CPU ejecutó código de nivel del usuario.
sy: El porcentaje de tiempo que el CPU ejecutó código de nivel del sistema.
id: El porcentaje de tiempo que el CPU estaba desocupado.
wa: Esperas de E/S.
Si se ejecuta el comando “vmstat” sin opciones, nos muestra una unica línea, que contiene promedios calculados desde la última vez que se arrancó el sistema.
Si ejecutamos “vmstat 1″ muestra una nueva línea de utilización de datos cada segundo, mientras que el comando “vmstat 1 10″, muestra una nueva línea por segundo, pero sólo por los próximos 10 segundos.

Si te ha gustado el artículo inscribete al feed clicando en la imagen más abajo para tenerte siempre actualizado sobre los nuevos contenidos del blog:

El comando ps muestra por pantalla un listado de los procesos que se están ejecutando en el sistema.

$
0
0
comando psPs ("process status", estado de procesos en idioma inglés) es un comando asociado en el sistema operativo UNIX (estandarizado en POSIX y otros) que permite visualizar el estado de un Proceso (informática).

El comando ps muestra por pantalla un listado de los procesos que se están ejecutando en el sistema.

Si no añadimos ningún parámetro, ps mostrará los procesos del usuario con el que estamos logueados.
Generalmente en cualquier distribución de GNU/Linux se incluye la versión de ps que acepta diferentes tipos de opciones: las opciones UNIX que son precedidas por un guión (dash), las opciones BSD que no utilizan guión, y las opciones GNU largas que se preceden por dos guiones.
ps
Estas opciones se pueden mezclar, pero a veces ocasionan conflictos o existen opciones sinónimas que producen los mismos resultados. Por ejemplo "ps -aux" muestra todos los procesos pertenecientes al usuario llamado "x", ya que no suele existir un usuario llamado "x" ps lo interpreta como el comando "ps aux" e imprime una advertencia :D

Por defecto ps sólo muestra los procesos con el mismo user id efectivo (EUID) que el del usuario que lo ejecuta. Cuando utilizamos ps con las opciones "aux" el resultado es:
  • a: eliminar la restricción BSD "only yourself" para agregar procesos de otros usuarios
  • u: utilizar el formato orientado al usuario
  • x: eliminar la restricción BSD "must have a tty" para agregar procesos que no tengan una tty asociada
De esta forma seleccionamos todos los procesos en el sistema y los mostramos en el formato orientado al usuario.

Captura de pantalla salida ps.
Comando
    ps [modificadores] [condición]
Donde modificadores es opcional, y puede tomar los siguientes valores:

Los siguientes modificadores no toman el parámetro condición:
    -A: Muestra todos los procesos (de todos los usuarios en el sistema).
    -a: Muestra todos los procesos de una [tty] determinada.
    -d: Muestra todo excepto los líderes de la sesión.
    -e: Muestra todos los procesos (equivalente a -A).
    T: Muestra todos los procesos de la terminal actual.
    a: Muestra todos los procesos de la terminal actual incluyendo los de otros usuarios.
    g: Muestra todos los procesos incluyendo grupos líderes (obsoleta excepto en sunOs).
    r: Muestra solamente los procesos corriendo.
    x: Muestra los procesos en un estilo BSD (sin controlar la [TTY]).
comando ps
Los siguientes modificadores toman el parámetro condición:
    -N: Muestra todos los procesos excepto los que encajan con la condición (equivalente a --deselect).
    -C: Muestra los procesos que tienen como nombre la condición.
    -G: Muestra los procesos que tienen como grupo (nombre de grupo o id) la condición.
    -P: Muestra los procesos que tienen como [Identificador de proceso] la condición.
    -S: Muestra los procesos que tienen como sesión la condición.
    -U: Muestra los procesos que tienen como usuario (nombre de grupo o id) la condición.
Existen distintos modificadores admitidos según la versión del comando ps que se esté usando en el sistema (BSD, POSIX, GNU, etc.)
Entre muchas opciones que tiene ps, es posible ordenar la salida de acuerdo a una columna, para esto se debe utilizar la opción gnu larga "--sort", por ejemplo para ordenar por tiempo de CPU (si deseamos determinar qué proceso ha utilizado más CPU) seleccionamos el código "cputime", correspondiente a la columna TIME:
ps aux --sort cputime
comando ps

Si te ha gustado el artículo inscribete al feed clicando en la imagen más abajo para tenerte siempre actualizado sobre los nuevos contenidos del blog:


Top es una herramienta que nos proporciona información de los procesos que se están ejecutando en tiempo real.

$
0
0
Top es una herramienta que nos proporciona información de los procesos que se estan corriendo en ese momento en tiempo real con valors de uso de CPU, memoria, swap y la posibilidad de manupular procesos. Presenta una interfaz simple que cuenta con varias partes.

Para ejecutar este comando solo tenemos que colocar en la consola:

# top

Y nos vamos a encontrar con algo como esto:

Se divide en dos la interfáz entre la cabecera y la lista de procesos corriendo en ese momento. La cabecera además se divide en 5 lineas:
  • Primera linea: Muestra una serie de datos referidos al sistema.
    • “02:51:37″: Es la hora actual de este caso
    • “up 59 min”: Es el tiempo en minutos que el sistema esta corriendo en este caso
    • “2 users”: Cantidad de usuarios conectados en ese momento
    • “Load average”: Los numeros indican el estado de uso del CPU. Si los numeros son menores a “1″ esto quiere decir que el CPU no tiene que esperar para poder ejecutar una instruccion. Si esta por encima de “1″ quiere decir que es necesario que el CPU necesite esperar para ejecutar una instruccion. Los tres numeros muestran el average cada 5, 10 y 15 minutos respectivamente.
  • Segunda linea: Muestra el total de procesos corriendo y los divide por estados, “Running”, “Slepping”, “Stopped”, “Zombie”.
  • Tercera linea: Muestra el uso de CPU en ese momento.
    • “%us”: muestra el uso de cpu del usuario
    • “%sy”: muestra el uso de cpu del sistema.
    • “%id”: muestra el uso de cpu disponible para utilizar.
    • “%wa”: muestra en porcentaje el tiempo en espera del cpu para manejo de I/O.
  • Cuarta linea: Muestra valores referentes a la memoria fisica del equipo (los valores pueden ser algo enañosos).
    • Tota: Es el valor total de la memoria fisica
    • Used: Es el valor de la memoria utilizada
    • Free: Es el valor de la memoria libre
    • Buffered: Es el valor de memoria fisica que esta en el buffer de memoria.
  • Quinta linea: Muestra valores referentes al uso de la memoria SWAP. Es similar a la cuarta linea en cuanto a los datos que proporciona salvo por un solo cambio que al final de la linea muestra la memoria que esta cacheada.
Ahora bien, como puedo calcular la memoria libre que tengo en el sistema?. Para eso lo que tenemos que hacer es sumar una serie de valores que nos presenta el comando top. La memoria disponible es la suma del valor “buffered” en la cuarta linea y el valor cached” de la quinta linea:
Memoria RAM disponible = Cached(12964k) + Buffered(153762k)
Para averiguar cuanta memoria estan utilizando los programas:
Memoria RAM utilizada por programas = Used (1942256) – (Cached(12964k) + Buffered(153762k))
Luego, en la parte inferior de la pantalla se encuentra la lista de procesos corriendo en el sistema en orden descendente. Cada linea cuenta con los siguientes datos:
  • PID: Process ID del proceso
  • USER: Usuario que esta corriendo dicha aplicacion
  • PR: Prioridad del proceso
  • NI: Valor por el cual se establece una prioridad para el proceso
  • VIRT: Total de la memoria virtual usada
  • RES: Resident task size
  • SHR: Estado del proceso. S (sleeping), D (uninterruptible sleep), R (running), Z(zombies), or T (stopped or traced)
  • %CPU, %MEM: Porcentajes de memoria y cpu utilizados en ese momento
  • Time: El tiempo de uso del procesador para ese proceso
  • Command: El comando que esta siendo ejecutado por el Daemon
Dentro del programa podemos interactuar con el con varias opciones:
  • k -> Si se quiere matar el proceso, luego debemos ingresar el numero de su PID.
  • r -> Cambia la prioridad del proceso
  • O (upercase) -> Muestra las posibles columnas que podemos agregar a la lista de procesos
  • 1 -> Muestra la información de todos los cores
  • z o b -> Agregan colores a la interfaz
  • c -> Muestra el path absoluto del binario que se esta ejecutando.
  • n -> nos permite reducir la lista a “n” procesos.
  • N (upercase) -> Ordena los procesos por PID
  • A (upercase) -> Ordena los procesos por aparicion, primero se encuentran los mas nuevos
  • P (upercase) -> Ordena los procesos por uso de CPU, esta opcion es la default
  • M (upercase) -> Ordena los procesos por memoria residente
  • T (upercase) -> Ordena los procesos por tiempo.
  • W (upercase) -> Guarda la configuracion que hicimos
  • q -> Salir de Top
Además top cuenta con una serie de switches además de las opciones anteriores:
  • top -u usuario -> Muestra los procesos que estan corriendo con ese usuario y sus valores
  • top -p PID -> muestra el proceso seleccionado y sus valores
  • top -n numero -> Numero es la cantidad de iteraciones que va a tener el comando y luego se cerrara
  • top -d numero -> “Numero” es el tiempop en segundos que va a esperar el comando para refrescar la lista.
  • top -b -> Batch mode, ideal para mandar resultados desde top a otros programas

Si te ha gustado el artículo inscribete al feed clicando en la imagen más abajo para tenerte siempre actualizado sobre los nuevos contenidos del blog:

Guia Python: redefinición de los operadores matemáticos.

$
0
0
python logoPython es un lenguaje de script desarrollado por Guido van Rossum.

Podemos codificar empleando programación lineal, estructurada y orientada a objetos (tengamos en cuenta que esta última es la que se ha impuesto en la actualidad).

Se cuenta con intérpretes de Python en múltiples plataformas: Windows, Linux, Mac etc. Se pueden desarrollar aplicaciones de escritorio como aplicaciones web. Empresas como Google, Yahoo, Nasa etc. utilizan este lenguaje para sus desarrollos (actualmente el creador de Python Guido van Rossum trabaja para Google.)

Se puede ejecutar instrucciones de Python desde la línea de comando o creando archivos con extensión *.py. Cuando uno comienza a aprender este lenguaje la línea de comandos nos provee una retroalimentación del resultado en forma inmediata.

El objetivo de este tutorial es presentar en forma progresiva los conceptos fundamentales de este lenguaje y poder analizar los problemas resueltos y codificar los problemas propuestos en este mismo sitio, sin tener que instalar en un principio el Python en su equipo (o luego de instalado poder avanzar con el tutorial en cualquier máquina conectada a internet).

Redefinición de los operadores matemáticos con objetos.
python operadores matematicos
Python nos permite redefinir los operadores matemáticos cuando planteamos una clase.
Los métodos especiales que debemos implementar son los siguientes:
Para el operador +:
__add__(self,objeto2)

Para el operador -:

__sub__(self,objeto2)

Para el operador *:

__mul__(self,objeto2)

Para el operador /:

__div__(self,objeto2)

Veamos con un ejemplo la sintaxis para redefinir el operador +. Crearemos una clase Cliente de un banco y redefiniremos el operador + para que nos retorne la suma de los depósitos de los dos clientes que estamos sumando.

class Cliente:
    def __init__(self,nom,mon):
        self.nombre=nom
        self.monto=mon
    def __add__(self,objeto2):
        s=self.monto+objeto2.monto
        return s
cli1=Cliente('Ana',1200)
cli2=Cliente('Luis',1500)
print 'El total depositado es '
print cli1+cli2


Es muy importante tener en cuenta que debemos redefinir un operador matemático siempre y cuando haga nuestro programa más legible.

Debemos redefinir los operadores +,-,*,/ etc. solo para las clases que con solo leer su nombre el programador intuya que operación implementaría dicho operador.

Redefinición de los operadores relacionales con objetos.

python operadoresAritmeticos

Python también nos permite redefinir los operadores relacionales cuando planteamos una clase.

Los métodos especiales que podemos implementar son los siguientes:

Para el operador ==:

__eq__(self,objeto2)

Para el operador !=:

__ne__(self,objeto2)

Para el operador >:

__gt__(self,objeto2)

Para el operador >=:

__ge__(self,objeto2)

Para el operador <:

__lt__(self,objeto2)

Para el operador <=:

__le__(self,objeto2)

Es importante recordar que una redefinición de un operador tiene sentido si ayuda y hace más claro nuestro algoritmo.

Veamos con un ejemplo la sintaxis para redefinir todos estos operadores relacionales. Crearemos una clase Persona que tiene como atributo el nombre y la edad. El operador == retornará verdadero si las dos personas tienen la misma edad, el operador > retornará True si la edad del objeto de la izquierda tiene una edad mayor a la edad del objeto de la derecha del operador >, y así sucesivamente

class Persona:
    def __init__(self,nom,ed):
        self.nombre=nom
        self.edad=ed
    def __eq__(self,objeto2):
        if self.edad==objeto2.edad:
            return True
        else:
            return False
    def __ne__(self,objeto2):
        if self.edad!=objeto2.edad:
            return True
        else:
            return False
    def __gt__(self,objeto2):
        if self.edad>objeto2.edad:
            return True
        else:
            return False
    def __ge__(self,objeto2):
        if self.edad>=objeto2.edad:
            return True
        else:
            return False
    def __lt__(self,objeto2):
        if self.edad<objeto2.edad:
            return True
        else:
            return False
    def __le__(self,objeto2):
        if self.edad<=objeto2.edad:
            return True
        else:
            return False
per1=Persona('juan',22)
per2=Persona('ana',22)
if per1==per2:
    print 'Las dos personas tienen la misma edad.'
else:
    print 'No tienen la misma edad.'
Como pedemos observar planteamos un método por cada operdor relacional:

def __eq__(self,objeto2):
        if self.edad==objeto2.edad:
            return True
        else:
            return False


El método recibe como referencia (self) la dirección del objeto ubicado a la izquierda del operador relacionar y como parámetro (objeto2) la referencia del objeto ubicado a la derecha del operador. Solo nos queda analizar el atributo edad de cada objeto y retornar True si los dos almacenan el mismo valor, en caso contrario retornar False.

Si te ha gustado el artículo inscribete al feed clicando en la imagen más abajo para tenerte siempre actualizado sobre los nuevos contenidos del blog:

Guia Python: las cadenas y las listas tratadas como objetos.

$
0
0
python logoPython es un lenguaje de script desarrollado por Guido van Rossum.

Podemos codificar empleando programación lineal, estructurada y orientada a objetos (tengamos en cuenta que esta última es la que se ha impuesto en la actualidad).

Se cuenta con intérpretes de Python en múltiples plataformas: Windows, Linux, Mac etc. Se pueden desarrollar aplicaciones de escritorio como aplicaciones web. Empresas como Google, Yahoo, Nasa etc. utilizan este lenguaje para sus desarrollos (actualmente el creador de Python Guido van Rossum trabaja para Google.)

Se puede ejecutar instrucciones de Python desde la línea de comando o creando archivos con extensión *.py. Cuando uno comienza a aprender este lenguaje la línea de comandos nos provee una retroalimentación del resultado en forma inmediata.

El objetivo de este tutorial es presentar en forma progresiva los conceptos fundamentales de este lenguaje y poder analizar los problemas resueltos y codificar los problemas propuestos en este mismo sitio, sin tener que instalar en un principio el Python en su equipo (o luego de instalado poder avanzar con el tutorial en cualquier máquina conectada a internet).
Las cadenas tratadas como objetos.
python operaciones con cadena
Ahora que hemos introducido los conceptos básicos de objetos veamos más profundo el concepto de cadenas (string) en Python.

En Python todo es un objetos, por lo que cuando definimos una cadena estamos definiendo un objeto.
Como hemos visto toda clase tiene una serie de métodos, veremos los métodos principales que tiene la clase que en Python administra una cadena.
Los métodos:
  • capitalize()
    Retorna otra cadena con el primer caracter en mayúsculas.
    cadena='ana'
    print cadena.capitalize() #Ana
    print cadena #ana

    Es importante notar que no se modifica el contenido de la variable 'cadena'. El método capitalize() retorna otra cadena con el primero en mayúsculas.

  • upper()

    Retorna otra cadena con todos los caracteres convertidos a mayúscula. cadena1='ana'
    cadena2=cadena1.upper()
    print cadena2 #ANA

  • lower()

    Retorna otra cadena con todos los caracteres convertidos a minúsculas.

    cadena1='Ana'
    cadena2=cadena1.lower()
    print cadena2 #ana

  • isupper()

    Retorna True si todos los caracteres de la cadena están en mayúsculas.

    cadena='ANA'
    if cadena.isupper():
    print 'La cadena '+cadena+' esta toda en mayusculas'

  • islower()

    Retorna True si todos los caracteres de la cadena están en minúsculas.

    cadena1='ana'
    if cadena.islower():
    print 'La cadena '+cadena+' esta toda en minusculas'

  • isdigit()

    Retorna verdadero si todos los caracteres de la cadena son dígitos.

    cadena='120'
    if cadena.isdigit():
    print 'Todos los caracteres de la cadena son numeros'

    Si al menos uno de los caracteres es distinto a un dígito retorna False. Inclusive si tiene el caracter punto.

  • isalpha()

    Retorna True si todos los caracteres son alfabéticos.

    cadena='Hola Mundo'
    if cadena.isalpha():
    print 'Todos los caracteres de la cadena son del alfabeticos'
    else:
    print 'No todos los caracteres de la cadena son del alfabeticos'

    En el ejemplo superior ejecuta el bloque del else ya que la cadena contiene un caracter de espacio.

  • isspace()

    Retorna verdadero si todos los caracteres de la cadena son espacios en blanco

    cadena='   '
    if cadena.isspace():
    print 'Todos los caracteres de la cadena son espacios en blanco'

  • isalnum()

    Retorna True si todos los caracteres de la cadena son números o caracteres alfabéticos.

    cadena='cordoba2008'
    if cadena.isalnum():
    print 'Todos los caracteres son numeros o alfabeticos'

  • find('cadena',[inicio],[fin])

    Retorna la posición donde se encuentra el valor del primer parámetro en el string. Si no se encuentra retorna -1. Podemos indicar como segundo y tercer parámetro a partir de que posición y hasta que posición de la cadena hacer la búsqueda.

    cadena='esto es una prueba y es solo eso'
    pos=cadena.find('es')
    print pos #0

    Retorna 0 ya que los dos primeros caracteres son la cadena 'es', es decir retorna la primera aparición del string.

    cadena='esto es una prueba y es solo eso'
    pos=cadena.find('es',5)
    print pos #5

    En este otro ejemplo comenzamos la búsqueda a partir de la posición 5. Si no indicamos el tercer parámetro la búsqueda la hace hasta el final de la cadena

  • rfind('cadena',[inicio],[fin])

    Igual al método find con la diferencia que la búsqueda comienza desde el final.

    cadena='esto es una prueba y es solo eso'
    pos=cadena.rfind('es')
    print pos #29

  • count('cadena',[inicio],[fin])

    Retorna la cantidad de veces que la cadena se repite en el string.

    cadena='esto es una prueba y es solo eso'
    cant=cadena.count('es')
    print cant #4

  • replace('cadena1','cadena2',[maximo])

    Retorna un string remplazando todas las ocurrencias de cadena1 por cadena2. Podemos eventuamente indicar la cantidad máxima de remplazos.

    cadena1='esto es una prueba y es solo eso'
    cadena2=cadena1.replace('es','ES')
    print cadena2 #ESto ES una prueba y ES solo ESo

  • split('caracter separador',[maximo])

    El método split retorna una lista dividiendo el string por el caracter indicado en el primer parámetro. Podemos pasar un segundo parámetro indicando la cantidad de trozos a general, el último elemento de la lista almacena el resto del string.

    cadena='esto es una prueba y es solo eso'
    lista=cadena.split(' ')
    print lista #['esto', 'es', 'una', 'prueba', 'y', 'es', 'solo', 'eso']
    print len(lista) #8
    lista=cadena.split(' ',2)
    print lista #['esto', 'es', 'una prueba y es solo eso']
    print len(lista) #3

  • rsplit('caracter separador',[maximo])

    Semejante a split pero procesando desde el final del string. En caso de indicar maximo el primer elemento de la lista almacena el trozo restante.

    cadena='esto es una prueba y es solo eso'
    lista=cadena.rsplit(' ')
    print lista #['esto', 'es', 'una', 'prueba', 'y', 'es', 'solo', 'eso']
    print len(lista) #8
    lista=cadena.rsplit(' ',2)
    print lista #['esto es una prueba y es', 'solo', 'eso']
    print len(lista) #3

  • splitlines()

    Retorna una lista dividiendo el string con los retornos de carro contenidos en el mismo.

    mensaje="""Primer linea
    Segunda linea
    Tercer linea
    Cuarta linea"""
    lista=mensaje.splitlines()
    print lista #['Primer linea', ' Segunda linea', ' Tercer linea', ' Cuarta linea']

  • swapcase()

    Retorna un string transformando los caracteres minúsculas a mayúsculas y los mayúsculas a minúsculas.

    cadena1='Sistema de Facturacion'
    cadena2=cadena1.swapcase()
    print cadena2 #sISTEMA DE fACTURACION

  • rjust(ancho,caracter de relleno)

    Retorna un string justificado a derecha y rellenando el lado izquierdo con caracteres según el segundo parámetro. La nueva cadena toma un largo indicado según el valor del primer parámetro.

    cadena='200'
    cadena2=cadena.rjust(5,'$')
    print cadena2 #$$200

  • ljust(ancho,caracter de relleno)

    Similar a rjust con la salvedad que se justifica a derecha el string.

    cadena='200'
    cadena2=cadena.ljust(5,'$')
    print cadena2 #200$$

  • center(ancho,caracter de relleno)

    El string original se centra.

    cadena='200'
    cadena2=cadena.center(5,'$')
    print cadena2 #$200$

Las listas tratadas como objetos.


python listas


Ahora veremos más profundamente el concepto de listas en Python y los métodos que provee su clase.

Los métodos:

  • append(elemento)

    El método append añade un elemento al final de la lista.

    lista=['juan','ana','luis']
    lista.append('carlos')
    print lista #['juan', 'ana', 'luis', 'carlos']

  • extend(elementos)

    El método extend procesa la secuencia de elementos del parámetro y los añade uno a uno a la lista. La diferencia con el método append es que append siempre añade un único elemento a la lista y extend añade tantos elementos como tenga la secuencia.

    lista=['juan','ana','luis']
    lista.extend(['uno','dos'])
    print lista #['juan', 'ana', 'luis', 'uno', 'dos']

    Ahora la lista tiene 5 elementos, es decir se añadieron 2 nuevas componentes a la lista.

    En cambio si utilizamos append el resultado es:

    lista=['juan','ana','luis']
    lista.append(['uno','dos'])
    print lista #['juan', 'ana', 'luis', ['uno', 'dos']]
    Ahora la lista tiene cuatro elementos y el último elemento es una lista también.

  • insert(posición,elemento)

    El método insert añade un elemento en la posición que le indicamos en el primer parámetro.

    lista=['juan','ana','luis']
    lista.insert(0,'carlos')
    print lista #['carlos', 'juan', 'ana', 'luis']

    En este ejemplo insertamos la cadena 'carlos' al principio de la lista, ya que pasamos la posición 0, no se borra el elemento que se encuentra en la posición 0 sino se desplaza a la segunda posición.

    Si indicamos una posición que no existe porque supera a la posición del último elemento se inserta al final de la lista.

  • pop([posicion]

    El método pop si lo llamamos sin parámetro nos retorna y borra la información del último nodo de la lista. Si en cambio pasamos un entero este indica la posición del cual se debe extraer.

    lista=['juan','ana','luis','marcos']
    elemento=lista.pop()
    print elemento #marcos
    print lista #['juan', 'ana', 'luis']
    print lista.pop(1) #ana
    print lista #['juan', 'luis']

  • remove(elemento)

    Borra el primer nodo que coincide con la información que le pasamos como parámetro.

    lista=['juan','ana','luis','marcos','ana']
    lista.remove('ana')
    print lista #['juan', 'luis', 'marcos', 'ana']

  • count(elemento)

    Retorna la cantidad de veces que se repite la información que le pasamos como parámetro.

    lista=['juan','ana','luis','marcos','ana']
    print lista.count('ana') #2

  • index(elemento,[inicio],[fin])

    Retorna la primera posición donde se encuentra el primer parámetro en la lista. Podemos eventualmente indicarle a partir de que posición empezar a buscar y en que posición terminar la búsqueda.

    Si no lo encuentra en la lista genera un error: ValueError: list.index(x): x not in list

    lista=['juan','ana','luis','marcos','ana']
    print lista.index('ana') #1

  • sort()

    Ordena la lista de menor a mayor.

    lista=['juan','ana','luis','marcos','ana']
    lista.sort()
    print lista #['ana', 'ana', 'juan', 'luis', 'marcos']

  • reverse()

    Invierte el orden de los elementos de la lista.

    lista=['juan','ana','luis','marcos','ana']
    lista.reverse()
    print lista #['ana', 'marcos', 'luis', 'ana', 'juan']


Si necesitamos borrar un nodo de la lista debemos utilizar el comando del que provee Python:


lista=['juan','ana','luis','marcos']
del lista[2]
print lista    #['juan', 'ana', 'marcos']




Podemos utilizar el concepto de porciones para borrar un conjunto de elementos de la lista:


Si queremos borrar los elementos de la posición 2 hasta la 3:


lista=['juan','ana','carlos','maria','pedro']
del lista[2:4]
print lista # ['juan', 'ana', 'pedro']



Si queremos borrar desde la 2 hasta el final:


lista=['juan','ana','carlos','maria','pedro']
del lista[2:]
print lista # ['juan', 'ana']




Si queremos borrar todos desde el principio hasta la posición 3 sin incluirla:


lista=['juan','ana','carlos','maria','pedro']
del lista[:3]
print lista # ['maria', 'pedro']




Si queremos ir borrando de a uno de por medio:


lista=['juan','ana','carlos','maria','pedro']
del lista[::2]
print lista # ['ana', 'maria']




Si necesitamos modificar el contenido de un nodo de la lista debemos utilizar el operador de asignación:


lista=['juan','ana','luis','marcos']
lista[2]='xxxxx'
print lista    #['juan', 'ana', 'xxxxx', 'marcos']




python3-ubuntu-1

Si te ha gustado el artículo inscribete al feed clicando en la imagen más abajo para tenerte siempre actualizado sobre los nuevos contenidos del blog:

Guia Python: los diccionarios y la instalación de Python en su computadora.

$
0
0
python logoPython es un lenguaje de script desarrollado por Guido van Rossum.

Podemos codificar empleando programación lineal, estructurada y orientada a objetos (tengamos en cuenta que esta última es la que se ha impuesto en la actualidad).

Se cuenta con intérpretes de Python en múltiples plataformas: Windows, Linux, Mac etc. Se pueden desarrollar aplicaciones de escritorio como aplicaciones web. Empresas como Google, Yahoo, Nasa etc. utilizan este lenguaje para sus desarrollos (actualmente el creador de Python Guido van Rossum trabaja para Google.)

Se puede ejecutar instrucciones de Python desde la línea de comando o creando archivos con extensión *.py. Cuando uno comienza a aprender este lenguaje la línea de comandos nos provee una retroalimentación del resultado en forma inmediata.

El objetivo de este tutorial es presentar en forma progresiva los conceptos fundamentales de este lenguaje y poder analizar los problemas resueltos y codificar los problemas propuestos en este mismo sitio, sin tener que instalar en un principio el Python en su equipo (o luego de instalado poder avanzar con el tutorial en cualquier máquina conectada a internet).
Los diccionarios tratados como objetos.
python diccionarios
Habíamos visto la estructura de datos tipo diccionario que utiliza una clave para acceder a un valor. El subíndice puede ser un entero, un string etc. Un diccionario vincula una clave y un valor.
Los diccionarios en Python también son objetos y como tales tienen una serie de métodos que nos permiten administrarlos:
  • keys()
    Retorna una lista con todas las claves del diccionario.
    diccionario={'house':'casa','red':'rojo','bed':'cama','window':'ventana'}
    lista=diccionario.keys()
    print lista # ['house', 'window', 'bed', 'red']

  • values()

    Retorna una lista con todos los valores almacenados en el diccionario.

    diccionario={'house':'casa','red':'rojo','bed':'cama','window':'ventana'}
    lista=diccionario.values()
    print lista # ['casa', 'ventana', 'cama', 'rojo']

  • items()

    Retorna una lista que contiene en cada nodo una tupla con la clave y valor del diccionario.

    diccionario={'house':'casa','red':'rojo','bed':'cama','window':'ventana'}
    lista=diccionario.items()
    print lista # [('house', 'casa'), ('window', 'ventana'), ('bed', 'cama'), ('red', 'rojo')]

  • pop(clave,[valor])

    Extrae el valor de la clave que pasamos como parámetro y borra el elemento del diccionario. Genera un error si no se encuentra dicha clave, salvo que se inicialice un segundo parámetro que será el dato que retornará.

    diccionario={'house':'casa','red':'rojo','bed':'cama','window':'ventana'}
    valor=diccionario.pop('window')
    print valor # ventana
    print diccionario #{'house': 'casa', 'bed': 'cama', 'red': 'rojo'}

    Si no encuentra la clave en el diccionario y hemos indicado un segundo parámetro al método pop será dicho valor el que retorne:

    diccionario={'house':'casa','red':'rojo','bed':'cama','window':'ventana'}
    valor=diccionario.pop('love','clave no encontrada')
    print valor # clave no encontrada

  • has_key(clave)

    Retorna True si la clave se encuentra en el diccionario, False en caso contrario.

    diccionario={'house':'casa','red':'rojo','bed':'cama','window':'ventana'}
    if diccionario.has_key('love'):
    print 'Si tiene la clave buscada'
    else:
    print 'No existe la clave buscada'

  • clear()

    Elimina todos los elementos del diccionario.

    diccionario={'house':'casa','red':'rojo','bed':'cama','window':'ventana'}
    diccionario.clear()
    print diccionario # {}

  • copy()

    Se genera una copia idéntica del diccionario actual en otra parte de memoria.

    diccionario1={'house':'casa','red':'rojo','bed':'cama','window':'ventana'}
    diccionario2=diccionario1.copy()
    print diccionario2 #{'house': 'casa', 'window': 'ventana', 'red': 'rojo', 'bed': 'cama'}
    diccionario1['house']='xxxxx'
    print diccionario2 #{'house': 'casa', 'window': 'ventana', 'red': 'rojo', 'bed': 'cama'}

    Es importante hacer notar que no es lo mismo:

    diccionario2=diccionario1

    Con la asignación anterior no se esta creando un segundo diccionario sinó se tiene dos variables que referencian al mismo objeto.

  • popitem()

    Retorna un elemento del diccionario y lo elimina. Como no hay un sentido de orden en el diccionario se extrae uno al azar.

    diccionario={'house':'casa','red':'rojo','bed':'cama','window':'ventana'}
    elemento=diccionario.popitem()
    print elemento
    print diccionario

    Para saber cual se extrajo se debe ejecutar el algoritmo.

  • update(diccionario2)


    Modifica el diccionario actual agregando los elementos del diccionario2, si una clave está repetida se modifica su valor.

    diccionario1={'uno':'1','dos':'2','tres':'3333'}
    diccionario2={'tres':'3','cuatro':'4','cinco':'5'}
    diccionario1.update(diccionario2)
    print diccionario1 #{'cuatro': '4', 'cinco': '5', 'dos': '2', 'tres': '3', 'uno': '1'}


Además seguimos contando con el comando del para borrar elementos del diccionario:


diccionario={'house':'casa','red':'rojo','bed':'cama','window':'ventana'}
del diccionario['house']
print diccionario #{'window': 'ventana', 'bed': 'cama', 'red': 'rojo'}



El cambio o agregado de un valor al diccionario se hace mediante la asignación:


diccionario={'house':'casa','red':'rojo','bed':'cama','window':'ventana'}
diccionario['red']='colorado'
diccionario['blue']='azul'
print diccionario  # {'house': 'casa', 'window': 'ventana', 'bed': 'cama', 'red': 'colorado','blue': 'azul'}



La cantidad de elementos mediante la función len:


diccionario={'house':'casa','red':'rojo','bed':'cama','window':'ventana'}
print len(diccionario)  # 4


Instalación de Python en su computadora.


python3-ubuntu-2


Ahora a llegado el momento de instalar Python en su equipo. Debemos descargar el instalador del sitio oficial de Python.


Aquí seguiremos los pasos para instalar la versión para Windows python-2.5.2. Descarguemos la versión para el procesasor x86.


Tenemos en nuestro equipo el archivo para hacer la instalación local de Python python-2.5.2.msi. Lo ejecutamos


El primer diálogo nos pregunta si se instala solo para nosotros o para todos los usuarios del equipo (podemos dejar la opción seleccionada para todos los usuarios) y presionamos 'Next'.


El segundo formulario del wizard nos permite seleccionar la unidad donde se instala el lenguaje. Dejemos por defecto la que nos propone el instalador: c:\Python25\


El tercer paso nos permite seleccionar o suprimir distintos módulos que vienen con Python (extensiones, documentación etc.), dejaremos por defecto que instale todos.


Finalmente ya tenemos instalado el lenguaje Python en nuestro equipo.


Ahora para codificar los programas utilizaremos un editor que se instala junto con el lenguaje Python, desde el menú de opciones podemos acceder al editor llamado: IDLE.


En realidad lo primero que aparece es una ventana llamada Python Shell donde podemos ejecutar instrucciones en forma unitaria:


Por ejemplo escribamos:

print 'Hola Mundo'


Pero nuestro objetivo fundamental es la creación de programas o módulos completos en Python, para esto seleccionamos en esta ventana desde el menú de opciones File -> New Window.


Ahora sí tenemos el editor que suministra Python para codificar nuestros programas.


Escribamos una aplicación muy sencilla:


import random

def mostrarnumeros():
for x in range(7):
valor=random.randint(1,100)
print valor

mostrarnumeros()


La grabamos en nuestro disco duro (por ejemplo prueba1.py) y desde el menú de opciones seleccionamos Run -> Run Module, si hemos tipeado correctamente el programa tendremos el resultado en la ventana "Python Shell".


En los conceptos siguientes veremos temas que no pueden ser ejecutados directamente en el sitio PythonYa, por lo que tener el lenguaje Python en forma local en su equipo se hace indispensable para probarlos.





python3-ubuntu-1_thumb[2]


Si te ha gustado el artículo inscribete al feed clicando en la imagen más abajo para tenerte siempre actualizado sobre los nuevos contenidos del blog:

Bsdgames para jugar y desmitificar el miedo a la consola.

$
0
0

bsdgames1No es la primera vez que hablo aquí de programas curiosos para la consola, como la demo multimedia, el tetris en consola o la reproducción de video en modo texto.

Creo que es una buena forma de desmitificar la consola y una excelente para verla  como una herramienta más a nuestro servicio y no como un verdadero tabù.

Hoy vuelvo al ataque con un paquete de juegos para la consola.

El paquete en cuestión, esta en los repositorios, se llama bsdgames e incluye los siguientes juegos y utilidades:

bsdgames

# adventure – Juego de exploración
# arithmetic – Test matemáticos
# atc – Control de tráfico aereo
# backgammon – El tradicional backgammon
# banner – Para imprimir banners
# battlestar – Juego de aventuras
# boggle – Juego de buscar palabras
# caesar - Desencripta códigos caesar
# canfield – Juego de cartas canfield
# cfscores – Muestra los records de canfield
# cribbage – Juego de cartas cribbage
# fish - Juego Go Fish
# gomoku – Cinco en linea
# hangman – El ahorcado
# hunt – Juego multiusuario
# huntd – Demonio para hunt
# mille - Juego Mille Bornes
# monop – El Monopoly
# morse – Traduce al morse
# number – Convierte números
# phantasia – Un juego de conversacional de fantasía
# pom – Muestra las fases lunares
# primes – Generador de numeros primos
# quiz – Un juego tipo trivial
# rain – Lluvia en tu pantalla (en modo texto)
# robots – Lucha de robots
# rot13 – Codificador rot13
# snake – Juego de la serpiente
# teachgammon – Tutorial de backgammon
# tetris-bsd – El tetris
# trek – Juego para trekies
# wargames – Curioso juego basado en Juegos de guerra.
# worm – El juego del gusano
# worms – Gusanos animados en el terminal

bsdgames_mars-orion2

Instalación:

Ya que estamos hablando de la consola, lo instalaremos desde ella.

Nada de complicaciones, solo hay que poner

aptitude install bsdgames

Y ya los tendremos a nuestra disposición. Solo nos queda disfrutar de juegos como el maravilloso tetris.


Viewing all 528 articles
Browse latest View live