Posts by Alvaro Anaya M.

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

read more

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í:

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
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

.

read more

Convertir videos al formato iPhone con Applescript y Quicktime X

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…

open (choose file)

Para los que nunca han programado nada (Uhmmm, y tampoco han leido ninguno de los muchos artículos de mi Blog :-P ) 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:

on open LosElementos
    try

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:

end try
end 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

.

read more

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

1
2
3
4
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í:

1
2
3
4
5
6
7
(*
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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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”.

read more

Creando un servicio de comandos YubNub

Creando un servicio de comandos YubNub

———————— 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

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

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
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
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.

read more
_