martes, abril 24, 2018

Jordi Évole y la acción de la UE en el Mediterráneo

De todas las ficciones que le he leído a Jordi Évole, probablemente la que más me llama la atención es aquella en la que afirma sin despeinarse que la Unión Europea no está haciendo nada en el Mediterráneo para intentar salvar a los inmigrantes que las mafias dedicadas al tráfico de personas lanzan al mar desde las costas libias. De hecho, ha vuelto de nuevo a embarcase en los barcos de Open Arms para grabar un programa. Aquí tenéis algunos ejemplos de tuits con los que se despacha (1,2)

Que Jordi Évole lleva bastante tiempo mintiendo sobre la relación de la Unión Europea y el tráfico de personas en el Mediterráneo es algo que puede comprobar fácilmente cualquiera. Sólo tiene hay que ir a la página web de EUNAVFOR MED o operation Sophia y podrá ver la cantidad de medios que la Unión Europea lleva dedicando desde octubre del 2015. El velero Astral, de la ONG Open Arms se adquirió en julio de 2016. Curiosamente, lo primero que se hace es embarca el equipo de Évole en el velero.

Jordi Évole lleva bastante tiempo afirmando que en la Unión Europea no se ha hecho nada para ayudar a los inmigrantes que salen desde Libia. Veamos los hechos con una pequeña muestra:

Podría seguir buscando referencias - cosa que haré cuando tenga un hueco - . Hay multitud de noticias donde se habla de la participación de los distintos medios puestos por la Unión Europea para ayudar a la lucha contra el tráfico ilegal de personas en el Mediterráneo. Y a esto le sumanos la inestimable labor que realizan multitud de ONGs en la zona, que nadie critica su labor.

Decir que la Unión Europea no ha puesto recursos para salvar a personas en el Mediterráneo es simplemente una mentira. Se ha puesto muchos medios y dinero. ¿Se podría poner más? ¿Se podría hacer más? No lo sé. Pero,ni está ciega ni mira para otro lado. Aquellos que realizan esas afirmaciones, mienten. Pronto tendremos un nuevo Salvados donde se nos intentará convencer de nuevo que la UE está de brazos cruzados. Y ahora, reflexionen sobre lo que muestra o no quiere mostrar el famoso documental Astral. Lo que no es justo es presentar a ciertas ONGs como las únicas que se preocupan por el problema de la inmigración y retratar a la UE como un ente frío que pasa del problema. Algo, por otra parte, clásico del maniqueísmo que suele hacer gala Évole.

Por otra parte, las mafias saben perfectamente que los europeos vamos a hacer lo posible por rescatar a las personas que los traficantes dejan en medio del mar. No me extrañaría mucho, que incluso se lo digan a los mismos inmigrantes que cuentan con esa baza. Un ejemplo de lo que digo es lo que le sucedió a Helena Maleno, a la que las mafias del tráfico de personas en el Estrecho, avisaban para que ésta llamase a Salvamente Marítimo.

Enlaces

viernes, abril 13, 2018

Jon Ritman estará en Retromadrid 2018

¿Os suena el videojuego de Batman o el maravilloso Head Over Heels?. Ambos desarrollados originalmente para máquinas de 8 bits con 64 Kb de memoria y apenas 4 Mhz. Usan la perspectiva isométrica que popularizó juegos como el Knight Lore. En mi caso, el Head Over Heels me proporcionó muchísimas horas de diversión en mi infancia en mi viejo Amstrad CPC 6128.

Pues Retromadrid en la edición que se celebrará este año el fin de semana del 28 y 29 de Abril, se trae el domingo 29 a Jon Ritman el programador de estos dos clásicos, a una charla coloquio. Todo un mito de la programación de los 8 bits. Merecerá la pena oír que cuenta sobre esa época.

lunes, abril 09, 2018

Applescript y Spotify: Uso del API para hacer un sistema de notificaciones

En MacOS X, el cliente de Spotify tiene un API accesible a través de Applescript, que permite controlar el reproductor y obtener información sobre las pistas que están sonando (álbum, artista, portada, etc). Está un poco limitado: no permite gestionar las listas de reproducción de manera sencilla.

Mi idea original era utilizar algún tipo de script que me permitiera gestinar mis listas de reproducción y hacer una copia de seguridad de la misma, así como ver la posibilidad de sincronización con otras aplicaciones. Sin embargo, el API no permite esta funcionalidad - al menos, de manera directa - , así que por hacer una prueba con el mismo, he implementado un pequeño script que se ejecuta desde los launch agents, comprobando cada cierto tiempo si está corriendo Spotify, en caso de que así sea, cuál es la canción que está reproduciendo y se compara con la anterior. En caso de que sea nueva, se muestra una notificación con la nueva canción que se ha empezado.

El script que implementa eso es el siguiente:

-- This script will loop if Spotify is running, showing a notification each time a new 
-- track is playing
use framework "Foundation"
use scripting additions
on getCurrentlyPlayingTrack()
  tell application "Spotify"
    set currentArtist to artist of current track as string
    set currentTrack to name of current track as string
    set currentAlbum to album of current track as string
    set theText to currentArtist & " - " & ¬
      currentAlbum & " - " & ¬
      currentTrack
    return theText
  end tell
end getCurrentlyPlayingTrack

on run
  set currentTrackID to ""
  repeat
    if application "Spotify" is running then
      tell application "Spotify"
        if player state is stopped or player state is paused then
          current application's NSThread's sleepForTimeInterval:2
        else
          set tmpTrackID to id of current track
          if tmpTrackID = currentTrackID then
            current application's NSThread's sleepForTimeInterval:2
          else
            display notification my getCurrentlyPlayingTrack()
            set currentTrackID to tmpTrackID
          end if
        end if
      end tell
    end if
    current application's NSThread's sleepForTimeInterval:2
  end repeat
end run

Las dos partes más interesantes de este script son aquellas partes que interaccionan con Spotify y la técnica usada para realizar una espera activa.

La interacción a través del API, nos permite saber cual es el estado actual del player, player state, que puede ser playing, paused o stoped:

tell application "Spotify"
  if player state is playing then
    display dialog "Player running"
  else if player state is paused then
    display dialog "Player paused"
  else if player is stopped then
    display dialog "Player is stopped"
  else
    display dialog "Unknow state"
  end if
end tell

Por otra parte, se obtiene información de la pista actual seleccionada en el reproductos con current track:

tell application "Spotify"
  set currentArtist to artist of current track as string
  set currentTrack to name of current track as string
  set currentAlbum to album of current track as string
  set theText to currentArtist & " - " & ¬
    currentAlbum & " - " & ¬
    currentTrack
  display dialog theText
end tell

El resto de las propiedades pueden verse añadiendo la aplicación al Editor de Script y viend las propiedades del objeto: Se puede controlar el volumen, la pista que se está reproduciendo, pasar a la siguiente pista, a la anterior...

Puede que nos interese que este script siempre se esté ejecutando, pero claro, no nos interesa estar haciendo espera activa, usar la funcionalidad presente en las versiones de AppleScript incluidas a partir de Yosemite, de llamar a clases de Objective-C, en vez de usar el comando delay, hago un sleep para que el control se ceda a otro hilo:

use framework "Foundation"
use scripting additions
current application's NSThread's sleepForTimeInterval:2

Para que nuestro pequeño script se arranque cada vez que entremos en el ordenador, lo ideal es implementarlo como un un Launch Agente. Si nuestro script está grabado en la ruta ~/Library/Scripts/spotify.scpt, se puede crear un fichero XML en ~/Library/LaunchAgents y cargarlo en el sistema con ayuda de launctl. Si creamos en el directorio de agentes un fichero que podemos llamar local.spotify.nexttrack.plist con el siguiente contenido:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>local.spotify.nexttrack</string>
  <key>ProgramArguments</key>
  <array>
    <string>sh</string>
    <string>-c</string>
    <string>osascript "$HOME/Library/Scripts/spotifyon.scpt"</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>

Y ahora, lo ponemos bajo supervisión del launchd, que lo lanzará cada vez que nos loguemos en el sistema:

cd ~/Library/LaunchAgents
launchctl load local.spotify.nexttrack.plist

Tal como está desarrollado el script, este hará un bucle, comprobará si está Spotify ejecutándose. De ser así, mirará el estado del reproductos, y si está reproduciendo y la pista es distinta a la anterior, mostrará una notificación.

sábado, abril 07, 2018

No importa el qué, importa el quién: Google vs Facebook

(via slashdot) Bloomberg acaba de publicar que los mensajes e imágenes que se envían usando los sistemas de mensajería de Facebook son analizados por la compañia para ver si los mismos cumplen con sus términos de servicio. En caso de que se produzca una violación de dichos términos, los mensajes no alcanzan sus destinatarios.

La noticia se enmarca dentro de los problemas que está teniendo Facebook con la privacidad. Lo curioso, es que este tipo de técnicas lo llevan usando años Google. Y no causan tanta revuelta. Por ejemplo, hasta hace poco, Google analizaba los correos de Gmail para poder ofrecer publicidad dirigida. O analizaba los ficheros para detectar aquellos s archivos con conetnido adulto que borraba del servicio GDrive.

El tratamiento de uno u otro caso en la prensa me lleva llamando la atención bastante tiempo: Ambas empresas viven del minado y perfilado de datos, para ofrecérselo a sus anunciantes: minan datos, perfilan a los usuarios e intentan aplicar todo tipo de algoritmos para que la publicidad sea lo más dirigida posible - maximizar la información mutua - . Sin embargo, Google aparece siempre rodeada por el Don't be evil frente a Facebook. ¿estamos ante un nuevo caso de no importa el qué sino el quién realiza un acto determinado?.

Más allá del tratamiento que estamos viendo en medios de comunicación de estos temas, hay una lección que se debe de extraer de todos estos casos: Los sistemas de análisis automático de contenidos van a ir a más. Y dependiendo de las condiciones de servicio, los proveedores pueden alterar conforme les plazca, pueden hacer imposible transmitir o almacenar en alguno de sus servicios según qué contenido. Aquí hemos puesto el ejemplo de contenidos para adultos legales. Pero llegado el momento,puede hacerse extensible a otro tipo de contenidos legales pero que por diversos motivos, a cualquiera de estos proveedores de servicio no les interese llevar.

¿Significa una crítica a Google o Facebook?. No, uso ambos servicios todos los días. Pero sé como funcionan y que se reservan el derecho de hacer con su plataforma lo que quieran. Y esto último, no debe olvidarse.