domingo, 11 de noviembre de 2012

"Información" sobre la "censura" de Youtube

Hoy Youtube! me ha escrito. Dicen que uno de mis vídeos quizá contenga contenido "inapropiado". De hecho, ha sido prohibido en Alemania.

Parece que alguien o algo (supongo que más bien algún programa) ha detectado que de fondo una canción comercial.

No entiendo cómo esto puede ser considerado un agravio :(, está totalmente fuera de lugar, como cualquiera puede juzgar por sí mismo viendo el vídeo: "Levitron".

Menos mal que, como me dice Youtube!, gracias al dios esto no penaliza mi cuenta. Cualquier día subo un vídeo y por sabe Dios qué motivo me quedo sin la cuenta de Youtube, y por qué no, sin la de Google, y ya de paso sin acceso a mi propio teléfono. Parece imposible, pero hay a quien Amazon le ha condenado sin acceso a sus libros... 

Reproduzco el texto del email de Youtube (en la página de información sobre copyright dan algún dato más):
Your video "Levitron", may have content that is owned or licensed by UMG, but it’s still available on YouTube! In some cases, it may be blocked, or ads may appear next to it.

This claim is not penalizing your account status. Visit your Copyright Notice page for more details on the policy applied to your video.

miércoles, 2 de mayo de 2012

Nowadays


I play guitar (self-taught). A few months ago I wrote this song... I later got myself a sound card and tried to record something. This is what I came up with.



Edit: A version with better audio quality and download link can be found at  http://soundcloud.com/jjmontes.

lunes, 5 de marzo de 2012

La conjura de los necios

"La conjura de los necios" trata de las peripecias de Ignatius J. Reilly, un ser tan inadaptado e inmaduro como cultivado. El protagonista, mordaz y ultra crítico con la sociedad en la que vive (la Nueva Orleans de mediados del siglo pasado), tiene un discurso irónico y pedante capaz de arrancar carcajadas. Pero lo cierto es que Ignatius es todo lo que ningún hombre querría ser. Los personajes son de auténtica locura.

Esta obra es genial. Se regodea en multitud de aspectos que en España nos resultan más cercanos: los treintaañeros que no se van de casa, la sociedad y tribus urbanas, la sexualidad, el racismo... Algunos pasajes hasta asustan, por ser tan actuales y tan transgresores, a pesar de haber sido escritos hace 50 años. O quizá esto sea un indicio de que los yankis empezaron a degenerar mucho antes que nosotros. Teología y geometría, es la respuesta de Ignatius para los males del mundo. No digo más.

"La conjura de los necios" ("A confederacy of dunces") es la obra maestra de John Kennedy Toole, un profesor de inglés de Nueva Orleans. Escrita en 1962, es una novela controvertida ya desde antes de su publicación. Su autor,  se suicidó a los 31 años tras no conseguir publicarla (siempre he pensado que un buen suicidio a los treinta es una forma genial de potenciar un best-seller). Su madre consiguió publicar la novela mucho después, en 1980. Poco más tarde, Toole recibía un Pulitzer póstumo por ella. Inquietantemente, las similitudes entre la biografía del autor y algunos de sus personajes no son desdeñables.
- Ignatius, contrólate.
- Me niego a "mirar hacia arriba": El optimismo me da náuseas. Es perverso. La posición propia del hombre en el universo, desde la Caída, ha sido la de la miseria y el dolor.
- Yo no me siento mísera.
- Lo eres.
- No, no lo soy.
- Sí, lo eres.
- No lo soy Ignatius. No me siento triste, si me sintiese triste, te lo diría.
- Si yo hubiera demolido propiedad privada en estado de embriaguez y con ello hubiera arrojado a mi hijo a los lobos, estaría dándome golpes de pecho y gimiendo. Estaría arrodillada hasta que me sangradan las rodillas, como penitencia. Por cierto, ¿qué penitencia te puso el sacerdote por tu pecado?
- Tres avemarías y un padrenuestro.
- ¿Nada más? -aulló Ignatius-. ¿Le explicaste lo que hiciste, que interrumpiste una obra crítica de gran importancia?
- Fui a confesarme, Ignatius. Se lo expliqué todo al padre. Y él me dice "No me parece culpa suya, querida. Creo que lo único que pasó fue que el coche patinó un poquito porque la calle estaba mojada". Así que le expliqué lo tuyo. Le dije "Mi hijo dice que soy la que le impide escribir en sus cuadernos. Lleva casi cinco años escribiendo esa historia". Y el padre va y dice "¿Sí? Bueno no me parece tan importante. Dígale que salga de casa y vaya a trabajar".
- Cómo voy a apoyar yo a la iglesia moderna, es imposible -exclamó Ignatius-. Deberían haberte azotado allí mismo, en el confesionario.

(Gracias Pat por dejármela, no te equivocabas :).

lunes, 31 de octubre de 2011

A look into various REST APIs

I have recently been working on a web application for data mining. We were initially using a typical stack of server Java technologies. The web MVC part was written on Struts 2.

Our application is pretty UI intensive and we wanted it to have a nice, modern look and feel. As development went on, we soon found ourselves issuing a good amount of AJAX calls to the server. Without careful planning, this can soon become an unmanageable mixture of HTML, JSON and XML response formats, and dozens or hundreds of different GET and POST requests that expect various parameters.

Our architect soon tackled the issue and we decided to define a full featured REST API for the application (incidentally,  we moved to Spring MVC which we found nicer), which we then access from the client side.

REST methods

We have since defined dozens of URLs that handle our application requests. Much has been said about how REST method signatures should look: should resource names be used in singular or plural [1]? is it mandatory to use PUT and DELETE methods and do they need to be idempotent [2]? how do list/search methods look like [3]? Not to forget that there are also some well known implementations that provide default methods for most operations.

Besides, REST is not a protocol, but an application architecture style [4]. Without an strict definition, nowadays there are many REST principles that are sistematically violated in real-world applications: not many REST APIs use hyperlinks as their only method reference (rather, they publish API documentation and expect programmers to directly access their published methods). Not all services use all four HTTP methods (GET, POST, PUT, DELETE) as defined by HTTP. Not all of them have consistent naming rules for resources.

Seeing how loose REST is about API aspect, I have collected a few examples from some of the most famouse services on the Internet, so we can have an oversight of how famous REST APIs look as of today.

Facebook (Graph API)

Facebook publish resources as a graph of social objects [5]. Every object in the social graph has a unique ID. You can access the properties of an object by requesting:

https://graph.facebook.com/ID

For example, the official page for the Facebook Platform has id 19292868552, so you can fetch the object at: https://graph.facebook.com/19292868552.

Responses are JSON:

{
   "name": "Facebook Platform",
   "type": "page",
   "website": "http://developers.facebook.com",
   ...
   "id": 19292868552,
   "category": "Technology"
}

Relationships between objects are called connections and are accessed using the name of the connection:

https://graph.facebook.com/ID/CONNECTION_TYPE
https://graph.facebook.com/me/likes?access_token=...
https://graph.facebook.com/me/friends?access_token=...

And results are also JSON:

{
   "data": [
      {
         "name": "John John",
         "id": "201095685"
      },
      {
         "name": "Andy Andy",
         "id": "202921236"
      },
      ...
   ]
}



You can render the current profile photo for any object by adding the suffix /picture to the object URL. They have consistent support for paging, selecting fields and/or multiple objects in one call, accepting/returning different date formats and fulltext search:

https://graph.facebook.com/bgolub?fields=id,name,picture
https://graph.facebook.com?ids=arjun,vernal
https://graph.facebook.com/search?q=mark&type=user

They also provide support for publishing (via POST) to the appropriate resource, using a few simple parameters. The following URL is used to add a comment to an object:

POST:      https://graph.facebook.com/OBJECT_ID/comments
arguments: message

This API uses only GET and POST. They don't use hyperlinks to reference other objects (for example, lists are composed of object IDs, not URLs).

Twitter

Twitter API [6] is also GET/POST based:

Get user home timeline, users who retweeted a post, followers:

GET statuses/home_timeline
GET statuses/ID/retweeted_by
GET followers/ids

Modifications are done via POST, like the URL used for actually tweeting:

POST statuses/update

These GET and POST methods accept a variety of parameters which are very well documented. Parameters can be used to filter the timespan of the object we want to retrieve, for defining pagination, filtering, whether to include extra metadata about objects returned... Twitter API can also provide a number of response formats: JSON, XML, RSS, Atom.

This is an example of a response list of tweets in JSON format (which is an array of tweet objects):

[
  {
    "coordinates": null,
    "favorited": false,
    "created_at": "Fri Jul 16 16:58:46 +0000 2010",
    "truncated": false,
    "entities": {
      "urls": [
        {
          "expanded_url": null,
          "url": "http://www.flickr.com/photos/cindyli/4799054041/",
          "indices": [
            75,
            123
          ]
        }
      ],
      "hashtags": [
      ],
      "user_mentions": [
    ...


Google Custom Search API

This is a very simple API [7]. You can retrieve results for a particular search by sending an HTTP GET request to its URI. The URI for a search has the following format:

https://www.googleapis.com/customsearch/v1?parameters

Parameters have to include the Google API key, the search query and other optional Google query parameters (response format, pagination, search options, filtering...). For example:

GET https://www.googleapis.com/customsearch/v1?key=INSERT-YOUR-KEY&cx=013036536707430787589:_pqjad5hr1a&q=flowers&alt=json

Response formats can be JSON or Atom.

{
 "kind": "customsearch#search",
 "url": {
  "type": "application/json",
  "template": "https://www.googleapis.com/customsearch/v1?q\u003d{searchTerms}&num\u003d{count?}&start\u003d{startIndex?}&hr\u003d{language?}&safe\u003d{safe?}&cx\u003d{cx?}&cref\u003d{cref?}&sort\u003d{sort?}&alt\u003djson"
 },
 "queries": {
  "nextPage": [
   {
    "title": "Google Custom Search - flowers",
    "totalResults": 10300000,
    "searchTerms": "flowers",
    "count": 10,
    "startIndex": 11,
    "inputEncoding": "utf8",
    ...


Summary


The big players have very different REST method signature approaches, but all of them share the simplicity and handyness of REST APIs. Being public APIs, all of them are also able to provide results in a number of formats, which allow for an easy consumption of these web services from a huge number of technologies.

As the real world rules for REST web services seem so lax, my advice is to prioritize ease of usage when designing REST services, and leverage the support that your tools or framework provide when building these services. The actual aspect of method signatures and result types is not as important as the naming and type consistency across your various method calls. Using HTTP methods properly is not as critical unless full proxy-cache support is a requirement for your system, and in many cases you'll be safe just using POST for requests that change the state of the system.

I hope this helps showing the different approaches used out there.



[1] http://stackoverflow.com/questions/6845772/rest-uri-convention-singular-or-plural-name-of-resource-while-creating-it
[2] http://stackoverflow.com/questions/7016785/is-put-delete-idempotent-with-rest-automatic
[3] http://stackoverflow.com/questions/1418114/questions-on-proper-rest-design

[4] http://en.wikipedia.org/wiki/Representational_state_transfer

[5] http://developers.facebook.com/docs/reference/api/
[6] https://dev.twitter.com/docs/api
[7] http://code.google.com/apis/customsearch/v1/using_rest.html


domingo, 28 de marzo de 2010

Sistemas informáticos con Software Libre


Hace tiempo que quiero sacar a la luz este artículo, ya que he dedicado buena parte de mi tiempo a los Sistemas Informáticos basados en Software Libre a nivel profesional el último año:

Aibox: nuestra solución informática basadas en Software Libre.

Toda organización necesita hoy en día cierto nivel de servicios TIC como el acceso a Internet, el control de usuarios, los sistemas de ficheros compartidos o las copias de seguridad, por nombrar algunos.

En general, se ha utilizado Windows para proporcionar los servicios TIC en nuestras organizaciones. Y actualmente, Windows Small Business Server es la oferta de Microsoft para las pequeñas y medianas empresas. No soy un fanático de Linux: creo que hoy en día tanto Windows como MacOS son muy buenas herramientas para gestionar servicios corporativos y aportan muy buenas soluciones en diversas áreas, desde las interfaces de usuario hasta el núcleo del sistema. Pero Windows tiene muchos defectos, siendo uno de ellos el no ser Software Libre, con todo lo que ello conlleva. ¿Qué alternativas tenemos?.

Sabemos que GNU-Linux está siendo utilizado en muchísimos escenarios: servidores en Internet, computación distribuída, virtualización... Sabemos que es un pilar fundamental de la estrategia de gigantes como Google y Amazon, y muchos de nuestros bancos. Está incrustado en dispositivos como routers, modems, o reproductores de DVD que utilizamos cada día. Sabemos que está cada vez más presente en los escritorios de los usuarios y que los portátiles, móviles y netbooks se ofrecen con Linux desde hace ya tiempo.

Pero ¿es posible utilizar Linux para la gestión integral de una pila de servicios informáticos en la empresa?. Hace un tiempo que las herramientas necesarias son estables y suficientemente maduras, lo que considero un punto que importante ya que hace cinco años las herramientas necesarias sencillamente no estaban listas para ser usadas ágilmente en un entorno productivo. Ahora la situación es diferente.
Cuando empezamos el diseño de nuestros sistemas para empresas escogimos Ubuntu Server LTS porque proporciona soporte durante 5 años y también proporciona una solución estable de virtualización (Xen, en Ubuntu 8.04). Se estimó que nuestros clientes podrían amortizar fácilmente la instalación a 4 años.

Teníamos claro que queríamos un sistema de configuración fácil y versátil: Zentyal es sencillamente perfecto. Proporciona un sistema fácil de configuración y además trae configuraciones muy robustas para los servicios, proporcionando un sistema productivo muy estable. Zentyal abarca una estupenda (y amplia) selección de servicios que solucionan prácticamente todas las necesidades de una PYME.

Confiamos en Zentyal para la gestión de la red (cortafuegos, redirecciones, dns, dhcp...), el acceso a Internet (Filtrado de acceso web , antivirus y antispam de correo), gestión de usuarios y grupos, redes privadas virtuales y gestión de certificados, servicios de correo, archivos compartidos y controlador de dominio.

Por otra parte, desplegamos una máquina virtual para el la gestión de copias de seguridad y la monitorización, ya que es necesario monitorizar todas las máquinas remotamente que gestionamos para enterarnos de cualquier incidencia. En ocasiones añadimos otros sistemas, como un servidor de clonación de PCs.

Todo el sistema soporta cómodamente a 20 usuarios sobre un Xeon X3460, 2.8Ghz, 8MB Cache con 8 GB DDR3 1333 MHz, y RAID1 1TB SATA2 7200rpm. Con hardware más potente, podemos gestionar unos 45 usuarios exigentes. Y podemos desplegar más máquinas virtuales, como por ejemplo un Windows, si fuese necesario para soportar aplicaciones corporativas.

Podemos supervisar los sistemas de forma remota, podemos centralizar la configuración de las máquinas y disponemos de muchísimas herramientas que no se incluyen por defecto en otros sistemas. También podemos realizar pequeños desarrollos, automatizar tareas o solucionar problemas del software que sería impensable abordar fuera de un entorno de Software de Código Abierto.

Herramientas que nos funcionen tan bien como Dovecot, Bacula, eGroupware, Centreon o VNC no se encuentran tan fácilmente en el universo del software privativo y, si están disponibles, a menudo tienen costes elevadísimos o malas condiciones de soporte, además de suponer un cerrojo tecnológico. Muchas herramientas privativas, a pesar de ser herramientas básicas del sistema, suponen una carga adicional, tanto administrativa como técnica, debido a la gestión de licencias y el acceso a asistencia técnica.

Esto no es tan problemático en un entorno de gran empresa, donde el coste de las licencias y la gestión se difumina en el coste total de la gestión de sistemas. Pero para una pequeña empresa las licencias suponen una partida importante, y en este sentido el software libre permite dedicar la inversión tecnológica a mantener la operatividad y las aplicaciones corporativas.

(Para información a empresas, nuestro enlace comercial es: Aibox: Sistemas Informáticos Gestionados).

sábado, 24 de octubre de 2009

Avances en JGF

Comparto algunos avances de un juego que estoy escribiendo, en forma de capturas de pantalla.

Este jueguecillo de tanques sirve para ejemplificar el uso de mi "framework para juegos (JGF)".


En el jueguecillo, el jugador está atrapado en territorio enemigo y debe escapar atravesando niveles llenos de tanques enemigos. En su camino, otra multitud de tanques intentan acabar con él.

Los tanques y las balas se mueven bastante despacio, pero las balas son muchas y rebotan en las paredes. Por ahora estoy bastante contento con el resultado.

Espero poder distribuir una versión jugable online en unos meses. Por lo demás, sería muy útil la colaboración de un artista 3D y/o de un desarrollador de niveles para mejorar el aspecto gráfico y acelerar el desarrollo. Si alguien se anima puede ponerse en contacto a través de la lista de correo de JGF.

martes, 16 de junio de 2009

Dinero es Deuda


Esto no lo enseñan el el colegio...