sábado, 8 de agosto de 2015

Metal & Swift 2

Hola!




Desde hace algún tiempo que me había interesado en aprender METAL, la nueva API propuesta por Apple para gráficos 3D, y hoy he empezado con los experimentos. Ya que siempre me gusta experimentar con lo más reciente instalé el iOS 9 beta a mi iPad, OSX El Capitan a mi MBP e instalé el Xcode Beta. Mi objetivo era tener un programa básico que mostrara al menos un triángulo usando METAL , Swift 2 y que funcione a resolución 2048*1536.

Buscando muestras de código, me doy con la sorpresa que los ejemplos de Apple, sólo están escritos en Objective-C. En otros blogs encontré ejemplos en Swift, pero usaban versiones previas del API de METAL y usaban la sintaxis de Swift 1. Asi, después de unas horas de corregir la compilación y averiguando como activar la resolución retina, he conseguido el programa más básico que cumple con lo que buscaba. Espero les sirva para sus experimentos. Les adjunto el link de descarga del proyecto para Xcode.
Saludos!



Hello!
It's been some time since I've been willing to try METAL, Apple's new API for 3D graphics, and today I started with my experiments. Since I always like use the latest(and most dangerous) this morning I installed iOS9 beta in my iPad, OSX El Capitan in my MBP and Xcode 7 Beta, with support for Swift 2. My targets were render at least one triangle with METAL, Swift 2 and working at 2048*1536 resolution.

While looking for sample code, I realised Apple only delivers Metal samples in ObjetiveC. In some other blogs I found examples with swift, but they were still using Swift 1 syntax, which gave me lots of error and warnings during compilation. So after some hours I've come with the most basic program that satisfies my requirements. I hope it to be useful for your experiments. Below the link to the sample code.
Bye!


https://onedrive.live.com/redir?resid=307D4ED910CAA55C!95923&authkey=!ADSZoZ8NBSR8WZw&ithint=file%2czip


domingo, 17 de mayo de 2015

Xilinx MIG for spartan 6 example

This is an example about how to use the Xilinx Memory Interface Generator for Spartan 6 in an sp605 board.

Although the documentation is very clear, there are not many simple examples available on internet, so I'm publishing this one that is very straightforward: and mig instance is generated with two ports, one port for reading and another port for writing. For writing, data is fetched from a switch and a button triggers the write operation. For reading, a button queues a read operation and, when available, its transferred to a led array. Both operations are done explicitly, so you can debug signals and have a better understanding of the functions.

A few notes about the MIG's core usage:

  • For reading, you queue a read command and wait for the data, If your reading port is c3_p2, use "c3_p2_rd_empty = '0'" as a data valid signal for its data port.
  • For writing, you first write to the data FIFO and just then queue the write command.

Here are the steps for the configuration of the MIG generator:













Source code (vhdl and constraints) can be found here: https://drive.google.com/folderview?id=0B64FjViHrZqpfkl1dE5Eb0QzWXBRRDFzVkZrX3F4ZFR2eVlJN3hFT1k4UWxLOE1CMzlKekk&usp=sharing.

Happy coding!

sábado, 28 de marzo de 2015

Creando un servicio TCP con systemd en el Intel Edison


Hola!

No hace mucho en el trabajo me encargaron desarrollar un par de servicios que corrieran en Ubuntu. Yo conocía UpStart, que era, y aún es, el sistema oficial para cargar todos los procesos de Ubuntu, incluyendo los servicios de fondo. Y empecé a desarrollar pensando en él hasta que leyendo me enteré de que Ubuntu va a abandonar ese sistema por systemd. Ya llevaba bastante avanzado mi proyecto y quería saber si valdría la pena volver a cambiarlo para usar systemd. El artículo que más me sirvió para entender fue este de Lennart Poettering y lo que más me llamó la atención fue el Socket Activation Protocol. Es una excelente forma de arrancar servicios de forma paralela. Ya que un "servicio" puede ser tanto un servidor HTTP como cualquier programa que no requiera interfaz gráfica, quería saber si lo podía usar en mi Intel Edison... y sí pude! Aquí están los pasos de cómo lo hice.

El servicio de prueba consiste en lo siguiente: Un servidor que crea un hilo por cada cliente conectado. Estos sólo envían un mensaje y cierran la conexión. El código está basado en el artículo mencionado. Los pasos a resaltar son:
  1. Detección de la señal SIGTERM.- Esta señal la usa systemd para indicarle a los servicios de fondo cuando deben finalizar.
  2. Detectar si el socket de escucha lo provee systemd ó debemos crearlo nosotros. Lo crea systemd cuando el programa se inicia como un servicio de fondo. Se debe crear uno por nuestra cuenta si el programa se lanza de forma explícita(ej: línea de comando)
  3. Escuchar conexiones y crear un hilo por cada cliente.
  4. Cuando se reciban la señal SIGTERM: cerrar el socket de escucha, esperar que acaben los hilos de los clientes y finalizar el programa.

El mismo código fuente funciona en Ubuntu 14.04 y en el Linux del Intel Edison. Sólo hay una diferencia al momento de construir el proyecto:

En Ubuntu tienes que enlazar con:
-lsystemd-journal -lsystemd-daemon -lpthread
Para el Intel edison, al enlazar usas:
-lsystemd -lpthread

El código, el archivo CMake y los scripts de systemd para usar el proyecto lo pueden descargar del sgte. enlace:
https://drive.google.com/file/d/0B64FjViHrZqpLWxnanpVSmpXOU0/view?usp=sharing

Cualquier consulta en lo comentarios.
Happy Coding! :)