febrero 2015

miércoles, 25 de febrero de 2015

Otra forma de entender recursividad en programación


Un amigo me comentó que jamás entendió recursividad y después de hacerlo sufrir un poco, (como todo buen amigo jeje), le expliqué recursividad a mi manera. Lo primero que le dije fue, - la recursividad es un bucle while desglosado, con la diferencia de que en recursividad regresamos un valor que podría ser utilizado o asignado.- Continua leyendo para que conozcas el porqué.
Nota: Los ejemplos estan realizados en c.
"Se denomina llamada recursiva (o recursividad), a aquellas funciones que en su algoritmo, hacen referencia a sí misma." (Python para principiantes)
Imagina que tenemos que imprimir un texto tres veces con un ciclo while, un ejemplo de esto sería:
int main(void){
    num=3;
    while(num>=1){
        printf("Hola Mundo!!");
        num--;
    }
    return 0;
}
Si esto lo pasamos a una función recursiva quedaría así:
int imprime(int num){
    if ( num>=1 ){
        printf("Hola Mundo!!");        
        return imprime(num-1);
} else {
        return 0;
    }
}

int main(void) {

    imprime(3);
    return 0;
}
Empecemos viendo las similitudes mientras vamos corriendo el código mentalmente:
  • Al momento de llamar la función le pasamos el valor de 3, así que la variable num en la función imprime tendrá el valor de tres, igual que en el ejemplo del while.
  • Después se comprueba que la variable num sea mayor a 1 en ambos ejemplos, (aquí entra el ciclo while o el primer if y se imprime por primera vez el texto Hola Mundo). 
  • En el while se le resta uno a la variable num y empieza nuevamente el ciclo. En la función recursiva se vuelve a llamar a la función imprime, pasando el resultado de la resta (num-1). Por el momento no le pongas atención al return, eso lo explicaré más adelante.
  • Nuestra variable num=2, el proceso de comprobación sucede de nuevo, se imprime por segunda vez el texto y se resta nuevamente el valor de uno a la variable num. Esto sucede una vez mas hasta que el valor de la variable num es menor que uno.
Hasta aqui no creo que exista ningún problema, si es así te invito a comentarlo.

Si has notado, el texto se imprime tres veces, el ciclo while debe de terminar en la siguiente comprobación y el if en la función recursiva ya no es verdadera. Hasta este punto la función ha sido llamada cuatro veces y tenemos pendiente el retorno del valor. En este caso, el valor de cero se regresará sin ser utilizado ni asignado. Por ejemplo, si modificamos el código anterior para imprimir el valor que regresa nuestra función el resultado sería.
Hola mundo
Hola mundo
Hola mundo
0
Para explicar el return utilizaré un ejemplo muy utilizado en la enseñanza de las funciones recursivas, que es la obtención del factorial.
#include <stdio.h>
int factorial(int num){
    if (num > 1){
        return num*factorial(num-1);
    } else {
        return 1;
    }
}

int main (void){

    printf("%d\n",factorial(5));
    return 0;
}
Imagina que cuando se llama la función factorial se crea un recuadro, y cada vez que la función factorial se llama a sí misma se crea un nuevo recuadro dentro del anterior. La función deja de llamarse a sí misma hasta que llega la variable num al valor de uno, regresando ese valor.

Cuando se inicia el retorno de los valores, se realizan las operaciones pendientes en el returns anteriores. Tal vez una imagen ayude a entenderlo un poco más.

animación recursividad garpillo


Es muy importante tener en cuenta que siempre que podamos evitar las funciones recursivas será mejor (ocupa menos memoria de ram y se ejecuta más rápidamente). Pero hay casos donde el usar de recursividad hace mucho más sencillo el desarrollo de un algoritmo.

miércoles, 11 de febrero de 2015

Configurar msmtp para enviar correos desde consola en Linux




Msmtp es un cliente de SMTP muy simple, personalizable y fácil de usar. Podemos enviar correos desde la terminal utilizando una cuenta de correo existente. Puedes configurar el servidor que tu quieras, yo te muestro tres. Hotmail, Gmail y Yahoo.

Para poder utilizarlo debemos instalarlo utilizando el gestor de descargas de nuestra distribución, además necesitamos instalar ca-certificates, sin el, los servidores no nos permitirán conectarnos.
sudo pacman -S msmtp ca-certificates
Una vez instalado creamos el archivo ~/.msmtprc y agregamos lo siguiente.

 nano ~/.msmtprc
 ~/.msmtprc

defaults tls on tls_starttls on tls_trust_file /etc/ssl/certs/ca-certificates.crt logfile ~/.msmtp.log # Gmail account gmail host smtp.gmail.com port 587 auth on from usuario@gmail.com user usuario password lacontraseña # Hotmail account hotmail host smtp.live.com port 587 auth on user usuario@hotmail.com password lacontraseña from usuario@hotmail.com # Yahoo account yahoo host smtp.mail.yahoo.com port 587 auth on user usuario@yahoo.com password lacontraseña from usuario@yahoo.com # Set a deafault account account default : gmail
Remplaza los valores usuario y lacontraseña por los tuyos.
Debemos tener permiso de lectura y escritura sobre el archivo:
chmod 600 ~/.msmtprc
Y probamos:

echo "Estoy enviando un correo desde consola con msmtp" | msmtp -a default usuario@dominio.com
El correo se enviará con la cuenta que tengamos definida en account default en nuestro archivo msmtprc o podemos cambiar en el comando anterior la opción default por hotmail, yahoo o gmail. Debes de cambiar usuario@dominio.com por la dirección del usuario al que le enviarás el correo, (por ejemplo la tuya).

Utilizando Gnu PG

Nunca está de más la seguridad, para eso nos podemos apoyar en Gnu PG (GPG) y evitar guardar la contraseña en texto plano, aunque podemos utilizar cualquier otra herramienta de cifrado. Al utilizar passwordeval podemos lanzar un programa externo. Encriptando:
 echo -e "lacontraseña\n" | gpg --encrypt -o .msmtp-gmail.gpg
Y en nuestro archivo de configuración cambiamos password por passwordeval y su valor de esta manera:
 passwordeval    "gpg --quiet --for-your-eyes-only --decrypt ~/.msmtp-gmail.pgp"

jueves, 5 de febrero de 2015

Cambiar iconos de Oblogout


oblogout final garpillo


Oblogout es un script configurable para la escritura de cierre de sesión que presenta una interfaz gráfica (es decir, botones) para cancelar, cerrar sesión, reiniciar, apagar, suspender, hibernar, y bloquear la pantalla. Es usado principalmente por los usuarios de openbox.

Para cambiar los iconos podemos buscar algunos temas en devianart o en google, aunque si no encuentras alguno que te guste puedes buscar imágenes y hacer tus combinaciones. (El tamaño de las imágenes en la captura de pantalla es de 64x64).


Si creamos nuestro tema tenemos que nombrar cada imagen con su respectiva acción, es decir, si el botón lo queremos para reiniciar su nombre será restart, si es para apagar shutdown, etc.

Las imágenes las guardamos dentro de una carpeta llamada oblogout, ésta carpeta a la vez la guardamos en otra con el nombre que tu quieras prefieras. Esto es importante ya que si no se hace de esta manera oblogout no la tomará en cuenta.


Después copiaremos la carpeta de nuestro tema a themes, en mi caso el nombre de los iconos que uso son Moka-Minimal.
sudo cp -r  ~/Moka-Minimal /usr/share/themes/

Para terminar tenemos que editar el archivo /etc/oblogput.conf con nuestro editor favorito.
sudo vi /etc/oblogout.conf

En ese archivo buscamos donde dice:
buttontheme = oxygen

y lo modifican por el nombre de de su tema
buttontheme = Moka-Minimal

Guardamos y con esto ya deben de tener los nuevos iconos.

Extra

Si tu quieres modificar el orden o eliminar alguna de las opciones que muestra oblogout, puedes hacerlo en el mismo archivo, busca

buttons = cancel, logout, restart, shutdown, suspend, hibernate, lock
si eliminas alguna opción, ésta ya no se mostrará, el orden de las opciones puede modificarse también en esta propiedad.