Mostrando las entradas con la etiqueta unix. Mostrar todas las entradas
Mostrando las entradas con la etiqueta unix. Mostrar todas las entradas

jueves, 31 de julio de 2014

Buscar archivos encriptados con gpg en Linux

Veamos como encontrar archivos que estén encriptados con GPG usando la herramienta find,esto nos sirve para encontrar archivos previamente encriptados por si posterior mente queremos o intentaremos abrirlos:


Solo abrimos una terminal y ejecutamos:

find ./ -exec file {} \; | grep 'GPG\|PGP'


Esto funciona para cifrado simétrico como el que vimos en la entrada pasada.

Eso es todo :D

Leer más...

martes, 10 de junio de 2014

Como automatizar nuestros scripts con cron

Este tutorial es para poder crear scripts "croneados",cron viene de chronos(tiempo),así que podríamos decir que ejecutar scripts cada cierto tiempo,pueden ser scripts en Bash,Perl,Awk o lo que sea,programas en C,C++,etc,mas que scripts son tareas o ordenes.

Por eso se llama así la entrada ya que un script son ordenes,mas que nada seria para ejecutar tareas importantes,como por ejemplo algo relacionado con apache,pero también podríamos poner recordatorios de cosas cotidianas.

Cron es un demonio,en los sistemas de tipo Unix es lo que se conoce como un proceso en segundo plano,cron estaría como "vigilando" el sistema cada cierto tiempo si es que se lo pidiéramos.

Vamos a hacer un ejemplo,tenemos que hacer algo a las cinco de la tarde,y se nos olvida :\ para eso esta cron "a pequeña escala" ya que no es un ejemplo muy bueno a menos que estemos todo el dia en la Pc,pero como podríamos crear un recordatorio en Linux?

Para empezar usamos una notificación,este script sirve:


1
2
3
4
#!/bin/bash
# Archivo :  ~/.scripts_cron/recordatorio.sh

notify-send "Recordatorio importante"

Por ejemplo lo vamos a guardar en ~/.scripts_cron/

Creamos el directorio:

Desde terminal tecleamos:

mkdir ~/.scripts_cron/

Y lo guardamos con el nombre recordatorio.sh

Le debemos dar permiso de ejecución ya que cron ejecuta ordenes(ejecutables):

chmod +x ~/.scripts_cron/recordatorio.sh

Luego como hacemos que se ejecute en una hora?

Para esto usamos crontab.

Para ello ejecutamos:

crontab -e

Nos abrirá la configuración de nuestro usuario con el editor de consola que tengamos en la variable de entorno EDITOR,para verla:

echo $EDITOR

Si no sale nada puede que el editor sea vi,para definir nano por ejemplo usamos:

export EDITOR=gedit

Si queremos que sea el editor de siempre,ejecutamos:

echo 'export EDITOR=gedit' >> ~/.bashrc


Bien,incluso creo que cron mismo da la opcion de elegir nuestro editor.

La sintaxis de cron es esta:


minuto hora dia mes dia_semana ejecutable


Explico:

minuto es en formato : 0 a 59 si desean siempre(cada minuto),usar *,si desean minutos específicos usar comas.

hora es en formato : 0 a 23 : 0 son las doce de la noche,las doce del dia son 12,ejecutar cada hora usar *,ejecutar horas seleccionadas usar comas.

dia es en formato : día de mes (1-31[dependiendo de los días del mes]),ejecutar todos los días usar *,ejecutar días seleccionados usar comas.

mes es en formato : 1 a 12 o las primeras tres letras del mes en ingles,para ejecutar todos los meses usar *,para ejecutar mas de un mes,usar comas.

dia_semana es en formato : 0 a 6 (domingo es cero,lunes 1,etc),o usar las tres primeras letras del nombre en ingles,para todos los dias usar *,para mas de un dia usar comas.

ejecutable es en formato : /ruta_ejecutable

Bien como ejecutamos el script a las 5 de la tarde,añadimos al final del archivo:

0 17 * * * /home/tu_usuario/.scripts_cron/recordatorio.sh

Eso es todo,ahora deberíamos ver el recordatorio a las cinco,antes que nos confiemos en esto vamos a probar ya que puede haber errores:


Error 1 no esta activo el demonio:

Para saber si esta activo ejecutamos en terminal:

 ps -ef | grep cron | grep -v grep

Si no muestra nada lo reiniciamos:

sudo service cron restart

Error 2 ejecutar programas con interfaz gráfica:


Si ejecutamos programas que se muestran en la pantalla debemos setear la variable de entorno DYSPLAY a :0

 env DISPLAY=:0

0 17 * * *  env DISPLAY=:0 /home/tu_usuario/.scripts_cron/recordatorio.sh

Error 3 nuestro usuario no puede ejecutar tareas con cron:

 Puede que nuestro usuario este agregado al archivo:

/etc/cron.deny
Si es así no podemos ejecutar cron,asi que editamos el archivo como root.

Por otro lado el fichero cron.allow permite a los usuarios que esten en el ejecutar cron.

Lo malo es que basado en el sistema que usemos puede que este en distintos directorios,lo buscamos con:

sudo find / -name \cron.deny -type f

Si muestra una ruta la editamos,si no no es este el problema.



Eso es todo,bueno antes de que acabe el tutorial debo aclarar que crontab tiene variables especiales,pero no es muy buena idea usarlas ya que se pueden remplazar con la sintaxis mencionada,la unica variable que no tiene remplazo es la acción de que se ejecute cada vez que se reinicie la Pc:

@reboot

Su uso es así:

@reboot script_a_ejecutar

Eso es todo :D


Leer más...

sábado, 8 de febrero de 2014

[Shell] Guardar mas comandos en history Linux

Muchas veces vemos en el historial comandos que hemos tecleado,muchas veces ni los recordamos y es por eso que los tecleamos,por ejemplo que hayamos usando un estándar de unix,un pipe o un comando que es difícil volver a escribir o simplemente no recordamos como era.

En Ubuntu por defecto el historial de history es de 2000 comandos,yo lo tengo en 20000,ya que uso mucho,pero mucho la terminal,así que si la usan igual o quieren registrar lo que escriben (puede que 1000,2000 quede corto) aquí veremos como:

Tutorial

Bien esto es bien sencillo,lo único que tenemos que hacer es cambiar dos variables de entorno,o una si así lo deseamos,las cuales son:

HISTSIZE # Numero de lineas que se muestran cuando tecleamos history

HISTFILESIZE # Numero de lineas que se guardan en el archivo

HISTFILE # Archivo donde esta el historial

Bien las que nos interesan son las dos primeras,mas especifico la segunda,ya que la primera es cuando tecleamos history,vean yo lo tengo en 20:


Para cambiar estas variables lo podemos hacer de varias formas,pero primero hay que localizar nuestro .bashrc :

Esta en nuestro home,a menos que hayamos cambiado esto:

Lo editamos:

nano ~/.bashrc

Lo buscamos :


Si no existen las variables las crean,si existen las actualizan, salimos:

Ctrl+x

Y reiniciamos la shell;

reset

Si queremos hacerlo con un editor de flujo y ahorrarnos el trabajo de entrar podemos usar sed:

sed -i -e 's/HISTSIZE.*/HISTSIZE=200/' ~/.bashrc

sed -i -e 's/HISTFILESIZE.*/HISTFILESIZE=20000/' ~/.bashrc

Si ven esto un poco peligroso,porque tecleamos cosas que no queremos que vea cualquiera,solo añaden un espacio al principio y no se guarda el comando.



Eso es todo.

Leer más...

miércoles, 5 de febrero de 2014

Como listar archivos con filtrado en Perl

En esta ocasion vamos a aprender como listar los archivos de un directorio con filtrado de extension,por ejemplo listar los .txt,los .png,etc.

En perl las cosas se pueden hacer de muchas maneras,así que vamos a ver algunas(no todas),pero las que me gustan o conozco:

En todos los ejemplos,el array @archivos contendrá los archivos filtrados,este sera el que pueden usar para lo que necesiten.


1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
use feature 'switch'; # Usamos switch

my $dir = "."; # . hace referencia al directorio actual

my @archivos;

 opendir(my $recorrer, $dir) || die "Error :( $! \n";  # recorrer es el filehandle
    while(readdir $recorrer){  # Leemos el directorio
        if (-f $dir . "/" . $_) { # Vemos si es un fichero
            given ($_) { 
                when (/.*jpg/) { # Elegimos la extension
                     push (@archivos, $_); # Añadimos al array el archivo
                }
                when (/.*jpeg/) { # Elegimos otra(si queremos)
                    push (@archivos, $_);
                }
            }
        } 
    }
    closedir $recorrer;  # Cerramos el directorio

Bien ese es que yo uso mas,es un poco a lo Java,pero me gusta que se vea mucho codigo,aunque luego me dicen que mientra menos mejor,y en perl eso es muy simple.

Bien ahora una forma mas sencilla,usando glob al estilo python,glob es similar a los pipes de Unix:

my @arr = glob("*.jpg");

Así de sencillo,aquí el problema es para añadir mas,podemos hacer esto si quisieramos tambien los .jpeg.


1
2
3
4
foreach (glob("*.jpeg")) 
{
   push (@archivos, $_);
}

Bien,ahora una manera aun mas sencilla:

my @arr = <*.jpg>;
De igual manera si queremos añadir mas:


1
2
3
4
foreach (<*.jpeg>)) 
{
   push (@archivos, $_);
}

Si queremos usar un directorio en especifico lo especificamos antes:

my @archivos = ;

Ahora por ejemplo para mostrar en pantalla:


1
2
3
4
5
6
7
use feature 'say';

my @archivos = <*.pl>;

foreach (@archivos) {    
    say $_;
}


Eso es todo.
Leer más...

jueves, 24 de octubre de 2013

Tutorial PHP-CLI introduccion

Bien,PHP es otro lenguaje de los que se podrian quedar en sitio,el cual seria el ultimo,asi que ya vere en unos dias que haga cuentas cual lenguaje le favorece mas al sitio:

Java Ruby o PHP-CLI

Bien en el tutorial de Ruby dije que no me interesaba en lo absoluto el desarrollo web y tal vez sea algo evidente como lo mencione,bien PHP no solo es para programación web sino que es de uso general,yo he visto programas en PHP+Gtk lo cual es raro ya que php es para lenguaje del servidor,pero también se puede usar para scripting,osea lineas de ordenes que nos faciliten la administración del sistema,sistemas de la familia Unix,es raro pero si.

Lo he visto en programación web y es bueno aunque un tanto sucio,por ejemplo la forma en la que wordpress lo usa embebido es sorprendente,pero sucio,pero muy útil,también otra cosa es que para aprender programación PHP como se debe se necesita saber Apache(o saber manipular alguna interfaz web),saber alguna base de datos,como MySQL,saber HTML y CSS para la vista,ademas de javascript si queremos usar también lenguaje de lado del cliente.

Por ejemplo necesitamos lenguaje de programación del lado del cliente y del lado del servidor,lenguaje de marcado,lenguaje de consulta,scripting para administrar el servidor,osea una vida :P.

O también podríamos usar DOM+PHP.

Bueno en esta introducción empezamos desde cero,osea desde lo que seria el principio básico,variables,archivos,etc.

Primero que nada PHP quiere decir Hypertext Pre-processor.lo que seria algo como Procesador de Hipertexto,o manipulador de Hipertexto,esta bajo su propia licencia la cual se considera  software libre,aunque no es compatible con GPL, :O(así son las leyes).

Bueno y que es PHP-CLI,PHP-CLI es la forma de usar PHP en linea de comandos CLI(Interfaz de linea de comandos,osea comunicación por Shell),esto es bueno para las personas como yo que hacen todo desde la terminal,así que bueno vamos a comenzar con PHP-CLI.

Primero que nada instalar,en ubuntu es fácil con:

sudo apt-get install php5-cli
Para otros sistemas no se cual sea el nombre del paquete,pero lo pueden buscar como,php5-cli:

Por ejemplo en Gentoo:

eix  php5-cli

Luego instalan el paquete señalado y les instala las dependencias y el paquete.

Ahora vamos a crear un archivo PHP,el cual seria como un script,el archivo le damos extensión .php, se pueden usar mas extensiones,pero el comun es .php,por ejemplo,desde la misma terminal abrimos nuestro editor de texto(en mi caso vim) y escribimos:

Abrimos:

vim holamundo.php

Luego añadimos el hashbang,con la ruta del ejecutable de php,por ejemplo:

#!/usr/bin/php
Pueden ver la ruta del ejecutable desde la linea de comandos con:

which php

O crear directamente un archivo con el hashbang desde la linea de comandos,así:

echo -e "#\x21`which php`" > holamundo.php

Bien ahora también van las llaves de PHP,estas llaves son necesarias tambien en PHP-CLI,las cuales son:

<?php //codigo ?>
Antes que otra cosa debemos crear ese código,un estilo así:




Bien ahora el primer hola mundo,como PHP ya es conocido vamos a hacer algo mas avanzado que un simple echo:


1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/php

<?php

if ($argc == 3) // Vemos el numero de argumentos
{
    hola($argv[1],$argv[2]); // Si son tres ejecutamos esto
} 
else 
{
    echo "Uso ".$argv[0]." texto1 texto2"; // Si no ejecutamos esto
}

?>

<?php
function hola($x,$y) // Función a ejecutar
{
    echo $x." ".$y; // Mostramos en pantalla
}
?>

 Para ejecutar podemos hacerlo de varias formas,la primera es dándole permisos de ejecución y que haga su trabajo el hashbang:

chmod +x holamundo.php

Y ejecutamos:

./holamundo.php
Otra forma también es ejecutar el archivo con el programa php,usando de argumento -f(file),así:

php -f  holamundo.php
O así directamente:

php holamundo.php


Bien,ahora vamos a ver entrada por teclado,para que se vea la diferencia entre Linea de comandos y Programación Web,ya que normalmente toma los parámetros PHP desde el HTML o desde la barra del navegador,asi que bueno vamos a hacer un simple código que pregunta el nombre y saluda:

Usamos la función trim para almacenar en una variable lo que devuelva fgets escaneando el STDIN(Entrada estándar(teclado)) quitando los espacios del principio y el final:


1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#!/usr/bin/php

<?php

echo "Como te llamas : ";

$nom = trim(fgets(STDIN)); 
if ($nom != "")
{
    echo "Hola ".$nom."\n";
}
else 
{
    echo "Tal vez luego\n";
}

?>




Bien de momento es todo,veremos si se queda PHP-CLI para introducirnos mas a fondo en este mundo.
Leer más...

sábado, 12 de octubre de 2013

Tutorial SQlite3 con Python3 en Linux

SQLite es una herramienta que nos permite guardar bases de datos portables para poder usarlas en programas,scripts,etc sin tener que acceder a conexiones de Bases de Datos establecidas en un servidor especifico,en otras palabras(mis palabras) SQLite es como un MySQL portable, SQLite usa una variante no estándar del lenguaje SQL,por lo cual si conoces el lenguaje SQL como con MySQL,no sera dificil comprender el funcionamiento de SQLite.

Primero que nada debemos tener instalado el modulo para Python,en Linux no debe haber problema,he oído que en otros sistemas si,pero en GNU/Linux no,pero de todos modos comprobamos:

python -c 'import sqlite3'

Si no ven ningún error no hay problema,si ven alguno tendrán que instalar,por ejemplo con pip:

pip install sqlite3

Bueno,primero que nada vamos a abrir nuestro editor de texto favorito para comenzar con los ejemplos,pueden usar la consola de python,pero yo recomiendo un editor y la shell de bash(la termina):

O sea dos terminales:



En mi caso vim(desde aquí se puede ejecutar el código sin usar otra terminal,pero yo uso dos).

Primero que nada vamos a crear un archivo .db,si no existe lo crea si no se conecta a el.

Vamos a crear una variable objeto para conectarnos al archivo  que guardara la base de datos:

db = sqlite3.connect('hola.db')

En estos momentos ya creamos un objeto para manipular la base de datos hola.db,ahora lo que tenemos que crear es un cursor para movernos(por así decirlo) dentro de la db,osea ejecutar comandos de lenguaje SQL en la DB:

cur = db.cursor()

Ahora vamos a ejecutar algunos comandos básicos de SQL con la función execute(este tutorial supone que tienes conocimientos básicos de lenguaje SQL):

cur.execute('CREATE TABLE holamundo(pal1 text,pal2 text)')

cur.execute('INSERT INTO holamundo VALUES("Hola","Mundo")')

Con eso ya tendriamos creada una DB basica,ahora vamos a guardar lo que hicimos con la funcion commit de la db:

db.commit()
Siempre debemos ejecutar commit o no guardara los cambios.

Por ultimo vamos a ejecutar la funcion close para que cierre la conexion:

db.close()

Podemos ejecutar nuestro script,asi quedaria:

 #!/usr/bin/env python3  
 import sqlite3  
 db = sqlite3.connect('hola.db')  
 cur = db.cursor()  
 cur.execute('CREATE TABLE holamundo(pal1 text,pal2 text)')  
 cur.execute('INSERT INTO holamundo VALUES("Hola","Mundo")')  
 db.commit()  
 db.close()  

Y listo tenemos una base de datos portable,si no me creen pueden ejecutar la shell de sqlite3 de linux:

sqlite3 hola.db

.tables

SELECT * FROM hola


Bien funciona :D.

Las ordenes que dimos con exec,las podemos dar en una sola linea ejecutando un script interno,con la función executescript del cursor:

Primero vamos a usar comillas triples,que son para varios comentarios,como DATA<< en Perl,Ruby o como --[[ ]]-- en lua:

cur.executescript("""
    CREATE TABLE holamundo(pal1 text,pal2 text);
    INSERT INTO holamundo VALUES("Hola","Mundo");
    INSERT INTO holamundo VALUES("Hola","desde SQLite Python");
""")

Añadí un comando mas para ver como funciona,en este caso no necesitamos hacer un commit ya que agrega y hace un commit internamente en cada orden.

Ya vimos como agregar ahora como obtener:

Para obtener los datos que necesitamos hay varias maneras,primero la mas sencilla,pero menos potente llamar un único valor:

Como se ve arriba el comando execute usa comandos SQL,si usamos comandos de creación crea,pero si usamos comandos de recuperación donde quedan?

Quedan en variables especiales que se convierten en tuplas,en este caso la función fetchone devuelve una tupla del primer valor que coincida:

cur.execute("SELECT * FROM holamundo")
print (cur.fetchone())

Eso nos devuelve una tupla desde una funcion,por lo cual es valido hacer esto:

print (cur.fetchone()[0])

Bien,pero si queremos todo?

Es fácil saberlo (sabiendo ingles básico),con el comando fetchall:

La cual nos devuelve una tupla de dos dimensiones(en este caso),ya que la primera dimensión contiene las dos tuplas que creamos,y la segunda dimensión contiene los valores de cada tupla:

print (cur.fetchall())

Por lo cual es valido hacer esto:

print (cur.fetchall()[1][1])

En este caso nos devuelve esto:



Bien,hay otra forma de recuperación de datos la cual es iterando sobre una orden de ejecución,ya que como nos devuelve una tupla podemos iterar sobre ella:

for tup in cur.execute("SELECT * FROM holamundo"): # Iteramos en la primera dimencion
    for val in tup: # Iteramos en la segunda dimencion
        print (val)
     
Bien vamos a temas mas avanzados de agregación de datos.

Supongamos que queremos poner un dato en la query que ejecuta la API de SQLite,en otras palabras queremos definir los valores que introduciremos en la tabla desde una variable,como le hacemos,¿Podemos usar formateo de cadenas?,Si,por ejemplo:

Borren la DB que creamos desde la shell:


rm hola.db

 #!/usr/bin/env python3  
 import sqlite3  
 db = sqlite3.connect('hola.db')  
 cur = db.cursor()  
 #cur.execute('CREATE TABLE holamundo(pal1 text,pal2 text)')  
 cur.execute("SELECT * FROM holamundo")  
 x,y = "Hola","Mundo" # Creamos variables  
 cur.execute('INSERT INTO holamundo VALUES ("%s","%s")' %(x,y)) # Formateamos  
 db.commit()  
 db.close()  

Eso se puede hacer,pero no se debe hacer,porque?

Por la vulnerabilidad de formateo de strings,por ejemplo una Inyección SQL.

Entonces que hacemos?

Podemos hacerlo de dos maneras creamos un dato tipo diccionario para que la query parse el valor desde los valores de un diccionario que es clave/valor o usando una tupla que no se puede cambiar el valor:

Primer ejemplo, metodo qmark:

cur.execute('INSER INTO holamundo VALUES(?,?)',(x,y))

En este caso usamos un estilo de formateo,pero con el símbolo (?) y le pasamos el valor desde una tupla,la cual no se puede modificar.

Segundo ejemplo, metodo de nombre:

cur.execute('SELECT * FROM holamundo WHERE pal1=:hola',{"hola":"Hola"});

print(cur.fetchall())

Este se ve un poco mas complejo pero es fácil,solo hay que pesarle los valores de un diccionario y como es una string para que no de error de valor debemos anteponer dos puntos en la query SQL,veamos otro ejemplo:

x,y = "Hola", "Mundo" # X vale Hola,Y vale Mundo

dic = {'x':x,'y':y} # Adentro del diccionario X vale X que a la vez vale Hola,Y vale Y que a la vez vale Mundo

cur.execute("INSERT INTO holamundo VALUES(:x,:y)",dic) # Insertamos los valores del diccionario,anteponemos dos puntos para que se reconozca como string.

Ahora como podemos ver las columnas?,ya que podemos ver los valores que contienen pero las columnas?

Aquí falta ver que columnas son las que contienen Hola y Mundo que serian pal1 y pal2,para ello vamos a cambiar el atributo row_factory de la db a sqlite3.Row:

db.row_factory = sqlite3.Row

cur = db.cursor()

cur.execute("SELECT * FROM holamundo")

Ahora podemos acceder a las llaves de la tupla que se crea cuando buscamos algo,recuerdan fetchone:

for i in cur.fetchone().keys():
    print(i)
 
También compatible con len:

print(len(cur.fetchone().keys()))

De esa manera tendremos las columnas de la tabla ya que por defecto fetch nos devuelve una tupla sqlite,y de esta manera nos devuelve una columna sqlite compatible con las funciones keys,len,entre otra.

De hecho la funcion sqlite3.Row es opcional,podemos programar nuestra propia funcion para que sea igual al parametro de row_factory de la DB,es un poco largo de explicar pero veamos un poco:

Creamos una funcion que sea igual a row:_factory,este parametro nos pasa argumentos,asi que vamos a recorrerlos con,con *args(recuerdan el tutorial):

 #!/usr/bin/env python3  
 import sqlite3  
 def datos(*args):  
   for i in args:  
     print (i)  
 db = sqlite3.connect('hola.db')  
 db.row_factory = datos  
 cur = db.cursor()
 cur.execute("select * from holamundo")
 print(cur.fetchone())
 db.close()  

Eso nos dirá los argumentos que nos manda,los cuales son:

El primero es un objeto mas específicamente un cursor,el segundo es la columna que regresa la query que ejecutamos y nos manda un tercero Nulo(None):

Así que podemos hacer esto,para ver las funciones que tienen:

 for i in dir(args[0]):
        print i

for i in dir(args[1]):
        print i

Y nos muestra las funciones de cada uno,en la pagina oficial nos muestra una manera de crear un diccionario,en este ejemplo seria así:

 import sqlite3  
   
 def dict_factory(cursor, row):  
   d = {}  
   for idx, col in enumerate(cursor.description):  
     d[col[0]] = row[idx]  
   return d  
   
 con = sqlite3.connect("hola.db")  
 con.row_factory = dict_factory  
 cur = con.cursor()  
 cur.execute("select * from holamundo")  
   
 print (type(cur.fetchone()))  
   
 for k in cur.fetchone():  
   print (k,"->",cur.fetchone()[k])
   

Todo lo que hicimos lo podemos hacer conectandonos directamente a la memoria ram,el cual nos dara un espacio de trabajo temporal,no lo recomiendo a menos de que sea un trabajo especial como un manejo de memoria basada en un algoritmo temporal,osea como una actualización basada en datos actuales que pueden cambiar,normalmente podemos hacer todo el trabajo en archivos,como en este tutorial en la base hola.db,de todas formas podemos conectarnos a una base de datos creada directamente en la memoria RAM la base de datos se destruirá cuando se cierre la conexión:

Para hacerlo necesitamos usar el parámetro :memory: en la conexión:

  #!/usr/bin/env python3   
  import sqlite3   
  db = sqlite3.connect(':memory:')   
  cur = db.cursor()   
  cur.execute('CREATE TABLE holamundo(pal1 text,pal2 text)')   
  cur.execute('INSERT INTO holamundo VALUES("Hola","Mundo")')  
  cur.execute('SELECT * from holamundo')  
  print(cur.fetchall())   
  db.commit()   
  db.close()  
   

Bien con eso terminamos este tutorial,tal vez haga otra parte ya que falto lo mas avanzado que es crear funciones y clases para usarlas como extensión,pero de momento es todo.

Esto es muy útil cuando se programan juegos,por ejemplo con pygame,o para android,un ejemplo rápido es ponerle un historial de juegos ganados al juego de ahorcado que programe en perl,así es usar Python junto con Perl es sencillo usar lenguajes juntos,así que vamos a ver como quedaría el script y haber si le entienden o encuentran errores con lo que aprendimos en este tutorial:

 #!/usr/bin/ev python3  
   
 from sys import argv  
   
 import sqlite3  
   
 db = sqlite3.connect('records.db')  
 db.row_factory = sqlite3.Row  
 cur = db.cursor()  
 num = 0  
   
 query = "SELECT * FROM ahorcado order by puntuaje"  
   
 try:  
   cur.execute(query)  
 except:  
   cur.execute('CREATE TABLE ahorcado(nombre TEXT,puntuaje INTEGER)')  
   
 def mayor_pal(p):  
   global num  
   if len(p) > num:  
     num = len(p)  
   
 def agregar(x,y):  
   gamer = x  
   puntos = y  
   cur.execute("INSERT INTO ahorcado VALUES(:jugador,:puntuaje)",{"jugador":gamer,"puntuaje":puntos})  
   db.commit()  
   
 def ver(x):  
   for i in x.execute(query):  
     mayor_pal(i[0])   
   print "\tJugador",(" "*num),"Puntuaje\n"  
   for i in x.execute(query):  
     print "\t",i[0],(" "*(num+4)),i[1]  
   
 if len(argv) > 1:  
   if argv[1] == "-a" and len(argv) == 4:  
     agregar(argv[2],argv[3])  
   elif argv[1] == "-v":  
     ver(cur)  
   else:  
     exit()  
   
 db.close()  

Al juego de ahorcado le hice también unas pequeñas modificaciones.

Pueden descargarlo aquí:

Enlace

Esto lo he aprendido de la documentación oficial como siempre,así que pueden darle una leeida para que aprendan de la misma fuente que yo:

http://docs.python.org/2/library/sqlite3.html
Leer más...

jueves, 26 de septiembre de 2013

[ Shell ] Buscar archivos desde terminal con find

En esta ocasión aprenderemos como buscar archivos desde la terminal,algo muy básico ya que es de lo mas común que se hace en un sistema,buscar archivos.

Tal vez en el futuro veamos tutoriales de seguridad informática y les aseguro que solo vamos a usar este tipo de comandos.

Para empezar para que queremos usar este buscador si el explorador cuenta con uno propio?

Find es un programa tipo consola un backend para buscar archivos,y no solo encuentra lo que le digamos sino que podemos ejecutar una accion basado en eso,como borrar,reproducir,copiar,mover,etc.

El filtrado es muy poderoso y la respuesta tambien(el tiempo que tarda en buscar).

La sintaxis mas básica del programa es la siguiente:

find ruta -name nombre

En donde ruta es la ruta,como hemos visto en Unix:

. => Directorio actual

../ => Un direcotorio para atras

~ => Nuestro home

/ => Raiz

etc.

-name => Va seguido de un argumento que es el nombre.

Para el nombre podemos hacer algo muy exacto como:

-name "archivo123.txt"

Y busca el archivo123.txt en la ruta que le indicamos,o podemos hacer un filtrado con regex de Unix:

-name 'archivo???.txt'

-name 'arc*.txt'

etc.

En el caso de una regex de comodines como los anteriores podemos usar esta sintaxis:

-name \arc*.txt

Ya que no hay problema de espacios,en otro caso usar la regex entre comillas simples,o incluso el parámetro -regex.

Podemos hacer uso del parámetro -user para encontrar solo archivos pertenecientes a un usuario en especial,por ejemplo buscar archivos de root que esten en nuestro home:

find ~ -name \* -user root

Podemos hacer uso del parámetro -group para buscar un archivo que pertenezca ha ese grupo:

find ~ -name \* -group 100

El parámetro es numérico,100 es el grupo users(para mas info googlear groups id unix)

Tenemos algunas opciones para enlaces simbólicos:

-P => Nunca seguir

-L => Seguir

Podemos buscar ejecutables(archivos con permisos de ejecucion) con el parametro -executable,por ejemplo buscar script's en shell ejecutables en nuestro home:

find ~ -name \*.sh -executable -user $LOGNAME



También podemos listar los detalles de los archivos encontrados,con el parámetro -ls:

find . -name \*.sh -executable -ls

El cual nos muestra: El usuario,el grupo al que pertenece,los permisos,la fecha del ultimo

Puede que halla archivos y directorios con el mismo nombre,así que podemos evitar encontrar archivos y directorios,mostrando solo lo que queramos con el argumento -type{d para directorios,f para archivos}:

find ~ -name \*py* -type d # Directorios de python(por ejemplo)

find ~ -name \*py* -type f # Ficheros de python(por ejemplo)

Otros argumentos,l link,p FIFO,s socket.

Podemos buscar archivos basados en permisos con el parámetro -perm,por ejemplo buscar todos los script's en shell con permisos 775:

find . -name \*.sh -perm \755

Por ultimo tenemos el parametro -exec que nos permite ejecutar un programa y pasale el resultado de la búsqueda como argumentos:

Por ejemplo buscar todas las fotos .png y verlas con feh:

find ~ -name \*.png exec `which feh` {} +

Se recomienda poner toda la ruta del ejecutable,pero si no sabemos donde esta podemos buscarla con el comando which seguido del nombre del programa encerrado en esas comillas que no recuerdo como se llaman :P.

Eso es todo,no es todo,pero es lo que me parece mas importante para uso basico,para mas info,en terminal:

man find

Ultimo ejemplo del poder de find:

Buscar todos los videos,mp4 y reproducirlos con totem:

find ~ -user $LOGNAME -name \*.mp4 -exec `which totem` {} +

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

miércoles, 25 de septiembre de 2013

Abrir y escribir en archivos con lua (IO Library)

Los dos tutoriales anteriores han sido sobre lua,y van a ser muchos mas,en estos momentos ya se aprendio sobre tipos de datos y condicionales con estructuras de seleccion y de repeticion,asi que ya se puede entender perfectamente como abrir un archivo de texto y leerlo,modificarlo o crear uno y escribir en el.

Primero que nada vamos a usar las librerias del moudlo io de lua,Input,Output,entrada y salida,normalmente podriamos hacer un require para llamarlo,pero no es necesario en lua a menos que queramos cambiar el nombre del modulo,pero bueno,para no confundirnos de que modulo estamos usando podemos poner en la cabecera del archivo los require:

require 'io'

O entre comentarios,por si hacemos un programa grande y no recordamos que modulos usamos.

Primero que nada Lua es muy similar a C,ya que la función que vamos a usar se parece a fopen,de C solo que un poco diferente,creamos un objeto desde el momento que abrimos un archivo,y en C creamos un puntero,bueno de todas formas vamos a ver como se hace:

Primero que nada definimos una variable con el nombre del archivo,en lua se recomienda que las variables las comencemos con local,ya que si no es así tendrían ámbito en todo el programa,esta es la forma de privatizar variables,funciones,etc:

local filename = "Arechivo.txt"

Ahora debemos crear un objeto que abra el archivo o lo cree en dado caso,con la funcion(io.open):

file = io.open(filename,modo)

En donde dice filename,es el nombre del archivo,desde una variable o crudo(una string),en modo es el modo de apertura:

w : Abre o crea un archivo en modo escritura(borra el contenido si existe)

r : Abre el archivo en modo lectura

a : Abre el archivo en modo adición(no borra el contenido si existe)

Hay mas.

Ahora debemos hacer lo que queramos:

Para leer un archivo linea por linea debemos iterar con un bucle for,hasta que termine de leer el archivo:

Para leer todo un archivo:

Primero que nada debemos saber que no necesariamente debemos crear un objeto,para trabajar con el,podemos abrilo simplemente pasandole el nombre del archivo:
for line in io.lines(filename) do  print (line) end

Vamos como enumerar las lineas de un archivo

n = 1

for line in io.lines(filename) do 
  io.write(n) 
  print (line)
  n = n + 1 
end

Para escribir en un archivo se pude desviar el STDOUT(salida estandar),ya que normalmente es en el prompt(terminal,consola),podemos desviarlo a un archivo,así:


io.output(io.open(filename,"w"))
Ahora si escribimos durante todo el programa,la orden de io,write,que es con el que escribe en la consola,ahora escribira en el archivo:

io.write("Hola este es un ejemplo\n")
io.write("Desde io.write\n")
Cuando terminemos cerramos el io:

io.close()

De esa manera se puden leer y escribir en archivos,pero no es la mejor manera,la mejor manera es usar un objeto:
file = io.open(filename,modo)
Y luego usar sus funciones de clase,para empezar lua usa notacion de dos puntos(:),para las clases,para recorrer un archivo linea por linea se usa esta sintaxis:

file = io.open(filename,"r")
for line in file:lines() do print(line) end
Para escribir en un archivo de texto se usa esta sintaxis:

file = io.open(filename,"w")

file:write("Texto\n")

Y en ambos casos se debe cerrar el archivo,cuando se termine de hacer lo que se tiene que hacer:

file:close()

Veamos un programa mas complejo:




 #!/usr/bin/env lua  
 repeat   
  io.write("Nombre del archivo: ")  
  filename = io.read()  
 until filename ~= ""  
 n = 1  
 file = io.open(filename,"w")  
 print ("Escribe EOF para salir...")  
 while true do  
  io.write("Linea "..n.." : ")  
  local response = io.read()  
  if response == "EOF" then break end  
  file:write(response.."\n")  
  n = n + 1  
 end  
 io.close()  

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

martes, 24 de septiembre de 2013

Tutorial lua en linux (condicionales)

En esta parte de los tutoriales de Lua aprenderemos a usar condicionales o como aprendí a decirles,estructuras selectivas las cuales deciden que "camino" elegir para un programa,y decidir que ejecutar basado en esta elección.

Tenemos de ejemplo esto:

Voy a usar mi pc con Internet,primero debo ver si tengo electricidad,si tengo la prendo,si no la conecto o no la prendo,luego si la prendo necesito Internet,si hay lo uso,si no hay me conecto a wifi,etc.

Vamos a ver un ejemplo y después lo explico:

 #!/usr/bin/env lua  
   
 -- Vemos si tiene energia la pc  
   
 t = {"Si","No"}  
   
 math.randomseed(os.time())  
   
 num = math.random(1,2)  
   
 -- ^ Funciones para elegir un numero al azar y asociarlo a una respuesta  
   
 res = t[num] -- Asociamos respuesta  
   
 function enciende()  
     repeat  
       io.write("Encender? (S/N):")  
       response = io.read()  
     until response == "S" or response == "N"  
     if response == "S" then  
       print("Encendida :D")  
       while true do  
         io.write("Ejemplo terminado\nEscribe exit para salir: ")  
         local response = io.read()  
         if response == "exit" then  
           break  
         end  
       end  
       os.exit(0)  
     else  
       print ("No encendida")  
       print ("Hasta luego")  
       os.exit(0)  
     end  
 end  
   
 while true do  
   if res == "Si" then  
     print ("Tienes energia")  
     enciende()  
   else  
     print("No tienes energia")  
     repeat  
       io.write("Conectar a la luz? (S/N):")  
       response = io.read()  
     until response == "S" or response == "N"  
     if response == "S" then  
       res = t[1]  
     end  
     if response == "N" then  
       print ("No conectada,hasta luego.")  
       os.exit(0)  
     end  
   end  
 end  
   


Ahora lo ejecutan y podrán ver lo practicas que son las selecciones:



En este caso vimos las palabras especiales:

if,else,while,repeat,until,end


Primero que nada debemos saber que una estructura selectiva siempre decide basado en una condición verdadera,aunque esta sea falsa a simple vista:

Me explico,cuando un lenguaje de programación elige una acción se basa en una decisión verdadera,lógica booleana,verdadero o falso,en este caso en lua solo admite,false o true:

Vamos a ver unos ejemplos:

1 es igual a 1 -- Es verdadero

2 es igual a 1 -- Es falso

1 no es igual a 2 -- Es falso

1 es menor a 10 -- Verdadero

1 es mayor a 10 -- Falso


Para usar esto en lua se usan los simbolos de asociacion:

== -- Igual a

=~ -- No igual a

< -- Menor a

> -- Mayor a

<= -- Menor o igual a

>= -- Mayor o igual a

Ahora vemos los ejemplos de arriba con simbolos

1 == 1 -- Es verdadero

2 == 1 -- Es falso

1 ~= 2 -- Es verdadero

1 < 10 -- Verdadero

1 > 10 -- Falso

Bien sabiendo eso podemos usar las elecciones de control:

Las cuales son:

Si..
Si no..
No

La sintaxis es:

if condicion then -- Condición principal

elseif condicion then -- Segunda condición(opcional)

else -- Error en condicionales anteriores(opcional,es para manejo de errores)

end

Vamos a ver un ejemplo:

 uno = 1  
   
 if 1 == 1 then  
   print ("Es verdadero")  
 elseif 2 == 1 then  
   print("Es falso")  
 elseif 1 ~= 2 then  
   print ("Es verdadero")  
 elseif 1 < 10 then  
   print ("Verdadero")  
 elseif 1 > 10 then  
  print("Falso")  
 else  
   print("Otro valor")  
 end  

Si ejecutamos ese codigo obiamente no veremos la palabra es falso,ya que al ser falso no entra en la condicion,de hecho no pasa a las siguientes estructuras si encuentra una verdadera primero.

Si queremos probar todas las posibles concidencias verdaderas tendriamos que usar solo if's:

 if 1 == 1 then  
   print ("1 == 1 : Es verdadero")  
 end  
 if 2 == 1 then  
   print("2 == 1 : Es falso")  
 end  
 if 1 ~= 2 then  
   print ("1 ~= 2 : Es verdadero")  
 end  
 if 1 < 10 then  
   print ("1 < 10: Verdadero")  
 end  
 if 1 > 10 then  
   print("1 > 10 : Falso")  
 end  
   

Algo muy importante de lua es que no necesita identacion ni punto y coma,como es el caso de python en identacion(sangria) y perl(punto y coma),lua usa el estilo shell scripting o el de ruby,usa llaves de terminación,en el caso de if,else,elseif usa:

then -> end
o mas adelante veremos:

do -> end

Por ejemplo podemos hacer una if en una linea:

if 1 ~= 2 then print ("1 ~= 2 : Es verdadero") end

Pero como siempre hay reglas de una buena programación y es bueno identar,comentar,usar varias lineas,usar varios espacios de linea,etc.

Esas son las estructuras de elección,básica ahora vamos a ver las estructuras de repetición,también de elección ya que deciden igual basado en una respuesta booleana.

El primero es while,el cual repite el código hasta que su condición inicial termine,la sintaxis es:

while condicion do
    -- codigo a ejecutar
end

Con while podemos crear repeticiones infinitas (bucles infinitos),solo basta con crear una condicion infinita,una condición que no cambiara,por ejemplo:

while true do print("Bucle infinito") end

Si no tenemos una variable bandera o una terminación no esperada no terminara,a menos que cerremos el proceso del sistema.

Terminación inesperada con break:

while true do
    print ("Bucle no infinito)
    break
end

Terminación con variable bandera:

uno = 1

while uno == 1 do
    print ("Cambiamos el valor de uno,la variable que controla while")
    uno = 2
end

Bucle de repetición for,el bucle for se usa basado en una variable o variables banderas que hasta que terminen de recorrer su valor no se detendrá,la sintaxis es:

for var = inicio,final,argumento do
    -- codigo a ejecutar
end

Veamos un ejemplo de una cuenta hasta diez desde uno:

for var = 1,10 do
    print(var)
end

Una cuenta de 10 a uno:

for var = 10,1,-1 do
    print(var)
end

Una cuenta de 0 a 100 de 5 en 5:

for var = 0,100,5 do
    print(var)
end

Con un bluce while eso se puede escribir así:

var = 0
while var < 105 do
    print(var)
    var = var + 5
end

Normalmente lo que se puede hacer con un bucle se puede hacer con otro,otro ejemplo es el bucle repeat/until,solo que este es inverso al bucle while,el bucle while se rompe cuando la condición sea falsa y este se rompe cuando la condición sea verdadera:

var = 5
repeat
    print(var)
    var = var + 5
until var == 105

Pues eso es lo mas importante de las estructuras selectivas en lua,existen mas cosas como la iteracion,pero lo veremos cuando hable de funciones y tablas mas a fondo.
Leer más...

jueves, 5 de septiembre de 2013

Tutorial lua en linux (variables,tipos)

Esta un poco muerto el sitio y como lo he dicho antes esto se debe a que no hay mucho de que hablar en linux,ya que mucha información que necesitemos esta a un simple comando:

man algo

Y es un poco aburrido hacer un tutorial de algo que nadie va a usar.

Lua es un buen lenguaje que se usa de diversas formas y aquí vamos a usarlo como script,como lo hacemos con Python,Perl y Bash.

Así que hola Lua :D y espero que les funcionen estos tutoriales.

Bien antes que nada vamos a instalar:

En ubuntu y derivados basta con:

sudo apt-get install lua5.2

Y es la versión que usaremos la 5.2,para otros sistemas solo usen los comandos que usan normalmente,por ejemplo:

En gentoo buscamos:

eix lua

Y luego instalamos el paquete.

Bien todo esto lo haremos desde la consola así que primero que nada vamos a crear una carpeta donde trabajar:

mkdir ~/Documentos/lua

Por ejemplo.

Y nos cambiamos a ese directorio:

cd ~/Documentos/lua

Ahora vamos a escribir el primer programa:

Con nuestro editor favorito(de consola) creamos un archivo llamado hola.lua:

Los archivos lua regularmente tienen la extensión .lua.

La primera linea del script puede ser el hashbang ya que podemos ejecutar el script como un ejecutable,así que es recomendable:

# : hash

! : bang

/usr/bin/env : Ruta del programa env que busca a lua

lua : Y el nombre del ejecutable que usa como parametro env

#!/usr/bin/env lua

Con eso ya podemos darle permisos de ejecución a nuestros scripts y los podremos correr sin llamar el lenguaje nosotros mismos,por ejemplo:

Con hashbang un programa se puede ejecutar así:

chmod +x /ruta/script.lua

y

/ruta/script.lua

o así:

lua /ruta/script.lua

Y sin el hashbang solo se puede ejecutar así:

lua /ruta/script.lua

Ahora la segunda linea puede ser un comentario los cuales inician con un doble guion medio,por ejemplo :

-- Este es mi primer script en lua5

Normalmente esas lineas son necesarias en todos los scripts aunque son opcionales,aunque menos opcionales que los módulos.

Así que todos nuestros script tendrán el hashbang y uno o mas comentarios.

El programa Hola mundo es un programa que se muestra por el stdout(standart ouput[Salida estándar]).

El cual podemos llevar a cabo con la función print de lua o con la función io.write:

print ("Mi primer programa en Lua :D")
io.write("Hola Mundo!!!\n")





Bien esa es la bienvenida,ahora vamos a ver algunos tipos de datos:

Primero que nada tenemos que almacenar nuestro valor en una variable:

Los cuales son string(cadenas de texto),encerradas en comillas o comillas dobles:

cadena = "Una cadena de texto"

Numeros (sin tipo,nada de flotante y entero,etc):

Por ejemplo:

num_f = 3.14

num_d = 10

Booleanos que son solo true y false(nada de 0 y 1),lua solo ve booleanos con las palabras especiales true o false.

bool = true

Funciones,como las que nosotros mismos crearemos en futuros tutoriales y las que trae programadas,como print.

Y nil que es un valor único el que se otorga a la nada(por así decirlo).

Si no me creen ejecuten este programa:

#!/usr/bin/env lua
-- Este es mi segundo script en lua5

cadena = "Una cadena de texto"
num_f = 3.14
num_d = 10
bool = true

print ("Variable cadena es : "..type(cadena))
print("Variable num_f es : "..type(num_f))
print("Variable num_d es : "..type(num_d))
print("Variable bool es : "..type(bool))
print("Print es :"..type(print))

Eso pudo haber salido mejor:

#!/usr/bin/env lua
-- Este es mi segundo script en lua5
--
cadena = "Una cadena de texto"
num_f = 3.14
num_d = 10
bool = true

vars = {cadena,num_f,num_d,bool}
tipos = {"Variable cadena","Variable num_f","Variable num_d","Variable bool"}

for i = 1,#tipos do
    print (tipos[i].." es : "..type(vars[i]))
end


Y aun mejor,pero es lo que aprenderán en estos tutoriales,pero eso me recuerda que están también los tipos de datos table,que antes usamos para crear un menú para awesome:

El cual se define de esta manera:

tabla = {"Hola","Mundo"}

print (type(tabla))

Esa es una tabla básica de una dimensión,a la cual podemos acceder a sus elementos usando corchetes indicando su valor comenzando desde uno.

print(tabla[1].." "..tabla[2])

Aunque el valor 0 esta definido (como nil),podemos cambiarlo,por ejemplo por el nombre de la tabla,pero por defecto se comienza a contar desde 1:

tabla[0] = "tabla"

print(tabla[0])

O también podemos hacer algo como esto:

tabla = {[0] = "Hola","Mundo"}

Pero eso lo veremos en una entrada dedicada,a las tablas por ultimo veremos paso de argumentos y leer valor desde el teclado:

Para pasar un parámetro se usa la tabla especial arg,con el valor que queramos usar comenzando desde el cero:

#!/usr/bin/env lua
-- Mi tercer programa con lua5

print("Nombre del programa: "..arg[0])

for i = 1,#arg do -- El # quiere decir el numero de valores de la tabla
    print(i..": Argumento => "..arg[i])
end

Podemos ejecutar nuestro script como esta en la imagen:



Otro ejemplo clásico:

#!/usr/bin/env lua
-- Mi cuarto programa en lua
--

if #arg > 0 then
    print("Hola : "..arg[1])
else
    print("Uso: "..arg[0].." <nombre>")     
end

También cabe aclarar que los argumentos comienzan con el 0,pero también cuenta lo que esta antes del nombre,por ejemplo si ejecutamos de esta manera:

lua script.lua uno

Estos serian los argumentos:

lua = arg[-1]

script.lua = arg[0]

uno = arg[1]

Bien ahora vamos a ver como se haría esto fácilmente desde la lectura del teclado(stdin[Standart input]):

#!/usr/bin/env lua
-- Mi quinto programa en lua
--

print("exit para salir")

while true do
    io.write("Escribe tu nombre: ")
    nombre = io.read() -- Funcion que usamos para stdin
    if nombre == "exit" then
        print("Hola : "..nombre.." :P")
        break
    else
        print("Hola : "..nombre)
    end
end



Como ven lua es sencillo y podríamos usarlo en administración del sistema o muchas cosas ya que cuenta con modulos desde JSON,hasta MVC Web,pero aquí termina el primer tutorial.
Leer más...

martes, 27 de agosto de 2013

[Shell] Juego de ahorcado en Perl

Bueno,estaba un poco aburrido hace unos días y me programe este juego de ahorcado en perl,sirve sin módulos,solamente lenguaje perl,ya que no tenia Internet en ese momento para instalar algún modulo que le ayudara a verse mejor.

Para jugar bajan el paquete zip:

Enlace
Versión 2:

Enlace

Y lo descomprimen.

Luego entran a la la carpeta desde terminal,o con nautilus/dolphin y le dan abrir en terminal y escriben:

perl ahorcado.pl

Y eligen una categoría,por defecto esta una categoría de programación con nombres de lenguajes de programación,pero si quieren añadir mas solo entran a la carpeta categorías y crean un archivo con el nombre de la categoría con extensión .txt y adentro de este meten las palabras para jugar de esa categoría.


Las letras se ven rojas por la configuración de mi $PS1,eso es todo,luego le pongo modulos para mejorar la función clear que no me gusto nada usarla,o un modo multijugador en modo online local,etc.

Leer más...

lunes, 5 de agosto de 2013

Búsqueda de directorios en forma recursiva con python

Comentaban en una entrada de un comando como tree para Windows,el cual existe que es lstree.exe desde la cmd de Windows,pero también pensé en programar uno similar usando algún lenguaje de programación,como C o C++ para hacer tree para Windows pero como ya esta lstree.exe no es necesario asi que solo me quede con la idea del algoritmo,de como seria y es muy sencillo,una búsqueda recursiva de archivos y directorios,claro que tree tiene argumentos como ordenar alfabéticamente,solo directorios,mostrar bytes,etc pero luego del algoritmo principal se saca lo demás,así que para una búsqueda recursiva basta usar una función recursiva.

Y que tiene que ver python?

Pues python o ruby son muy sencillos y los uso para hacer prototipos,como un tipo de pseudocodigo que pueda ejecutar,ya que python es mucho mas sencillo que C,C++,C#,Java y bueno:

 #!/usr/bin/env python
 from glob import glob  
 from os import path  
 """  
 Algoritmo:  
   
 1.-Recorrer directorio y selecionar los directorios y archivos.  
   
 2.-Recorrer cada directorio y hacer lo mismo que el paso 1  
   
 """  
   
 def dirs(x,n):  # funcion principal
     di = glob(x+"/"+"*")  # vemos todo lo que esta adentro del directorio que nos manden
     tabs = "  "*n  # Algo de vista
     do = x.split('/')  # Esto es para mostrar el archivo(por culpa de glob)
     print tabs+do[-1]+" /"  # Mostramos la vista
     for i in di:  # Recorremos el directorio
         if path.isdir(i):  # Si es direcotorio
             dirs(i,n+1)  # Empezamos la función recursiva
         elif path.isfile(i):  # Si es archivo
             do = i.split('/')  # gracias a glob :/
             print "|"+tabs+do[-1]  # Lo mostramos
   
   
 if __name__ == "__main__":  # Asi se ejecutan los scripts
     dirs(".",0)  # Iniciamos el script buscando en el directorio actual
   

Veamos.

Creamos algunos archivos y carpetas:



tree :


El script en python:


Como ven le falta mucha vista,pero eso ya se hace teniendo el script principal,lo unico que queria mostrar era la busqueda recursiva usando una funcion recursiva.

Espero que les sirva :D.

Un extra para los Linuxeros/Unixeros:

 find . -print | sed 's;[^/]*/;->|   ;g'


Eso es todo :D.




Leer más...

miércoles, 31 de julio de 2013

[Shell] tee tuberia en T Unix

Bien,si han usado algun tipo Unix a de alguna forma rara o libre un tipo Unix conoceran las tuberias,o pipes Unix de comunicacion,pues esa tuberia es de solo dos lados,entrada y salida,pues bien si conocen los tubos en fotma de T sabran que tienen tres salidas,pues es eso lo que hace el comando tee,combierte nuesta tuberia en una T:

Imagen de : wikipedia

Bien,como vemos en la imagen de arriba lo que hace es tomar el primer comando meterlo en un archivo y luego continuar con el siguiente comando:

Por ejemplo:

wget -O- http://www.pagina.com/dvd.iso | tee dvd.iso | sha1sum > dvd.sha1

Bien,esto es lo que haria el flujo estandar de Unix:

>

Si queremos que haga esto:

>>

Tenemos que añadir -a a tee:

Por ejemplo

 ls ~/Descargas | tee archivos_selectos.txt | less && echo "Documentos : " >> archivos_selectos.txt; ls ~/Documentos | tee -a archivos_selectos.txt | less



Y con esto nos guarda los archivos de Descargas en un archivo,nos los muestra con less,y hace lo mismo con los archivos de Documentos sin rescribir todo el archivo.

También podemos añadir el parametro -i,que lo que hace es que ignore la señal SIGINT,el usado ctrl+c.

Referencia : wikipedia






Leer más...