sábado, 19 de agosto de 2017

Desactualizando paquete de Arch Linux sin pacman


A.K.A. El fin de semana después del día que ingenuamente quise actualizar Arch Linux por partes en vez de actualizarlo todo.

Acerca de como comenzó todo

Pueden omitir esta sección. Todo comenzó un día que quise actualizar mi instalación de Apricity OS mientras estaba cenando, pero no quise actualizar todo debido a que necesitaba trabajar en la computadora después de cena, en Windows, y el tamaño de la actualización era de 1.2 Gb, por lo que con una magnífica conexión de 2Mbps, eso iba a tomar un largo rato.

Así que decidí a actualizar solo algunos paquetes que yo creía que eran independientes de todo lo demás. Empecé a ver la lista, y poco a poco fui actualizando algunos paquetes: geany, gimp, nano, samba... curl. Luego de eso seguí usando la computadora por un rato con normalidad, y la apagué. Todo bien.

Luego vine el fin de semana a querer utilizar la computadora para ver vídeos en Youtube mientras desayunaba. Para mis ratos de ocio prefiero ocupar Linux, ya que es más rápido, y no dependo de nada de Windows para ello. Todo bien. Luego noté que Variety no estaba corriendo (Variety se ha vuelto mi referencia de la salud del sistema operativo últimamente). ¡Qué raro?, pensé yo, pues lo había actualizado recientemente. Así que lo ejecuté desde la línea de comandos, para obtener más información. Apareció en pantalla un error de que no se podía encontrar la librería libssl.so.1.1.

Pensé que podría ser que Variety necesitaba otra actualización, así que procedí a actualizar la base de datos de paquetes de pacman, para ver si habían actualizaciones disponibles, con el comando:

sudo pacman -Syy

Cuando veo un error similar: No se puede encontrar la librería libssl.so.1.1. Así que ni modo, recurrí a Google para buscar alguna respuesta.

Después de un rato encontré un post que sugería crear enlaces simbólicos de las librerías requeridas hacia las librerías existentes, así que cree dos enlaces simbólicos, uno para libssl.so.1.1 y otro para libcrypto.so.1.1:

ln -s /usr/lib/libssl.so.1.0.0 /usr/lib/libssl.so.1.1
ln -s /usr/lib/libcrypto.so.1.0.0 /usr/lib/libcrypto.so.1.1

Luego intenté nuevamente actualizar la lista de paquetes de pacman, y obtuve el siguiente error:


Y allí me acordé: había actualizado curl, pero lo que no sabía es que curl requería versiones actualizadas de libssl y libcrypto. Además, lo había actualizado por sí solo pensando que yo había sido el que había instalado el paquete y que no había dependencias de este.  Pero para mi horror, el mismísimo pacman dependía de curl.

Intenté buscar una forma de desactualizar curl, pero la forma estándar requería usar pacman, lo cual fue imposible. Oh, el horror.


Así que ni modo, a buscar una alternativa para hacer la actualización a pata. Gracias a Dios me encontré con esta entrada en Reddit: Pacman libcritpto.so.1.1 errors.

Desactualizando paquete de Arch sin pacman

Sabiendo que en mi caso el error había sido solamente con curl, procedí a realizar la desinstalación de la versión más nueva que encontré en /var/cache/pacman/pkg, la cual era curl-7.55.1-1. Ejecuté el siguiente comando, como super usuario:

tar -tf /var/cache/pacman/pkg/curl-7.55.1-1-x86_64.pkg.tar.xz | sed s:^:/: | grep -v /$ | xargs rm

Explicando el comando por partes:
PasoComandoDescripción
1 tar -tf /var/cache/pacman/pkg/curl-7.55.1-1-x86_64.pkg.tar.xz
Obtiene la lista de archivos contenidos en el paquete.
2 sed s:^:/:
Agrega / al principio de la ruta de cada archivo.
3 grep -v /$
Del listado anterior, quita los elementos que terminen en /, ya que estos corresponden a carpetas.
4 xargs rm
Elimina los archivos listados.

Luego, procedí a instalar la versión previa disponible en el cache de paquetes, que era curl-7.52.1-2, con el siguiente comando (siempre como usuario root):

tar -xf /var/cache/pacman/pkg/curl-7.52.1-2-x86_64.pkg.tar.xz

Y finalmente probé actualizar nuevamente la base de datos de pacman, y todo resultó bien:


Lección aprendida: No actualizar Arch Linux a medias.

sábado, 12 de agosto de 2017

Obtener documentación de base de datos SQL Server

Por cuestiones de tiempo, esta entrada es solo un "dump" de código fuente. Asumiendo que hiciste tu tarea de colocar los comentarios de los objetos de la base de datos utilizando la propiedad extendida MS_Description, a continuación incluyo unas consultas para obtener la documentación respectiva de los objetos más relevantes de la base de datos.

Esquemas

SELECT
  s.name AS esquema,
  ep.value AS descripcion
FROM sys.schemas s
  left join sys.extended_properties ep
    ON s.schema_id = ep.major_id
      AND ep.name = 'MS_Description'
WHERE s.name NOT IN (
  -- Lista de esquemas a ignorar
  'db_accessadmin',
  'db_backupoperator',
  'db_datareader',
  'db_datawriter',
  'db_ddladmin',
  'db_denydatareader',
  'db_denydatawriter',
  'db_owner',
  'db_securityadmin',
  'guest',
  'INFORMATION_SCHEMA',
  'sys'
)
ORDER BY 1

Tablas

SELECT
  SCHEMA_NAME(schema_id) esquema,
  t.name AS tabla,
  ep.value AS descripcion
FROM sys.tables AS t
  left join sys.extended_properties ep
    ON t.object_id = ep.major_id
      AND 0 = ep.minor_id
      AND ep.name = 'MS_Description'
ORDER BY 1, t.name

Columnas

Nota: No he descubierto aún por qué, pero hay ciertos casos en los que la columna que es llave primaria me aparece duplicada. Cualquier ayuda es bienvenida :)

SELECT
  SCHEMA_NAME(schema_id) + '.' + t.name AS tabla,
  c.name AS columna,
  TYPE_NAME(c.system_type_id) AS tipo_de_datos,
  CASE c.max_length
    WHEN -1 THEN 'MAX'
    ELSE CAST(c.max_length AS VARCHAR(100))
  END tamano,
  CASE c.is_nullable
    WHEN 1 THEN 'Sí'
    ELSE 'No'
  END AS permite_nulos,
  CASE i.is_primary_key
    WHEN 1 THEN 'Sí'
    ELSE 'No'
  END AS llave_primaria,
  CASE
    WHEN fk.referenced_column_id IS NOT NULL THEN 'Sí'
    ELSE 'No'
  END AS llave_foranea,
  ep.value AS descripcion
FROM sys.tables AS t
  INNER JOIN sys.columns c
    ON t.object_id = c.object_id
  LEFT JOIN sys.index_columns AS ic
    ON ic.OBJECT_ID = c.OBJECT_ID AND ic.column_id = c.column_id
  LEFT JOIN sys.indexes AS i
    ON i.OBJECT_ID = ic.OBJECT_ID AND i.index_id = ic.index_id
  LEFT JOIN sys.foreign_key_columns AS fk
    ON fk.parent_object_id = c.object_id
      AND fk.parent_column_id = c.column_id
  LEFT JOIN sys.extended_properties ep
    ON t.object_id = ep.major_id
      AND c.column_id = ep.minor_id
      AND ep.name = 'MS_Description'
ORDER BY 1, c.column_id

Llaves foráneas

Nota: Esta consulta devuelve una fila por columna, por lo que aparecerán tantas filas como columnas incluya la llave.

SELECT
  SCHEMA_NAME(t.schema_id) + '.' + t.name as tabla_hija,
  c.name as tabla_hija_columna,
  SCHEMA_NAME(tr.schema_id) + '.' + tr.name tabla_padre,
  cr.name tabla_padre_columna,
  fk.name fk_nombre,
  CASE fk.update_referential_action
    WHEN 0 THEN 'NO ACTION'
    WHEN 1 THEN 'CASCADE'
    WHEN 2 THEN 'SET NULL'
    WHEN 3 THEN 'SET DEFAULT'
  END regla_actualizacion,
  CASE fk.delete_referential_action
    WHEN 0 THEN 'NO ACTION'
    WHEN 1 THEN 'CASCADE'
    WHEN 2 THEN 'SET NULL'
    WHEN 3 THEN 'SET DEFAULT'
  END regla_eliminacion
FROM sys.foreign_key_columns as fkc
  INNER JOIN sys.foreign_keys fk
    ON fkc.constraint_object_id = fk.object_id
  INNER JOIN sys.tables as t
    ON fkc.parent_object_id = t.object_id
  INNER JOIN sys.columns as c
    ON fkc.parent_object_id = c.object_id
      and fkc.parent_column_id = c.column_id
  INNER JOIN sys.tables as tr
    ON fkc.referenced_object_id = tr.object_id
  INNER JOIN sys.columns as cr
    ON fkc.referenced_object_id = cr.object_id
      and fkc.referenced_column_id = cr.column_id
ORDER BY 1, fkc.constraint_column_id

Índices

Nota: Esta consulta devuelve una fila por índice, y muestra las columnas separadas por comas.

SELECT DISTINCT
  da.tabla AS tabla,
  i.name AS indice,
  da.tipo AS tipo,
  CASE i.is_primary_key
    WHEN 1 THEN 'Sí'
    ELSE 'No'
  END AS llave_primaria,
  CASE i.is_unique
    WHEN 1 THEN 'Sí'
    ELSE 'No'
  END AS llave_unica,
  CASE i.is_unique_constraint
    WHEN 1 THEN 'Sí'
    ELSE 'No'
  END AS restriccion_unicidad,
  LEFT(cols.names, LEN(cols.names) - 1) columnas
FROM sys.tables AS t
  INNER JOIN sys.columns c
    ON t.object_id = c.object_id
  INNER JOIN sys.index_columns AS ic
    ON ic.OBJECT_ID = c.OBJECT_ID AND ic.column_id = c.column_id
  INNER JOIN sys.indexes AS i
    ON i.OBJECT_ID = ic.OBJECT_ID AND i.index_id = ic.index_id
  CROSS APPLY (
    SELECT
      SCHEMA_NAME(schema_id) + '.' + t.name tabla,
      CASE i.index_id
        WHEN 1 THEN 'CLUSTERED'
        ELSE 'NONCLUSTERED'
      END AS tipo
  ) da
  CROSS APPLY (
    SELECT c_i.name + ','
    FROM sys.columns c_i
      INNER JOIN sys.index_columns AS ic_i
        ON ic_i.OBJECT_ID = c_i.OBJECT_ID AND ic_i.column_id = c_i.column_id
    WHERE i.OBJECT_ID = ic_i.OBJECT_ID AND i.index_id = ic_i.index_id
    FOR XML PATH ('')
  ) cols(names)
ORDER BY 1, 2, 3

Sobreviviendo a un OS descontinuado - Apricity OS


Saludos a todos, ya tenía un largo tiempo de no escribir en el blog, debido a algunos proyectos que han consumido demasiada parte de mi tiempo libre :(

Precisamente debido a esto, ya que los proyectos habían sido desarrollados en en Windows (Visual Studio, .NET, y todas esas cosas del imperio), ya tenía un  largo rato de no utilizar el sistema Linux que también tengo instalado en mi computadora personal. Pues bien, esta mañana finalmente encendí mi computadora e ingresé a mi muy apreciada instalación de Apricity OS, y como primera tarea decidí que quería hacer funcionar el administrador de fondos de escritorio que tengo instalado, llamado Variety, ya que la ultima vez que entré al sistema habia notado que este había dejado de funcionar y que no podría ser iniciado. Intente ejecutarlo desde la línea de comandos, para obtener más información acerca del posible error, y vi un mensaje que me indicaba que la razón por la cual no estaba funcionando era que la versión de Variety que tenía instalada era antigua, y que debía actualizar a la versión más reciente. Yo le temo a las actualizaciones, pues tienden a romper cosas, en Windows y Linux, pero bueno, era solo un paquete, así que procedí a la actualización usando la confiable herramienta pacman.

sudo pacman -S variety

Pero tristemente no se pudo, ya que en su lugar me apareció el siguiente mensaje:


Siendo un noob en Linux, y en particular en Arch, me puse a investigar en google, y de lo que logré encontrar, decidí que tal vez necesitaba actualizar las bases de datos de los repositorios, así que intenté eso:

sudo pacman -Syy

Y luego me apareció un mensaje más claro:


Falló la descarga del archivo 'apricity-core.db' desde static.aprictyoscom : Falló la conexión a static.apricityoscom puerto 80: Conexión rechazada

La triste sorpresa

Mmm, ¿será tal vez que el servidor no está disponible?
¿Habrá algún espejo para poder usar?
¿Será que iban a hacer mantenimiento de sus servidores este día?
 Bueno, a googlear para buscar alguna noticia. Y allí fue cuando, para mi sorpresa, me dí cuenta de la triste noticia: Apricity OS ha sido descontinuado, desde el 6 de mayo del presente 2017. Ingresando a su página de Github, se puede ver el siguiente mensaje:


¿Apricity OS?

La noticia es triste para mí, ya que Apricity OS había sido mi versión favorita de Linux, desde que empecé a ocupar Linux. Apricity OS era una distro basada en Arch Linux, que intentaba ofrecer lo mejor de este sistema operativo de un forma amigable y sencilla. Entre las cosas buenas que tenía era que oseía un instalador gráfico para facilitar la instalación y actualización de paquetes. También compartía el modelo de actualización de liberación continua de Arch, lo que permitía actualizar el sistema sin tener que instalarlo desde cero nuevamente cada vez que hubiera una nueva versión. Otra característica interesante es que incluía ICE, que es una aplicación que permite utilizar auna aplicación web como si fuera una aplicación de escritorio normal. También poseía una interfaz con un diseño limpio y moderno utilizando Gnome 3.



¿Y ahora qué?

La verdad es que a mí me encanta este sistema operativo, sigue siendo el que más me ha gustado, y considero que siendo basado en Arch, aún puedo continuar utilizándolo, ya que buena parte de los paquetes provienen de ese entorno. Bajo esta premisa, mi siguiente paso fue desactivar el repositorio de Apricity OS de la configuración de pacman. Para ello abrí el archivo /etc/pacman.conf en un editor de texto con el usuario administrador (en mi caso utilicé el comando gksudo geany /etc/pacman.conf para ello). Luego marqué como comentarios las siguientes líneas:

[apricity-core]
SigLevel = Required
Server = http://static.apricityos.com/apricity-core-signed/

Así:

#[apricity-core]
#SigLevel = Required
#Server = http://static.apricityos.com/apricity-core-signed/

Con ello pacman ignora el repositorio de Apricity OS, lo cual evita que se produzca el fallo debido a que no puede descargar su base de datos. Hecho esto ya pude actualizar el paquete que necesitaba.

Conclusiones finales

Es una triste noticia que un sistema operativo tan eficiente, elegante y amigable haya llegado a su fin, en un tiempo tan corto (creo que fue un poco más de un año el tiempo que el proyecto estuvo disponible), pero así es el mundo del software libre, ya que se depende del trabajo voluntario de comunidades de desarrolladores que buscan ofrecer piezas de software increíbles sin esperar nada a cambio. "Por amor al arte", como dicen. Solo nos queda agradecer a estas personas por la maravillosa experiencia que nos ofrecieron al traer al mundo a Apricity OS, y también nos deja la motivación para que nosotros nos animemos a integrarnos a alguna de estas apreciables comunidades.

Saludos, y hasta la próxima.

viernes, 18 de noviembre de 2016

Eliminar ramas antiguas de repositorio GIT local

Al trabajar durante un tiempo con GIT utilizando un modelo de ramificación que implique la creación de varias ramas, como por ejemplo GitFlow, las ramas antiguas se van acumulando en nuestro repositorio local, aunque ya hayan sido eliminadas del repositorio remoto, debido a que las herramientas de GIT no hacen este proceso de forma automática, y no existe un comando de GIT que lo haga por nosotros.

Sin embargo, con ayuda de algunos útiles comandos, es posible crear una instrucción que nos permita eliminar las ramas locales que hacen referencia a ramas remotas que ya han sido eliminadas:

git fetch -p && git branch -d `git branch -vv | grep ': gone]' | awk '{print $1}' | xargs`

A continuación se explica paso a paso lo que hace este conjunto de comandos:

PasoComandoDescripción
1 git fetch -p Obtiene los cambios más recientes desde el repositorio remoto, y elimina ("corta") las referencias a las ramas remotas que ya no existen.
2 git branch -vv Lista las ramas de forma detallada, lo cual incluye información el vínculo entre las ramas locales y las referencias a las ramas remotas, así como el estado de las ramas remotas.
3 grep ': gone]' Del listado anterior de ramas, filtra aquellas que contengan el texto ': gone]', es decir, aquellas ramas cuyas ramas remotas vinculadas ya fueron eliminadas. Estas ramas eliminadas poseen el estado gone.
4 awk '{print $1} De la lista filtrada, obtiene la primera columna, la cual contiene el nombre de la rama local.
5 xargs Convierte las filas de nombres de ramas en una cadena de una sola línea, separando el contenido de cada fila mediante un espacio en blanco.
6 git branch -d Elimina las ramas listadas en el paso anterior. Al utilizar la d minuscula, se indica que no se forzará la eliminación de ramas, lo que previene que se eliminen ramas locales que no hayan sido combinadas (merged) a otras ramas.

Esta serie de comandos trabaja solamente con el repositorio local, por lo que no hay peligro de afectar el repositorio remoto. Sin embargo, se recomienda asegurarse de haber subido (push) los cambios de todas las ramas, para prevenir la eliminación de ramas locales que aún tengan cambios no incluidos en el repositorio remoto.

martes, 11 de octubre de 2016

Fondo de escritorio rotativo en Elementary OS

Saludos. Despues de un par de semanas de esfuerzo, finalmente pude instala la ultima version de Elementary OS, Loki (v0.4), en mi laptop. Y para embellecer un poco mi entorno, decidi buscar alguna aplicacion con la que pudiera cambiar la imagen de fondo de mi escritorio de forma periodica y aleatoria (wallpaper slideshow). Despues de una rapida busqueda en Google, me tope con Variety.


Características

Variety ha sido creado por Peter Levi, y es un cambiador de fondos de pantalla de código abierto, como se describe en su página. Sin embargo, esta definición se queda corta, ya que incluye una gran cantidad de funcionalidades:
  • Descarga periódica y automática de imágenes desde sitios de internet como Flickr, Wallhaven, entre otros. Esto realmente te quitará el aburrimiento, ya que tendrás nuevas imágenes cada vez que veas tu escritorio. Además tú puedes configurar cuánto espacio de disco dedicar a las imágenes descargadas, y cada cuánto tiempo descargarlas.
  • Puedes escoger los directorios locales o sitios web desde los cuáles Variety toma las imágenes.
  • Puedes habilitar el selector de fondos de pantalla (wallpaper selector), que te muestra en la parte de abajo de la pantalla las las imágenes que tienes disponibles, y te permite escoger la que más te guste para mostrarla en tu escritorio.
  • Puedes indicar las imágenes que más te gustan, y guardarlas en una carpeta especial. Si te suscribes a VRTY.ORG, puedes compartir tus imágenes con otros usuarios de Variety, y además copiar tus imágenes favoritas en todas tus computadoras. Cabe advertir que el sitio web VRTY.ORG puede contener imágenes obscenas o para mayores de edad.
  • Teniendo en cuenta la advertencia previa, es importante mencionar que a última versión de Variety hasta este momento (0.6.2) incluye un "modo seguro", que sirve para evitar imágenes no aptas para menores de edad. Este modo seguro se basa en los ratings de Wallhaven, así como en las clasificaciones provistas por la comunidad de Variety. Esto no significa que Variety pondrá cualquier cosa en tu escritorio, ya que por defecto solamente tiene habilitadas las fuentes de imágenes más seguras.
  • No podía faltar además un conveniente reloj digital, que puedes personalizar y mostrar en tu escritorio con la fuente y tamaño que tú elijas.

Instalación

Variety se encuentra disponible ya en los repositorios oficiales de Ubuntu Xenial (16.04), que es el sistema operativo en el que se basa Elementary OS Loki, por lo que para instalarlo solo basta ejecutar el siguiente comando:

sudo apt-get install variety

Sin embargo esta es la versión 0.6.0 de Variety, y la versión más reciente disponible hasta el momento de esta entrada es la 0.6.2, por lo que si quieres instalar la versión más reciente, debes añadir el repositorio oficial de variety, e instalar los paquetes variety y variety-slideshow, así:

sudo add-apt-repository ppa:peterlevi/ppa
sudo apt-get update
sudo apt-get install variety variety-slideshow

Variety también puede ser instalado en otros sistemas operativos. Las instrucciones más detalladas las puedes encontrar aquí.

Contribuye

Y si te ha gustado mucho esta aplicación, puedes contribuir a su creador a través de una donación, a la comunidad compartiendo imágenes en VRTY.ORG, o contribuyendo directamente al desarrollo del software de las distintas formas que se listan aquí. El código fuente, así como reportes de bugs, los puedes encontrar en Launchpad.

lunes, 20 de junio de 2016

Instalar Lightbend Activator en Windows

Estaba intentando preparar las herramientas para probar hacer una aplicación usando Scala y Play Framework en mi computadora, solo que en esta ocasión en Windows 10. Sin embargo, intentando "instalar" el Lightbend Activator, me topé con algunos problemas inesperados particulares para Windows, y que tristemente parecen existir desde hace ya algunos años. A continuación comparto los pasos que pude seguir para preparar el Activator en Windows, en caso de quee alguien más tenga problemas, y también para recordarle al yo del futuro como hacer esto, en caso de que tenga que hacerlo en otra máquina.
 

1. Descargar e instalar el Java JDK 1.8

Para poder usar el Lightbend Activator necesitamos instalar el Java JDK 1.8 (al fin y al cabo Scala compila a bytecode de Java, y corre sobre la JVM). Podemos descargar el instalador de la última actualización de la versión 1.8 para Windows desde la página de Oracle, para la arquitectura de nuestra computadora (i586 - 32 bits - o x64 - 64 bits).

Una vez descargado el instalador, procedemos a ejecutarlo, para realizar la instalación, siguiendo los pasos indicados (a.k.a. presionar Next hasta finalizar).
 

2. Crear la variable de entorno JAVA_HOME

Es necesario crear la variable de entorno de Windows llamada JAVA_HOME, para que haga referencia al directorio donde se instaló el JDK. El script del Lightbend Activator hará uso de esta variable para encontrar el JDK, que necesita para ejecutarse. Acá hay un tutorial que muestra cómo hacer este paso.
 

3. Descargar el Lightbend (Typesafe) Activator

Para descargar el Lightbend (antes Typesafe) activator, hay que visitar el sitio web de Lightbend. En la parte de abajo hay un listado de enlaces, entre los cuales está uno que dice Download Activator (créanme que me costó encontrar el enlace).

Luego, en la página de descarga, basta con presionar el botón Download, que descargará la versión completa (entre 600 y 700 Mb) y más reciente disponible (v1.3.10 al momento de escribir esta entrada). Lo que se descarga es un archivo ZIP, por lo que podemos guardarlo en cualquier parte.


 4. Descomprimir el Lightbend Activator

Una vez descargado el Activator, es necesario descomprimirlo. Si solo lo vas a utilizar con tu usuario, puedes descomprimirlo en cualquier carpeta dentro de tu directorio de usuario. Si quieres que otros usuarios pueda utilizarlo, te recomendaría hacerlo en una ruta más pública, como por ejemplo C:\Development\Lightbend o algo así. Un punto importante es que la ruta donde coloquemos el Activator no debe tener espacios.

5. Agregar la ruta de los binarios del Activator a la variable PATH

Para poder utilizar el Activator desde la línea de comandos, sin necesidad de conocer el directorio de instalación de este, es necesario agregar la ruta de la carpeta de binarios (carpeta bin dentro del directorio del activator - por ejemplo activator-dist-1.3.10\bin) a la variable de entorno PATH. Nuevamente, si solo vamos a utilizar la aplicación con nuestro usuario, modificaremos la variable propia de nuestro usuario; y si la van a utilizar todos los usuarios, agregamos la ruta a la variable PATH de sistema. Este y este otro son algunos tutoriales que muestran como agregar valores a la variable PATH de Windows.

6. Corregir el archivo de activator.bat

Sí, triste pero cierto, hay que corregir un archivo. El archivo activator.bat se ubica en la carpeta de binarios (bin). Hay que abrir el archivo con cualquier editor de texto, buscar la línea que dice:

set SBT_HOME=%BIN_DIRECTORY


set SBT_HOME=%BIN_DIRECTORY%

Luego guardamos el archivo y continuamos con nuestra vida. O podríamos modificarlo para que se pueda colocar el Activator en rutas con espacios (recordar el punto No. 4... pero tal vez en otra ocasión).

7. Agregar el archivo sbtconfig.txt

¡No tan rápido! Si intentamos ejecutar el Activator desde la línea de comandos, nos mostrará el siguiente mensaje:

The system cannot find the file C:\ruta\al\lightbend\activator-dist-1.3.10\bin\..\conf\sbtconfig.txt.

Para corregir esto debemos agregar el archivo en la ruta especificada. El archivo lo podemos descargar desde el repositorio del SBT Launcher en GitHub, y lo guardamos en la ruta activator-dist-1.3.10\conf\

8. Ejecutar el Activator

¡Finalmente! Abrimos la línea de comandos, y ejecutamos el siguiente comando (valga la redundancia):

activator ui 

Esto abrirá una ventana en el navegador que tengamos por defecto, en donde se mostrará la interfaz de usuario del Activator, con los listados de tutoriales y proyectos base para poder empezar a trabajar con las herramientas de la plataforma reactiva de Lightbend (las que sean gratis, al menos).



lunes, 30 de mayo de 2016

Lecturas interesantes 1


Hola, en esta ocasión solo quería compartirles un par de lecturas interesantes que he encontrado de casualidad en el último año.

1. Desenredando la historia de Ada Lovelace (Untangling the Tale of Ada Lovelace)


Ada Lovelace

Augusta Ada King, Condesa de Lovelace, es considerada como la primera programadora de computadoras. Sin embargo, debido a que vivió durante la época Victoriana, su vida muchas veces se ha visto rodeada de muchos desacuerdos por parte de los historiadores.

En este artículo re-publicado en Medium por Backchannel, Stephen Wolfram (desarrollador del motor de conocimiento computacional Wolfram Alpha), describe su profunda y apasionada investigación de la vida y obra de Ada Lovelace. Parte desde su niñez, el desarrollo de su interés en las matemáticas en su juventud tras conocer el motor diferencial de Charles Babbage, su relación con la comunidad científica de esta época de desarrollo tecnológico (dominada por hombres), hasta su trágica muerte a una edad temprana. También desmiente los mitos que rodean su relación con el mismo Charles Babbage, con quien mantuvo una relación de amistad y casi de negocios alrededor de su motor diferencial. Tras un estudio profundizado de notas de esta máquina de cálculos y su sucesor, el motor analítico (el cual según parece quedó a nivel de concepto), fue capaz de desarrollar algoritmos, y se cree que fue la primera persona en vislumbrar el concepto de computación universal (conocido en la actualidad a través del concepto de la Máquina Universal de Turing). El artículo incluso muestra el desarrollo paso a paso de uno de sus algoritmos para el cálculo de los números de Bernoulli para el motor analítico de Babbage.

Si no hubiera muerto a una edad tan joven (tan sólo 36 años), quién sabe cuanto más hubiera avanzado la informática hasta la actualidad. Incluso se sabe que el mismo Alan Turing estudió sus notas para desarrollar su famosa prueba de Inteligencia Artificial de 1950 (conocida como Prueba de Turing).

Una lectura fascinante de la historia de la computación, y la vida de una mujer valiente e innovadora.

2. Planeadores de Schweizer (Sailplanes by Schweizer)

Schweizer2-32-02.JPG
Dos planeadores Schweizer 2-32 en Oahu, Hawaii. 1995. Imagen lanzada al dominio público por su autor a en English Wikipedia.

Este libro, que casualmente encontré en Scribd buscando el tema de planeadores (aviones sin motor), narra la historia de la compañía aeronáutica estadounidense Schweizer, a través de sus modelos de aviones, desde sus humildes inicios con los tres hermanos Schweizer en el cobertizo de la casa de la familia a principios del siglo 20, su época de crecimiento durante la segunda guerra mundial, una época díficil durante la posguerra, un crecimiento dorado de la aviación sin motor durante los años 60, hasta el inicio de su ocaso en la última parte del siglo 20.

Esta compañía la recuerdo por el planeador Schweizer SGS 2-32, que salía en el "trailer" (si se le puede llamar así) del Microsoft Flight Simulator 5.1 para Windows 95. Buscando en internet, tristemente me di cuenta que la compañía ya no fabrica planeadores, sino que fue adquirida en el 2004 por Sikorsky Aircraft Corporation, y cerrada en el 2012.

A pesar de ello, sus aeroplanos fueron tan bien diseñados y construidos, que aún hay muchos modelos que datan hasta de los años 40 y que todavía se encuentran en uso, como este modelo 2-12 (TG-3A):




Con la tecnología de Blogger.