Enviado por Alvaro Anaya M. sobre Jul 16, 2010 en Scripts, Varios | 38 comentarios
————– 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):
Y para acceder a las sesiones SSH:
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:
1
| 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.
1
| 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:
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:
- Nombre de servicio y puerto de la máquina fisica
- Nombre del servicio y puerto de la máquina virtual
- 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:
1
| 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
Enviado por Alvaro Anaya M. sobre Feb 6, 2010 en Scripts | 9 comentarios
Hoy día, a nada que busquemos en la red encontraremos miles de «milagrosas» aplicaciones para convertir los videos al formato iPhone para todas las plataformas. Lo cierto es que, en MAC, no es necesario recurrir a aplicaciones de terceros para realizar este proceso ya que, gracias a QuickTime X, podremos hacerlo facilmente a golpe de ratón (o de trackpad 😉 ) mediante un par de clics pero si eres como yo, un apasionado de los Scripts y de automatizar los procesos y tareas repetitivas, una vez más podremos recurrir a la versatilidad que nos ofrece Applescript para realizar estas tareas.
El proceso a recrear con nuestro Script, es decir, los pasos tal y como son realizados con el ratón en el entorno gráfico, serían los siguientes:
- Abrir un archivo con Quicktime
- Ir al menú superior –> Archivo –> Guardar como
- En la ventana que se nos abre podremos seleccionar el formato de salida que queramos. En este caso será iPhone*
*Nota!! Hay dos versiones de iPhone en el menú de «guardar como». La que necesitamos en esta ocasión es la que trae solamente iPhone ya que la otra está pensada para poder ser transmitida mediante straming y para ello lo que hace es rebajar el nivel de calidad del archivo, entre otras cosas.
Una vez seguidos estos pasos, nos generará un archivo de extensión .m4v que es el formato de video nativo del iPhone.
Ahora que ya tenemos clara la base o guión, sobre el que nos vamos a centrar para realizar nuestro Script, procedemos con el mismo. Como siempre, primero mostraré la versión corta, es decir, la que hace solamente lo que necesitamos y desde esta iremos ampliando poco a poco la funcionalidad del Script, así que vamos allá.
Tras pelearme unos minutos con la opción «save» que nos muestra el diccionario de applescript de la aplicación QuickTime, en cuyos parámetros vemos lo siguiente:
Extraido del diccionario de Applescript de la aplicación QuickTime Player…
save v : Save a document.
save specifier : The document(s) or window(s) to save.
[in file] : The file in which to save the document.
[as saveable file format] : The file format to use.
…he llegado a la conclusión de que es mejor olvidarse de ella. Más que nada lo digo por si hay alguien, empeñado como yo en hacer un «save as», que mejor no pierda el tiempo y haga uso de esta otra opción (Extraida también del diccionario Quicktime):
export v : Export a movie to another file
export document : the movie to export
in file : the destination file
using settings preset text : the name of the export settings preset to use
Teniendo en cuenta esta nueva opción,es mucho más facil llegar a conseguir que nos funcione el script que mediante el «save as» y esta es la prueba:
1 2 3 4
| Tell application "QuickTime Player"
Open (choose file)
export document 1 in "convertido.m4v" using settings preset "iPhone"
end tell |
Con esas simples lineas, ya tenemos nuestro convertidor de videos completamente operativo. Ahora vamos a perfeccionarlo un poco para que nos quede algo más «profesional» (Además, el video convertido lo deja en raiz del disco duro, y eso no queda muy bien que digamos y eso suponiendo que el usuairo que ejecuta el Script tenga permisos de escritura en dicha ruta)
Lo primero que vemos en el Script es que, tras llamar a la aplicación QuickTime, hacemos un…
Para los que nunca han programado nada (Uhmmm, y tampoco han leido ninguno de los muchos artículos de mi Blog 😛 ) les diré que esta linea es simplemente:
«OPEN» –> Comando del propio Quicktime para abrir un archivo
«Choose file» –> Esta orden invoca el diálogo de apertura de archivos de OSX.
Por lo tanto al combinarlas de esa manera lo que hacemos es básicamente:
abrir (El archivo que selecciones en esta ventana).
Perdonadme los que sepais de programación por esta explicación tan «cutre» pero creo que, a la gente que nunca ha hecho ni leido algo de este tema, les viene bien saber el porqué de cada linea.
Lo cierto es que, aunque el script según está funciona, tiene partes muy mejorables, como por ejemplo añadir una orden, similar a la de apertura de archivo (choose file) pero con el fin de guardar, en una ruta y con un nombre, el archivo convertido. Para esto, si escribimos simplemente «choose file» tal y como lo hemos hecho anteirormente, solo nos permitirá seleccionar un archivo existente, así que vamos a variar un poco esa orden para que nos permita introducir un nombre de archivo que no exista, a fin de crearlo nuevo. Además, para que no nos quede una linea demasiado larga y más dificil de comprender, vamos a hacerlo en dos veces, tal que así:
set Destino to (choose file name)
export document 1 in Destino using settings preset "iPhone"
Si nos fijamos, vemos que el comando usado para invocar el diálogo de apertura de archivos es ligeramente diferente, ya que hemos añadido la palabra «name». Esto hace que, cuando aparezca dicho diálogo, podramos escribir un nombre de archivo nuevo, tal y como mencionaba anteriormente. Dicho nombre de archivo junto con su ruta, será almacenado en la variable «Destino» para usarla en la siguiente linea como la salida de la exportación.
Bien, ahora si unimos lo que tenemos por ahora, veremos que nuestro pequeño script nos preguntará..
¿¿Que archivo queremos convertirt (Y donde está)??
¿¿Que archivo queremos crear (Y donde ubicarlo)??
Parece que lo básico, una vez más, está listo. ¡¡Pues no!! Aún tenemos un problema que deberemos de corregir si queremos crear un Script que pueda utilizar cualquier persona, ente o animal, sin que se le presente ni el más mínimo problema. El handicap que nos podemos encontrar es que, cuando introducimos el nombre del archivo destino, podemos obviar la extensión, es decir, si tratamos de introducirlo sin añadir «.m4v» al final del archivo, no nos encontraremos ningún problema para que se ejecute el Script pero el archivo resultante no será reconocido por el sistema (A pesar de que lo unico que le pasa es que carece de extensión). Para cualquier usuario medio o incluso nosotros mismos, esto no representa ningún problema y mucho menos sabiéndolo pero seamos francos, queda muy feo que pase eso y no cualquier usuario se dará cuenta de que si no puede usar el archivo es debido unicamente a la extensión. Así que ahora ya tenemos un nuevo objetivo para mejorar en nuestro pequeño conversor..
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| set ExtensionesReales to {".avi", ".mov", ".mpg", ".mpeg", ".divx", ".qtm", ".rpm", ".wmv", ".m4v"}
set Destino to (choose file name)
set largo to length of Destino
set PosibleExtension to characters (largo - 3) thru largo of Destino as string
repeat with i from 1 to (count of items in ExtensionesReales)
set UnaExtension to (item i of ExtensionesReales) as string
if PosibleExtension is in UnaExtension then
set LargoExtension to length of (item i of ExtensionesReales)
set Destino to characters 1 thru (largo - LargoExtension) of Destino
end if
end repeat
set Destino to Destino & ".m4v" as string |
Vamos a explicar un poco el significado de estas lineas…
set ExtensionesReales to {".avi", ".mov", ".mpg", ".mpeg", ".divx", ".qtm", ".rpm", ".wmv", ".m4v"}
Lo primero que hacemos es crear una lista con las extensiones de archivos de video que podrían introducirse. En este caso la gemos declarado como una variable normal pero mas adelante lo haremos con la orden «property» antes de cualquier otra linea del script.
set largo to length of Destino
set PosibleExtension to characters (largo - 3) thru largo of Destino as string
Almacenamos en la variable «largo» el número total de caracteres que forman el archivo de destino para, en la siguiente linea, extraer los últimos 3 caracteres, es decir, lo que sería la extensión del archivo en el caso de que esta exista, cosa que aún no sabemos.
1 2 3 4 5 6 7
| repeat with i from 1 to (count of items in ExtensionesReales)
set UnaExtension to (item i of ExtensionesReales) as string
if PosibleExtension is in UnaExtension then
set LargoExtension to length of (item i of ExtensionesReales)
set Destino to characters 1 thru (largo - LargoExtension) of Destino
end if
end repeat |
Este es el corazón de la comprobación. Hacemos un pequeño bucle para ir comprobando si esos 3 caracteres que extraemos del final del archivo destino, coinciden con alguna de las extensiones de archivo de video, cuya lista hemos almacenado en la variable «ExtensionesReales». En el caso de que alguna coincida, el siguiente paso es comprobar cuantos caracteres mide dicha extensión (Esto es debido a que no todas las extensiones miden lo mismo porque podremos encontrarnos archivos .mpeg y .mpeg, por lo que también tendremos en cuenta esta posibilidad).
Una vez establecida la medida de la extensión el paso a seguir es extraer de la variable «Destino» (La que almacenaba la ruta completa y nombre del archivo que se generará) todos los caracteres comprendidos desde el primero hasta el final menos la medida de la extensión, o lo que es lo mismo, desechamos la extensión para quedarnos con todo lo demás.
set Destino to Destino & ".m4v" as string
Y para terminar, si el usuario ha añadido extensión al nombre de archivo destino, con los pasos anteriores se la hemos quitado. Si, por el contrario, no ha añadido extensión alguna, los pasos anteriores determinarán que esto es así, de forma que el resultado del proceso en este punto siempre será el mismo, es decir, tendremos en la variable «Destino» la ruta y nombre de archivo sin extensión alguna así que solamente nos queda añadirle la que queremos por lo que concatenamos «.m4v» al valor de la variable «Destino».
Ahora, por fin, podemos decir que nuestro pequeño conversor ya es semi-profesional y lo cierto es que es bastante operativo pero… ¿¿que seria de MAC si no tuviera esas maravillosas aplicaciones de arrastrar y soltar?? Pues eso, que vamos a convertir nuestra pequeña aplicación en Droplet, de forma que si el usuairo quiere usarlo tal y como haria con una aplicación común, es decir, pinchando con el ratón dos veces sobre su icono, podrá hacerlo, pero si ademas quiere utilizarlo tambien como droplet, arrastrando los archivos que quiera convertir hacia el icono, también será posible.
Además, para poder utilizar el mismo código que hemos escrito para eliminar la extensión del archivo, sin falta de tenerlo por duplicado en el script, crearemos con esas acciones una función a la que llamaremos siempre que necesitemos hacer uso de ella, de forma que con solo añadir la llamada a la misma nos ejecute todas sus lineas.
Vamos entonces manos a la obra de nuevo…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| on open LosElementos
try
tell application "QuickTime Player" to activate
set CuentaElementos to (count of items in LosElementos)
repeat with i from 1 to CuentaElementos
set ElementoUnico to (item i of LosElementos)
tell application "QuickTime Player" to open ElementoUnico
set ElementoUnico to ElementoUnico as string
set ArchivoDestino to RecortaExtensiones(ElementoUnico)
tell application "QuickTime Player" to export document 1 in ArchivoDestino using settings preset "iPhone"
end repeat
-- La siguiente linea es la gestión de errores, que tambien llamará a una función común a las 2 partes del Script
on error errmsg number errnum
GestionErrores(errmsg, errnum)
end try
end open
-- Aquí comienza la función para eliminar la posible extensión y añadir la nueva.
on RecortaExtensiones(ElementoUnico)
set largo to length of ElementoUnico
set PosibleExtension to characters (largo - 3) thru largo of ElementoUnico as string
repeat with i from 1 to (count of items in ExtensionesReales)
set UnaExtension to (item i of ExtensionesReales) as string
if PosibleExtension is in UnaExtension then
set LargoExtension to length of (item i of ExtensionesReales)
set ElementoUnico to characters 1 thru (largo - LargoExtension) of ElementoUnico
end if
end repeat
set ArchivoDestino to ElementoUnico & ".m4v" as string
return ArchivoDestino
end RecortaExtensiones
-- Procedemos con la función para evitar el aviso de "Cancelado por el usuario", que es el error -128 y que muestre el numero y mensaje de error en los otros casos
on GestionErrores(errmsg, errnum)
if errnum is not -128 then
tell me
activate
display dialog "OOOuuch!!!: Acabamos de encontrarnos un feo error" & return & return & errmsg & " (" & errnum & ")" buttons {"OK"} default button 1 with icon stop with title "Vaya por dios!!!!"
end tell
end if
end GestionErrores |
Realmente, además de los cambios visibles y comentados, en esta nueva parte del script lo que hemos hecho para hacer que reaccione a los archivos que podramos arrastrar es añadir al comienzo las lineas:
La primera, la que pone «on open» es la que convierte nuestra aplicación que un droplet y lo que sigue, es decir, la palabra «LosElementos» es una variable que almacenará la ruta y nombre de todo archivo que sea arrastrado hasta nuestra app. La siguiente linea «try», hace que si falla, por el motivo que sea, nos muestre el mensaje de error personalizado que hemos preparado.
La parte que tiene algo más de miga es la que está bajo «Activate» y es la encargada de, si lo que se arrastra es más de un archivo, ir aplicando las correspondientes órdenes a cada uno de ellos por separado de forma que comience con uno, lo procese y vuelva a comenzar al encontrarse el «end repeat», así hasta que llegue a «CuentaElementos» que es básicamente la variable en la que hemos almacenado el número total de elementos arrastrados (length of LosElementos).
En este caso, para hacer un poco diferente el script y que no sea exactamente igual una parte que otra, más que nada, a fin de aprender más con él, lo que hemos hecho es que, si los archivos a convertir son arrastrados al icono de la aplicación, los procese sin preguntar un nombre de destino. Evidentemente un nombre es obligatorio que tengan ya que no existe archivo alguno que no tenga nombre, así que mantendrá su nombre original (su ruta tambien) pero con una nueva extensión, es decir, cuando arrastremos uno o más archivos a nuestro convertidor, el archivo o archivos resultantes aparecerán en la misma ubicación que el original y con el mismo nombre pero su extensión será «.m4v».
Para finalizar la parte droplet, solamente tendremos que cerrar el «intento», es decir, el «try» que añadiamos al comienzo y el open:
Y ya casi tenemos todo un señor conversor terminado, solo nos quedaría amoldar la parte que teniamos para que sea ejecutada en caso de iniciar nuestro programa de la forma habitual o, lo que es lo mismo, para que reaccione cuando se haga doble clic sobre el icono, ya que esta parte deja de funcionar al introducir las lineas que lo convierten en droplet, así que vamos allá de nuevo añadiendo «on run» al comienzo de la primera parte y «end run» al final del misma.
Y si, ahora si está terminado nuestro conversor personal de archivos de video al formato iPhone. Este es el interior del mismo para quienes no quieran ir «juntando» los fragmentos que hemos ido explicando hasta ahora.
Por supuesto, al final del artículo, hay un enlace para descargar el archivo entero ya preparado.
Este es nuestro Script:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| property ExtensionesReales : {".avi", ".mov", ".mpg", ".mpeg", ".divx", ".qtm", ".rpm", ".wmv", ".m4v"}
on open LosElementos
try
tell application "QuickTime Player" to activate
set CuentaElementos to (count of items in LosElementos)
repeat with i from 1 to CuentaElementos
set ElementoUnico to (item i of LosElementos) --as Unicode text
tell application "QuickTime Player" to open ElementoUnico
set ElementoUnico to ElementoUnico as string
set ArchivoDestino to RecortaExtensiones(ElementoUnico)
tell application "QuickTime Player" to export document 1 in ArchivoDestino using settings preset "iPhone"
end repeat
on error errmsg number errnum
GestionErrores(errmsg, errnum)
end try
end open
on run
try
set Origen to (choose file)
set ElementoUnico to (choose file name) as string
tell application "QuickTime Player" to open Origen
set Destinaco to RecortaExtensiones(ElementoUnico)
tell application "QuickTime Player" to export document 1 in Destinaco using settings preset "iPhone"
on error errmsg number errnum
GestionErrores(errmsg, errnum)
end try
end run
on RecortaExtensiones(ElementoUnico)
set largo to length of ElementoUnico
set PosibleExtension to characters (largo - 3) thru largo of ElementoUnico as string
repeat with i from 1 to (count of items in ExtensionesReales)
set UnaExtension to (item i of ExtensionesReales) as string
if PosibleExtension is in UnaExtension then
set LargoExtension to length of (item i of ExtensionesReales)
set ElementoUnico to characters 1 thru (largo - LargoExtension) of ElementoUnico
end if
end repeat
set ArchivoDestino to ElementoUnico & ".m4v" as string
return ArchivoDestino
end RecortaExtensiones
on GestionErrores(errmsg, errnum)
if errnum is not -128 then
tell me
activate
display dialog "OOOuuch!!!: Hemos tenido el siguiente problema:" & return & return & errmsg & " (" & errnum & ")" buttons {"OK"} default button 1 with icon stop with title "Oh, Vaya!!"
end tell
end if
end GestionErrores |
Descargar el script sin compilar: Conversor_iPhone
Descargar la aplicacion (Versión Final): Conversor_iPhone
.
leer más
Enviado por Alvaro Anaya M. sobre Oct 15, 2009 en Varios | 24 comentarios
———————— Nota de actualización ———————
Este artículo tiene una actualización. Concretamente es en la parte del Applescript ya que he tenido que modificarlo haciendo alguna instrucción más simple ya que, el anterior código, no se ejecutaba bien en algunos equipos a pesar de que en otros si. Además en los que fallaba tampoco lo hacía siempre y era de forma completamente aleatoria, motivo por el cual, tras buscar los posibles problemas y gracias a las pruebas que realizó @zigaurre, quien también detectó el problema, he llegado a la conclusión de que seria más seguro sustituir el código y, de hecho, así ha sido.
Eso si, agradecería mucho que si alguien más ha experimentado este problema, me lo hiciese saber, ya que por ahora solamente ha ocurrido en un equipo, al menos que yo sepa, y casualmente es el único que tiene el Snow Leopard actualizado sobre una instalación anterior (Repito, al menos que yo sepa que le ha ocurrido).
El código que muestra el artículo ya está modificado así que no se preocupe porque pueda utilizarlo por error ya que no seria posible ya que, el enlace de descarga para quienes no quieran realizar los pasos a mano, también ha sido actualizado.
———————— Fin de la Nota de actualización ———————
Prácticamente de la misma forma que CREAMOS UN SERVICIO DE TRADUCCIÓN en nuestros MAC con Snow Leopard y gracias a la idea que me dió el compañero @zigaurre en twitter, se me ocurrió una solución al problema que se produce con la combinación de la beta de Quicksilver para Snow Leopard, la única versión de este genial lanzador de apps para este sistema y los triggers. El problema en concreto es que, por muchas veces que nos molestemos en crear el fabuloso trigger que nos comenta Berto Pena (@bertop) en ESTE ARTICULO de Think Wasabi (100% recomendado, tanto el artículo como el Blog), para pasarle comandos a YubNub, Quiksilver no tarda mucho tiempo en eliminarlo, haciéndolo completamente inservible (Repito, con la combinación de la última versión de Quicksilver y Snow Leopard solamente)
Dado que en Snow Leopard se mejora más aún el tema de los servicios de OS X permitiendo asignarle fácilmente un atajo de teclado a cada uno de ellos, y teniendo en cuenta que AUTOMATOR ha facilitado, aún más si cabe, la creación de sus flujos de trabajo y entre ellos el de la creación de servicios, no fue muy difícil llegar a la conclusión de que si unimos las posibilidades que nos ofrecen estas soluciones, podremos crear un servicio para buscar con YubNub, ya sea invocándolo mediante una rápida combinación de teclas o incluso con un par de clics de ratón a través del menú superior del sistema.
Una vez presentada la idea, vamos a ponernos manos a la obra aunque por esta vez, se lo pondré más fácil a la gente sin tiempo, o a quienes no quieren, por el motivo que sea, realizar todos los pasos y simplemente prefieran descargarlo ya hecho.
El archivo a descargar es: BUSCAR CON YUBNUB
Y la ruta donde debe estar ubicado es:
Carpeta de usuario /Libreria/Services
Ahora bien, si lo que quiere es saber como poder realizar cada uno de los pasos para crear este servicio, esto es lo que sigue…
Lo primero que necesitamos es abrir AUTOMATOR y seleccionar Crear nuevo servicio en el asistente que nos aparecerá, tal y como se muestra en la siguiente imagen:

El asistente de Automator
Esto nos abrirá un nuevo flujo de trabajo en el que solamente veremos un cuadro en la parte superior. Dicho cuadro sirve para especificar que tipo de datos recibirá el servicio y desde que aplicacion(es) aunque en este caso, no precisamos marcarle ninguna entrada de datos ya que lo haremos todo desde las siguientes acciones que insertaremos, así que tendremos que dejar, en los desplegables, marcadas las opciones «sin datos de entrada» y «en cualquier aplicación», al igual que no marcaremos que se reemplace el texto seleccionado, tal y como muestra la siguiente captura:

Sin entrada de datos
Ahora vamos a proceder a componer el flujo de trabajo. Si no está familiarizado con Automator verá que es muy fácil ya que solamente se trata de arrastrar la acción que queremos, de la parte izquierda al flujo de trabajo, en la derecha, como muestra la siguiente imagen:

- Insertando la acción en el flujo de trabajo
Lo primero que haremos será incorporar al flujo de trabajo la acción de “Solicitar Texto” mediante la cual habilitamos que sea posible introducir el comando YubNub.
NOTA DE COMILLAS: Para localizar las acciones en la parte derecha, si no nos aclaramos o no nos parece cómodo buscarlas en las categorías en las que están divididas, también podremos hacerlo utilizando un pequeño buscador que hay sobre ellas.
Tras tener preparado el diálogo que se mostrará, el siguiente paso es arrastrar la acción “Ajustar el valor de la variable” en la cual tendremos que pinchar con el ratón sobre el contenido del desplegable para que nos solicite un nuevo nombre de variable. Puede poner el que quiera pero recuerde que las siguientes veces que necesite usar esa variable deberá escribirlo tal cual. Si quiere seguir el ejemplo al pié de la letra, el nombre que yo he usado es “result”.
Y por último solamente tendremos que añadir una acción más al flujo de trabajo: “Ejecutar Applescript” que es, realmente, la que se encarga de que lo anterior tenga un sentido.
Su función es bastante simple: Recuperar el texto escrito en la primera ventana, gracias a la y concatenarlo a la dirección de YubNub para efectuar la búsqueda indicada en Safari. Como he dicho otras veces, puede usarse cualquier otro navegador pero prefiero hacerlo con Safari por que es el que seguramente esté en todos los MAC.
El applescript debe estar exactamente igual que aquí:
Pues ahora que ya sabemos como añadir las acciones comencemos a trabajar:
Lo primero que haremos será incorporar al flujo de trabajo la acción “Solicitar Texto” mediante la cual habilitamos que sea posible introducir el comando YubNub.
Para localizar las acciones en la parte izquierda, si no nos aclaramos o no nos parece cómodo buscarlas en las categorías en las que están divididas, también podremos hacerlo utilizando un pequeño buscador que hay sobre ellas.
Tras tener preparado el diálogo que se mostrará, el siguiente paso es arrastrar la acción “Ajustar el valor de la variable” en la cual tendremos que pinchar con el ratón sobre el contenido del desplegable para que nos solicite un nuevo nombre de variable. Puede poner el que quiera pero recuerde que las siguientes veces que necesite usar esa variable deberá escribirlo tal cual. Si por el contrario, quiere seguir el ejemplo al pié de la letra, el nombre que yo he usado es “result”.
Por último solamente tendremos que añadir una acción más al flujo de trabajo: “Ejecutar Applescript” que es, realmente, la que se encarga de que lo anterior tenga un sentido.
Su función es bastante simple: Recuperar el texto escrito en la primera ventana, gracias a la variable y concatenarlo a la dirección de YubNub para efectuar la búsqueda indicada en Safari. Como he dicho otras veces, puede usarse cualquier otro navegador pero prefiero hacerlo con Safari por que es el que seguramente esté en todos los MAC.
El applescript debe estar exactamente igual que aquí:
1 2 3 4 5 6 7 8 9 10 11 12 13
| on run {result}
set LaDirecc to "http://www.yubnub.org/parser/parse?command=" & result
tell application "Safari"
activate
open location LaDirecc
end tell
end run |
Tras esto, solamente nos quedará guardar el servicio para poder utilizarlo a través del menú superior de cualquier aplicación (Tal y como marcamos en el primer cuadro del flujo de trabajo) PERO como en Snow Leopard es muy sencillo «rizar el rizo» vamos a darle una vuelta de tuerca más y le asignaremos una combinación de teclas para poder, a golpe de teclado, invocar el servicio de una rapidísima manera.
Para hacerlo tendremos 2 maneras de actuar:
Podremos hacerlo mediante el menú servicios en la barra superior, concretamente la opción»Preferencias de los servicios», o bien es posible realizarlo a través del panel de preferencias del sistema, entrando en teclado y en la ventana que aparece nos situaremos en la última pestaña «Funciones rápidas de teclado» y seleccionamos «servicios» en el cuadro de la izquierda. Cualquiera de estos dos caminos nos situarán en la misma ventana que es la que nos permitirá asignar (o modificar) una combinación de teclas a cualquier servicio, no solo al que acabamos de crear, sino a cualquiera de los que veamos en esa lista.

- Asignación de teclas a los servicios
Para asignar las teclas, tendremos que pinchar con el ratón a la derecha del servicio. La verdad es que no es un campo que esté delimitado así que tendremos que hacerlo por aproximación tomando como ejemplo los que están en la lista y ya tienen una combinación de teclas asignadas (O la anterior captura, ya que la zona donde debemos pinchar con el ratón es la que está marcada con un circulo rojo).
En el ejemplo he añadido la combinación ALT+Comando+Ñ ya que es muy posible que sea un atajo de teclado que no esté en uso pero es posible añadir la combinación que queramos incluso aunque esté en uso ya, eso si, en el caso de que sea una combinación utilizada no funcionará siempre, evidentemente.
Y con todo esto, ya podremos disfrutar de la genialidad de YubNub con una combinación de teclas, casi de la misma forma que lo hacíamos con Quicksilver antes de que la actualización hiciese que el trigger se borrase del lanzador cada X tiempo.
leer más
Enviado por Alvaro Anaya M. sobre Oct 2, 2009 en Manuales | 23 comentarios
—————– Actualización del 18 diciembre 2009—————
He tenido que modificar el Script ya que la dirección del traductor ha cambiado, haciendo que no funcionase la anterior versión. Si ya tenias el servicio creado y este ha dejado de funcionar, puedes bajarte la nueva versión o modificar la direcc del traductor en tu Script, como prefieras. Si por el contrario es la primera vez que lees este artículo, puedes seguirlo sin problema dado que ha sido actualizado y todo está correcto.
—————————————————————-
Una de las características más útiles y menos conocidas de MAC es la del menú Servicios, integrado en la barra de herramientas de cada programa. Dichos Servicios son funciones que vienen «de serie» en el sistema y otras que se añaden con cada nuevo programa y que permiten interactuar con los contenidos que estemos visualizando dependiendo del tipo que sean estos, del programa que estemos usando y de la función en si.
Esta carácterística incluye funciones como:
- Resumir: Permite, a partir del texto seleccionado, hacer un resumen del contenido a modo de preview. Para comprender esta opcion basta con pensar en el pequeño avance que nos muestran de las noticias algunos feeds o algunas Webs.
- Crear nuevo correo: Inserta el texto seleccionado en un nuevo correo
- Buscar en Google: Eso mismo, busca la seleccion en Google
Estas son solamente unas pocas de las muchísimas funciones que pueden aparecer en dicho menu y, a pesar de que existen todo tipo de ellas, hay una que no viene por defecto y que es realmente útil: La traducción.
Lo cierto es que, al menos en mi caso, he ido sustituyendo dicha función por la de búsqueda en el diccionario, que es otro de los servicios que viene por defecto en el sistema y que permite ver la definición de una palabra (evidentemente, como cualquier otro diccionario) pero eso, en ocasiones no resulta suficiente, sobre todo si no es una palabra lo que deseamos traducir y es una expresión o un texto completo.
Por otro lado, desde hace unos dias estoy disfrutando de las nuevas funcionalidades de Snow Leopard y una de las mejoras es precisamente la personalización del menu Servicios por lo que animado a causa de esto, he decidido crear mi propio servicio de traducción a través del Traductor de Google de forma que, solamente con el sistema y sus opciones, es decir, sin software de terceros ni ningún tipo de añadido salvo la conexión a internet, veremos como crear este servicio e incluso la forma de ejecutarlo con una combiancion de teclas para evitar movernos por los menús, ganando aún mas rapidez si cabe. Comencemos….
Para que todo sea mas sencillo, vamos a recurrir al programa ideado para hacer las cosas mas sencillas: AUTOMATOR.
Abrimos automator y seleccionamos la opción para crear un nuevo servicio.

El asistente de Automator
Ya dentro de la ventana para componer el flujo de trabajo, veremos en la parte superior de la columna derecha un pequeño cuadro con algunas opciones, en las que tendremos que decirle que nuestro servicio va a recibir TEXTO y lo hará DESDE CUALQUIER APLICACIÓN, tal y como vemos en la siguiente captura:

- Creando el servicio de Traducción
Una vez especificado el tipo de datos y de donde los recibirá, tendremos que situarnos en la columna de la izquierda y arrastrar hacia la de la derecha la acción EJECUTAR APPLESCRIPT, tal y como muestra la siguiente imagen:

- Insertando la acción en el flujo de trabajo
Y ahora solo nos falta el código, que a fin de cuentas es lo que hace que el servicio funcione y como habréis intuido a juzgar por la acción incorporada al flujo de trabajo, se trata de un pequeño applescript (Y lo de pequeño esta vez va en serio 🙂 ). Así que dentro de la acción que acabamos de arrastrar al flujo de trabajo de nuestro futuro servicio tendremos que tener escrito estas líneas que siguen, tal cual aparecen aquí debajo.
Código applescript a incluir:
1 2 3 4 5 6 7 8 9
| on run {input}
tell application "Safari"
activate
set LaDirecc to "http://translate.google.com/#en|es|" & input
open location LaDirecc
end tell
End run |
Básicamente la función de estas lineas es unir la selección texto que hayamos indicado a una URL, concretamente la del traductor de Google para que realice directamente la traducción del texto con dicho servicio. Como instrumento para realizar la acción he optado por Safari ya que viene por defecto en el sistema por lo que seria raro encontrarse un MAC sin él.
Tras realizar tal cual, todos los pasos solamente nos quedará guardar el trabajo realizado en Automator para tener listo nuevo nuevo servicio y aunque una vez guardado ya será totalmente funcional, aun podremos mejorarlo asignándole una combinación de teclas para que sea más cómodo. Eso si, es importante guardarlo con un nombre claro ya que será el que aparezca en el menú.
Hagámos una pequeña prueba, para ver si hemos seguido todos los pasos de forma correcta. Si abrimos cualquier aplicacion que muestre texto, ya sea un navegador Web, un procesador de texto, cualquier otro programa o documento en el que podamos hacer la unica parte totalmente necesaria que es, SELECCIONAR UN TEXTO y nos dirigimos al menú superior del sistema donde veremos algo similar a la siguiente captura, salvo en el nombre del programa (a no ser que también haya abierto el mismo que en ese caso, será todo idéntico):

- Pasos para ejecutar el servicio
Para que no haya confusión alguna, iré explicando cada uno de los pasos para ejecutar el servicio.
- Seleccionamos el texto. En la imagen he usado TextEdit pero servirá cualquier otra aplicación, documento o correo.
- Iremos a la entrada del menú servicios que siempre estará en el barra superior de la aplicación en la que estemos. En el caso de Snow Leopard también podremos acceder a los servicios invocando el menú contextual sobre el texto seleccionado.
- Veremos un nuevo menú categorizado según el tipo de datos con el que trabajamos. En este caso, dentro de la categoría texto aparecerá un servicio que tendrá el mismo nombre con el que hayamos guardado el flujo de trabajo de automator. Al pinchar sobre él, se ejecutará el servicio que, en este caso, abrirá una nueva ventana de Safari con la traducción del texto que hayamos seleccionado previamente.
A pesar de que ya hemos creado un servicio completamente operativo, a la par que realmente útil, si tenemos Snow Leopard como sistema podremos rizar el rizo un poquito más asignando una combinación de teclas que nos permita, tras seleccionar el texto, realizar la acción desde el mismo teclado. Para ello bastará con volver a sacar el menú de Servicios desde la barra de tareas superior e ir hasta la entrada que se muestra bajo la lista de servicios cuyo nombre es: Preferencias de los servicios. También es posible acceder a este menú mediante el panel de preferencias del sistema y entrando en la opción de teclado y ratón.

- Preferencias de los servicios
En esa misma ventana que visualizamos tendremos que buscar el nuevo servicio que hemos creado y tomando como referencia el resto de servicios que aparecen y que ya tienen una combinación de teclas asignadas, sabremos donde hacer doble click para agregarle un atajo de teclado a nuestra creación. En la anterior imagen se puede ver la combinación de teclas que he asignado en mi equipo al servicio de traducción recien creado. He optado por las teclas «Comando + Alt + G» ya que no es excesivamente dificil de recordar gracias a la G de google y existen muchas combinaciones que utilizan el uso de las teclas «Comando + ALT» así que no resulta muy rebuscada. Además hay que tener en cuenta que la combianción que asociemos no debe estar asignada ya a ninguna otra función y con más cuidado aún, en este caso que hemos creado un servicio común a cualquier aplicación por lo que es más difícil encontrar combinaciones vacías.
Un buen consejo para evitar problemas por combinaciones de teclas duplicadas es desactivar, en esa misma ventana, las combinaciones del sistema que no utilicemos. Por ejemplo, si el equipo es un portátil con Trackpad multitouch y usamos los gestos de 4 dedos para invocar Exposé o para mostrar escritorio, no es necesario tener habilitadas tambien las combinaciones de teclas para esas mismas tareas.
Ahora que ya tenemos también una combinación de teclas asignada a nuestro servicio, hemos terminado el trabajo y ya no tendremos que quedarnos con la duda de lo que significa ninguna palabra o texto, solamente por el hecho de que nos de pereza efectuar todos los pasos necesarios para realizar una traducción de la manera tradicional. Además no solo hemos aprendido algo realmente útil sino que hemos dotado al sistema de una nueva y potente característica sin recurrir a herramientas externas.
Por supuesto, utilizando este mismo sistema podremos crear nuevos servicios en el sistema, siendo como muchas otras veces, la única limitación, la que nos impone la falta de ideas e imaginación que le echemos.
Ahora bien, si no le funciona el script o no tiene ganas de seguir los pasos, siempre puede optar por la manera rápida que es descargarse el flujo de trabajo del servicio desde ESTE ENLACE y copiándolo en una de las 2 siguientes rutas dependiendo de lo que quiera:
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
Una vez esté nuestro servicio en cualquiera de esas 2 rutas, ya podremos disfrutar de su versatilidad desde el menú servicios.
En el caso de que haya optado por crear el servicio paso a paso en vez de descargándolo ya hecho, cuando lo guarde con Automator, la ruta donde estará ubicado es la del usuario actual, es decir, solo estará disponible para el usuario con el que lleve a cabo los pasos. Eso si, siempre podrá moverlo a mano a la otra ruta para que todos los usuarios que utilicen el sistema disfruten de él.
leer más
Enviado por Alvaro Anaya M. sobre Sep 19, 2009 en Manuales | 8 comentarios
Hace tiempo que donde trabajo, se está utilizando el Office Communicator 2005 como herramienta de comunicación interna de la empresa y la verdad es que resulta muy útil y «cómoda» sobre todo para no estar siempre colgado del teléfono cuando necesitas hablar con personas de otros departametos o incluso de otras sedes pero cuando tienes muchos contactos agregados, comienza a ser como todo programa muy cargado, es decir, poco práctico y lento.
En mi caso, opté por agrupar las personas por departamentos pero ha llegado un momento en el que tampoco sirve como solución cuando quieres rapidez, y más si estás acostumbrado a un buen lanzador como QUICKSILVER en MAC, por eso he recurrido a esta combinación de script y lanzador de aplicaciones en el escritorio Windows del trabajo.
El primer paso era tratar de automatizar, en un script, la apertura de un chat, al menos, con las personas que más suelo utilizarlo que, normalmente son un grupo de 5 o 6, no más. Con este paso ya me encontré el primer problema ya que, por más que busqué, no apareció nada de información sobre parámetros para pasar por linea de comandos al communicator 2005 pero como se podría decir que soy bastante testarudo, mediante el método de ensayo y error, testeando los comando de programas similares he llegado conseguir abrir un chat con una persona a través de la linea de comandos de la siguiente manera:
COMMUNICATOR.EXE sip:direccion@correo.com
En teroria el parámetro sip:direccion, deberia de establecer una llamada sobre VoIP pero dado que en mi empresa esto no está configurado, no funciona así. Es más, con dicho parámetro me abre un chat con la persona cuya dirección sigue al sip:. Es de suponer que esto funcione de forma similar en otras instalaciones de Office Communicator 2005 pero si veis que no es así, buscaremos una solución
Tal cual está, ya tiene cierta utilidad porque añadiéndole un par de líneas tendriamos un pequeño script mediante el cual podremos con un simple clic inciar un chat, así que completemos un poco más el script para que sea útil
1 2 3 4
| @ECHO OFF
CLS
CD "C:\Program Files\Microsoft Office Communicator"
COMMUNICATOR.EXE sip:direccion_correo @dominio |
Evidéntemente cambiariamos direccion_correo@dominio por una dirección de correo válida de la empresa interconectada con el communicator.
Como hemos dicho, hasta aquí ya estaría bien ya que un script así es iniciable con el ratón y con situarlo en el escritorio bastaria para tenerlo a mano pero si son muchas las personas que queremos tener accesibles de esta forma, nos va a ocurrir el mismo problema que teníamos con ellas en el communicator: demasiados botones, demasiadas personas y lentitud para buscar una entre tantas.
Para volver a evitarlo y conseguir que este manual sea realmente útil, necesitamos recurrir a una pequeña aplicación similar al ya citado QUICLSILVER de MAC solo que en esta ocasión para Windows, un lanzador de aplicaciones. A pesar de que existen varias alternativas, nos vamos a quedar con EXECUTOR ya que puede tenerse funcionando correctamente sin falta de ser administrador de equipo (No es necesario realizar una instalación).

Aspecto del cuadro de executor
Esta aplicación, una vez está arrancada, no es visible al usuario. Para «activarla» tendremos que presionar una combinación de teclas que, en mi caso, para tener la misma que en el MAC, he usado las teclas CTRL + SPACE. Cuando se pulsa dicha combinacion aparece un pequeño cuadro de texto en el que escribiremos el nombre de la aplicacion que queramos lanzar y se ejecutará.
Solamente con esta característica ya se gana un tiempo maravilloso pero lo mejor es que se pueden personalizar los comandos de la aplicación llegando ser realmente útil y comodo realizar muchas de las acciones cotidianas aunque en este caso solamente configuraremos el comando necesario para abrir un chat con la persona que queramos por communicator.
Ahora que ya he presentado el programa, vamos manos a la obra de nuevo:
Descargamos el EXECUTOR de la PAGINA OFICIAL.
Una vez descargado, tendremos que configurar 2 puntos para llamar a nuestro compañero de trabajo.
El primero es más bien las teclas que queremos tener para invocar el communicator y seleccionar que se inicie cuando arranquemos Windows. Esto se haria en el punto marcado en la siguiente captura:

Configuracion 1 del EXECUTOR
Executor ya funcionaria sin más pero nos falta aún la parte que interesa para este artículo, llamar al communicator y que nos abra un chat con la persona indicada. Esto lo conseguiremos creando un nuevo comando para el executor que, en cuanto lo escribamos vaya directamente a ejecutar el SCRIPT que le indiquemos. así que vamos manos a la obra:

Crear un nuevo comando en EXECUTOR
Para crear el nuevo comando nos situaremos en la pestaña «Keywords» y pulsaremos la tecla «INS» del teclado, lo que nos situará sobre el primer cuadro de texto llamado también «Keywords» y en el que escribiremos el nombre por el que queramos invocar el comando o script. En el caso de la captura he escrito compañero pero si tenemos en mente crear varios comandos para abrir chats, sería recomendable asignarles los nombres de las personas como por ejemplo, Armando, Sonia, Jandro, como salen en los cuadros de la parte superior de la captura.
En el siguiente cuadro de texto tendremos que escribir la ruta completa hasta el script previamente creado.
Una vez hecho esto ya estaría preparado para ser invocado de forma rápida, cómoda y sencilla aunque se puede rizar el rizo asignándole una «Hotkey» en esa misma ventana, es decir, un atajo de teclado para invocar dicho comando o incluso cambiar el icono que tendrá el comando en executor cuando lo escribamos aunque no es necesario y lo veremos en otro artículo.
Y ya está, en cuanto apliquemos los cambios realizados ya podremos hacer la prueba y disfrutar de la comodidad. Si habeis dejado la configuración igual que yo los pasos serían los siguientes:
Desde cualquier ventana, pantalla, programa, es decir, esteis donde esteis, al pulsar:
CTRL + SPACE
Se abrirá una pequeá ventana similar a esta:

Aspecto del cuadro de executor
Dentro de ella, tendremos que escribir el nombre que le hayamos dado al comando. Si habeis dejado el mismo que puse en el ejemplo seria: compañero. Realmente con que comenceis a escribirlo ya deberiais ver que os lo va autocompletando a la vez que muestra un icono, una vez veais la palabra tal y como la introdujísteis en la configuracion, solamente tendreis que apretar el intro para que el SCRIPT inicial se ejecute.
Ya veis que sencillo resulta tener todos los programas, scripts, incluso ubicaciones como el panel de control, mi pc o mis documentos en dos sencillos pasos de teclado.
Os aconsejo encarecidamente que echeis un vistazo a los comandos que vienen incluidos en la lista del propio EXECUTOR ya que os servirán de guía para crear otros nuevos. Además tened en cuenta que tambien admite parámetros y páginas WEB por lo que podréis crear comandos compuestos, sin mucha complicación como algunos de los que tengo yo aunque la elaboración de los mismo la veremos en otro manual más adelante
Un saludo.
leer más