Automatización de tareas de Mac OSX con JavaScript

Me encanta la automatización y a menudo uso herramientas de automatización para mejorar mi productividad. Estoy usando una MacBook Pro como mi estación de trabajo principal, que incluye sistema operativo Unix Like Mac OSX. Quería encontrar una manera de facilitar mis tareas diarias, por ejemplo, programar y escribir en mi blog. Abrir muchas aplicaciones y configurarlas, me hace mas lento, y solo configurar mi ambiente de trabajo puede llevar unos minutos. ¿Qué pasaría si pudiera reducir eso a unos pocos segundos escribiendo un script para realizar esas tareas repetitivas?

Aquí hay un ejemplo del conjunto de tareas que realizo para comenzar a escribir un nuevo blog post (utilizo el generador de sitios estático de hugo).

  1. Abrir la terminal.
  2. Navegar a la ruta en la que se encuentra mi blog /my/user/directory/ottogiron.me.
  3. Ejecutar el comando serve hugo serve -D.
  4. En el terminal actual (iTerm) abrir un nuevo panel-horizontal/sesión.
  5. Navegar de nuevo a la ruta (sí, mi sesión de iTerm predeterminada no recuerda mi ruta).
  6. Ejecutar código de estudio visual code .
  7. Comenzar a escribir.

Entonces si estoy lo suficientemente enfocado estos pasos toman 20 segundos (tal vez). ¿Si estoy un poco distraído 1 minuto?.

Descubrí que OSX incluye su propio intérprete para automatizar ese tipo de tareas. Es compatible con su propio lenguaje de scripting de automatización llamado Applescript. Lo empecé a usar y no lo disfruté, ya que carecía de las características que esperarías en un lenguaje en general. Acepto que la idea que tenían para un lenguaje declarativo era buena. Me imagino que estaban buscando llegar a un público más amplio, no solo a los programadores.

Usé Applescript al principio, y me sentí un poco frustrado debido a las vueltas que necesitaba para cosas básicas. Un ejemplo fue la falta de arrays asociativos. Más tarde descubrí que también proveen compatibilidad con JavasScript. La opción de JavaScript proporciona toda la potencia del lenguaje, que es mucho mejor.

Ejemplo

Aquí hay un ejemplo simple. Abre una nueva ventana de iTerm y escribe un comando.

#!/usr/bin/env osascript -l JavaScript //(optional)
//myscript.js
const projectPath = '/path/to/my/project'
const app = Application("iTerm");
 var window = app.currentWindow();

 if (!window) {
    window = app.createWindowWithDefaultProfile();
 }

 const serviceSession = window.currentSession();
 serviceSession.write({text:`cd ${projectPath}`});

El script anterior comprueba si una ventana de iTerm ya está abierta, si no abre una nueva, obtiene la sesión actual y escribe un comando simple.

Corriendo el Script

osascript, el intérprete, ya está instalado en OSX

Opción 1

Para correr el script en la terminal:

   osascript -l JavaScript myscript.js

Magia! Va a correr las tareas.

En mi caso, quería que el script estuviera disponible como un binario.

Opción 2

Notaron el #!/usr/bin/env osascript -l JavaScript en la parte superior del script? Útil para hacer el archivo ejecutable o simplemente ejecutarlo con su shell favorito.

Haciéndolo ejecutable

chmod + x
/path/to/script/myscript.js

O, Corriendo con el shell

sh /path/to/script/myscript.js

Desventajas

No encontré una manera fácil de modularizar mi código. Por ejemplo, la parte en la que valido si la ventana ya está abierta, tuve que copiar y pegarla en todas partes. Lo resolví usando Webpack transfiriendo el código modular al viejo y confiable ES5/JavaScript. Voy a escribir otra publicación en el blog explicando cómo lo hice.

Conclusión

La automatización no solo es divertida, sino que puede aumentar mucho nuestra productividad. Mostré un ejemplo simple, pero con la imaginación podríamos escribir scripts de automatización más sofisticados. Eso puede ayudarnos a concentrarnos en lo que importa cuando trabajamos con alguna tarea diaria.


comments powered by Disqus