GeekWare - Daniel Pecos Martínez

Computer Science

Homelab monitoring using Grafana and Prometheus

Homelab monitoring using Grafana and Prometheus

I have a homelab, mainly as a hobby but also as an environment for experimentation. It’s quite useful for self-hosting different services—not only because of the potential cost savings (although you do need to account for hardware costs and electricity) — but also because it allows you to develop skills that will be useful as a professional developer. And the best part? You don’t have to invest a lot of money — I didn’t. I started my homelab with a Raspberry Pi 3B, and for about a year, that was all I needed. It was capable of running HomeAssistant and Mosquitto well enough. Eventually, as I brought more services into my homelab, I had to expand. And guess what? I got a Raspberry Pi 4. So now I have two hosts in my homelab, and the most important question I had to answer was which node should run each service and what kind of availability I wanted.
Attending a PGP / GnuPG signing party

Attending a PGP / GnuPG signing party

In today’s digital world, ensuring the authenticity and security of our communications is more important than ever. PGP (Pretty Good Privacy) and GnuPG (GNU Privacy Guard) are tools designed to provide secure encryption and decryption of data, playing a crucial role in protecting privacy and information. A key component of this security model is the “web of trust,” an informal network of users who verify and sign each other’s public keys. By hosting a PGP/GnuPG signing party, individuals can expand their web of trust, increasing the reliability of key verification and enhancing overall communication security. This guide offers practical steps, complete with GnuPG command examples, to help you host a successful signing party.
From Xorg to Wayland

From Xorg to Wayland

The landscape of Linux desktop environments has been undergoing a major transformation, with the advent of Wayland as a promising successor to the long-standing Xorg display server. This shift has brought about significant changes in popular desktop environments such as Plasma and GNOME. In this post, we explore the state of the art in terms of Wayland’s impact on these environments and how they compare to Xorg, as well as explaining my path towards moving from Xorg to Wayland, steps I took, mistakes I made, and learnings I’ve got.
Parchis: the reason why I am a developer

Parchis: the reason why I am a developer

A while back, digging into an old DO NOT DELETE backup folder in one of my old hard drives, I stumped upon a folder called parchis, and for a moment I held my breath until I found some *.bas files there! So what? Well, I just found the lost source code of my very first project, the one I coded while learning about variables, procedures and loops, the one that made me realize that this is the kind of stuff I wanted to do as my professional career and hobby.
How I write AWS SES email templates using MJML

How I write AWS SES email templates using MJML

If you are a AWS SES user (AWS’ email system) you probably know that working with its JSON based templates is not a user-friendly task: Text and HTML content are defined as properties of a JSON object It’s a JSON file, meaning that you have to escape some characters, like " in the HTML It’s quite hard to find the content to change in the HTML being stored in a single line But still, is a quite convenient system, as hosting your own email server is quite an effort, and you want it to be reliable.
What is a Monorepo

What is a Monorepo

Definition: A monorepo is a standard Version Control System, or VCS (such as Git, Subversion or CVS) repository, which instead of containing just one application or unit of software (applications, libraries, micro services, modules…), contains all the components that a project (or company) needs to operate. At first glance, it sounds counterintuitive to host more than one unit of software in a single repository, but there are few advantages on having all components stored in the same place:
How to rotate your OpenPGP / GnuPG keys

How to rotate your OpenPGP / GnuPG keys

It’s been a while (well, years) since I rotated my GPG keys, and to be honest, now that I know better how to handle a GPG key pair in order to avoid master key rotation, I think it’s the time to get a new pair. This tutorial will show you the steps I followed with explanations on what we are achieving in every step.
Demistifying blockchain - Part 2

Demistifying blockchain - Part 2

In the previous post we explained from a theoretical point of view how a block chain works. In this post we will get down to work and will implement a working blockchain in Go. If you haven’t read it yet, we recommend you to do it now before continuing. It’ll provide you the basic concepts needed to understand the examples below. (You can find the complete example in this Github repository: https://github.com/dplabs/demistifying-blockchain)
Demistifying blockchain - Part 1

Demistifying blockchain - Part 1

Blockchain is one of those buzzwords everyone is listening nowadays, but what it really is? In this series of posts we will dig one general concepts about BlockChain and a little bit of its relation with BitCoin, as well as we will develop a simple blockchain in Go. To put it simple, and as its name states, it’s just a chain of blocks. The interesting detail is that is a cryptographic chain providing some characteristics that make them really useful:
REST API with Node.js and Swagger

REST API with Node.js and Swagger

In this tutorial I’ll show how to piece together the required NPM modules to build a REST API in Node.js with proper Swagger documentation. We’re going to use Express as the HTTP framework, and the Swagger documentation will be written as inline comments within the code, as close as possible to the handling endpoint or models that will implement the contract, so it will be harder for them to eventually diverge.
From Ubuntu to Arch Linux

From Ubuntu to Arch Linux

Recently I took the decision of leaving my long beloved distro – Ubuntu (sorry, link in spanish) and moving forward into Arch Linux. And why? As JFK said when the USA was aiming to land on the moon, “not because it’s easy, but because it’s hard”, maybe not that much compared to getting to the moon, but definitely more tedious than Ubuntu. One thing you can take for sure if you take the chance to install Arch: no matter if you success or give up with it, you will learn something new about how a Linux distro works.

Surprises with Java packages

Packages in Java is a quite simple and straightforward concept of the language. It’s there from the beginning and it’s commonly used by every Java programmer. In a few words, these are the rules you have to follow to create a class inside a package (spoiler: which are not completely true, as we’ll see later): Package statement must be the first one specified in a java class file A package namespace must match the physical path of the file, i.e a class defined with a package a.b.c must be placed in a path a/b/c/ Easy right? Let’s check…

Coursera: Principles of Reactive Programming

In little less than a week, a new edition of Coursera’s course, Principles of Reactive Programming from Martin Odersky, Erik Meijer and Roland Kuhn, is launching. This course is a follow-up of Principles of Functional Programming in Scala, which I took in its first edition and which I enjoyed a lot. I’ve regretted missing out first edition of this second course for a long time (more than a year, in fact), so if you want to learn about this magnificent frameworks of the Scala world, don’t miss this chance!

Java 8 and Functional Programming

Purpose of this post is to provide a glimpse of the new features included in Java 8 that shift this language towards a more Functional Programming paradigm. But before, let’s define what we understand for Functional Programming (FP). Functional programming key characteristics include: Higher Order Functions Pure Functions and Immutability Tail Call Recursion Higher Order Functions for a FP language means that functions are considered first class citizens, allowing the programmer to use them as any other value the language defines, for example, a Function value:

Groovy to be part of the Apache Software Foundation

As March 11th, Pivotal dropped its financial sponsorship for Groovy, and despite of not really endangering it, as Groovy is an already well established language with a great community backing it, it raised many concerns, as the required boost a platform like this deserves was missing until now. Furthermore, its creator and project leader until lately, Guillaume Laforge, also recently stepped back in order to focus in Restlet. Also the recent release of Java 8, with the introduction of lambdas into the Java language has increased the interest and traction of Java, making a lot of people question if there were still room for other JVM languages, even more being so closed to Java.

Java 8 one year later

It’s been a little more than a year since Java 8 was released (2014/03/18) and you might think that it’s a little too late for a What’s new in post. In fact latest public update available is 8u40, so let’s review not only what was initially included in Java 8, but what else has changed during this first year, up to release 8u40. Lots of changes were included in the initial Java 8 release, being probably the most notable of them, in my opinion (feel free to disagree, looking forward to discussions):

Using Chromebook for node.js development

Every single working day I spend between 2 and 2.5 hours in a train. And I feel pretty lucky about this, mostly because is one single train, no need to pay attention for switch overs or other kind of public transports, and that allows me to invest that time in whatever task I want: podcasts, videos, blogging or even programming. And that’s what I want this post to focus in, because there are plenty of posts that explain how to use a Chromebook for day-to-day tasks (even being offline) but not that many that talk about programming in node.js using a Chromebook.

From Node.js back to Java

During last year, I had the chance to work as CTO of a startup, working mainly within MEAN stack. I was happy, the technology I was working with was in a great hype and its community grew bigger and bigger with lots of projects popping up everywhere. But life is continuously changing, and I started to work in a new company within Java/JEE technologies. I was back to my first days as a professional computer engineer. Java ecosystem is huge, and there are some well established tools that you must control if you want to progress as Java developer. But Java -the language- is getting older, and newer languages are more expressive and require less boiler plate code (don’t get me wrong, JVM is a great platform, and probably the best one for enterprise applications). Even with the recent release of Java 8, which introduced Lambdas and some functional style capabilities, I still feel like writing too much, or at least much more than with other languages.

Functional programming in javascript: Function composition

Function composition is one the key features (among others) of functional programming. Programming languages that offer higher order functions as a feature can potentially use function composition. But, still, programmers need to be aware of some key concepts to successfully apply this pattern in our code. Function composition, as defined on Wikipedia, is an act or mechanism to combine simple functions to build more complicated ones. In other words, we can define new functions, equivalent to the result of chaining a set of given functions, so the input of function i is the output (or result) of function i-1. Let’s see an example in javascript.

Who is who in computer science

I have problems remembering people’s names. Really, I’m not good at it. And that’s no exception with computer technology. That’s why I’ve written this post, to try to improve and persist those names in my head. Let’s see who is who in nowadays computer science. Methodologies <div> <strong>Kent Beck</strong> (<a href="http://en.wikipedia.org/wiki/Kent_Beck">wikipedia</a>, <a href="https://twitter.com/KentBeck">twitter</a>) &#8211; XP, Agile, TDD </div> </td> <td width="50%"> <a href="http://martinfowler.com/"><img class="alignleft" src="/assets/2014/05/martin_fowler.png" alt="martin_fowler" width="100" height="85" /></a><strong><a href="http://martinfowler.com/">Martin Fowler</a> </strong>(<a href="http://en.wikipedia.org/wiki/Martin_Fowler">wikipedia</a>, <a href="https://twitter.com/martinfowler">twitter</a>) &#8211; OOP, Agile, TDD </td>

Organizing your Code: Javascript Modules

The way you structure your code is a key factor when you define your source code organization. It will make your life easier or miserable, and once this structure is established it will become a really tedious task to redefine it. That’s why you know about the different patterns available and choose the one fits your project best. But, why should I care about modules? Well, is the way Javascript offers to organize and encapsulate your code, and if you don’t think you need to do it, because maybe it’s a small project or you don’t care at all, trust me, you are making a huge mistake!

Create and publish an NPM module

Code modularization, achieved in one way or another, is a technique a good developer must aim for because it helps keeping things small, well-tested and organized. And of course, it follows the DRY directive. So as a Node.js developer (and maybe contributor to the Open Source), creating and publishing an NPM module is one of those steps you will eventually face. Probably if any Node.js developer would have to pick an indispensable tool of the ecosystem, npm would win by far. Its greatness resides in how much easy is to build applications using on of several modules, each of them providing one certain functionality, as if they were building bricks, picking the right tool for each task.

Node.js ecosystem

The Node.js ecosystem is quite young and prolific: new tools appear almost every day or week, changing and turning upside down your current workflow, always trying to squeeze a little more productivity to your time and effort or simply making your work easier. As an example, take a look on the NodeFramework page, where Azat Mardanov (@azat_co) collects lot’s of frameworks and utilities related to Node.js. Or NodeWebModules, more web oriented than the previous one, from Caio Ribeiro Pereira (@crp_underground).

Node.js and V8 history

Talking about Node.js history, it’s talking a little bit about V8 history. But let’s start with a one line definition of what it is: Node.js is a platform built around Google Chrome V8 Javascript engine, to create lightweight, fast, scalable, event-driven and non-blocking I/O applications. So lets begin talking about Node.js origins, the V8 javascript engine. V8 is an opensource project by Google and it is in the very core of Google Chrome browser. Its first public release was on September 2, 2008, same date Chrome’s first release was announced. It was a big step forward in browsers’ performance, and it pushed browsers’ technology to a new whole level. It’s written in C++ and its biggest revolution was that it precompiled the Javascript source code to machine code instead of just interpret it and then applied a JIT process again in runtime to improve dynamic code execution.

Javascript Allongé: a review

Javascript Allongé@raganwald is one of the more refreshing coding books I have read in a big while. Usually when I face a programming language book, I skip the beginner chapters (if I already know the language, of course) and go directly for the juicy ones, but with this one I tried to follow it from end to end because I read some comments on twitter telling that the way basics are explained, become a really solid base for the language, so I gave it a chance.

Javascript Promises Pattern in plain Javascript

In the previous post I gave a glimpse of the Javascript Promises Pattern (JPP). Now we are going to take a more in deep look into it and implement our (simplified) version of this pattern. First of all, let’s sow the code I we defined works: we had three operations (to make the example simpler, they all share the same code, but this is not a requisite), each of them expecting a set of arguments which are processed by an asynchronous operation. The result of this asynchronous operation will be feed to the next operation, and so on until we achieve processResults function that will handle the final result. This is a refactored version of the code exposed in the previous post:

Javascript Promises Pattern – 101

I am sure you have heard about the javascript Promises Pattern, but if you haven’t, here is a quick and simple definition: a promise or future is an object that represents a future result, not yet obtained or calculated (here you have a more complete definition). In fact, what is really nice about it is that allows you to define callbacks for async code in and more elegant and readable way.

Functional Programming & Scala course finished

Coursera Functional Programming has not been my first experience in an online course, but it has been the most satisfying by far. Many people were interested in it, and I think it created a great hype, not only in the course forums but in social networks like twitter. People all around the world were interacting in the same course, creating really interesting conversations and discussions about the subject. Really nice.

Recipe: From SVN to Git without pain

Are you already in love with Git? I’m pretty sure of that, that’s the reason why you are reading this, huh? These are the steps you should follow to migrate an existing SVN repository to a Git one: 1 – Create a file where you will map SVN users to Git users, following this pattern: svn_user = git_user This is the one I created to migrate some SVN repositories from Google Code:

Git-SCM (Part 2)

In a previous post, we have seen what Git is and its main characteristics. Now, we’ll go more into detail about its functionality and we’ll see what a usual day working with Git looks like. But before, some initial concepts: Repository: A working tree of files and directories which can be versioned, keeping track of every single modification made over the working tree, been able to move forward and backward in its history. Branch: it is an alternative image of the repository, keeping track of its own history of modifications. A repository has a main branch called master, and it can have an undefined number of branches, some of them may be copies of remote branches and the default name for the upstream repository is origin. The current branch of the working copy can be always referenced as HEAD. Commit: it is a concrete state of a branch, containing the modifications made to the entire working tree since the previous commit in the history, as well as author information and timestamps. It can be identified by its SHA hash, but a name or tag can be associated to it in order to make thing easier. Merge: it is the process of integrating changes or commits of two different branches. This integration is automatically carried by Git, if there are no conflicts between commits. Push: the changes committed in a local branch into a remote branch. These are the basic concepts we are going to use in the rest of this post. Now let’s start with the fun!

amCharts Javascript Tutorial: Parsing dates and styling up the chart

Recently I began a collaboration with amCharts, writing some tutorials for their blog. This is my first contribution, and you can find the original post in amCharts blog. http://blog.amcharts.com/2011/03/amcharts-javascript-tutorials-part-3.html I hope you’ll enjoy my first tutorial about this great graphs library! And, of course, feedback is wellcomed! In this tutorial we will enhance our previous example in order to parse dates. This will allow us to obtain date-based graphs displaying their data points using relative distance to each other and not placing them at regular spaces.

HTTP connection + HTTP Authenticacion + Proxy + SSL

Many times during your life as a java developer, you will face the situation of retrieving some resources using an HTTP connection. At first, it will seem easy, but probably some problems will arise such as: Needing to use an HTTP Proxy (maybe authentication would be required) Establishing an HTTP authenticated connection Connecting to a server that uses SSL self-signed certificates I’m sure you will quickly find the Apache Commons solution: commons-httpclient. In this article I will show you some code that, I hope, will ease you the resolution of the previous obstacles using this great API from Apache.

Git-SCM (Part 1)

One of the key tools of a software project development is the repository where it’s hosted. During my experience as software developer I have been working with several flavors, such as Visual SourceSafe, CVS, Mercurial, and of course, SVN. But latetly I have found this little jewel called Git. Git was initially developed by Linus Torvalds as a result of an unsuccessful research to replace the propietary SCM BitKeeper, used back in 2005 in the Linux Kernel project (kinda strange that the opensource star project was hosted with a propietary software, huh?). Back then, the ability to freely use BitKeeper was withdrawn by its copyright holder, so Linus was forced to find a replacement for it. He was looking for a VCS with a high performance in the process of applying patches and keeping track of the changes, but he didn’t find any opensource solutions that fitted his requirements, so he started the developement of Git (as he says on Git’s Wikipedia entry, Git was named after himself, because he considers himself an “egoistical bastard, and I name all my projects after myself”; git is the British English slang word for an stupid or unpleasant person).

GNU HttpTunnel: Como saltarse un proxy HTTP

Creo que es la primera vez que posteo sobre una aplicación, pero creo que en este caso merece la pena hacerlo. Se trata de GNU HttpTunnel, una pequeña aplicación que crea un túnel HTTP sobre el que podemos meter cualquier servicio. ¿Ventajas? Pues que al ser HTTP, si nos encontramos en una red que solo tiene salida a Internet mediante un proxy HTTP, con esta aplicación (y un PC fuera de la red), podemos salir de la red con el servicio que más nos interese.

Ingeniero informático, to be or not to be?

Desde hace un par de semanas está circulando una convocatoria de huelga para los ingenieros informáticos. Según comentan en la web, esta huelga se debe a la exclusión de las titulaciones de Informática de las propuestas de en las que se proponen los títulos habilitados para ejercer distintas profesiones. Concretamente se atribuyen a la Ingeniería en Telecomunicaciones muchas (por no decir prácticamente todas) las funciones que ejerce un Ingeniero Informático. Según comentan en dicha web, el Ministerio de Educación justifica esta decisión argumentando que:

Google anuncia Chrome

Tras varios años de rumorología acerca de si Google iba a publicar un navegador web propio o no, finalmente se ha aclarado: su nombre es Chrome. Será un proyecto opensource basado en WebKit de Apple (el motor de renderizado de Safari) y según comentan, incluye un motor Javascript escrito desde cero, con el fin de mejorar el desempeño tanto en tiempo de ejecución como en consumo de memoria, con respecto a los navegadores que actualmente hay en el mercado. Otras características que incorpora son la navegación anónima, un sistema “Speed Dial” como el de Opera o una barra de autocompletado basada en el buscador.

Debian vs. Ubuntu

¡30 minutos! Eso es exactamente lo que he tardado en instalar Ubuntu con incluso más funcionalidades de las que tenía en mi Debian. ¿Por qué este cambio? Bueno, supongo que la edad tendrá algo que ver y uno ya no tiene tanta paciencia como antes. Y es que en mi humilde opinión, disponer de un sistema Debian con todo correctamente configurado, resulta una tarea tremendamente tediosa, además de que si deseas estar un poco al día con los programas que tienes instalados, te implica estar en una versión testing o unstable de Debian, con el riesgo que ello conlleva.

¡Feliz aniversario BASIC!

El 1 de Mayo de 1964 se ejecutó el primer programa en BASIC. Los creadores de este lenguaje de programación, los profesores John G. Kemeny y Thomas E. Kurtz del Dartmouth College, hace 44 años ejecutaron por primera vez un código escrito en BASIC (Beginner’s All-Purpose Symbolic Instruction Code). La búsqueda de un lenguaje potente y sencillo de usar (por aquellas fechas se solía utilizar Fortran y Algol) comenzó en el año 1956, con el fin de facilitar a sus estudiantes el aprendizaje de los métodos de programación.

JavaServerFaces, Spring WebFlow y Struts Tiles, todo en uno

¿Mezclar la versatilidad de JSF con la definición de flujos de negocio de SWF, todo ello con una estética semejante gracias a Tiles? Pues es posible, aunque resulta realmente tedioso y complicado para aquel que es relativamente nuevo a algunas (más bien todas) de estas tecnologías del mundo Java JEE. A esto es a lo que me he dedicado la última semana de trabajo, a intentar comprender el funcionamiento y buscar por Internet la forma de poder conjugar estas tres tecnologías. He conseguido hacerme una idea del complejo funcionamiento de JSF, SWF me ha sorprendido gratamente por la gran potencia que se consigue con tan pocas líneas de código, y Tiles, aunque ni tan avanzado tecnológicamente ni tan sorprendente, ofrece unas posibilidades de diseño visual que unifica toda la aplicación web con tan solo unos poco ficheros.

El escritorio del futuro

Ésto me lo acabo de encontrar navegando por internet. La verdad es que es muy impresionante: Se trata de un sistema semejante a un escritorio físico, de los de verdad. Tendremos una especie de mesa con los documentos, los archivos sobre ella. Con el ratón podremos moverlos de un lado a otro de nuestra mesa virtual, y gracias a diversos gestos, podremos agruparlos, apilarlos, ordenarlos, moverlos, y multitud de opciones de la Vida Real, pero con nuestro ordenador y de un modo virtual.

Mundo Java

Desde hace cosa de unas semanas, el mundo Java está cambiando notablemente. Por un lado, Sun publicó Java EE 5.0, junto con Sun Application Server 9.0, primera versión estable del proyecto Glassfish, que pretende implementar un Application Server libre para la especificación de JEE 5. En esta nueva versión se ha incluido, a parte de un cambio de la nomeclatura para las versiones, la especificación de EJB 3.0, Java Persistence API, una mejora en el desarrollo de webservices o JSF entre otras características.

Web 2.0

Es el término de moda en los entornos de programación web: AJAX, consistente en la interacción de las tecnologías JavaScript, HTML/CSS y XML. Aunque en sí misma esta conjunción resulta bastante reciente, las tecnologías implicadas son ya viejas glorias entre los programadores. El concepto básico en el que se basa esta técnica de programación es bastante simple: cuando se produce un evento en el navegador web que está mostrando el código HTML, en vez de realizar una petición HTTP al servidor, tal y como se suele realizar normalmente, se crea un objeto JavaScript XMLHttpRequest, encargado de realizar dicha petición, la cual devolverá unos datos que serán pasados al manejador del evento que se haya definido.

Google ofrece IM/Jabber

Pues parece ser que los tan sonados rumores de que Google iba a ofrecer un servicio de mensajería instántanea se han hecho realidad. Es más, también se ha confirmado que utiliza el protocolo Jabber, lo cual supondrá un fuerte empujón a esta tecnología libre. El nombre con el que se ha bautizado este servicio es Google Talk. Podemos ver que ofrecen un cliente, por el momento únicamente para sistemas Windows, con el cual podremos realizar tanto conversaciones vía texto o vía voz.

Mono: ¡Hola Mundo!

Para retomar de nuevo la marcha del blog, he decidido comenzar mostrando algunos ejemplos de programación en C#. Por el momento os dejo el obligatorio programa para todo aquel que empieza con algún lenguaje. Hola Mundo! using System; namespace HolaMundo { public class HolaMundo { public static void Main (string [] args) { Console.WriteLine ("Hola Mundo!"); } } } Sencillo, ¿verdad? Tiene mucha semejanza con Java, exceptuando que las palabras reservadas difieren y que Java no posee el concepto de espacios con nombre o NameSpaces, entre otras.

Funcionamiento de .NET

En los artículos anteriores hemos hablado de conceptos como CTS, CLI (CLS), IL o JIT, los cuales pueden resultar bastante confusos. A continuación daremos una aclaración del significado de cada uno de ellos, y explicaremos su función dentro de la plataforma .NET, para lo cual se hará una explicación más a fondo de su funcionamiento. Hemos comentado en artículos anteriores que cuando compilas un código fuente a un binario de .NET, éste binario no contiene código máquina de la arquitectura en la que se compiló, sino que se genera un código para una máquina virtual, al estilo del bytecode de Java.

Pasado, presente y futuro de Mono

En este artículo os comentaré un poco de historia sobre la evolución de la tecnología .NET y del proyecto Mono, que a pesar de su corta existencia, ha sido un proyecto muy vivo, y en el cual han participado y participan muchas personas de todo el mundo. .NET es una tecnología desarrollada por Microsoft, que ha sido estandarizada en el ECMA (C#, CLI), ofreciendo la posibilidad de crear utilidades que trabajen con este entorno, sin miedo a que un día Microsoft interponga una demanda o que simplemente cambie las especificaciones a su antojo.

¿Qué es Mono?

Mono (http://www.go-mono.com) es la implementación libre de la tecnología .NET, capaz de correr en Linux, sistemas *NIX, MacOS, y Windows. Gracias a este proyecto, los usuarios de sistemas *NIX podremos contar con los últimos avances en lo que a tecnología del software se refiere. Y es que Mono no es simplemente un compilador y su correspondiente runtime, sino que también se incluyen una serie de utilidades que nos facilitarán mucho la vida a la hora de programar, como un explorador de documentación –MonoDoc-, o un mini servidor web –XSP-, con capacidad de procesar programas escritos para ASP.NET o de ofrecer un servicio web para el resto de Internet, entre otras.