lunes, 22 de julio de 2013

Manejo de errores en python parte 1/2


En la programación siempre cuando ejecutamos un  una solución escrita en algún lenguaje de programación lo más seguro es que de algunos errores ,a menos de que sepamos exactamente lo que estamos haciendo y como se va a comportar lo que estemos haciendo ,no es que no haya programadores que no se equivoquen pero esto no se trata de equivocarse si no de desviar problemas a soluciones y aun así un problema mismo podría ser una solución bien manejada.

En python tenemos una gran manera de manejar errores los cuales se basan en probar,con la palabra reservada try, para manejar un error solo es necesario encontrarlo primero, para ello vamos a ver un ejemplo:

Quiero importar el siguiente modulo:

 #!/usr/bin/env python3  
 # Le ponemos de nombre mi_modulo.py  
 def pinta():  
   print ("Hola")  

Y ahora en un script lo intentamos importar,pero accidentalmente nos equivocamos de nombre,o también podría ser que no lo tengamos siempre a la mano,por ejemplo que compartimos un código el cual necesita de ese modulo y las personas que lo descarguen solo descarguen el script y no asi el modulo,entonces en nuestro script lo importamos:

import mi_modulo

Ahora si ejecutamos el script,daria un error:



Mas en especifico el error:

ImportError

Ahora vamos a aprender como manejarlo,por ejemplo ese es un error de importación,en operaciones matemáticas tambien hay errores,en tipos de datos,en IO,etc,pero la misma consola nos dice cual es:

Para manejarlo usamos la palabra reservada except:

except nombre_error:

Pero antes adentro de una sentencia try hacemos lo que causa el error:

 try:  
   import mi_modulo  
 except ImportError:  
   # Aquí hacemos lo que queramos si entra en error,por ejemplo:  
   print ("No existe el modulo")  

:D

Python también nos deja manejar los errores desde el tipo exceptions,un tipo de dato que nos devuelve una tupla, esta tupla devuelve un numero de argumentos los cuales podemos usar,para el manejo de errores,en realidad no es una tupla,ya que el tipo de dato no lo verifica,pero retorna valores de tipo lista,solo que es inmutable:

Para ello usamos la palabra reservada as:

 try:  
   import mi_modulo  
 except ImportError as error:  
   print (error)  

Para ver los argumentos de error o el nombre que le asignemos usamos esta sintaxis:

print (error.args)

Y podemos hacer esto,por ejemplo:

 try:  
   import mi_modulo  
 except ImportError as error:  
   print (error[0])  

Ahora,si queremos manejar lo que sucedería después de esto,podemos hacerlo escribiendo fuera del bloque try/except pero si queremos que se ejecute en el mismo,podemos hacer uso de else:

 try:  
   import mi_modulo  
 except ImportError as error:  
   print (error[0])  
 else:  
   print ("Usando el modulo :D")  
   print ("O cualquier otra cosa")  

Por ejemplo:

 #!/usr/bin/env python3  
   
 try:  
   ar = open ("Archivo.txt","r")  
 except IOError as io:  
   for i in io.args:  
     print ("Error: %s")%(i)  
   print ("Tipo : %s")%(type(io))  
 else:  
   print ar.read()  
   ar.close()  

Otro ejemplo:

 #!/usr/bin/env python3  
   
 while 1:  
   print ("Bucle infinito" + ("-"*30))  
   try:  
     var = input("No puedes salir a menos que escribas salir : ")  
   except EOFError:  
     print ("\n;)")  
   except KeyboardInterrupt:  
     print ("\nSin trucos ;)")  
     continue  
   else:  
     if var.lower() == "salir" or var.lower() == "s":  
       break  

Eso es todo  de esta parte :D




Leer más...

domingo, 21 de julio de 2013

[Shell] chmod permisos en las carpetas Unix/Linux


Cambiar permisos en las carpetas y archivos en sistemas Unix


Los permisos en las carpetas de sistemas Unix son básicos,pero no así sencillos,como me comentaba el redactor de un blog sobre Linux hace un tiempo se podría hacer un libro solo sobre los permisos,ya que no solo es saber otorgar permisos si no que es saber a quien otorgárselos,en este tutorial prenderemos a cambiar permisos de archivos desde la shell usando el comando chmod,lo hare breve y espero que les ayude a entender como funciona el comando chmod  por si tienen problemas con el.

Tutorial

El comando chmod no es parte del código de bash pero aun así esta instalado en todos los sistemas Unix,por defecto.

Para ver los permisos de un archivo usamos el comando:

ls -l

Como vemos nos muestra los permisos en caracteres,como por ejemplo:

-rw-rw-r--

A diferencia de como se ven con ls,no los asignamos así,esto no lo hacemos:

chmod -rw-rw-r--

Lo que hacemos es usar  números octales,los cuales comienzan en 0 y terminan en 7,estos números los usamos sobre tres distintos tipos de usuarios del sistema:

owner => usuario(propietario)

group => grupo

other => otros

Los números octales están asignados de la siguiente manera

4 => lectura => r

2 => escritura => w

1 => ejecucion => x


0            0           0

^ owner ^ group ^ others


Y sumados se asignan los permisos,por ejemplo algo sencillo seria:

444 

Que seria:

-r--r--r--



Lo que también significa,que el usuario,el grupo y otros pueden leer pero no pueden ejecutar ni escribir:




Otro ejemplo es 775

A lo que seria

7 = 4 => r + 2 => w  + 1 => x { sobre usuario }

7 = 4 => r + 2 => w  + 1 => x { sobre grupo }

5 = 4 => r + 1 => x { sobre otros }

También existen otro tipo de permisos los cuales ya no usan números octales,los llamados permisos simbólicos en el mundo de Unix y los cuales son mas sencillos,según mi opinión:

Al igual que los numeros tenemos distintas asignaciones:

r  lectura
w  escritura
x  ejecución  o acceso si es directorio
s  usa el id del dueño o grupo del archivo al ejecutar
t  fijar "sticky bit" a un directorio: sólo dueños pueden borrar
u  usuario (dueño)
g  grupo
o  otros
a  todos (dueño grupo y otros)

+  agrega permiso a los permisos existentes
-  quita permisos de los existentes
=  únicos permisos asignados al archivo

El equivalente seria:

000
ugo

Veamos como asignamos 444 con asignación simbólica:

u=r,g=r,o=r




Por ejemplo si han usado este comando:

chmod +x archivo_ejemplo

Y no sabían que es lo que asía,lo que hace es darle permisos de ejecución con asignación simbólica:

+x es igual a + ejecución y conserva los demás permisos

Es lo genial de la asignación simbólica podemos,asignar permisos mas los existentes:

chmod +w

Nos concede el permiso de editar el archivo,lo cual no podíamos con permisos 444.

Eso es todo,como vemos no solo es saber asignar permisos sino saber a que archivo,por ejemplo los archivos de /etc donde se guardan los archivos de configuración muchos de ellos solo tienen permisos de ejecución y lectura para todos los usuarios,y escritura solo para el propietario que es root.





Leer más...

sábado, 20 de julio de 2013

Como usar MongoDB con Perl

Tutorial Perl MongoDB scripting


Como prometí en un comentario,aquí un tutorial de como usar MongoDB desde un script en Perl,el cual luego podemos usar en GUI,Diseño Web,etc en otra ocasión lo haré en python pero de momento en Perl.

Primero que nada se supone que ya debemos tener instalado MongoDB,si no es así consulta lo documentación o busca si ya esta en tu distribución de Linux(Si usas Linux):

Por ejemplo en Ubuntu/Debian:

aptitude search mongo

Gentoo:

emerge –search mongo
Y luego lo instalamos :

sudo apt-get install mongodb

etc


Bueno,también necesitamos el modulo MongoDB de Perl,así que lo instalamos desde CPAN:

En terminal:

sudo cpan install MongoDB


SI usan Windows,pueden instalar desde la GUI que traen las versiones de Perl,dependiendo cual usen,con el nombre MongoDB.

Ahora vamos a crear el script para Shell:

Con su editor favorito:

vim mongo.pl

Y metemos:

 #!/usr/bin/env perl # <-Hashbang  
   
 use MongoDB; # <- Modulo  
 use MongoDB::Database; <- Submodulo  
 use strict;  
   
 use warnings; # <- Para desarrollo  
   
 # Definimos algunas variable para conectarnos a la Base de Datos  
 # Como el nombre de la base de datos   
 # El puerto,etc  
   
 my $database = "test";  
   
 my $puerto = 27017;  
   
 my $host = "localhost";  
   
 # Iniciamos la conexion  
   
 $host = sprintf("%s:%s",$host,$puerto);  
   
 my $cliente = MongoDB::MongoClient->new("host" => $host );  
   
 # Nos conectamos a la base de datos  
   
 my $base_datos = $cliente->get_database( $database );  

Esa es la plantilla basica de conexion,ahora vamos a ver algunas cosas que se pueden hacer:

Listar las collections:

Para ello usamos un array

 my @collections = $base_datos->collection_names;  
   
 for (my $i = 0; $i < scalar(@collections); $i++)  
 {  
   print $collections[$i],"\n";  
 }  

Definir una collection:

 my $collections = {};  
   
 my @collections = $base_datos->collection_names;  
   
 for (my $i = 0; $i < scalar(@collections); $i++)  
 {  
   print $i,":",$collections[$i],"\n";  
 }  
   
 my $coll = {};  
   
 print "Elige una base de datos : ";  
   
 my $R_c = <STDIN>;  
   
 chop($R_c);  
   
 $coll->{$collections[$R_c]} = $base_datos->get_collection($collections[$R_c]);  



Eso se hace mas simple pero yo use una referencia para acceder a barias collections,ahora ya estamos en una collection adentro de la referencia:

$coll;

También podemos hacer algo mas simple manualmente como;

 my $coll = $base_datos->get_collection('collection');

Buscar un objeto:

Para buscar un objeto solo basta con asignar una variable al objeto,ya que solo es uno:

Pero aunque nos devuelva un solo valor covertira la variable a un hashref,ya que al usar formato estilo JSON debemos iterar sobre un valor de tipo diccionario,si usan,usaban MySQL no hay problema se hace lo mismo para recorrer los valores:

 my $object = $coll->{$collections[$R_c]}->find_one();  
   
 foreach my $keys(keys $object)  
  # Con un foreach basta  
 {  
   print $object->{$keys},"\n";  
 }  

Buscar todos los datos de una collection:

Si no queremos buscar uno y queremos ver todos los datos podemos usar un bucle foreach anidado en un while desde la funcion find del modulo MongoDB:

 my $all = $coll->{$collections[$R_c]}->find;  
   
 while (my $doc = $all->next) {  
   foreach my $keys (keys $doc)  
   {  
     print $doc->{$keys}," ";  
   }  
   print "\n";  
 }  

Insertar datos:

Para insertar datos debemos estar en la collection,así que el código iría debajo del anterior o en vez:

 $coll->{$collections[$R_c]}->insert({  
     "_id" => 2,  
     "value" => "Hola Mundo desde Perl y MongoDB"  
   });  


Les dejo un script con todo lo que hicimos:

Enlace

Bueno y eso es lo básico,conexión,consulta y insertar,para mas información visiten el tutorial de CPAN:

http://search.cpan.org/~friedo/MongoDB-0.701.4/lib/MongoDB/Tutorial.pod
Leer más...

miércoles, 17 de julio de 2013

Como usar comodines Unix en Python

Wildcards Unix con python


Esta entrada es rara porque aunque la entrada sea sobre Unix,este tutorial lo realice en Windows:



Así es ese sistema es Windows aunque parezca KDE :P

El hecho es que estoy usando Windows y por eso no he hecho tutoriales últimamente para este blog, pero aunque use Windows no puedo vivir sin Unix y sus wildcards :P,así que programe un script en python que simula esto,el hecho es que no lo programe ya que no lo necesito solo es cuestión de usar un modulo nativo de Python y todo es automático,estoy simulando las wildcards pero aun no las termino por el comodin (?) que se me ha dificultado,pero en fin este tutorial sirve para Linux,OS X y cualquier sistema en el que se pueda instalar Python.

Tutorial

Primero que nada importamos el modulo glob:

from glob import glob

Ahora solo vasta con pasarle un argumento a la función glob del modulo glob,el cual es la wildcard:

Por ejemplo listar todo el directorio:

mi_dir = glob("*")

Eso nos devuleve una lista:

print type(glob)

Ahora solo basta iterar sobre ella:

for  archivo in mi_dir:
   print (archivo)

Eso es todo,como sabemos las wildcards funcionan para listar un contenido especifico fácilmente,mas fácil que con regex y aquí un tutorial.

Aquí un código útil para Linux:
Uno compilado para Windows:

Enlace

Y el código fuente de Windows:

Que usa el compilado:


Enlace

Espero que les funcione,si tienen dudas comenten. 
Leer más...

jueves, 11 de julio de 2013

Clases y objetos python 3 parte (2/4)

Tutorial clases python 3


Ya hablamos de las clases y como se definen y funcionan con sus metodos y variables de clase,ahora toca hablar de la herencia,la cual es cuando tomamos atributos de una clase madre llamada clase super(superclass),la cual le pasa atributos y metodos a nuestra clase hija de la cual deriva de la superclass.


La clase super es la clase a la cual no le pasamos argumentos o solo le pasamos el argumento object:

class Ejemplo(object):

Cuando una clase es creada a base de otra se usa el nombre de la superclase como parametro:

class Ejemplo2(Ejemplo):

Cuando creamos una clase nueva a base de otra clase,la clase hija tiene los atributos y metodos de la clase madre:

 #!/usr/bin/env python3  
 class Madre(object):  
   def __init__(self):  
     self.hola = “Hola mundo”  
 class Hija(Madre):  
   pass  
 ejemplo = Hija()  
 print (ejemplo.hola)  


Como vemos no se ha definido una nueva,cuando esto ocurre se le conoce como sobrecarga(override):

 #!/usr/bin/env python3  
 class Madre(object):  
   def __init__(self):  
     self.hola = “Hola mundo”  
 class Hija(Madre):  
   def __init__(self):  
     self.hola = “Hola otra vez”  
 ejemplo = Hija()  
 print (ejemplo.hola)  

Como podemos ver parece que sobrecargamos la variable,pero en realidad sobrecargamos el constructor,(el metodo constructor),por ejemplo:

Si lo ejecutamos dará un error porque no hemos definido la variable hola en el constructor de la clase hija.

Aun asi podemos sobrecargar el constructor,pero no así los demás métodos:

 #!/usr/bin/env python3  
 class Madre(object):  
   def __init__(self):  
     self.hola = "Hola mundo"  
   def hola(self): # Metodo de clase madre  
     self.hola = "Hola mundo"  
     return self.hola  
 class Hija(Madre):  
   def __init__(self): # Sobrecargacamos el constructor  
     self.otra_var = "Hola otra vez"  
 ejemplo = Hija()  
 print (ejemplo.hola()) # Ahora imprimimos el método  


Veamos un ejemplo,las Pc continen un forma especial,pero existen Laptos,Netbooks y cada una tiene su hardware y software,podriamos definir una Pc de esta manera:

class Pc(object):
   def __init__(self):
       self.partes = ['hardaware','software']
       self.stdout = 'pantalla'
       self.stdin = 'teclado'
       self.nombre = 'Pc'

Ahora definimos una netbook derivada de la clase Pc:

 class Netbook(Pc):  
   def __init__(self,arch,sistema,procesador):  
   Pc.__init__(self)  
 """^Para llamar el los atributos del constructor de la clase madre lo hacemos de esta manera"""  
   self.arch = arch  
   self.portable = 'muy portatil'  
   self.sistema = sistema  
   self.procesador = procesador  
   def ver(self):  
     print ('Una netbook %s arquitectura %s' %(self.procesador,self.arch))  
     print ('Contiene un sistema %s y es %s' %(self.sistema,self.portable))  
     print ('Es de la familia %s' %(self.nombre))  
     for i in self.partes:  
       print ('Partes : %s' %(i))  
 hp_mini = Netbook("x86","GNU/Linux","intel")  
 hp_mini.ver()  



Eso es todo,de momento aun faltan dos partes de clases y objectos,espero que haya quedada clara la idea de como se heredan atributos,en las proxias partes hablaremos de lo que falta,este codigo es el final:


Enlace

Leer más...

domingo, 7 de julio de 2013

Tutorial Perl MySQL Consulta

Bueno,es raro que hable de MySQL en este blog pero en fin,vamos a ver como usarlo en perl,se suponer que debes saber algo de MySQL y de Perl para entender este tutorial,pero aun así lo haré un poco didáctico:

Primero que nada necesitamos instalar el modulo DBI de perl,lo mas seguro es que ya lo tengas,pero si no es así lo instalamos desde terminal con :

sudo cpan DBI 

Bien,ahora vamos a usar un script para ver su funcionamiento,el script se usa desde la terminal,recuerden que la terminal sirve para muchas cosas,entre ellas probar los algoritmos antes de usar GUI o Diseño Web.

Iniciamos(lo que esta en morado iremos escribiendo en el script):

Definimos el hashbang y llamamos a DBI:

#!/usr/bin/env perl

use DBI;

Ahora definimos los datos de acceso:

El usuario:

my $user = "usuario";

La base de datos:

my $db = "base_de_datos";

El host:

my $host = "mi_host";

El puerto(regularmente es el 3306 a menos que tu mismo o el administrador lo hayan cambiado):

my $port = "3306";

Si no sabes cual es y tienes nmap,puedes averiguarlo con:

nmap host | grep --color sql
También vamos a guardar una tabla:

my $table = "tabla"; 

Y el password:

my $pass = "password";

Si no quieres guardarlo a fuego(adentro del script),puedes usar STDIN desde la shell:

print "Password : ";

my $pass = <STDIN>;

chop($pass);

O incluso hacer invisible la shell,o usar un shasum,etc.

Ahora vamos a crear un variable de información para MySQL:

my $info="DBI:mysql:database=$db;$host:$port";

Vamos a crear una variable tipo referencia para guardar la conexión:

my $dbh = DBI->connect($info,$user,$pass);

Por ultimo vamos a preparar un query para consulta:

my $query = "Select * from $table"; # Orden MySQL

Ahora preparamos la query:


my $sth = $dbh->prepare($query); 

Y ejecutamos:

$sth->execute();

Con eso ya establecimos nuestra conexion MySQL,ahora para ver los valores de la tabla,solo hace falta ver en ellos:

Creamos una referencia:

my $referencia = $sth->fetchrow_hashref()

Y podemos recorrer sus valores con un foreach:

foreach my $keys (keys $referencia)
  {
        print  " $keys => $referencia->{$keys}";
  }

Eso en el caso de ser solo una linea si es mas de una se recomienda usar un buble while asi:

my $referencia;
my $n = 0; # Creamos un numero para guardar el nombre de los valores
while($referencia = $sth->fetchrow_hashref())
 # Llenamos el valor de la referencia con nuevos valores
{
if ($n == 0)
{
    foreach my $keys (keys $referencia)
    {
        print  " $keys"; # Imprimimos las columnas
    }
}
print "\n";

foreach my $keys (keys $referencia)
  {
        print  " $referencia->{$keys}"; # Imprimimos las columnas
  }
$n++;
}
print "\n";

Con eso simulamos la impresion de MySQL,tendriamos que ponerle una barras tipo exel,pero con eso nos manda la impresión tabla columna de MySQL.

El script completo queda así:

Enlace
Eso es todo,no lo explico mas porque no tengo tiempo,pero si tienen dudas comenten.

Como ven es un uso de shell,pero así se inicia todo,esto se podría hacer un tipo phpmyadmin en programación web o programa en Gtk/Qt/etc para sistemas operativos:





Eso es todo :D.

Mas información.



Leer más...

martes, 2 de julio de 2013

[Shell] cut tutorial Linux

En esta ocasión veremos este comando de la shell de tipo ejecutable (type cut),el cual nos sirve para hacer filtrado de información basado en delimitadores,y columnas,este comando se puede comparar con algunas funciones de lenguajes de programación como split,explode,map,etc el cual nos maneja datos a partir de un delimitador:

En Perl:

#!/usr/bin/env perl

my @delim = split(":","http://www.itimetux.com");

foreach my $d (@delim)
{
    print "$d\n";
}

Lo que hace ese codigo es crear un arreglo basado en el delimitador :,osea crea dos :

1 . http
2 . //www.itimetux.com

Y el : no lo muestra

En Php se puede con explode,en ruby con split,etc,pero aquí lo importante es hacerlo con cut para ejecutarlo en Tuberias Unix,veamos un ejemplo:

Primero que nada necesitamos saber para que sirve exactamente cut de Unix,si creen que es como cortar y pegar de un explorador de archivos,no lo es si lo que queremos es cortar y pegar un archivo el equivalente seria en Unix mv:

mv archivo ruta_archivo
cut es una herramienta de filtrado de texto basado en delimitadores y especificadores de caracteres o bytes.

Por ejemplo tenemos el comando date que nos muestra el tiempo:

date
Ahora con una tuberia usando cut mostramos l fecha basado en el delimitador espacio:

date | cut -d " " -f 5
Bien que hicimos aquí?

No de hice copy and paste :P

Lo que hicimos fue dividir la salida de date(stdout) con cut basado en el delimitador espacio(" "), esto no lo devuelve en columnas los cuales consultamos con el argumento -f, por ejemplo en ese ejemplo tenemos 7 f(fields)

f1 f2 f3 f4 f5 f6 f7mar jul  2 18:50:41 CDT 2013
Ojo,devuelve columnas aquí si nos muestra solo un valor es porque solo es una linea:


Veamos otro ejemplo:

Llenamos un archivo de texto con el date unas cuantas veces y usamos el mismo comando:

for i in {1..5}; do date >> date.txt; done

cut -d " " -f 5 date.txt
Muestra lo mismo pero en todas las columnas:


Como se arregla esto?

Esto lo podemos arreglar con un pipe usando sed,pero ese ya es otro asunto,ahora a la explicación de cut:

Primero que nada y después de esto tenemos que ver siempre la ayuda del comando con el parámetro help,que trae todo lo que les voy a comentar y mas:

cut --help

Bien,primero que nada debemos saber que se hace con los comandos que acabamos de usar:

-d # Es un delimitador el cual se basa en un solo caracter,en este caso usamos el caracter "/",debe ir entre comillas para evitar problemas con caracteres como \ o ;.

 -f # Nos muestra las columnas creadas por el delimitador,se puede usar con un solo numero como (-f 1),o con rango como (-f 1-5) , que nos mostraría de la columna 1 a la 5 o solo la columna 1 y 5(-f 1,5).

Lo contrario es usar el parámetro (--complement),este parámetro nos indica que lo que queremos ver es lo que no indicamos con el parámetro f,también el parámetro (-s) nos muestra las columnas que no contengan el delimitador.

Los parámetros -c y -b nos muestran los caracteres y los bytes basados en rangos o en un solo numero,por ejemplo mostrar los 5 primeros caracteres:


Eso es todo,es lo mas importante(en mi opinión) y para ver mas info:

man cut && cut --help | less





Leer más...

domingo, 23 de junio de 2013

Como instalar LAMP en Debian Wheezy

Aqui un rapido tutorial de como instalar un sevidor Linux+Apache+PHP/Perl+MySQL (LAMP),bien en debian las cosas son faciles solo basta con pegar unos cuantos comandos y tendremos instaldo LAMP:

Abrimos una terminal y tecleamos:

Entramos como root:

su
Instalamos apache

apt-get install apache2 apache2-mpm-prefork
Instalamos MySQL

apt-get install mysql-server
Aqui nos va a salir la opcion de elegir la contraseña de mysql,eligen una es la de root pero no la de UNIX,la de root de MySQL(el administrador).


Instalamos php con las librerías de sql

apt-get install php5 php5-mysql libapache2-mod-php5

Aqui los archivos se guardan en /var/www/

Si queremos editar el archivo que se carga al entrar al 127.1.0.0

cd /var/www/
nano index.html # Esto es estando como root
Y entramos:

  127.1.0.0
Si no entra reiniciamos apache

service apache2 restart
Ahora instalamos phpmyadmin

apt-get install phpmyadmin

Y entramos:

  127.1.0.0
Si no entra,enlazamos la carpeta que esta en share:

 ln -s /usr/share/phpmyadmin  /var/www/phpmyadmin

Para saber la informacion de php y el API de apache:

printf "<?php\nphpinfo();\n?>\n" > /var/www/info.php

Y entramos

http://127.1.0.0/info.php

Eso es todo,ya dandole una "maquillada" asi puede quedar el localhost:


Eso es todo :D.



Leer más...

Saber la longitud mayor de un string en un diccionario Python

Algo que he necesitado hacer es saber cual es la string mas larga de un valor y una clave de un diccionario,esto es facil recorriendo y anaizando valor por valor y clave pro clave cada elemeto del diccionario:

Algoritmo:

1.Recorren el diccionario por clave y valor

2.Llenar dos valores con los valores de la longitud de las strings(listas en este caso)

3.Teniendo las listas devolver el elemento mas largo de la lista(numéricamente hablando)

En python eso luce asi:

 #!/usr/bin/env python3  
 Dic = {  
     "Clave" : "Valor",  
     "ClaveNumero2" : "Valor_numero2"  
 } # Diccionario de prueba  
 def espacios(valor,val=False): # Val false debuelve clave  
     strvalor,strclave = [],[] # Iniciamos dos listas para trabajar en el buble  
     for clave in valor: # Iniciamos el recorrido de claves  
         strvalor.append(len(valor[clave])) # Llenamos la lista con la longitud de cada valor  
         strclave.append(len(clave)) # Llenamos la lista con la longitud de cada clave  
     if val: # Si quieren el valor trabajamos el valor  
         strvalor.sort() # Sorteamos el valor de forma ascendente  
         return (strvalor[len(strvalor)-1]) # Regresamos el ultimo valor que es el mas alto  
     else: # Igual con la calve si es lo que desean  
         strclave.sort()  
         return (strclave[len(strclave)-1])  
 print ("La string mayor de clave es : %d") %(espacios(Dic,False)) # Probamos  
 print ("La string mayor de valor es : %d") %(espacios(Dic,True))  

Para que les funcione como debe,descomenten el código y asignen bien la sangría:


Les dejo el paste:

Enlace

Espero que les sirva :D.

Leer más...

Saber el numero mayor de un array Perl

En ocasiones necesitamos saber cual es valor mas alto numéricamente hablando,de un array o de un hash,en esta ocasion veremos los array,el algoritmo es simple:

1.Definir un valor a 0

2.Recorrer el array y comparar el valor de cada elemento con el de 0.

3.Como es obvio esperar un valor mayor a 0 cambiamos el valor de 0 al valor del elemento del array.

4.Regresamos al paso 2

Eso en Perl luce asi:



 #!/usr/bin/env perl  
 my @prueba = ( 8,1,2,2,6881);  
 print num_mayor(@prueba),"\n";  
 sub num_mayor  
 {  
   my @array = @_;  
   my ($n,$mayor) = (0,0); # Definimos dos numeros para trabajar el bucle  
   while ($n < scalar(@array)) # Recorremos el array  
   {  
     if ($mayor >= $array[$n]) # Vemos si es mayor o igual  
     {  
       $mayor = $mayor; # Si es asi sigue teniendo su valor  
     }  
     else # Si no es asi  
     {  
       $mayor = $array[$n]; # Obviamente es menor y le ponemos un nuevo valor  
     }  
     $n+=1; # Interaccion  
   }  
   return $mayor if ($mayor != 0); # Regresamos valor si no es 0  
 }  


Es simple el algoritmo,y podemos hacerlo en C,PHP,Lua,Javascript,etc,por ejemplo en ruby:


O en python me gusta usar un "truco",voltear la lista y imprimir el primer valor que debería ser el numero mayor:

 #!/usr/bin/env python3  
 prueba = [2,4,3,222,12]  
 def num_mayor(x):  
   mayor = sorted(x)  
   mayor = mayor[::-1]  
   return mayor[0]  
 print (num_mayor(prueba))  

En perl no se si existen estas funciones,porque hemos hablado de pop,shift,etc pero trabajan diferente,de todas formas me gusta parsear,para ver como funcionan las funciones del lenguaje de programación :D.

Espero que les sirva.
Leer más...

domingo, 16 de junio de 2013

Editar metadatos mp3 (id3tags) desde Debian/Ubuntu

En ocasiones nos encontramos con la necesidad de editar los metadatos de una canción los metadatos en las canciones se llaman ID3tags y son los que contienen la información mas importante del grupo musical,artista,banda,etc en windows por ejemplo existen infinidad de programas que nos ayudan a cambiar esta información incluso en smartphones con Android o iOS podemos realizar esto,pero en Linux se puede?

Si :D.

Existen algunos programas que lo hacen y en este caso que nos concentraremos mas en Debian ya que tiene el programa mas fácil de usar en sus repos, llamado easytags de Gnome.

Para instalarlo en Debian/Ubuntu basta con:

sudo apt-get install easytags

Ahora lo abrimos y el uso es bastante sencillo,solo elegimos una carpeta y nos busca todos los archivos de audio,luego elegimos los datos a modificar y por ultimo guardamos, también tiene opción de imagen de portada:






Eso es para Debian y Ubuntu y derivados,es al estilo windows,es bastante sencillo y recomendable,pero solo lo he visto solo en Debian en repos,si saben compilar pueden bajar el codigo fuente y compilarlo como yo arriba que lo compile para Gentoo(en estos momentos no estoy en Debian y por eso no puse las capturas de Debian):

Enlace

Descomprimen,necesitan ver las dependencias en  el archivo README

cat README
Y las opciones en el archivo INSTALL

cat INSTALL 

El programa es al estilo windows,y creo que esta disponible para el,si queremos al estilo Unix,podemos instalar id3tool y editar los ID3 desde linea de comandos en la Shell:

Para instalar:

sudo apt-get install id3tool

También lo probé en Gentoo y se instala:

sudo emerge -v media-sound/id3tool
Y ejecutamos asi:

id3tool --opcion cancion.mp3

Por ejemplo para el año

id3tool --set-year=2000 cancion.mp3

Para ver todas las opciones:

id3tool -h

Eso es todo,existen muchas mas herramientas,por ejemplo con VLC se puede hacer esto y con librerias de programación también,por ejemplo yo programe un script para mi en Perl

Enlace



Pero bueno eso ya es otra cosa :P.

Saludos.
Leer más...

lunes, 10 de junio de 2013

Visor pdf ligero con pcmanfm

Hay un visor de pdf que abre los documentos desde la linea de comandos,a este programa se le pasa un parámetro que es le nombre del fichero y en pcmanfm tenemos la capacidad de configurar los programas de esta manera asi que tendremos un visor de pdf ligero y usable desde pcmanfm.

Tutorial

Instalamos el visor:

 En Gentoo

sudo emerge -av app-text/mupdf

En Ubuntu


sudo add-apt-repository ppa:guilhem-fr/mupdf

sudo apt-get update
sudo apt-get install MuPDF

En Arch

pacman -S mupdf

Bien,ahora vamos a pcmanfm y le damos clic derecho a un PDF

Abrir con...

Y Linea de comandos # O su equivalente en ingles

Y escribimos:

mupdf %f

Y listo


Eso es todo :D
 


Leer más...

sábado, 8 de junio de 2013

Como cambiar el wallpaper automáticamente en openbox

En openbox usamos un programa de linea de comandos que se llama feh,el cual usaremos en este momento,yo he visto que tambien usan nitrogen,asi que si no tienes feh instalalo:

En Debian:

sudo aptitude install feh

En Gentoo:

sudo emerge -av feh

Bien,ahora van a usar este script en Perl que programe:

 Enlace

Lo meten en un archivo de texto,luego le dan permisos de ejecución:

chmod +x archivo_que_cambia_el_wallpaper

 Y luego lo agregan al inicio de openbox:

nano ~/.config/openbox/autostart.sh

Añaden la ruta,por ejemplo:

/home/tu_usuario/archivo_que_cambia_el_wallpaper &

El & es para que se quede ejecutando en segundo plano.



Eso es todo,antes de añadirlo configuren la carpeta de las imagenes y el tiempo entre cada cambio,es en segundos,asi que un minuto son 60,el script busca automáticamente las imágenes que esten en la carpeta que señales y luego las ordena alfabéticamente y las cambia cada x segundos que hayas definido,si algo anda mal avisara:

Como una imagen no se ve como funciona:


Les dejo un vídeo:



Eso es todo :D



Leer más...

Nuevos nombres de red en Gentoo a partir de kernel 3.8

Bien,esto no es un tutorial mas bien es un aviso a otros gentooneros,a partir del kernel 3.8 se cambian los nombres de nuestra interfaz de red a diferentes nombres,esto no es por el kernel 3.8 para arriba, mas bien es por udev,ahora las interfaces se muestran algo como:

wlp1s0

En vez de wlan0,o eth0 muestra algo como lo de arriba.

Bien,lo menciono porque hace poco actualice y me cambiaron los nombres de red en estos momentos estoy usando el kernel 3.9 de la rama inestable de x86, y ese nombre se ve mal,pensé que era por el kernel pero no,esto lo dice en las noticias de eselect:

eselect news read all

Pero como no lo leeo,tuve que ver el error con dmesg,en el cual me apareció algo como:

udev cambio el nombre de wlan0 a wlp1s0 (en ingles)

Bueno,si acaban de instalar gentoo,o actualizaron udev tienen que modificar las configuraciones de udev y openrc(si lo usan):

Primero borramos eth0 y wlan0 de runlevel default.

rc-update del net.eth0 default

rc-update del net.wlan0 default

Ahora cambiamos los enlaces de net.lo a los nuevos nombres,pero primero los vemos con este comando:

udevadm test-builtin net_id /sys/class/net/eth0 2> /dev/null

udevadm test-builtin net_id /sys/class/net/wlan0 2> /dev/null



Es el que dice ID_NET_NAME_PATH=enp3s0 # En mi caso

Y muestra el nuevo nombre,ahora creamos un enlace:

cd /etc/init.d/

ln -s net.lo net.enp3s0

También en wlan0

Ahora

cd ../conf.d

nano  net

Y actualizamos eth0 por el nuevo nombre.

Por ultimo agregamos el nuevo servicio a openrc:

rc-update add net.enp3s0 default

También para wlan0 con nuevo nombre.

Eso es todo,creo mas info en la wiki:

http://wiki.gentoo.org/wiki/Udev/upgrade


Leer más...

jueves, 6 de junio de 2013

[Shell] Variables de entorno Linux

Hemos hablado en algunas ocasiones de las variables de entorno pero no las hemos tocado a fondo,por ejemplo el $PS1,$PS2,$LS_COLORS,etc.

Las variables de entorno cambian el comportamiento del sistema,un tanto en modo shell y también en modo gráfico ya que se definen variables que pueden modificar el comportamiento del sistema total.

Un ejemplo de ello son las locales,variables de entorno local de lenguaje,en mi caso:

es_MX.utf8

Las variables de entorno son variables de lenguaje de programación,en este caso Bash pero puede ser sh,tcsh,etc dependiendo de la Shell que uses, en bash se definen las variables así:

variable=valor

Las variables que usamos en el lenguaje de programación bash mediante scripts,se aislan en el script,por ejemplo si creamos un script que  contenga:

#/bin/bash

hola="hola"
mundo="mundo"

echo $hola $mundo


Y lo ejecutamos:

bash holamundo.sh

Se debería asignar el valor "hola" a la variable hola al ejecutar el script,así que si en la linea de comandos escribiéramos:

echo $hola

Debería imprimir el valor de hola que le dimos en el script,pero no,porque se aisla su contenido en el mismo script,en cambio si en la linea de comandos defiriéramos una variable:

hola="hola"

Y la imprimiéramos

echo $hola



Si nos mostraría resultados,esto es porque la linea de comandos es una consola dinámica para bash,como la de python por ejemplo.

Las variables de entorno son variables que usa el sistema,estas son definidas con mayúsculas y las define automaticamente el sistema o los programas que las usan,las variables mas comunes son:

HOME # Muestra nuestro home

PWD # Muestra el lugar donde estamos

OLDPWD # Muestra el ultimo lugar donde estuvimos(se define cuando visitamos mas de dos lugares en el sistema,con el comando cd)

TERM # Muestra la terminal por defecto

LOGNAME # Muestra el nombre del usuario actual

LANG # Muestra el lenguaje

DESKTOP_SESSION # Muestra la sesión gráfica(entorno de escritorio)

SHELL # Muestra la sesión de linea de comandos(shell)

PATH # Muestra el lugar donde se encuentran los programas ejecutables

LS_COLORS # Muestra los colores que usan los programas con argumento (--color=auto)

PS1 # Muestra la configuracion del entorno (shell)

PS2 # Muestra la configuracion del entorno (shell) al acceder al PS2

Esto no solo es de Linux,GNU/Linux y todos los *nix que usan Bash,esto también existe en Windows/MS-DOS.

Para definir una variable de entorno se usa el comando

export VARIABLE="VALOR"

Por ejemplo

export PDF="/home/$LOGNAME/Descargas/pdf"

Y para acceder seria por ejemplo:

cd $PDF

Otro ejemplo es por ejemplo añadir rutas de ejecutables,por ejemplo cuando trabajamos con Perl:

Nota:En este caso estamos modificando una variable de entorno y se usa:

VAR="$VAR:mas valores"

Por ejemplo:

PATH="home/$LOGNAME/perl5/bin:$PATH" # PATH=VAR : $PATH

Para ver todas las variables de entorno o casi todas tecleamos:

env

o

printenv

Y para guardar la variable de entorno la metemos en nuestro bashrc:

echo 'export VARIABLE="VALOR"' >> ~/.bashrc
O

nano ~/.bashrc # nano o {vim,gedit,VI,kate,joe,etc}

Y exportamos las variables que queramos.

Eso es todo :D

Nota:Cuidado al modificar variables de entorno,en especial(PATH)

Leer más...

domingo, 2 de junio de 2013

[Shell] Tutorial tail Unix/Linux

En esta ocasión aprenderemos a usar tail,un comando muy usado por los administradores de servidores,no es que sea uno pero si lo fuera lo usaría ya que algo de lo que mas me llama la atención es que usa un bucle para mantener abierta la concatenación de un archivo,hagan de cuenta un cat funcionando en bucle infinito,que muestra las lineas que le indiquemos,esto sirve para escanear actividades en un archivo o incluso podemos escribir en el,usando los flujos estándares de Unix,solo Tuberias y flujos estándares,para ver con tail el avance del texto:

Vean,como programo un pequeño script en Perl sin usar un editor y viendo el avance con tail:




Ahora vamos a ver como funciona:


tail muestra las ultimas 10 lineas por defecto,solo las ultimas 10,por ejemplo podemos crear un archivo con 11 lineas comenzando desde el 0,con bash:

for i in {0..10}; do echo "Linea $i"; done >> prueba.txt

Y ahora ejecutamos tail:

tail prueba.txt

Y también podemos usar cat,que concatena todo el archivo.

Y vemos la diferencia:



Aunque tenemos 11 lineas tail solo usa 10,ahora veamos los parámetros:

tail -v archivo

Muestra el nombre del archivo en la primera linea:

tail -f archivo

Deja abierto tail para comprobar la actividad del archivo o también a su hermano:

tailf archivo

type tailf

Que también funciona lo que se menciona abajo(-n y  -v ).

tail -q

No muestra el nombre,es como tail solamente,solo que se usa porque cuando abrimos dos archivos al mismo tiempo:

tail archivo1 archivo2

Nos muestra los nombres por defecto,así que si no queremos eso usamos:

tail -q archivo1 archivo2
 
Solamente con el parámetro -q.

tail -n [{-,+}numero]

Muestra desde la lineas que indiquemos:

Por ejemplo

Desde la tercera linea hasta el final:

tail -n +3 archivo

Desde la tercera linea del final

tail -n -3 archivo

Por ejemplo para mostrar la ultima linea seria:

tail -n -1 

Y para mostrar todo al estilo cat,seria:

tail -n +1

Y nos muestra al estilo que cat concatena archivos de texto.

tail -c [{+,-}bytes]

Muestra los caracteres desde el byte que indiquemos,por ejemplo desde el byte 5:

tail -c +5 archivo

Desde el byte 5 de atrás:

tail -5 archivo

Eso es todo,para mas información siempre tenemos en la misma shell:

tail --help

o

man tail

Ya que me faltaron mencionar alguna funciones,pero estas son las mas interesantes(en mi opinión).

Eso es todo :D
Leer más...

sábado, 1 de junio de 2013

Como usar iwep pro asv

Como usar y como funciona iWep Pro ASV


Ya que andamos en esto del wifi y el iphone voy a explicar un sencillo tutorial de como usar iwep pro versión applestore ya que es diferente a app de cydia también vamos a ver en detalles técnicos  como logra averiguar los passwords de los routers a nivel programación.

Bien primero que nada como dije es diferente a la app de cydia,para empezar la app de cydia viene en .deb que es la paqueteria de debian que usa el iPhone(iOS) jailbroken para instalar aplicaciones y en la version de applestore biene en .ipa que es la paqueteria que usa apple,la diferencia entre estas dos paqueterias es que las .deb se pueden instalar en cualquier parte del sistema(root,la raíz del sistema) y las .ipa están aisladas en la carpeta mobile y solo pueden hacer uso de sus propias configuraciones y archivos.



La app de cydia funciona recolectando el:

SSID : Nombre del wifi o mas en especifico SSID (Service Set IDentifier) es un nombre incluido en todos los paquetes de una red inalámbrica (Wi-Fi) para identificarlos como parte de esa red. El código consiste en un máximo de 32 caracteres que la mayoría de las veces son alfanuméricos (aunque el estándar no lo especifica, así que puede consistir en cualquier carácter). Todos los dispositivos inalámbricos que intentan comunicarse entre sí deben compartir el mismo SSID, las redes en infraestructura que incorporan un punto de acceso, se utiliza el ESSID (Extended Service Set IDentifier).

y

BSSID: Se forma con la dirección MAC (Media Access Control) formada por 48 bits (6 bloques hexadecimales), el BSSID es un nombre de identificación único de todos los paquetes de una red inalámbrica (Wi-Fi) para identificarlos como parte de esa red

Después los calcula uniendo los dos con posibles coincidencias,así es posibles coincidencias,estas coincidencias son los paswords por defecto del router.

En la versión de cydia podemos instalar diccionarios,los cuales son bases de datos SQLite3 empaquetados en un .deb para poder instalarlos y así la app consultar el arreglo que es el SSID y BSSID juntos.

Como dije son posibles contraseñas que son usadas por defecto en la configuración del router al usar algoritmos pésimos las compañías de telecomunicación,aun así imagínense 6 bases de datos con mas de 2 millones de contraseñas:


Como he dicho antes en entradas similares a esta,funcionara y en muchas ocasiones ya que no muchos cambian la contraseña o el nombre de la red,conque cambien alguna de esas dos cosas ya no funcionara al no tener uno de los dos datos necesarios.

Existen muchos programas que usan este algoritmo(solución) mas que nada en Windows,en Linux tenemos por ejemplo aircrack-ng que si crackea la red.

Esto es automático en la versión de cydia,pero en la version de applestore tenemos que hacerlo manualmente:

Tutorial

1.Abrimos la app y elegimos la red,por ejemplo:

Infinitum

En el nombre(SSID) no hay problema es el que nos muestra en ajustes,lo apuntamos en algo y lo escribimos.

En MAC es la MAC (BSSID) del router,para aberiguarla hay varias formas pero aqui la tonteria:

No podemos desde el iPhone!!!
No se que tiene apple contra el escaneo de redes pero existia una app muy buena llamada wifianalizer o wififofum que mostraban esta informacion pero apple las borro :(

Yo aun la tengo,pero de nada sirve se supone que no tienes jailbreak:



Bien por ejemplo si usas Linux en el escritorio,puedes usar el script que programe que en parte lo reprograme por esto:

Enlace

O usar esta tubería Unix(como root):

iwlist wlan0 scan | grep -B 5 "essid de la red" | sed -n "1p" | awk '{print $5}'

Ahora con eso listo metemos el MAC en el iPhone y calculamos :



Y listo nos manda un password,lo pegamos en la configuración y listo(en este caso) :D



Como dije,si cambian el nombre de la red,el password,es WPA2 no funcionara.

Para buscar el MAC desde Mac pueden usar KisMAC-ng :

Enlace de descarga

O si usan Mountain Lion solo van a NetWork Utilities

En windows pueden usar NetSumbler

Enlace de Descarga

Aunque se me hace una tonteria usar un programa de Pc para poder usar una app de smartphone,pero bueno.

Leer más...

Detecta intrusos en tu red wifi desde el iPhone

Hace un tiempo hable de fing para Linux,un escaner de red similar a nmap que se usa desde la consola en Linux,no se si en windows y os x también pero en Linux se usa desde la consola,en esta entrada veremos que fing esta iOS con version de firmware 4.3 para arriba.

Fing es una utilidad muy similar a nmap en cuanto a funcionalidad y desde la limpia interfaz de iOS podremos averiguar:

Nuestra MAC

Muestra nuestra ISP en ubicación geográfica(Axtel,Telmex,etc(por ejemplo en México))


Reverse DNS:

 Nombres NetBIOS

Y lo que es el titulo de esta entrada,muestra todas las maquinas conectadas a tu red local,entre ellos algunos intrusos :P


Pues eso es todo,tambien detecta los servicios que esta ejecutando el host(dispositivo) que indiquemos,puerto 80,445,etc.

Eso es todo :D

Descarga
O búscalo como fing en appstore es gratuito.

Leer más...

Script para buscar wifi desde terminal [Actualizado]

Le hice una actualizacion a este pequeño script,el cual logra que nos conectemos por wifi desde la consola,este script lo cree para instalar Gentoo hace un tiempo ya que me conectaba a wifi desde la shell o tty y era un poco complicado andar de un lado a otro conectandome desde la shell,esto se puede solucionar con un solo comando o un pequeño script pero como me conecto a varias redes wifi,de amigos,familia,abiertas,etc no era una opcion solo hacer algo como:

 #!/bin/bash  
 iwconfig wlan0 essid "red" key clave  
 dhcpcd wlan0  
 exit 0;  

Cree el script para ayudarme y para ayudar a los que tengan el mismo problema que yo,ya que para usar solo se descarga desde una pc con internet,lo pasamos a una usb y la conectamos a nuestra distro, en mi caso Gentoo y como es solo tty seria algo como:

fdisk -l | sed -n '$p' | awk '{print $1}' # Para ver el usb

mnt /dev/sdx /media # Para montar el usb en media

cd /media && cp scan.sh ~/ # Para copiar el script a nuestro home

Y finalmente

bash scan.sh

Para ejecutar,todo debe ser como root.



Lo que le añadí a este script es que busca el BSSID y checa si la conexión es abierta,si es abierta al elegirla automaticamente hace un dhcpcd para asignarnos una ip,si tiene clave wep nos la pide,si tiene wpa o wpa2,da error ya que eso se hace con wpa suplicant :( y no le he añadido soporte.

Otras cuestiones a tomar es que la interfaz de red debe estar activa,(tener instalado los drivers(modulos) en el sistema tener dhcpcd o un programa que nos asigne una ip, y no estar corriendo un daemon como wicd o networkmanager porque da error de comunicacion(además de que no debería porque esta pensado para usuarios que no tienen interfaz,a menos que uses wicd en modo curses),bien eso es todo,les dejo el script


Enlace
Nota: Crea un archivo que se llama redes.temp,si tienes uno que se llama igual en la carpeta del script lo va a borrar. 

Esta hecho a base de tuberias de comunicacion Unix para el filtrado de datos.

Puede que piensen que algo como wicd-curses es una mejor opcion y de hecho si,yo tambien lo pense y no tenia internet para descargarlo y cuando me di cuenta ya habia programado este script que tambien puede usar dhclient,dhcpcd,pump,udhcpc,udhcpd solo que hay que configurar en el script:D

Luego le hago una Interfaz grafica :P

Saludos :D
Leer más...