Artículos etiquetados "Scripts"

Descomponer una ruta en directorios, nombre de archivo y extensión en Bash

Una tarea que puede ser bastante común a la hora de escribir scripts o aplicaciones que trabajen con el sistema de archivos es la necesidad de descomponer una ruta completa del tipo «/directorio/subdirectorio/…/…/archivo.extension» para obtener por separado el nombre de archivo, la extensión y la ruta de directorios. De hecho, fue una de las necesidades que me ha surgido estos días, escribiendo un Shell Script un tanto grande en el que necesitaba obtener el nombre de un archivo de una ruta completa así como la estructura de directorios hasta el mismo.

Dado que me suele gustar, al escribir scripts de cierto tamaño, dividirlos por bloques de código independientes, voy a publicar este como una solución aislada para solventar el problema de descomponer rutas aunque cuando lo volváis a ver en el script que aún no he terminado aparecerá como una función por la comodidad que representan y porque facilitan mucho la lectura del código en scripts de muchas lineas. Sin más preámbulos, vamos manos a la obra:

Dado que este código ahora es independiente, he realizado algunos cambios como que tome la entrada de datos a modo de parametros tras el nombre del script por lo que la ruta a descomponer, deberá ir tras el nombre del script en lo que seria el parámetro $1, es decir, tendriamos que pasárselo de la siguiente manera:

./script.sh /ruta/que/queramos/descomponer/archivo.extension
Por el mismo motivo, lo he dispuesto de forma que la salida del mismo sea la salida estándar mostrando el valor de cada una de las variables que intervienen en el proceso.

También he comentado las lineas relevantes ya que creo que será mejor explicar cada una de las lineas en el mismo punto donde aparece. Así pues, este es el script:

 



#!/bin/bash
# Script para descomponer una ruta completa a un archivo o directorio, obteniendo
# el nombre de archivo y extensión (si existen) y ruta hasta los mismos
for RutaCompleta in $1
do
# Comenzamos extrayendo la parte derecha desde el ultimo caracter "/", es decir, el archivo
NombreArchivo="${RutaCompleta##*/}"
# Longitud de la ruta es el total de caracteres menos el largo del nombre de archivo
LargoRuta="${#RutaCompleta} - ${#NombreArchivo}"
# Extraermos la ruta desde el caracter 0 hasta el caracter final de largo de ruta
RutaSola="${RutaCompleta:0:$LargoRuta}"
# Lo siguiente es extraer nombre de archivo
NombreSolo="${NombreArchivo%.[^.]*}"
# Extension se obtiene eliminando del nombre completo el nombre mas el punto
Extension="${NombreArchivo:${#NombreSolo} + 1}"
# Las 2 lineas anteriores fallan si no hay extension por lo que es necesario comprobar que no
# se de el caso de que haya extension pero no nombre ya que en ese caso la ext seria el nombre
if [[ -z "$NombreSolo" && -n "$Extension" ]]; then
NombreSolo=".$Extension"
Extension=""
fi
done
# Este es el resultado del script
echo
echo "Este es el resultado del script:"
echo
echo La ruta completa es:
echo $RutaCompleta
echo
echo "Ruta.........: \"$RutaSola\""
echo "Nombre.......: \"$NombreSolo\""
echo "Extension....: \"$Extension\""
echo


Si lo ejecutamos, la salida del mismo, según está, sería similar a esto
:

 


$ ./descomp.sh /dir1/subdir1/subdir2/archivo.txt

Este es el resultado del script:

La ruta completa es:
/dir1/subdir1/subdir2/archivo.txt

Ruta………: «/dir1/subdir1/subdir2/»
Nombre…….: «archivo»
Extension….: «txt»


Ahora bien, hay que tener en cuenta que si lo vamos a utilizar como una función llamada desde otro script o simplemente como un bloque de código incrustado entre las lineas, habría que hacerle algunos cambios, pero dado que lo estoy utilizando en otro script que voy a publicar aquí también, no lo explicaré aún ya que es cuestión de tiempo que me toque hacerlo.


 

 

leer más

Servidor Virtualizado con conexión NAT (VirtualBox y Windows)

————– Actualización ————–

Aunque el método usado en este artículo sigue siendo válido, con las nuevas versiones de VirtualBox ya es posible hacerlo todo desde el menu gráfico, cosa que se agradece bastante.

———————————————–

Últimamente, es bastante común montar servidores en máquinas virtuales y ese fue el caso que me ha llevado a crear este pequeño script que, en esta ocasión, es para sistemas Windows y con el conocido sistema de máquinas virtuales VIRTUALBOX.

En este mismo sistema, al igual que en muchos otros, existen varias opciones para la configuración de las tarjetas de red aunque para este caso en concreto nos centraremos en la opción por defecto y la tarjeta que, al menos antes, siempre se habilitaba por defecto, al menos en mi caso, que siempre es conexión mediante NAT y con la tarjeta PC NET.

Antes de nada diré que si ya está familiarizado con el NAT puede saltarse las siguientes lineas ya que, por si hay alguien a quien solamente «le suene» un poco o que directamente desconozca que es o como funciona, trataré de hacer una pequeña explicación.

Lo primero, como siempre es tener la maquina virtual funcionando (Evidentemente ;-)) y una vez tengamos la conexión mediante NAT, deberíamos poder conectarnos a Internet desde el sistema virtualizado sin ningún problema ni paso adicional que configurar la conexión en dicho sistema como si fuera una instalación física más, es decir, añadiendo una IP, máscara, puerta de enlace y DNS en el caso de que nos vayamos a conectar con una dirección estática o simplemente activando DHCP si tenemos algún dispositivo que nos permita una configuración de IPs dinámica. Sea cual sea el modo de conexión, nos es indiferente a la hora de montar el servidor virtualizado siempre y cuando la IP de nuestra máquina física, es decir, la que alberga la virtual tenga una IP fija o algún sistema que nos permita llamarla siempre de la misma forma aún siendo dinámica (Por ejemplo, algún sistema similar a DynDNS, NoIP de cara a internet o simplemente un router que de la posibilidad de asociar una dirección MAC a una direcc concreta de forma que aunque este configurado todo por DHCP siempre de la misma a la misma máquina ).

Se preguntará ¿¿Porque es necesario esto sobre todo cuando ya me conecto a internet?? pues bien, porque ahora mismo la máquina virtual conecta con «hacia fuera», por decirlo de alguna manera, pero no admite las peticiones que se le hagan desde la red como podrían ser las que se hacen a cualquier servidor así que es necesario realizar NAT (Network Address Translation) de forma que para acceder a este servidor virtualizado tendremos habilitar la correspondiente configuración en la maquina física que lo alberga para que al apuntar a esta (MAquina física)  nos redirija a la máquina virtual. Como explicarme nunca fue mi fuerte, vamos con los ejemplos:

Tenemos los siguiente:

Máquina VIRTUAL:
– IP: 10.0.2.15
– Servidor WEB (Puerto 80)
– Servidor SSH (Puerto 22)

Máquina FISICA (Sobre la que corre la Virtual)
– IP: 192.168.1.10

Pues en este caso de supuestos, para poder ver las WEB del servidor virtualizado tendríamos que hacerlo poniendo la IP de la máquina FISICA, es decir, esta es la dirección que tendríamos que escribir en el navegador (A falta de configurar un dominio aunque fuese local, por supuesto):
http://192.168.1.10
Y para acceder a las sesiones SSH:
ssh 192.168.1.10
Esto es debido a que, con las instrucciones que veremos a continuación habilitaremos que, el propio VIRTUALBOX, realice una redirección de los datos enviados a los puertos que digamos hacia la tarjeta de red y puerto de la máquina virtual y ahora que ya tenemos claras las nociones básicas, procedemos con lo importante.

 

.Entre las muchas cosas que incorpora VirtualBox, hay un comando llamado VBOXMANAGE.EXE desde el que se puede hacer de todo y que es, precisamente, el que utilizaremos para que nuestra máquina virtual admita conexiones desde el exterior, es decir, para que nuestro servidor funcione como lo que es. Como decia, entre las multiples funciones de VBOXMANAGE está la de configurar que las peticiones a ciertos puertos de la máquina FISICA pasen a nuestra máquina virtual.

 

A continuación muestro el comando y explico sus parámetros para esta tarea pero quizás este un poco más claro en el ejemplo que hay debajo. El comando a ejecutar es:

 

VBoxManage setextradata MAQUINA "VBoxInternal/Devices/pcnet/0/LUN#0/Config/PROCESO/"PUERTO O PROTOCOLO"" PUERTO

 

Es muy importante fijarse en que, para pasarle la orden de que escuche las peticiones en un puerto de la máquina fisica, indicamos, no solo el puerto de la máquina virtual sino que también la tarjeta de red que recibirá los datos.
VBoxInternal/Devices/pcnet/0/LUN#0/Conf...

 

Para estar seguros del nombre de la máquina sin tener que abrir el virtualbox, podremos hacer un listado de todas las máquinas virtuales que tenemos gracias, como no, al polivalente comando VBoxManage de la siguiente manera:

 

VBoxManage list vms

 

El proceso para abrir el servidor a las conexiones externas, por ejemplo las peticiones a un servidor web consiste en aplicar 3 veces el comando anterior para indicar, además de la tarjeta de red, como ya indicamos:

 

  1. Nombre de servicio y puerto de la máquina fisica
  2. Nombre del servicio y puerto de la máquina virtual
  3. Nombre del servicio y PROTOCOLO usado (Normalmente TCP)

 

De esta misma manera no estaremos obligados a usar el mismo puerto en ambas máquinas. Esto quiere decir que si, casualmente la máquina física que contiene la virtual, tuviese además un pequeño servidor WEB en el puerto 80, podríamos establecer con el anterior comando que dicha máquina reenvíe solo las peticiones, por ejemplo del puerto 8080, al 80 (Puerto estándar) de la máquina virtual. En definitiva, no hay restricción alguna respecto a los puertos salvo la de que no esté en uso.

 

Como pequeña nota, solo queda añadir que si tenemos algun sistema de FIREWALL configurado ya sea en la maquina física como en la Virtual, tendríamos que hacer los pasos pertinentes para que no bloquease el tráfico por lo puertos que haya pensado utilizar.

 

Pues bien, esa fue la teoría y ahora, el como aplicarla ya es tarea suya. Puede simplemente experimentar por su cuenta con el comando basándose esta breve explicación y, como siempre, también tiene la opción cómoda de descargarse el SCRIPT que he creado para automatizar todo el proceso. He de decir que, al menos en mi caso, es lo que estoy usando siempre gracias a la comodidad y rapidez del mismo.

 

Este Script no tiene que editarlo para cambiar puertos, protocolo o el nombres de servicio ya que se lo preguntará durante la ejecución del mismo. Eso si, funciona teniendo en cuenta que VirtualBox estará instalado en la unidad C: y el directorio por defecto, es decir:

C:\Archivos de programa\Oracle\VirtualBox

Si ese no fuera su caso, entonces si tendría que editarlo para modificar las primeras lineas, pues son las únicas que hacen referencia a dicha carpeta. Por supuesto, tambien es totalmente libre de editarlo para ver como está hecho 😉

Enlace de descarga del SCRIPT:  SCRIPT VIRTUALBOX a SERVER

Un saludo.

leer más

MiniScript VBS para avisar de nuevo correo

Este pequeño Script fue ideado para un caso muy concreto aunque se puede adaptar bastante más según las necesidades. En este caso, lo explicaré según el ámbito para el que fué ideado y que no es otro que el estar asociado a una regla de Outlook para activarse en cuanto llegue un correo de extrema importancia que no puede demorarse sin ser procesado.

Como he dicho antes, este VBScript fue diseñado para un entorno muy concreto que puedo resumir así:

  • Existen varias máquinas virtuales destinadas a la monitorización con diferentes herramientas.
  • Cada una de las máquinas tiene un Outlook configurado con la cuenta del cliente que representa.
  • Evidentemente, las máquinas están monitorizando por lo que no pueden tener el Outlook en pantalla.
  • Esto hace que, además de un equipo para trabajar, tengamos múltiples monitores con sus respectivas herramientas de monitorización abiertas de continuo.

En este entorno de trabajo se incorpora una nueva premisa: Si llegan correos de cierta aplicación, hay que procesarlos cuanto antes ya que tienen un tiempo de vida. En principio esto no es un problema pero dado que son varios monitores, que están a unos metros y que quienes los controlan tienen otras tareas, es relativamente sencillo que el paupérrimo aviso que nos muestra el Outlook se nos pase desapercibido de forma que solamente veremos ese correo tan urgente si hacemos un repaso máquina por máquina de forma manual, lo que tambien es bastante sencillo que transcurra más tiempo del debido entre repaso y repaso por lo que volvemos a influir negativamente en el tiempo de respuesta al correo urgente.

Si bien es cierto que las propias reglas del Outlook incluyen la posibilidad de mostrar un aviso en pantalla, este tampoco es realmente eficaz, al menos en este entorno, ya que no siempre se muestra encima de todas las ventanas (Haciéndolo quedar oculto) sino que alguna que otra vez falla y no sabemos porque, aunque con tanta máquina virtual, no es la primera aplicación que se nos vuelve loca. Así que tras barajar todas las posibilidades y probar algunas alternativas me he decantado por crear este pequeño VBScript que está resultando realmente eficaz y sencillo, combinación que lo hacen ser la solución perfecta, al menos en este caso. Además, gracias a su sencillez, es posible implementarlo en otros entornos haciendo unos cambios mínimos en el mensaje.

Veamos el Script:
Dim Shell : Set Shell = CreateObject("Shell.Application") : Shell.MinimizeAll
msgbox("Ha llegado un nuevo correo de APLICACION_ENVIADORA")

.Esta 2 lineas son el 75% de todo el proceso ya que el 25% restante es la regla que enlaza con este Script al darse la condición que le digamos.

La primera de las dos lineas lo que hará es ocultar TODAS las ventanas que tengamos visibles, es decir, es lo mismo que pulsar el boton de «Mostrar Escritorio».

Una vez que solo veamos el escritorio, nos mostrará un mensaje de advertencia informando de que ha llegado un nuevo correo de APLICACION_ENVIADORA. (Evidentemente la aplicación real no se llama así pero no creo que sea relevante para la explicación cual sea el nombre real de la aplicación).

Ahora solo nos queda ir al Outlook y entrar en:

Herramientas –> Reglas y alertas –> Nueva regla –> Comenzar regla en Blanco

Esto nos abrirá un pequeño asistente en el que podremos ir confeccionando los parámetros de la regla que, en este caso, quedarían así una vez terminada:

Aplicar esta regla a todos los mensajes procedentes

de  APLICACION_ENVIADORA@loquesea.com

y solo en esta máquina

iniciar Script_AppEnviadora.vbs


La primera parte de la regla es la condición, que en este caso comprobará si se cumple que el remitente de cada nuevo correo sea  APLICACION_ENVIADORA@loquesea.com que, en este caso, se trata de una aplicación y la parte otra parte de la regla, la relativa a la acción a desarrollar cuando se produzca la condición, es iniciar la ejecución de un programa, que en este caso, más que un programa es nuestro script de 2 lineas:  Script_AppEnviadora.vbs.

Esta combinación funciona realmente bien, os lo puedo asegurar y en un entorno de monitorización no hay nada mejor para llamar la atención de quien esté en el puesto que ocultarle la herramienta con la que monitoriza, es infalible. Eso si, hay que tener en cuenta un punto realmente importante, esta regla que hemos creado es una regla de cliente y por tanto es completamente necesario que el cliente esté funcionando, es decir, es necesario tener el Outlook abierto para que se ejecute pero eso no lo voy a automatizar ya que mi intención es mejorar la efectividad y hacer más cómodo el trabajo, no sustituir a las personas por Scripts o automatizaciones, que ya hay bastante paro estos días en los que vivimos!!!!

Descargar el Script: SCRIPT.VBS

leer más

Servicio de traducción en Snow Leopard v2 (Texto y Webs)

Se imagina que, con solamente seleccionar un texto en inglés (en cualquier programa) y presionar una combinación de teclas (O dos clic de ratón, como prefiera) se traduzca en Google Translate?? ¿¿Se imagina que eso no tome recursos del ordenador porque no es ningún proceso en memoria, ni ejecutándose continuamente?? ¿¿Se imagina bajarlo ya preparado o haciéndolo usted mismo desde cero?? Pues si le está costando imaginárselo es que no ha leído aún el artículo «COMO CREAR UN SERVICIO DE TRADUCCION EN MAC» que hace no mucho tiempo he publicado y cuya nueva versión comenzaré a explicar a continuación.

Hace un par de días, uno de los lectores del Blog (Micropark) me comentaba que estaría bien que también se le pudiesen enviar direcciones WEB al traductor creado en el artículo antes mencionado para que se tradujesen como WEB completas. Como no era algo muy complejo, me puse a hacerlo y este es el resultado:

En este artículo no me pararé a explicar cada uno de los pasos y los detalles del porqué se hacen las cosas, ya que lo explico todo, paso por paso, en el ANTERIOR ARTÍCULO.

Ciertamente, Micropark tenía razón, si se seleccionaba un texto la traducción funcionaba perfectamente pero si seleccionábamos una dirección WEB el servicio se limitaba a traducirla como si se tratase de un texto normal, es decir, realizaba una traducción de la propia dirección y no del contenido.

La propia página del traductor de Google hace su distinción del texto que introducimos en ella para saber si se trata de un enlace o no, pero como en nuestro caso ya le enviamos una dirección concreta, la función de detección de enlaces de google no nos sirve. Teniendo esto en cuenta está claro el siguiente paso lógico que debemos de dar:

Tenemos que modificar el Servicio, o más bien el script del flujo de trabajo del automator, para que sea nuestro propio script el que distinga si se trata de una dirección WEB o de un texto normal para lo que nos basaremos en 3 reglas muy simples:

  • Regla 1: Si el texto comienza por http, es una WEB
  • Regla 2: Si comienza por www. también es una WEB
  • Regla 3: Si no es ninguna de las anteriores es un texto normal.

Si se cumple alguna de las 2 primeras, formaremos la dirección a enviar al navegador WEB de la manera que el traductor de Google forma la URL cuando se trata de una WEB a traducir. En cambio, si es la regla 3 la que se cumple, enviamos la dirección tal y como lo hacíamos anteriormente (en la 1era versión del Script).

Así que el flujo de trabajo de automator queda exactamente igual salvo por el Script, que será así:


on run {input}

set input to {input} as text
set LaDirecc to ""
set LaDireccCompleta to CompruebaLinks(input, LaDirecc)
tell application "Safari"
activate
set the URL of (make new document) to LaDireccCompleta
end tell

end run

on CompruebaLinks(input, LaDirecc)
set Comienzo to input as text
set Comienzo to characters 1 thru 4 of input as text
set EsEnlace to false
if Comienzo is "www." then set EsEnlace to true
if Comienzo is "http" then set EsEnlace to true
if EsEnlace is true then
set LaDirecc to "http://translate.google.es/translate?js=y&prev=_t&hl=es&ie=UTF-8&layout=1&eotf=1&u=" & input
else
set LaDirecc to "http://translate.google.com/#en|es|" & input
end if
set input to LaDirecc
return LaDirecc

end CompruebaLinks

Si se fija un poco verá que para hacer la comprobación de las 3 reglas tampoco es necesario complicarse la vida mucho. De hecho, para hacerlo el único paso adicional realizado es comprobar los 4 primeros caracteres con los que comienza la cadena o texto a traducir. Como ya hemos dicho, si comienza por «http» o por «www.» (Fíjese que ambas cadenas son de 4 caracteres ya que en «www.» he incluido el punto) es una dirección web. Esto hace que si introducimos, por ejemplo: «archivoslog.es» no lo reconozca como dirección WEB pero realmente es la manera más simple de hacer la distinción ya que tratar de hacerlo por la terminación, además de complicar muchísimo el código del script debido a la gran cantidad de dominios existentes (.com, .es, .org, .ar, .eu…etc) seria relativamente sencillo encontrarnos fallos en textos con errores de sintaxis (Sin espacio tras el primer punto).

La diferencia más grande, además de la detección de enlaces, evidentemente, es que realizamos esta misma mediante una función llamada CompruebaLinks a la que le pasamos dos variables:

  • input: Es la que contiene el texto seleccionado y que previamente convertimos al tipo «text» para poder manejarla a nuestro antojo.
  • LaDirecc: Esta variable la enviamos vacía al proceso aunque es un pequeño truco para que la reconozca pero su principal misión es la de devolvernos el resultado de la función, es decir, la dirección final ya procesada para enviarla al navegador.

Y ya está, la verdad es que no ha sido complicado ¿verdad?. Ahora bien, como siempre, también está disponible el enlace de descarga del servicio ya completo al cual solamente le faltaría ubicarlo en la carpeta Servicios una vez descargado. Como último apunte, como en MAC hay 2 carpetas «servicios», os detallo la diferencia de ubicar nuestra pequeña creación en una u otra:

Para que todos los usuarios del sistema tengan acceso al servicio (Requiere autenticación):

  • Disco principal/sistema/Librería/Servicios

Si quiere tener el servicio solo para el usuairo actual, la ruta es:

  • Home del usuario/Librería/Servicios

Si tiene dudas de como realizar alguno de los pasos: VER EL ARTÍCULO ANTERIOR (Versión 1)

Servicio de traducción (Versión 2) Google para Snow Leopard: DESCARGAR

.

leer más

Growl + Applescript = Aplicaciones cool

Growl + Applescript = Aplicaciones cool

La verdad es que da gusto cuando ejecutamos un script o una aplicación y nos informa correctamente de lo que está haciendo, o de lo que hizo, sobre todo si lo hace mediante un gestor de mensajes como Growl.

Además, como es un tema interesante, a la par que constructivo, pues voy a tratarlo en este artículo así que vamos a allá con… la comunicación con el usuario desde nuestros applescript.

Lo primero que tenemos que hacer es, además de tener Growl instalado (Evidentemente 😉 ) es conocer el nombre del proceso para referirnos a él, que es GrowlHelperApp.

De esta forma comenzaremos el proceso con un bloque «Tell» hacia dicho proceso:
tell application "GrowlHelperApp"

La mejor forma de conocer todas las posibilidades que tenemos de interactuar con Growl es añadir su diccionario a la biblioteca del editor de applescript, ya que por defecto no aparece. Para ello tendremos que añadir el archivo GrowlHelperApp (Está ubicado dentro del paquete Growl.prefpane) a dicha biblioteca y así podremos ver todos los comandos y parámetros que admite.

Biblioteca Applescript

Biblioteca Applescript

En este caso nos limitaremos mostrar una notificación muy básica para la cúal, la siguiente linea tras la sentencia «Tell» será definir un nombre para el mensaje. Para este ejemplo lo definiremos con la variable Notificacion a fin de poder usarla de nuevo en la próxima línea :

set Notificacion to "Título del mensaje"
La cabecera está lista, ahora ya nos metemos con el mensaje en cuestión. Como hemos dicho, en este ejemplo vamos a mostrar un aviso muy básico por lo que con una sola linea más, crearemos el cuerpo del mensaje:
notify with name Notificacion title "Esto es el Título" description "Esto es el mensaje" application name Notificacion
Tras eso solamente nos quedaría cerrar de nuevo el Bloque «Tell». Veamos como queda todo junto:

Ejemplo de mensaje básico

Ejemplo de mensaje básico


tell application "GrowlHelperApp"
set Notificacion to "Nombre de la notificación"
notify with name Notificacion title "TITULO" description "Esto es el mensaje" application name Notificacion
end tell

Lo normal es que el nombre de la notificación (La variable Notificacion) sea igual que el título de la misma, pero no tiene por que ser así obligatoriamente, de hecho en el ejemplo, lo he cambiado por la cadena «TITULO».

Como ejemplo, la anterior notificación ya nos sirve perfectamente pero ahora vamos a rizar el rizo un poco más. Vamos a crear una SUBRUTINA o HANDLER (Si no conoce nada del mundo de la programación, no se asuste, que lo explicaré todo) llamada ComunicacionUsuario, al que le podremos pasar la variable MensajeUsuario.

Esto nos servirá para poder llamar a dicha subrutina desde nuestros programas, sin tener el codigo de la misma (En este caso, el codigo que mostrará las notificaciones) mezclado con nuestro código, permitiendo así que sea mucho mas facil la lectura y comprension del programa en general.

El tema para llamar a una subrutina incluida en nuestro script o aplicación, basicamente funciona así:

(*
Estas son unas lineas de ejemplo de lo que podría ser un programa cualquiera
Las siguientes lineas declaran la variable que contendrá el mensaje a mostrar
y llamaremos a la subrutina para mostrar dicho mensaje
*)
set MensajeUsuario to "Mensaje que queremos mostrar al usuario"
ComunicacionUsuario(MensajeUsuario)

El anterior código es un ejemplo sencillo de como llamar a la subrutina de mensajes que vamos a crear a continuación. Si es un programa que puede mostrar varios mensajes, dependiendo del punto en el que se encuentre, bastará con escribir al final del programa una subrutina como la que viene a continuación y a la cual podremos llamar todas las veces que queramos con 2 simples lineas como las anteriores, en vez de escribir todo el codigo de llamar a Growl cada vez que necesitamos invocar los mensajes. Para que nos muestre un mensaje u otro, solamene tendremos que declarar el mensaje que queramos que nos muestre en cada ocasión a través de la variable MensajeUsuario antes de llamar a la subrutina.

Además el ejemplo de subrutina que vamos a crear hace una comprobación más, ya que es posible que el equipo donde se lance nuestra aplicación o Script no tenga Growl, por lo que seria un fallo bastante grande dar por hecho que estamos informando al usuario y que no sea verdad (A parte de que lo más probable es que se genere un error que termine con la ejecución del Script o aplicación). Por esto mismo, añadiremos unas lineas para comprobar si Growl se está ejecutando y, en el caso de que no esté habilitado en el equipo, mostraremos un diálogo estándar de applescript como el que muestra la siguiente imagen:

Diálogo estándar de Applescript

Diálogo estándar de Applescript

Aunque se podría compactar el código bastante más, he decidido dejarlo así para que sea más sencillo de comprender para la gente que no sabe programación:
on ComunicacionUsuario(MensajeUsuario)

tell application "System Events"
if exists process "GrowlHelperApp" then
set ExisteGrowl to 1
else
set ExisteGrowl to 0
end if
end tell

if ExisteGrowl is 1 then
tell application "GrowlHelperApp"
set Notificacion to "Extractor de Enlaces"
set LosMensajes to {Notificacion}
register as application Notificacion all notifications LosMensajes default notifications {Notificacion} icon of application "Finder.app"
notify with name Notificacion title Notificacion description MensajeUsuario application name Notificacion
end tell
else
display dialog MensajeUsuario & ". (Se muestra este mensaje al no detectar Growl)" with title "Notificación al usuario" buttons "OK" with icon 2
end if

end ComunicacionUsuario

En este ejemplo, también hemos mejorado un poco más la notificación de Growl añadiéndole alguna cosilla más como el icono del Finder, haciendo que tenga un aspecto un poquito más cuidado. Además tenga en cuenta que esto es solamente un ejemplo cuya finalidad es servir de guía haciéndole ver las posibilidades de este sistema de notificaciones. De la misma manera que añadimos el icono del Finder, podremos añadir cualquier otro icono.

Mensaje de Growl con icono personalizado

Mensaje de Growl con icono personalizado

Eso si, ahora como siempre, el tema lo comienzo yo pero el límite del mismo lo pone usted ya que esto puede dar mucho más de si, haciendo vuestras aplicaciones o scripts mucho más «Cool».

leer más