Script para traducir textos desde linea de comandos Un script muy sencillo que nos permitira si queremos utilizar traducción instantaneo en nuestros pequeños programas de bash. Basicamente se hace uso de Google Translate Ajax API y de “curl” para hacer una petición HTTP con los parametros adecuados y se analiza la respuesta recibida, los parametros son el idioma “origen”, el idioma “destino” y el string que queremos traducir.
#!/usr/bin/env bash
# gtranslate.sh
# Translate using Google Translate Ajax API:
# http://ajax.googleapis.com/ajax/services/language/translate?v=1.0 \
# &langpair=en|es&q=hello+world
# More Info: http://code.google.com/apis/ajaxlanguage/documentation/
# ksaver (at identi.ca), March 2010.
# Licence: Public Domain Code.
progname=$(basename $0)
if [ -z "$3" ]
then
echo -e "Usage: $progname lang1 lang2 'string of words to translate...'"
echo -e "Example: $progname en es 'Hello World!'\n"
exit
fi
FROM="$1"
TO="$2"
# Google Translate Ajax API Url
TRANSURL='http://ajax.googleapis.com/ajax/services/language/translate?v=1.0'
LANGPAIR="$FROM|$TO"
shift 2
# Parse string to translate, change ' ' to '+'
# STRING: String to translate.
STRING="$@"
PSTRING=$(echo "$STRING" |tr ' ' '+')
# Get translation
RESPONSE=$(/usr/bin/env curl -s -A Mozilla \
$TRANSURL'&langpair='$LANGPAIR'&q='$PSTRING)
echo -n "$progname> "
# Parse and clean response, to show only translation.
echo "$RESPONSE" |cut -d ':' -f 3 |cut -d '}' -f 1
Para muchos de nosotros Gedit no es más que un editor de textos, reemplazo del clásico bloc de notas de Windows, en el que podemos modificar pequeños y simples (al carecer de formato) ficheros de texto como ficheros de configuración y/o propiedades.
Aunque mi entorno de desarrollo (IDE) suele ser Eclipse, de un tiempo a esta parte vengo utilizándolo muy a menudo para la creación y edición de scripts tanto en Bash como en Groovy (lenguaje que, por necesidades del cliente, me he visto “obligado” a aprender).
Cansado de la rutina de editar el fichero con GEdit (o vim si se terciaba), y tener abierta una terminal para probar lo que iba modificando me dio por investigar qué otras alternativas existen para ello descubriendo la potencia y flexibilidad del complemento Herramientas externas.
Activando el complemento
Tan sencillo como buscarlo en las preferencias de GEdit
y marcar la casilla correspondiente
para finalizar no queda más que configurarlo
Definiendo el primer script
Como introducción y, a modo de ejemplo, nos limitaremos a mostrar en consola el resultado de listar el contenido del directorio temporal del sistema (/tmp) para lo cual añadiremos un nuevo comando pulsando el botón existente para ello
y escribiremos el siguiente código en la zona de edición habilitada
ls -l /tmp
A modo de referencia podéis ver cómo he definido el resto de parámetros del script en la siguiente captura
destacando entre ellos
Tecla rápida para lanzar el script cuando estemos editando en GEdit sin tener que buscar el script en los menús de la aplicación
Guardar: Documento actual para evitarnos tener que preocuparnos de guardar el documento antes de lanzar el script. Con el valor Documento actual se guardará el fichero que estemos editando de modo que lo que se ejecute sea exactamente lo último que hemos escrito evitando de este modo falsos resultados (imagina que haces algunos cambios y ejecutas el script: se ejecutaría sobre lo último que tienes en disco que no coincide en absoluto con lo que estás viendo en pantalla)
Ejecutando scripts
Tan sencillo como pulsar la combinación de teclas definida en el paso anterior (CTRL+SHIFT+E en la configuración de referencia) y observar el resultado en el panel inferior del editor
NOTA: Curiosamente, si estás editando un documento nuevo que no ha sido guardado nunca en disco, el complemento se limita a pedirte dónde guardarlo y no ejecuta el script . En dicho caso dale un nombre y vuelve a lanzarlo pulsando nuevamente la combinación de teclas asociada.
El script definitivo
Una vez que hemos aprendido cómo funciona el complemento con un ejemplo sencillo (listar el contenido del directorio /tmp) pasemos a la finalidad de este artículo: ejecutar el contenido del script que estamos editando.
No tenemos más que cambiar el código del script anterior por éste:
GEdit es, en apariencia, un sencillo editor de textos que consume muy pocos recursos y que está llamado a convertirse en el equivalente a editores de textos como el UltraEdit de Windows (que al escribir este artículo acabo de descubrir que ya existe versión para Linux :O aunque, como era de esperar, no es Software libre )
Bonus tip
Para aquellos que les haya llamada la posibilidad de ejecutar scripts desde Gedit les recomiendo que le echen un vistazo a la colección de ejemplos de scripts que existe pues es mucho lo que se puede aprender de ellos.
De Google podemos decir cualquier cosa, excepto que sea predecible con sus nuevos servicios y aplicaciones. Y este es el caso de GoogleCL, una aplicación para acceder a los servicios de datos de la empresa desde la línea de comandos. Fue presentado con bombo y platillo hace no más de una semana y no es sino un gran script Python que usa las bibliotecas gdata (Google Data Protocol). Les presentaré unos ejemplos para comenzar a aprovecharlo.
Por ahora, GoogleCL soporta estos servicios:
Docs
google docs edit --title "Comandos Linux"
Blogger
google blogger post --title "Frase" "Si no te equivocas de vez en cuando, es que no lo intentas"
Calendar
google calendar add "Desayuno en Tiffany"
Contacts
google contacts list name,email > contactos-respaldo.csv
Picasa
google picasa create --title "Fotos vergonzosas" ~/fotos/familia/*.png
Youtube
google youtube post --category Education aprendiendo_navi.mp4
Instalación enUbuntu/Debian
Descarga el código fuente o bien el DEB para sistemas de la familia Debian. Elige tu favorita del sitio de descargas. La versión más reciente a la fecha es la 0.9.7. Desde Debian/Ubuntu ejecuta:
sudo dpkg -i googlecl_0.9.7-1_all.deb
Uso
Hay muchos ejemplos en el sitio de GoogleCL. Aquí me concentraré en mostrar cómo configurar el acceso a Google Docs desde la línea de comandos. Antes de eso debes saber que ejecutado sin argumentos, GoogleCL inicia una sesión interactiva a través del comando google, con el carácter “>” como prompt.
google
> help
Welcome to the Google CL tool!
Commands are broken into several parts: service, task, options, and arguments.
For example, in the command
[...más salida...]
Enter "> help <service>" for more information on a service.
Or, just "quit" to quit.
> help docs
Available tasks for service docs: 'edit', 'delete', 'list', 'upload', 'get'
edit: Edit a document
Requires: title Optional: format, editor
delete: Delete documents
Requires: none Optional: title
list: List documents
Requires: delimiter Optional: title, folder
upload: Upload a document
Requires: none Optional: title, folder, no-convert Arguments: PATH_TO_FILE
get: Download a document
Requires: (title OR folder) Arguments: LOCATION
> quit
Usaré la sesión interactiva en todos los ejemplos.
Es importante configurar el navegador que utilizaremos con GoogleCL para realizar ciertas tareas. Hay dos opciones: exportar una variable de ambiente BROWSER o editar el archivo de configuración de la aplicación. Te recomiendo esta última.
echo auth_browser=firefox >> ~./google/config
Desde el shell de GoogleCL y con ayuda de la documentación haremos unas sencillas tareas. Comencemos por obtener una lista de nuestros documentos. La primera vez te solicitará un usuario y luego que aceptes desde el navegador que GoogleCL pueda acceder a tu cuenta en el futuro.
google
> docs list
Please specify user: *****
Please log in and/or grant access via your browser at https://www.google.com
***** then hit enter.
El navegador que elegiste se abre y debes dar clic en “Grant access”. Un archivo access_tok_tu_usuario se crea bajo el directorio ~./google.
De ahora en adelante ya no será necesario autorizar nada para ese usuario. Después de aceptar, en el shell de google aparece un listado de tus archivos. Aquí muestro una vista parcial de la salida porque es extensa.
Lista de ejemplos,http://docs.google.com/Doc?docid=*****
Reporte 10-P,http://spreadsheets.google.com/ccc?key=*****
[... más salida ...]
Ahora edito un documento de texto con Vim.
docs edit --title "In the beginning was the command line" --editor vim
Y aquí lo descargo
docs get --title "In the beginning was the command line"
Downloading In the beginning was the command line to /home/eli/In the [...] .txt
Conclusiones
Como sucede con cualquier herramienta, GoogleCL puede ser tan poderoso como lo quieras. Sobre todo si lo incluyes en tus scripts personales. Además notarás que algunas opciones tienen bugs, pero ten paciencia y espera la versión 1.0 estable. Si eres frecuente usuario del shell y de los servicios de Google, encontrarás en GoogleCL un importante aliado para tu productividad.
Muchos servidores o sistemas Linux al tener demasiados archivos abiertos necesitan mucha SWAP y mucha RAM , para evitar que no se bloquee el servidor por tener la memoria SWAP llena, aqui teneis este script en bash para vaciar o liberar memoria o partición de intercambio (como lo queramos llamar) SWAP .
#!/bin/bash
echo -e "\nOutput of free before:"
free
swapoff -a ; swapon -a
echo -e "\nOutput of free after:"
free
echo "Swap Clean DONE¡"
Este script lo podeis guardar en un archivo, lo haceis ejecutable con «chmod +x archivo» y lo podeis poner en un CRON diario para que se vacie la partición SWAP
NOTA: para reducir la tendencia a usar SWAP se modifica el archivo sysctl.conf con el siguiente valor:
Bueno otro buen script a la huchaca… esta escrito en bash aparte de ser utilisisimo porque chequea las tablas fragmentadas y tambien chequea todas las bbdds en busca de tablas MyISAM o INNODB y las optimiza.
#!/bin/bash
VERSION="0.7.2" log="$PWD/mysql_error_log.txt"
echo "MySQL fragmentation finder (and fixer) v$VERSION, written by Phil Dufault ( http://www.dufault.info/ )"
showHelp() { echo -e "\tThis script only repairs MyISAM and InnoDB tables" echo -e "\t--help or -h\t\tthis menu" echo -e "\t--user username\tspecify mysql username to use\n\t\t\tusing this flag means the script will ask for a password during runtime, unless you supply..." echo -e "\t--password \"yourpassword\"" echo -e "\t--host hostname\tspecify mysql hostname to use, be it local (default) or remote" }
#s parse arguments while [[ $1 == -* ]]; do case "$1" in --help|-h) showHelp; exit 0;; --user) mysqlUser="$2"; shift 2;; --password) mysqlPass="$2"; shift 2;; --host) mysqlHost="$2"; shift 2;; --) shift; break;; esac done
# prevent overwriting the commandline args with the ones in .my.cnf, and check that .my.cnf exists if [[ ! $mysqlUser && -f "$HOME/.my.cnf" ]]; then if grep "user=" "$HOME/.my.cnf" >/dev/null 2>&1; then if grep "pass=" "$HOME/.my.cnf" >/dev/null 2>&1; then mysqlUser=$(grep user= < "$HOME/.my.cnf" | awk -F\" '{print $2}');
mysqlPass=$(grep pass= < "$HOME/.my.cnf" | awk -F\" '{print $2}');
if grep "host=" "$HOME/.my.cnf" >/dev/null 2>&1; then mysqlHost=$(grep host= < "$HOME/.my.cnf" | awk -F\" '{print $2}');
fi
else
echo "Found no pass line in your .my.cnf,, fix this or specify with --password"
fi
else
echo "Found no user line in your .my.cnf, fix this or specify with --user"
exit 1;
fi
fi # set localhost if no host is set anywhere else
if [[ ! $mysqlHost ]]; then
mysqlHost="127.0.0.1"
fi # error out
if [[ ! $mysqlUser ]]; then
echo "Authentication information not found as arguments, nor in $HOME/.my.cnf"
echo
showHelp
exit 1
fi if [[ ! $mysqlPass ]]; then
echo -n "Enter your MySQL password: "
read -s mysqlPass
fi # Test connecting to the database:
mysql -u"$mysqlUser" -p"$mysqlPass" -h"$mysqlHost" --skip-column-names --batch -e "show status" >/dev/null 2>&1 if [[ $? -gt 0 ]]; then echo "An error occured, check $log for more information."; exit 1; fi
# Retrieve the listing of databases: databases=( $(mysql -u"$mysqlUser" -p"$mysqlPass" -h"$mysqlHost" --skip-column-names --batch -e "show databases;" 2>"$log") ); if [[ $? -gt 0 ]]; then echo "An error occured, check $log for more information." exit 1; fi
echo -e "Found ${#databases[@]} databases"; for i in ${databases[@]}; do # get a list of all of the tables, grep for MyISAM or InnoDB, and then sort out the fragmented tables with awk fragmented=( $(mysql -u"$mysqlUser" -p"$mysqlPass" -h"$mysqlHost" --skip-column-names --batch -e "SHOW TABLE STATUS FROM $i;" 2>"$log" | awk '{print $1,$2,$10}' | egrep "MyISAM|InnoDB" | awk '$3 > 0' | awk '{print $1}') ); if [[ $? -gt 0 ]]; then echo "An error occured, check $log for more information." exit 1; fi tput sc echo -n "Checking $i ... "; if [[ ${#fragmented[@]} -gt 0 ]]; then if [[ ${#fragmented[@]} -gt 0 ]]; then if [[ ${#fragmented[@]} -gt 1 ]]; then echo "found ${#fragmented[@]} fragmented tables." else echo "found ${#fragmented[@]} fragmented table." fi fi for table in ${fragmented[@]}; do let fraggedTables=$fraggedTables+1; echo -ne "\tOptimizing $table ... "; mysql -u"$mysqlUser" -p"$mysqlPass" -h"$mysqlHost" -D "$i" --skip-column-names --batch -e "optimize table $table" 2>"$log" >/dev/null if [[ $? -gt 0 ]]; then echo "An error occured, check $log for more information." exit 1; fi echo done done else tput rc tput el fi unset fragmented done
# footer message if [[ ! $fraggedTables -gt 0 ]]; then echo "No tables were fragmented, so no optimizing was done."; else if [[ $fraggedTables -gt 1 ]]; then echo "$fraggedTables tables were fragmented, and were optimized."; else echo "$fraggedTables table was fragmented, and was optimized."; fi fi
if [[ ! -s $log ]]; then rm -f "$log" fi
unset fraggedTables
Link | http://www.dufault.info/blog/a-script-to-optimize-fragmented-tables-in-mysql/