Script en bash para redimensionar imágenes

| | Add comment | Trackbacks (0)

El script funciona de la siguiente forma:

 user@host:~$ script directorio 800x600

Donde:

script es el archivo que contiene este codigo y que guardamos en la carpeta bin

directorio es el directorio que contiene las imágenes que vamos a redimensionar

y 800x600 es el nuevo tamaño que vamos a asignar

 

Nota: este script no es recursivo, por lo tanto no toma las imágenes de los subdirectorios del directorio dado

 

#!/bin/bash

E_BADPARAMS=99
E_BADDIRECTORY=100

if [[ -z "$1" || -z "$2" ]]
then
    echo "Usage example: scriptname /home/user/Pictures -resize 800x600"
    exit $E_BADPARAMS
else
    dir=$1
    if [[ -d "$dir" || -d ./"$dir" ]]
    then
        size=$2
        if [[ $dir =~ .*[^/]$ ]]
        then
            dir=$dir/
        fi
        for file in "$dir"*.{jpg,JPG,png,PNG}
        do
            if [ -f "$file" ]
            then
                echo "Convirtiendo $file ..."
                convert "$file" -resize $size "$file".tmp
                mv "$file".tmp "$file"
                if [ -t "$file".tmp ]
                then
                    rm "$file".tmp
                fi
            fi
        done
    else
        echo "Bad directory."
        exit $E_BADDIRECTORY
    fi
fi

He encontrado 2 buenos algoritmos para convertir un numero decimal a binario a través de estas funciones que reciben el numero entero en base 10 a convertir y devuelven una cadena de caractéres con los dígitos del mismo número ya convertido a base 2.

 

Python versión 2.7 

 

def binario1(n):
 
    """este primer algoritmo utiliza la formula n = 2k + b"""
 
    if n == 0 or n == 1: return str(n)
 
    k = n / 2
 
    E = binario1(k)
 
    b = n % 2
 
    return str(E) + str(b)
 
 
def binario2(n):
 
    """y este va recorriendo 1 bit hacia la derecha en cada iteracion"""
 
    if n == 0: return str(n)
 
    b = ''
 
    while n > 0:
 
        b = str(n % 2) + b
 
        n >>= 1
 
        #de esta forma el numero se va dividiendo entre 2 para llegar a 0
 
        #y terminar el bucle
 
        #tambien podria ser de esta forma
 
        #n /= 2 
 
    return b

 

Siéntente libre de comentar que te parecieron y si conoces algún otro te invito a publicarlo, gracias 

N-ésima permutación lexicográfica

| | Add comment | Trackbacks (0)

En este post tenemos dos funciones en python para obtener la n-ésima permutación lexicográfica de un conjunto de elementos.

 

from functools import reduce
 
def factorial(n):
    """calcula el factorial de un numero"""
    #si n es mayor a uno realiza el calculo
    if n > 1: return reduce(lambda x, y: x * y, range(1, n + 1))
    #si no simplemente regresa 1
    else: return 1
 
def n_permutacion(n, lista):
    """obtiene la n-esima permutacion lexicografica de los elementos de una lista"""
    
    #creamos una funcion lambda para ir removiendo
    #los elementos que ya fijamos, por lo tanto los demas van cambiando
    remover = lambda lista, aremover: [i for i in lista if i != aremover]
    
    #cuando ya no hay elementos en la lista significa que los elementos
    #ya quedaron ordenados y terminamos, regresando [] (vacio)
    if not lista:
        return []
        
    #obtenemos div (divisor) y mod (modulo de n (numero de permutacion)
    #entre la longitud de la lista - 1)
    div, mod = divmod(n, factorial(len(lista)-1))
    #el primer elemento es igual al elemento que hay
    #en la posicion div de la lista   
    elemento = lista[div]
    #concatenamos el elemento actual con todos lo demas elementos
    #que nos valla regresando esta funcion, hasta que regrese []
    #notese que el modulo va disminuyendo y se va pasando como parametro
    return [elemento]+n_permutacion(mod, remover(lista, elemento))


 

Créditos:

http://pyeuler.wikidot.com/problems-21-30

Bueno como ya es de saberse en cada uno de los post donde exponga algún código de python sera de la versión 3.1 ó >, entonces no cabe la necesidad de estar mencionando la versión del lenguaje en el título del post.

Les presento un par de algoritmos muy parecidos ya que los dos usan la llamada criba de Eratóstenes para "cribar" los números primos de una sequencia de números. Ambos usan una sequencia 1..2000000.

La criba de Eratóstenes

 

 

Nota:

Si conoces algún algoritmo más eficiente tienes la libertad de comentarlo, gracias

#inicializamos el tamano de la sequencia de numeros
n = 2000000
#se usa un conjunto porque es mas eficiente
#(no hay numeros repetidos)
noprimos = set()
 
#iteramos desde 2 hasta la raiz cuadrada de n
#y desde lo que lleva i, hasta n / i
#esto nos permite obtener todos los multiplos de i
#y agregarlos a el conjunto noprimos
for i in range(2, int(n ** .5) + 1):
    if i not in noprimos:
        for j in range(i, int(n / i) + 1): noprimos.add(i * j)
        
#por ultimo creamos una lista con todos los numeros
#primos desde 2 hasta n
primos = [p for p in range(2, n + 1) if p not in noprimos]

Créditos:

http://es.wikipedia.org/wiki/Criba_de_Eratóstenes

 

y aquí esta el otro que a mi parecer es más eficiente

#inicializamos la criba como una lista con n elementos True
 
criba = [True] * n
 
#iteramos desde 2 hasta la raiz cuadrada de n
#y desde lo que lleva i, por i, hasta n
for i in range(2, int(n ** .5) + 1):
    for j in range(i * i, n + 1, i):
        #esto nos permite poner False en la posicion j - i de la criba
        #porque j es un multiplo de i y por lo tanto no es primo
        criba[j - 1] = False
 
#por ultimo "cribamos" todos los numeros primos desde 2
#hasta la longitud de la criba
primos = [p for p in range(2, len(criba) + 1) if criba[p - 1])]


Créditos:

http://www.s-anand.net/euler.html

El día de hoy estuve buscando con un algoritmo para obtener una lista de factores primos de un número y me tope con esté que me pareció muy interesante

def factorizar(n):
    #almacenamos los resultados
    #de la factorizacion en una lista
    l = []
    num1 = n
    #mientras podamos dividir por 2
    #el dos es un factor
    while num1 % 2 == 0:
        l.append(2)
        num1 /= 2
    #ahora probamos con los impares
    #empezando por el 3
    cuenta = 3
    raiz = int(math.sqrt(num1))
    while cuenta <= raiz and num1 > 1:
        if num1 % cuenta == 0:
            l.append(cuenta)
            num1 /= cuenta
        else:
            cuenta += 2
    if num1 > 1:
        l.append(num1)
    return l  
 

Créditos

http://latecladeescape.com/recetas-algoritmicas/descomposicion-en-factores-primos.html

Ya tengo algún tiempo con este pequeño script el cual en pocas palabras lo que hace es actualizarme la lista de paquetes en ubuntu e instalarme opcionalmente nuevos paquetes así como eliminarme paquetes en desuso y tratar de corregirme aquellos con dependecias incumplidas.

Pueden apreciarlo aquí:

 

#!/bin/bash

# Actualiza el sistema y remueve paquetes no necesarios
update() {
    echo -e "\n********** ACTUALIZANDO EL SISTEMA **********\n"
    echo -e "1. ACTUALIZANDO LA LISTA DE PAQUETES...\n"
    sudo apt-get update 1> /dev/null
    echo -e "2. ACTUALIZANDO...\n"
    sudo apt-get upgrade
    echo -e "\n3. CHECANDO DEPENDENCIAS INCUMPLIDAS...\n"
    sudo apt-get check  1> /dev/null
    echo -e "4. CORRIGIENDO DEPENDENCIAS INCUMPLIDAS...\n"
    sudo apt-get install -fy 1> /dev/null
    echo -e "********** ELIMINADO PAQUETES BASURA **********\n"
    echo -e "5. DESINSTALANDO PAQUETES EN DESUSO...\n"
    sudo apt-get autoremove
    echo -e "\n6. BORRANDO ARCHIVOS DESCARGADOS...\n"
    sudo apt-get autoclean 1> /dev/null
    echo -e "7. BORRANDO ARCHIVOS ANTIGUOS DESCARGADOS...\n"
    sudo apt-get clean 1> /dev/null
}

sudo true
update
echo -e "********** ^^ LISTO ^^ **********"
sleep 1
clear

#mas info en [man apt-get] o [apt-get --help] (mas breve)

 

Por último les recomiendo que cualquier script que hagan, lo guarden en un directorio que este incluido en el $PATH esto es en la variable de entorno para las rutas. Para que lo puedan ejecutar desde la terminal, p.e. yo nombre a mi script "update", entonces cada vez que lo quiero ejecutar voy a la terminal y escribo:

update 

y me da la sig. salida:

user@host:~$ update
[sudo] password for user:

********** ACTUALIZANDO EL SISTEMA **********

1. ACTUALIZANDO LA LISTA DE PAQUETES...

2. ACTUALIZANDO...

Leyendo lista de paquetes... Hecho
Creando árbol de dependencias      
Leyendo la información de estado... Hecho
0 actualizados, 0 se instalarán, 0 para eliminar y 0 no actualizados.

3. CHECANDO DEPENDENCIAS INCUMPLIDAS...

4. CORRIGIENDO DEPENDENCIAS INCUMPLIDAS...

********** ELIMINADO PAQUETES BASURA **********

5. DESINSTALANDO PAQUETES EN DESUSO...

Leyendo lista de paquetes... Hecho
Creando árbol de dependencias      
Leyendo la información de estado... Hecho
0 actualizados, 0 se instalarán, 0 para eliminar y 0 no actualizados.

6. BORRANDO ARCHIVOS DESCARGADOS...

7. BORRANDO ARCHIVOS ANTIGUOS DESCARGADOS...

********** ^^ LISTO ^^ **********

Recomendación:

Ejecuta este comando hasta que en todas las secciones te aparezca

 0 actualizados, 0 se instalarán, 0 para eliminar y 0 no actualizados.

Esto significa que ya no hay paquetes por actualizar, instalar, eliminar y actualizar, y que por lo tanto 0 paquetes se actualizaron.

 

Dudas?, comentarios?

Bienvenidos a mi nuevo Blog de programación

| | Add comment | Trackbacks (0)

Soy estudiante de Ingeniería en Software y además estudio por mi cuenta los lenguajes de programación: python, perl y bash (porque estos no me los enseñan en la escuela :()

Mi intención es compartir lo más relevante de python (en especial) que valla aprendiendo y aprender más en base a las sugerencias y críticas constructivas que puedan surjir.

Te agradezco si quieres colaborar conmigo.

Saludos

Jorge Luna

(pythonista)