martes 14 de febrero de 2012

Script para enviar Twitts de manera automática usando Bash y Twidge

Hace un tiempo instalé "Twidge", un cliente Twitter que se utiliza desde el prompt, en este caso lo uso desde Bash, hice un pequeño script que envía Twitts automáticamente leyendo línea a línea un archivo de texto, adosa la línea que está leyendo en ese momento y envía el Twitt.

La configuración de Twidge es sencilla, se debe ejecutar:

twidge setup

Posteriormente arroja un enlace que se debe abrir desde el navegador web, luego, se ingresa el PIN que determine el Twitter oficial de la cuenta donde esté abierta la sesión en el navegador.

Por ahora utilicé tiempos marcados, es decir, defino un valor constante para variar el lapso de tiempo que usa el script para enviar la línea que está leyendo en un determinado momento.

Ejemplo de un archivo de texto:

Mi twitt número 1 es para hacer una prueba de envío
El segundo para asegurar que llegó
El tercero es para no seguir enviando

El script de prueba que hice quedó de la siguiente manera:

#!/bin/bash

TIEMPO=$1
TIEMPO=$((TIEMPO*60))
ARCHIVO=$2
TAM=$(wc -l "$HOME/$ARCHIVO" | cut -d" " -f1)
CONT=1

cat "$HOME/$ARCHIVO" | while read LINEA
do
 echo "$LINEA" > /tmp/twitt.tmp
 twidge update < /tmp/twitt.tmp
 if [ $CONT != $TAM ]; then
  SEG=$(((TIEMPO/CONT)*TAM))
  CONT=$((CONT+1))
  sleep ${SEG}
 fi
done
rm -rf /tmp/twitt.tmp
exit 0

Lo llamé enviaTwitt.sh, asigné los permisos de ejecución y lo guardé en /usr/local/bin/ para ejecutarlo desde cualquier ruta donde esté ubicado en la shell de comando.

Se usa de la siguiente forma:

enviaTwitt.sh 4 archivoDeTexto

Donde el 4 indica el valor constante para la formula del tiempo y archivoDeTexto es el archivo donde tendré guardadas mis líneas de publicación, cada línea con un máximo de 140 caracteres.

sábado 4 de febrero de 2012

PingüinoVE

Hace un tiempo, se vienen gestando algunas investigaciones y prácticas en base a lo que se denomina Hardware Libre, esto con miras a obtener un producto electrónico con las capacidades de ser programado, utilizado en el área industrial, la domótica, la robótica, entre otras.

Joan Espinoza, ha realizado gran parte de dicho proyecto, es el precursor en Venezuela y lleva la batuta en un grupo que hoy día, se integra de personas particulares, estudiantes, algunos empresarios y gente motivada al desarrollo del software y hardware libre, ya que una de las herramientas que complementa el PingüinoVE, es Linux y algunas aplicaciones como su IDE, que está hecho bajo software libre.

Acá una foto de muestra, la última presentación de placa de PingüinoVE, recientemente me llegó, tenía una versión muy vieja:


Si quieres más información al respecto, puedes visitar la página oficial de PingüinoVE.

jueves 2 de febrero de 2012

Mezclar 2 archivos en bash

Estuve realizando unas prácticas mezclando 2 archivos de texto, juntar la primera línea de archivoA con la primera línea de archivoB, archivoA tenía en su contenido:

perro
loro
gallo

Mientras que archivoB tenía en su contenido:

come perra harina
come alpiste
come maíz

Entonces el script quedó de la siguiente forma:

#!/bin/bash

ARCHIVO1=$1
ARCHIVO2=$2

TAM1=$(wc -l ${ARCHIVO1} | awk '{print $1}')
TAM2=$(wc -l ${ARCHIVO2} | awk '{print $1}')

if [ ${TAM1} -eq ${TAM2} ]; then
        for i in $(seq 1 ${TAM1})
        do
              ARCHIVOA=$(head -${i} ${ARCHIVO1} | tail -1)
              ARCHIVOB=$(head -${i} ${ARCHIVO2} | tail -1)
              echo "${ARCHIVOA} ${ARCHIVOB}"
        done
else
        echo "Los archivos no tienen la misma cantidad de líneas"
fi

exit 0

Para ejecutar se le otorgan los privilegios de ejecución al script.sh y se corre de la siguiente manera:

./script.sh archivo1 archivo2

Es una manera sencilla de mezclar o relacionar el contenido de 2 archivos línea por línea.

lunes 30 de enero de 2012

Condición if en Bash

Dentro de las herramientas que se suelen usar en la programación es la sintaxis condicional if, muchas veces creamos condiciones que van desde comparar dos valores y establecer la acción que determine la condición.

if [ $val1 == $val2 ]; then
     echo "Son iguales";
else
     echo "No son iguales";
fi

Sin embargo muchas veces en teoría esto no funciona, puesto que para determinar o crear la verdadera condición, no se reconocen los signos de mayor que, menor que, mayor o igual que, y el resto. Para ello existen unos comodines.
  • -le Menor o igual que "<=".
  • -ge Mayor o igual que ">=".
  • -lt Menor que "<".
  • -gt Mayor que ">".
  • -eq Igual que "==".
  • -ne Distinto que "<>".
Entonces podemos crear nuestra sintaxis dentro de un pequeño script:

#!/bin/bash

echo "Introduzca el primer valor: ";
read val1;
echo "Introduzca el segundo valor: ";
read val2;

if [ $val1 -eq $val2 ]; then
     echo "Son iguales";
else
     echo "No son iguales";
fi

domingo 29 de enero de 2012

Redirección de sitios web a través de Apache

Hace un tiempo, viendo la necesidad de hacer más fácil al usuario final el uso de las aplicaciones, me trajo a ésta publicación, el caso es que se tenía un sitio web con un puerto específico, la aplicación es una caja negra la cual nadie quiere meterle mano, puesto que decidí buscarme una forma de hacer llegar la conexión hasta el sitio sin tener tantos inconvenientes.

Anteriormente se tenía que escribir http://nom_servidor:num_puerto/sitio_especifico/ en el navegador para entrar a la aplicación, se podrán imaginar el rompecabezas para un usuario que no está acostumbrado a usar la informática en niveles altos.

Bien, para solucionar la situación se usó un trampolín, otro servidor(B) web que no tienen nada que ver con el servidor(A) caja negra, desde el servidor(B) se configuró un host virtual de Apache, se activó el módulo mod_alias y se configuró un alias o cname en el DNS principal.

El SO usado en el servidor(B) trampolín es Debian Etch, la versión de Apache v2 y como usuario root.

Inicialmente el módulo se cargó como se hace típicamente con el comando de Apache:

# a2enmod alias

Luego:

# invoke-rc.d apache2 reload

Editamos nuestro host virtual en /etc/apache2/sites-available/sitio_especifico y agregamos en el contenido:

<VirtualHost *:80>
     ServerName sitio_especifico
     ServerAlias sitio_especifico.dominio
     Redirect   /   http://servidor_caja_negra:num_puerto/sitio_especifico/
</VirtualHost>

Para activar el host virtual debemos también ejecutar el comando típico de Apache:

# a2ensite sitio_especifico

Luego:

# invoke-rc.d apache2 reload

Desde luego, se debe añadir en nuestro DNS principal el sitio_especifico asociado a la dirección IP del servidor(B) trampolín. Si usamos Bind como servidor DNS, sería añadir una línea parecida a la siguiente:

sitio_especifico A direccion_ip_servidor(B)

Al final queda probar desde el navegador escribiendo http://sitio_especifico para comprobar el resultado de lo establecido.

sábado 28 de enero de 2012

Palíndromos y capicúa con bash

Hace un tiempo, un amigo necesitaba crear un pequeño script que validara si una palabra o frase era palíndromo o si un número era capicúa usando como lenguaje el bash de Linux, nos montamos en la tarea hasta dar con la solución, conseguimos múltiples ejemplos pero no funcionaban correctamente, aquí está nuestro aporte:

#! /bin/bash

echo "Introduzca una frase, palabra o número para verificar si es palindromo o capicua"
read VAR

# Configuro tamaño real de la variable a evaluar
CAPTAM=$(echo $VAR | wc -c)     
TAM=$(($CAPTAM-1))              
STR=$VAR

# Quito los espacios si existe una frase con espacios
for j in $(seq 1 1 $TAM)
do
        CONCAT=$CONCAT$(echo $VAR | cut -f$j -d" ")
done

# Vuelvo a configurar el tamaño real
CAPTAM1=$(echo $CONCAT | wc -c) 
TAM1=$(($CAPTAM1-1))

# Divido la lectura hacia delante y hacia atrás de la frase, palabra o número 
# en dos variables para luego compararlas
for i in $(seq 1 1 $TAM1)
do
        ESP=$ESP$(echo $CONCAT | cut -c $TAM1)
        FRENTE=$FRENTE$(echo $CONCAT | cut -c $i)
        TAM1=$(($TAM1-1))
done

# Comparo las dos variables
if [ "$ESP" != "$FRENTE" ]; then
        echo "No es palindromo o capicua"
        exit 0
fi

echo "Si es palindromo o capicua"

exit 0

Lo guardamos con un nombre ej. palindrome.sh, se le asignaron los atributos correspondientes para un archivo ejecutable, ejecutamos:

$ ./palindrome.sh

Posteriormente sale el mensaje para ingresar una palabra, frase o número para verificar.

Como nota curiosa, existe un comando que invierte palabras, frases y números de una entrada, se puede usar de la siguiente manera:

$ echo Satelite Guayana | rev

viernes 27 de enero de 2012

Conexión vía socket con python

En el Congreso Nacional de Software Libre de 2009, tuve el agrado de participar en un taller de python, dictado por Juan Hernández donde explicó ciertas sentencias y algo de la lógica de python, anteriormente lo había leído poco pero no había incursionado de lleno en el lenguaje.

Después de eso, unos amigos necesitaban hacer un trabajo de conexión entre dos máquinas vía socket, en vista de la oportunidad de ayudar, decidí hacer el proyecto con python, conseguí buena información y de varios lugares oficiales de python algunos ejemplos.

El programa consiste en aumentar el valor de una variable o decrementar dicho valor, para eso usamos dos condiciones y el valor de la variable que se desea aumentar. Trataré de explicar un poco el programa a ver si puedo expresarlo.

Se crea un archivo para el servidor, donde se realiza todo el proceso, al archivo lo llamé "servidor.py", su contenido está lo siguiente:

#!/usr/bin/python

import socket

con = socket.socket()
con.bind(("localhost", 9999))
con.listen(1)
val = 0

sc, addr = con.accept()

while True:
    recibido = sc.recv(1024)
    if recibido == "1":
        recval = sc.recv(1024)
        val = int(recval) + val
        print "Aumento a:", val
    else:
        if recibido == "2":
            recval = sc.recv(1024)
            val = val - int(recval)
            print "Disminuyo a:", val
        else:
            if recibido == "q" or recval == "q":
                break
            else:
                print "Debe ingresar 1 para incrementar"
                print "Debe ingresar 2 para decrementar"
                print "Debe ingresar q para salir"
                break

print "Cerrando conexion"

sc.close()
con.close()

Posteriormente creado los archivos, debemos darle permisos de ejecución, se debe tomar en cuenta que primero se ejecuta el archivo servidor.py, puesto que es el que abre el puerto de escucha esperando una solicitud de algún cliente, luego ejecuto el cliente.py quien enviará los datos suministrados al servidor.

En los archivos donde aparece:

con.bind(("localhost", 9999)

El anterior archivo servidor.py y en el archivo cliente.py:

con.connect(("localhost", 9999)

Donde se declara localhost podemos declarar la dirección IP de nuestro servidor, en ambos archivos, la práctica la realizamos en una misma máquina y en dos máquinas, una como servidor, en ambos casos siempre se coloca la dirección IP del servidor, tanto en el archivo servidor.py como en el cliente.py.

El programa es muy sencillo y fácil de interpretar.