A little dose of statistics

ColorSharp's NuGet StatisticsSo, there aren’t many interesting news today, but i want to share some bits of information about ColorSharp’s usage 🙂 .

I don’t know who is using it, but I’m sure that I’m not its unique user 😀 . Since the 0.5.2 version there are a lot of downloads that I can’t explain with my own use cases!

I’m happy because this project it’s still in alpha state, but there are people who are using it. The bad point is that nobody have still forked the project, nor starred it or marked it as ‘watching’ in Github. Obviously no one has sent any pull request 😦 .

Another important point is that I’ll have to stabilize soon the ColorSharp’s API to avoid irritating other programmers. The “playing time” is coming to an end.

If you want to contribute, feel free to do it 😉 , and if you have doubts, feel free to ask me too!

Microsoft makes .NET an open source project

Great news! After many years Microsoft has started a process to make .NET (and a lot of its many subprojects) an open source project 🙂 . More info in Miguel de Icaza’s blog : http://tirania.org/blog/archive/2014/Nov-12.html .

In my opinion, making .NET an open source project is not enough, but it’s a big step. We still need a better and more interoperable tool set: Last Mono version installers for Windows, better support for Linux in NuGet, more and better documentation for GTK#, a port of GTK# 3 to Windows (we are sill using GTK# 2.12), RYU‘s JIT SIMD classes in Mono

Mono shouldn’t the main desktop technology in Linux (as Miguel de Icaza pretended), but it’s a good open source project and it lacks the community support that deserves.

Mejorando el rendimiento de ColorSharp

Estos últimos días he realizado algunos cambios importantes en ColorSharp, aunque no han repercutido demasiado en su funcionalidad. He cambiado ligeramente la arquitectura subyacente, he añadido algo de documentación, TODOs, CHANGELOGs… Sin embargo lo que me motivó para realizar los cambios que me llevaron al cambio de arquitectura fue la búsqueda de un mayor rendimiento.

La realidad es que las mejoras que obtuve fueron marginales. No he tomado medidas (os prometo que la próxima vez seré más serio), pero puedo asegurar que la conversión de unas 40.000 muestras de color CIE XYZ a sRGB (que en mi máquina tomaba un segundo y medio aproximadamente) presentaba cambios difícilmente perceptibles por un ser humano.

Cambios planteados

SIMD

El primer cambio que me planteé fue introducir paralelismo a nivel de instrucción (SIMD) en los algoritmos. Había leído hace tiempo que Mono facilitaba el uso de SIMD sin necesidad de usar código inseguro, y eso fue lo que me incentivó a buscar. Desgraciadamente tuve que abandonar este enfoque, pues el diablo está en los detalles.

La versión “original” de .NET no permite usar SIMD, o no lo permitía hasta hace muy poco. Recientemente han creado “RyuJIT”, que facilita el uso de SIMD… pero que presenta dos problemas: Es semiexperimental y su API para trabajar con SIMD es diferente a la que presentaba Mono. Por otro lado, parece que las versiones recientes de Mono para entornos de escritorio han eliminado el soporte de SIMD.

Algoritmo de Strassen

Una parte sustancial del cómputo realizado para convertir espacios de colores son productos de matrices. El algoritmo clásico de multiplicación de matrices toma un tiempo del orden O(n³) siendo n·n las dimensiones de la matriz. El algoritmo de Strassen se basa en un inteligente truco (basado en una observación de Gauss) que permite reducir ligeramente la complejidad asintótica del algoritmo. Aun no he aplicado esta optimización, sin embargo no espero una gran mejora, pues trabajo con n pequeña (generalmente 3).

Cambio de arquitectura

Este es el único cambio de la lista que ya he realizado a día de hoy. Consistió básicamente en reducir el uso de “Generics” y métodos “introspection/reflection”, así como hardcodear los mejores caminos de conversión entre espacios de color en vez de calcularlos en tiempo de ejecución.

Aunque este cambio no presentó cambios notables, es el que permite un mejor aprovechamiento de las futuras mejoras que incorporen las VMs/JITs de .NET y Mono.

Aprovechar la GPU con OpenCL

Cuando pensé en usar SIMD también pensé en aprovechar la GPU, sin embargo mi desconocimiento en este campo frenó mi avance en esta dirección. Casualmente esta mañana he encontrado información muy útil que seguramente llevará a que en breve ColorSharp sea mucho más eficiente 🙂 .

Mi plan es usar OpenCL.NET (que funciona en Windows, Linux y Mac, tanto en .NET como en Mono). En cuanto a como aprenderé a usarlo en condiciones, he encontrado este tutorial, parece que promete bastante.

Futuros artículos

Puede que parezca raro tener en cuenta los artículos divulgativos en la lista de tareas pendientes, pero considero que es una parte esencial del proyecto.

Siguen pendientes los artículos sobre .NET, Mono, NuGet, PowerShell, PASH, Chocolatey… (también hablaré de Wine!). Como avance, tratarán sobre el ecosistema de software libre alrededor de Mono, especialmente sobre sus puntos débiles.

Además, hay otros dos puntos muy importantes que deben ser tratados: Qué motiva el desarrollo de ColorSharp y qué lo diferencia del resto de bibliotecas; y cómo preparar un desarrollo Mono para poder usar un entorno de CI (Continuous Integration).

Nueva v0.7.0 y algunos apuntes

Hola a todos,

ayer lancé 2 nuevas versiones de ColorSharp con cambios significativos que podéis ver en el CHANGELOG, pero os hago un resumen de los más importantes:

  • Corregido un error importante en la conversión entre el espacio sRGB y el espacio CIE XYZ.
  • Eliminada dependencia de NUnit (he separado los tests en un proyecto distinto bajo la misma “Solución”).
  • Refactorización importante (que rompe la API anterior):
    • He eliminado el anterior sistema, que buscaba el “camino más corto” dentro de un “grafo de conversiones”. Era una característica de la que me encariñé, pero debido a limitaciones de C# (que le restaban elegancia a la implementación) y a que el número de espacios de color es acotado y “pequeño”, ésta no aportaba ventajas evidentes y sin embargo afectaba negativamente al rendimiento.
    • La componente Y del blanco de referencia pasa a ser 1.0 en vez de 100.0, se ahorran divisiones y se presta menos a confusión.
  • Añadida nueva documentación XML (el sistema de autocompletado o IntelliSense funcionará mejor con ColorSharp).
  • Ligeras mejoras en el fichero README, y por supuesto, por fin hay CHANGELOG.

Ok, esto en lo tocante al desarrollo del proyecto. También durante el día de ayer descubrí otros dos proyectos muy interesantes con objetivos muy parecidos a los de ColorSharp y en estadios de desarrollo bastante más avanzados.

Aun no he podido estudiarlos en profundidad, pero eso no es excusa para no darlos a conocer:

  1. El primero es Colourful , también centrado en .NET/Mono. Particularmente su arquitectura no me convence, pero aun así es una biblioteca muy potente y de la que seguramente sacaré ideas.
  2. El segundo es Colour-Science, un proyecto centrado principalmente en Python, pero que también provee código para otros entornos (como Matlab). Sinceramente, me ha dejado impresionado. El trabajo que hay detrás es descomunal y está claro que hay verdaderos expertos trabajando en él.

Tengo algunas cosas más sobre las que hablar (C#, .NET, Mono, NuGet, PowerShell, PASH…), pero se merecen sus propios artículos y un cierto esfuerzo de síntesis que soy incapaz de hacer a estas horas de la madrugada.

Introducing ColorSharp

 → Spanish Version

Introduction

In the “first” post of this blog I want to introduce ColorSharp. ColorSharp is an open source .NET/Mono library created to manipulate colour spaces and light spectrums.

The current version is 0.5.2 (alpha quality). The current unit testing coverage is still very low, the performance should be improved and I can’t ensure yet a stable API, but I think this will change in a few weeks.

ColorSharp releases are following “semantic versioning“. Probably the number of releases during the first weeks will be hight because I’m using the library in many closed source projects and I often need to release minor changes in order to use it in these projects.

How to use ColorSharp

To start using ColorSharp the easy way, you can download the DLL files using NuGet :

nuget install ColorSharp

The distributed ColorSharp.dll file is signed and “strong-named”, so you can use it in other signed and strong-named .NET/Mono components.

How to contribute

If you want to contribute there is a TODO list at the end of this post with many ideas to improve the project. Whatever you want to improve in ColorSharp, you’ll need to be able to build the library. I’ll assume basic GIT knowledge.

Cloning the GIT repository

You can find the ColorSharp’s GIT repository at:

https://github.com/Litipk/ColorSharp/

Work Environment Setup

I recommend using Monodevelop >= 5.0 . If you are working in Linux you may experience minor problems. Probably you’ll have to compile Mono >= 3.8 and Monodevelop >= 5.3 in order to be able to use NuGet and its integrated “Package Manager Console”.

If you work on Windows I suggest to install Mono in order to allow testing of your contributions also on Mono (I don’t want to break Mono compatibility).

As an extra point, it’s recommended to download the NuGet executable binary. In Linux you need Mono to execute NuGet (I suggest to write a simple wrapper to simplify the program call and “install” it in /opt adding the path in the PATH environment variable).

To Do List

  •  Add documentation to the Github’s wiki.
  • Improve the code comments.
  • Add new color spaces :
    • CIELAB
    • CIELUV
    • CMYK
    • HSV
    • HSL
  • Add new feature extraction methods:
    • Color Temperature.
    • Color Quality Scale (CQS).
    • Color Rendering Index (CRI).
  • Improve performance (profiling, better architecture…).
  • Increase unit testing coverage.
  • Integration with TravisCI.
  • Integration with Coverity Scan.
  • Create .DEB & .RPM packages for Debian, Ubuntu, Fedora and Redhat.

That’s all for today. Cheers.

Presentando ColorSharp

Versión en Inglés

Introducción

En esta primera entrada del blog quiero presentar el proyecto ColorSharp. ColorSharp es una biblioteca .NET/Mono de código libre que tiene como objetivo ayudar en la manipulación de espacios de color y espectros lumínicos.

La versión actual es la 0.5.2, y se encuentra en estado alfa. La cobertura de pruebas unitarias es a día de hoy muy baja, el rendimiento debe mejorar y todavía no puedo prometer una API estable, aunque en pocas semanas debería cambiar la situación.

En general (salvo excepciones por errores metodológicos), las versiones que he ido lanzando siguen el sistema de “versionado semántico“, y seguirá siendo así (sin excepciones). Durante las primeras semanas es probable que el número de nuevas versiones sea relativamente elevado, esto es así porque uso la biblioteca en otros proyectos de código cerrado y suelo necesitar nuevas características sobre la marcha.

Como usar ColorSharp

Para empezar a usar ColorSharp fácilmente recomiendo instalarlo como dependencia en tu proyecto .NET/Mono usando la herramienta NuGet (hablaré más adelante sobre esta horrible y detestable herramienta y como lidiar con ella en entornos Linux). Asumiendo que hemos instalado NuGet en nuestro sistema, el siguiente comando sirve para descargar los ficheros DLL de ColorSharp y sus dependencias.

nuget install ColorSharp

El fichero DLL que distribuyo a través de NuGet está firmado y es “strong-named”, por lo que puede usarse como dependencia de otros binarios .NET/Mono firmados.

Como colaborar

Si quieres colaborar, hay distintos frentes abiertos (listados más adelante). Independientemente de lo que quieras mejorar de la biblioteca, seguramente deberás ser capaz de construirla.

Empecemos pues por pasos. En lo que sigue asumiré una cierta familiaridad con el sistema de control de versiones distribuido GIT.

Clonar el repositorio GIT

Puedes encontrar el repositorio de código en la siguiente dirección:

https://github.com/Litipk/ColorSharp/

Preparar el entorno de trabajo

Si trabajas en Windows, recomiendo usar la última versión de Monodevelop (ahora Xamarin Studio :s). Si trabajas en Linux recomiendo usar Monodevelop >= 5.0 . Esto es un problema porque a día de hoy la mayoría de distribuciones Linux tienen como versión más reciente la 4.0.

Particularmente he tenido que compilar Mono 3.8 y Monodevelop 5.3 por mi cuenta para poder trabajar cómodamente con ColorSharp (para poder usar la versión integrada de NuGet y su “Package Manager Console”).

Mono es una dependencia fuerte en Linux para poder usar Monodevelop, pero en Windows no. Sugiero que si se está en Windows también se instale Mono para poder comprobar que los cambios que efectuáis no rompen la compatibilidad de ColorSharp con Mono.

Como extra, recomiendo descargar el binario ejecutable de la utilidad NuGet. En el caso de Linux se tiene que usar Mono para poder ejecutar la utilidad NuGet (sugiero escribir un pequeño wrapper en Bash para simplificar la llamada) e “instalarlo” en /opt (añadiendo la ruta a la variable PATH).

Lista de (algunas) tareas pendientes

  •  Documentar la biblioteca en la wiki de Github.
  • Mejorar la documentación interna (los comentarios de código).
  • Añadir nuevos espacios de color (actualmente solo están soportados CIE XYZ de 1931, CIE xyY de 1931, sRGB y espectros lumínicos) :
    • CIELAB
    • CIELUV
    • CMYK
    • HSV
    • HSL
  • Añadir nuevas rutinas de extracción de características:
    • Color Temperature
    • Color Quality Scale (CQS)
    • Color Rendering Index (CRI)
  • Mejorar el rendimiento (profiling, mejor arquitectura…)
  • Aumentar la cobertura de pruebas unitarias.
  • Integrar builds automáticos con TravisCI
  • Integrar builds automáticos con Coverity.
  • Crear paquetes .DEB y .RPM para Debian, Ubuntu, Fedora y Redhat.

Me quedaré aquí por hoy, pero tengo que escribir mucho más sobre el desarrollo (y traducir este mismo artículo al inglés). Saludos!