Posted by Alvaro Anaya M. on Sep 7, 2011 in Scripts, Trucos | 0 comments
Una de las tareas que, hoy por hoy, no podemos realizar con applescript (Y sin herramientas o aplicaciones de terceros) es mostrar una imagen o reproducir un video. Ciertamente, si bien es posible hacerlo llamado a alguna aplicación que si lo haga, si queremos que nuestro script sea portable y que funcione en cualquier equipo, esto es un problema puesto que no todo el mundo tendrá la aplicación que usemos para tales tareas y/o ganas de instalarla. Otro método que si nos permitiría reproducir el video o mostrar una imagen, sería recurrir al nuevo (Bueno, ya no tan nuevo) applescript studio basado en cocoa pero es algo más complicada la curva de aprendizaje, al menos inicialmente y requiere invertir un tiempo que no siempre tenemos así que si desechamos estas opciones vemos que hoy por hoy no es posible ¿O si?
Una de las características que más uso de OSX es el QuickLock, esa maravillosa ventanita que si tenemos un archivo seleccionado y pulsamos la barra espaciadora, nos muestra su contenido sin importar que sea video, imagen o archivos de texto (Eso sin contar con los plugins que permiten mostrar prácticamente de todo) así que ¿Porque no recurrir a ella desde nuestro script? Está claro que es la solución más rápida y factible que tenemos puesto que no es nada complicado de invocar y sabemos que está en cualquier Mac en el que se ejecute nuestro script así que, una vez más… manos a la obra
Esta vez es un script lo suficientemente pequeño y sencillo para no tener que ir explicando más profundamente de lo que lo que hacen las lineas de comentarios en el mismo script.
1 2 3 4 5 6 7 8 9 10 11 12 13
| -- Primero definimos el handler
on abreQuicklook(elArchivo)
-- Convertimos el formato de la ruta
set laRuta to quoted form of (POSIX path of elArchivo) as string
-- Llamamos a Quicklook desde la linea de comandos
do shell script ("qlmanage -p " & laRuta)
end abreQuicklook
-- Solicitamos un archivo
set elArchivo to (choose file with prompt "Seleccione una imagen o video…")
-- Llamamos a nuestro hadler pasándole la ruta al archivo
abreQuicklook(elArchivo) |
Y ya!! con esto veremos que, con muy pocas lineas, tenemos un script capaz de mostrar contenido multimedia, sin recurrir a ninguna app de terceros, la cuál es posible que no esté instalada en cualquier mac.
read more
Posted by Alvaro Anaya M. on Sep 2, 2011 in Manuales, Trucos | 9 comments
Con la actualización a Lion, tenia una pequeña aplicación (llamada Go2Shell) que ha dejado de funcionar. Dicha aplicación, descargada de la Mac App Store, tenia como finalidad “Abrir la terminal” y el sitio optimo para utilizarla era arrastrándola a la barra de herramientas del Finder (La barra que hay en la parte superior de toda ventana del Finder, si está habilitada la opcion de que se muestre en el menú Visualizacion del mismo Finder) para que, en cualquier carpeta que visualizaras a través del Finder, estuviese el botoncito que, al pulsarlo, abría una terminal en la misma carpeta, haciendo bastante cómodo el proceso. Por desgracia, este botón ha comenzado a mostrar un error al pulsarlo y para mi sorpresa, al tratar de eliminarlo de la barra de herramientas del Finder, no se puede.
Apartando por un momento este inconveniente, me he puesto a buscar un pequeño applescript que había hecho hacia tiempo para esto mismo con la finalidad de sustituir el programita pero, por despiste, he añadido otro script a la barra de herramientas de Finder, consiguiendo tener 2 iconos en dicha barra que no funcionaban y que no podía quitar por lo que me he puesto a investigar un poco y, por suerte, he encontrado una soluciónpara eliminar dichos botones, que resultan bastante molestos al no servir para nada.
Estos son los pasos a seguir…
Lo primero que hay que hacer es ir a la siguiente ruta….
1
| Carpeta de usuario/Library/Preferences |
Hay nos encontraremos varios archivos del tipo “com.apple.xxxxx.xxxxx”
Estos archivos son los famosos property list (PLIST) en formato binario y antes de tocar ninguno de ellos, el primer paso a realizar es hacer una copia del que vamos a editar, por si se tocase algo más de lo debido y generásemos un nuevo problema.
Dado que el archivo sobre el que vamos a trabajar es “com.apple.finder.plist”, lo que toca es realizar una copia del mismo a un lugar seguro.
Ahora que ya tenemos una “red de seguridad” ante posibles accidentes
tendremos que editarlo y dado que está en binario, si no tenemos un editor de archivos PLIST, tocará convertirlo a formato de texto. Para este paso tendremos que abrir un terminal y ejecutar el siguiente comando….
1
| plutil -convert xml1 com.apple.finder.plist |
Una vez aplicada la conversión del formato, ya podemos abrirlo con un editor de texto como, por ejemplo, TextMate. Al hacerlo, veremos que tiene un montón de lineas aunque a nosotros solamente nos interesan dos de ellas (Dos han sido en mi caso, realmente es una por cada icono añadido por nosotros que queramos quitar y digo añadido por nosotros porque para los propios del Finder se puede hacer desde las opciones, sin falta de tanto paso)
Así pues, buscaremos un bloque parecido a este:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <key>TB Item Identifiers</key>
<array>
<string>com.apple.finder.BACK</string>
<string>NSToolbarFlexibleSpaceItem</string>
<string>com.apple.finder.SWCH</string>
<string>com.apple.finder.ARNG</string>
<string>NSToolbarSpaceItem</string>
<string>com.apple.finder.QUIK</string>
<string>com.apple.finder.ACTN</string>
<string>NSToolbarFlexibleSpaceItem</string>
<string>com.apple.finder.loc </string>
<string>com.apple.finder.loc </string>
<string>com.apple.finder.INFO</string>
<string>NSToolbarFlexibleSpaceItem</string>
<string>com.apple.finder.SRCH</string>
</array> |
En este bloque, las lineas que tendremos que eliminar son las que ponen lo siguiente:
1 2
| <string>com.apple.finder.loc </string>
<string>com.apple.finder.loc </string> |
Una vez eliminadas ya habremos solucionado el problema y solamente nos quedaría reinciar el Finder. Para hacerlo, basta con aplicar desde una terminal el siguiente comando…
Esta orden, nos solicitará la password y una vez aplicado veremos como el Finder se cierra y a continuación se vuelve a abrir solamente que esta vez, los molestos iconos no aparecerán en la barra de herramientas, dejando el espacio que ocupaban completamente libre para dejarlo vacío o para añadir nuevos botones (Eso si, sería bueno que, si añadimos nuevos botones, esta vez sean scripts o aplicaciones que funcionasen
)
Como alternativa, también seria posible directamente eliminar dicho archivo y reinciar el Finder, ya que esto hace que se genere de nuevo y, aunque a priori pueda parecer más rápido o cómodo, hay que tener en cuenta que se perderían todos las configuraciones/personalizaciones que hubieran sido hechas sobre la barra de herramientas y por supuesto, que sería menos entretenido y menos didáctico que hacerlo a mano borrando las lineas implicadas.
read more
Posted by Alvaro Anaya M. on Sep 25, 2010 in Scripts | 11 comments
Una tarea que puede ser bastante común a la hora de escribir scripts o aplicaciones que trabajen con el sistema de archivos es la necesidad de descomponer una ruta completa del tipo “/directorio/subdirectorio/…/…/archivo.extension” para obtener por separado el nombre de archivo, la extensión y la ruta de directorios. De hecho, fue una de las necesidades que me ha surgido estos días, escribiendo un Shell Script un tanto grande en el que necesitaba obtener el nombre de un archivo de una ruta completa así como la estructura de directorios hasta el mismo.
Dado que me suele gustar, al escribir scripts de cierto tamaño, dividirlos por bloques de código independientes, voy a publicar este como una solución aislada para solventar el problema de descomponer rutas aunque cuando lo volváis a ver en el script que aún no he terminado aparecerá como una función por la comodidad que representan y porque facilitan mucho la lectura del código en scripts de muchas lineas. Sin más preámbulos, vamos manos a la obra:
Dado que este código ahora es independiente, he realizado algunos cambios como que tome la entrada de datos a modo de parametros tras el nombre del script por lo que la ruta a descomponer, deberá ir tras el nombre del script en lo que seria el parámetro $1, es decir, tendriamos que pasárselo de la siguiente manera:
1
| ./script.sh /ruta/que/queramos/descomponer/archivo.extension |
Por el mismo motivo, lo he dispuesto de forma que la salida del mismo sea la salida estándar mostrando el valor de cada una de las variables que intervienen en el proceso.
También he comentado las lineas relevantes ya que creo que será mejor explicar cada una de las lineas en el mismo punto donde aparece. Así pues, este es el script:
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
| #!/bin/bash
# Script para descomponer una ruta completa a un archivo o directorio, obteniendo
# el nombre de archivo y extensión (si existen) y ruta hasta los mismos
for RutaCompleta in $1
do
# Comenzamos extrayendo la parte derecha desde el ultimo caracter "/", es decir, el archivo
NombreArchivo="${RutaCompleta##*/}"
# Longitud de la ruta es el total de caracteres menos el largo del nombre de archivo
LargoRuta="${#RutaCompleta} - ${#NombreArchivo}"
# Extraermos la ruta desde el caracter 0 hasta el caracter final de largo de ruta
RutaSola="${RutaCompleta:0:$LargoRuta}"
# Lo siguiente es extraer nombre de archivo
NombreSolo="${NombreArchivo%.[^.]*}"
# Extension se obtiene eliminando del nombre completo el nombre mas el punto
Extension="${NombreArchivo:${#NombreSolo} + 1}"
# Las 2 lineas anteriores fallan si no hay extension por lo que es necesario comprobar que no
# se de el caso de que haya extension pero no nombre ya que en ese caso la ext seria el nombre
if [[ -z "$NombreSolo" && -n "$Extension" ]]; then
NombreSolo=".$Extension"
Extension=""
fi
done
# Este es el resultado del script
echo
echo "Este es el resultado del script:"
echo
echo La ruta completa es:
echo $RutaCompleta
echo
echo "Ruta.........: \"$RutaSola\""
echo "Nombre.......: \"$NombreSolo\""
echo "Extension....: \"$Extension\""
echo |
Si lo ejecutamos, la salida del mismo, según está, sería similar a esto:
1
| $ ./descomp.sh /dir1/subdir1/subdir2/archivo.txt |
Este es el resultado del script:
La ruta completa es:
/dir1/subdir1/subdir2/archivo.txt
Ruta………: “/dir1/subdir1/subdir2/”
Nombre…….: “archivo”
Extension….: “txt”
Ahora bien, hay que tener en cuenta que si lo vamos a utilizar como una función llamada desde otro script o simplemente como un bloque de código incrustado entre las lineas, habría que hacerle algunos cambios, pero dado que lo estoy utilizando en otro script que voy a publicar aquí también, no lo explicaré aún ya que es cuestión de tiempo que me toque hacerlo.
read more
Posted by Alvaro Anaya M. on Mar 6, 2010 in Scripts, Trucos | 4 comments
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
Posted by Alvaro Anaya M. on Feb 24, 2010 in Scripts | 18 comments
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