Loving MOOCs

I am in love. Yes, I am really and deeply in love. I am in love with MOOCs :). But what are MOOCs? The term MOOC stand for massive open online course. According to the MOOC guide a MOOC is:

[…] a Massive Open Online Course. It is a gathering of participants, of people willing to jointly exchange knowledge and experiences for each of them to build upon.

Wikipedia defines it as:

an online course aiming at large-scale participation and open access via the web.

In other words, a MOOC is an online course aimed to a large audience, audience which interact not only with the tutors of a particular course, but also among themselves. I find that not only really cool but also amazing. Taking the same lecture with thousands of students from all over the world that most of the time are supportive and help you wherever you have a question.

I guess that although most of the readers of this blog are familiar with the term, I am sure that many have not taken one of these courses offered any of the MOOC websites. Therefore, I want to share my experiences and views as a user of these platforms.

So, what makes them different from watching some videos on YouTube or just reading the slides online? ( Or for that matter paying for some online tutorial/screencast). Here is what I found different and noteworthy:

  • Interactive: many of the pre-existing online education sites offered recording of the lectures. Although of good quality, they cannot replace the one to one relationship that can be established when a single person is attending a lecture. Current MOOC use questions inside the videos (I would not dare to call this a 'interactive video'), allowing the user to double check if they are actually understanding the content the instructor is trying to explain. That somehow replaces the "in-class interaction" that one have when attending a real-world class room.
  • Timed: these courses run during some fixed time. With this one I have love-hate relationship. I do like that these courses are timed, because it allows the university and instructor to commit to the teaching and also helps for them to know when a critical mass of student will be taking the class. For students, it is also helpful to know that they will be able to find people ready to answer their questions. The bad thing is that the homeworkers / exams are also held during this time span. Late submission generally decreases a lot the grade. So for a late starter it will be really hard to score a good grade or even get a certificate of accomplishment.
  • this takes me to my next point: The courses are scored and sometimes you can get a certificate of completion. And sometimes even credits! For me the fact that you get grade / recognized for your work is one of the most important. Before that, I started courses of watched some videos on MIT OCW / YouTube, but as the time passed I eventually forgot that I was actually taking the class. Having some sort of recognition helps (at least me) to keep on track.
  • Interactive (again): but I am not talking about the "video" this time but more about the fact they are forums where you can ask questions if some topic is clear enough or just give feedback. On this forums, no only other members of the "class" can answer but there also the equivalent of teaching assistants that generally answer quite fast to the students questions. In other opportunities when I watched some videos, e.g. In YouTube, I just have the comments. I once even dared to send an e-mail to a professor but of course, I received no answer :).

Currently there are many sites that offer MOOCs, being Coursera, Udacity and Edx the most popular (also free). There are also other courses that not necessarily use any of these sites, like the large scale machine learning course taught by Prof. Yann LeCunn and John Langford at NYU.

One characteristic that these platforms had was that most of the courses were in English and about most of them were about technical subjects, mostly related to computer science. Nowadays this is mo longer true. Today there are many non technical courses available, like music and history and courses in Spanish and French can also be found. Related to this, Coursera recently announced courses from more university worldwide adding more languages and topics to the offer, including my University and coincidentally my IDP evaluator Prof. Kleinsteuber.

I personally feel that I have not taken advantage of the existing course offering, most of the time this is due to timing issues. I have taken Introduction to Artificial Intelligence parts of Machine Learning, NLP and I have just finished completely the course Introduction to Sound Design. I am currently trying to follow course "Algorithm Design" but I started late due to my semester final exams and a 3 weeks trip through my country I had planned way in advance. I will try to finish it (although I will not receive any certificate) and try to attend the ones available in the future. There are many interesting upcoming course, I just hope I will have time and determination to finish it.

To conclude, I think there was no time before where the access to quality education material was as easy and free as today. I think that this is just the start, and step by step the classical classroom approach will be outdated, and it will start to shift into a more massive and collaborative approach to learning. I am not claiming now that MOOCs are going to replace the university experience completely, but this wills definitely affect it. To what extend it is yet to be seen.

As a bonus, a nice graph showing interesting numbers. This graph comes from an article on the last issue of Nature on the impact of online learning / MOOCs on higher education:

From Things 2Do

I have used many TODO and productivity programs. Many of them without success. I have used in the last 5 years a range of applications including simple text files, Chandler, TimeTo and even Emacs' Org-mode (totally awesome). I really liked Org-mode, however, it really got a bit chaotic and the lack of structure kind of bothered me. Also, the fact that it integrated bad (or not at all) with things like my Google calendar other related services made me look for an alternative.

Around 1.5 years ago I got a Macbook Pro, so I decided to try a Mac based TODO list application called Things. It was not as completed as Org but it was simple and beautiful. Initially it kind of worked OK, but after some months I started to notice some limitations regarding of how to handle projects and the integration with the calendar. Then, after an update, they changed some important features, breaking my "workflow".

I almost decided to go back to Org but I continued looking for alternatives, and I finally found a little jewel called 2Do. It is really similar to Things, but brings more structure and semantics for managing ToDos (same structures I used in Org-Mode) plus other features that I find interesting, like linking a TODO to a particular location and a really good integration with iCloud / Calendar.

Now, I have a lot of stuff in Things and I really did not want to copy and paste everything. Also in Thing you can't just copy several TODOs at one. So what TODO? (get the pun? :-P).

Well I discovered that Things offered and scripting interface using AppleScript. I don't really know a lot of Mac OSX and all these things, I come from Linux world and anything else but Perl and Bash doesn't sound to me really to "script". Anyway it looks like that the Apple guys have a nice environment for scripting using this "AppleScript" language (kind of weird, looks like Lisp at times). Things offered an scripting interface and you can access this programmatically do pretty much all you want with it You can see the capabilities of Things (and other scriptable applications like Finder and Evernote) using the AppleScript editor and the dictionary explorer (see screen-shot).

Cool. The problem is now that 2Do still doesn't not provide such an interface, but at least if you copy and paste several lines from at text file, it will create a TODO item for each line copied. Good enough.

So, I just have to quickly learn this new Scripting language?. Well, not, I am to lazy for that (although Things offered a nice AppleScript guide with a nice set of snippet to work with the Things objects). I discovered that Apple offered a Scripting Bridge so you can access this scriptable application from other languages. So why not use my favorite Language (Ruby) and quickly throw some lines and get all my todos into text files so I can easily import them into 2Do? Piece of cake, I just need to install MacRuby in order to access this cool feature.

Well, Not so fast cowboy, I can easily access all the objects but there was some problems with this. For example AppleScript sometimes properties have spaces and this is not as nicely mapped to Ruby as you would expect. After wasting time using irb I found this cool post from a guy who suffered something similar (thanks mate) and I found out how to access the important properties.

So finally this LONG script, run it with MacRuby and check out the code comments for extra quirks I found while finding out how to it:

If I have time and desire I might make a AppleScript version of this so more people can use it.

Interesting Events in 2013

Here a list of interesting events in Europe that I find interesting and I would like / will attend in 2013. If you have any suggestions for events please comment :-).

Make Munich 2013:

Make Munich is a Do-it-yourself/ Hacker / 3d printing exhibition fair in Munich. I am not really into these topics, but a friend of mine insisted on attending and given that is relatively inexpensive (if the ticket are bought early enough), I think is a good opportunity to see and learn, and maybe trying get into this topic.

Eurocamp 2013:

The European Ruby Camp. Although I am not an active Ruby developer (lately mostly Matlab and soon Python). I love Ruby and when I do small stuff and script I write them in this language. Also, Ruby meetings are fun. Last year I attended RuPy, and although not Ruby exclusive, a lot of the community members were present.

Machine Learning Summer School 2013:

Since I was in Colombia I wanted to attend a Machine Learning school. Last year, when I arrived, it was in the Canaries. It was also bit expensive (due to the ticket to the canaries) and I did not have time to properly apply (I just had arrived some months ago). This year is going to be held in Germany, so it is quite convinient for me.

One of the requirements for the application is to send the abstract of a poster that is would be presented by the application if it get accepted into the summer school. I will send an abstract about the work I am doing in my interdisciplinary guided research that is related to Music Information Retrieval.

Others

Here I will post some of the conferences I can't attend or those that would be nice but very difficult / expensive to attend.

European Summer School in Information Retrieval:

The problem with this one is that it collides with MLSS :(. But I would totally love to attend this summer school.

Baruco 2013:

EuroSciPy:

I am going to work with Python / Scikit-learn a lot this year, so I think this will nicely complement my Python learning.

Muerte en Hawaii - Cover Vallenato

De esto ya ha pasado algún tiempo, pero creí necesario escribir sobre lo mismo para que quede en la posteridad.

Todo comenzó cuando navegando en internet vi que existia un concurso del periodico ADN para concoer personalmente a los chicos de Calle 13. El concurso consistía en hacer algunas cosas relacionadas con Calle 13, entre ellas hacerce el look de Residente o Cantar la canción Muerte en Hawaii de la misma banda y subir el video a YouTube. El premio se lo ganaba la persona que más likes consiguiera en Facebook.

Dado que me puedo considerar fan de la banda y que he estado neciando con música ultimamente (hice un remix de esa canción con mis juguetes musicales, ver el video abajo) y después de conversarlo con mi novia, decidimos hacer una versión de Muerte en Hawaii de Calle 13 propia para participar en el concurso. Nuestra versión iba a tener unos arreglos propios de la múscia de la costa norte de Colombia (Vallenato y Cumbia para ser más específicos). Como queriamos hacerlo rápido, decidimos hacerlo en dos sesiones por la noche y así subirlo lo más rápido posible para iniciar a conseguir "likes".

Iniciamos grabando los acordes básicos, con suerte descubrimos que la canción estaba en el tono que estaba afinado mi acordeón (Bb-Eb-Ab), asi que no tendria que buscar otro (o comprarme un Roland FR-18 ). Grabamos también los acordens en piano (usando my Korg padKontrol). Con esa base procedimos a reemplazar una de las guitarras con el acordeón, el cual grabamos con mi FastTrack pro y el micro Samsom C03 conectado a esa tarjeta. Todo lo grabamos usando GarageBand que venia con mi Mac. Aprovechamos y grabamos también la caja y la guacharaca del mismo modo. Todo eso en algo más de 3 horas un domingo por la noche.

Aunque sonaba bien, nos faltaba otra guitarra (y el bajo) y era dificil tocarla como queriamos usando algún controlador MIDI, así que le dije a mi amigo Esteban Salazar para que se trajera su guitarra al dia siguiente y así grabaramos la segunda guitarra y los bajos. Conectamos la guitarra directamente a la FastTrack Pro y usando los amplificadores virtuales del GarageBand obtuvimos los sonidos que queriamos tanto para el bajo como para la guitarra. Esteban tuvo algunos problemas identificando algunos acordes que posiblemente con algo de tiempo los hubieramos conseguido, pero como estabamos al trote, decidimos hacer algunas ediciones en Garageband y seguir.

Las voz principal la grabé y con mucha ayuda de mi novia que es profesora de canto. Ella me corrigió algunos problemas de afinación. Los coros los hicimos todos y algunas voces auxiliares las realizó ella.

El "Video" que hicimos esa misma noche y usamos la camara de mi MBP fija, sin ninguna iluminación apropiada y con la ropa del trabajo (y algunos trapos encima). Una vez grabado, hice la edición rápida en iMovie y lo publiqué (recuerdo haberme acostado esa noche como a las 2:00 AM)..

Al final no ganamos (realmente quedamos en muy mala posición en el top :P), pero fue muy divertido hacerlo y jugar con los juguetes (hablaré de los mismos en otro post). El resultado obviamente dista de ser pro (nunca habia grabado algo en mi vida) pero quedé muy contento con el mismo. Depronto me gustaría hacer algo con un acordeón más elaborado (hacerlo más vallenato tal vez) y tener cajeros y guacharaqueros de verdad para que quedara bien grabado. (por que me tocó grabar todo eso a mi, la calidad no es la mejor).

Abajo el vid con el resultado final. (El cual es totalmente Cheezy, pero divertido). Por favor obviar los errores de sincronización del cantane y la música :D.

Bonus Track

Aca un remix de la canción Muerte en Hawaii de Calle 13 con una percusión (realizada con Garageband y mi Korg padKontrol):

AmazonXCH - Mira los precios de Amazon en tu Moneda Local

Cuando yo tengo un viaje a estados unidos o algún amigo viaja para allá, mucho de nosotros aprovechamos y compramos cosas. Uno de los sitios favoritos para comprar en USA tanto mio como de mis compañeros de trabajo es Amazon. Los precios, como es de esperar, están en dolares, por tanto tenemos dos opciones para ver los precios en nuestra moneda local: 1. Hacemos el calculo aproximado (por ejemplo 1 dolar = 2000 pesos) o 2. usamos una sencilla calculadora y juiciosamente realizamos el calculo. También, si usamos algún buen navegador podremos usar alguna extensión que nos ayude con ese calculo.

Sin embargo, lo ideal sería poder ver precios de nuestra moneda local directamente en Amazon. Dado que no vi ninguna extensión que hiciese eso (y la verdad no busqué de a mucho) y que también que tenia ganas de aprender Javascript (por eso del HTML5) decidí hacerme una extensión para Google Chrome (el navegador que uso) que hiciese precisamente eso, mostrar los precios en la moneda local. (En mi caso COP).

Se llama Amazon-XCH y la la desarrollé basandome en la extensión Currency Converter para Chrome, es decir, usa como fuente de datos Yahoo Finance, por tanto usa los datos en tiempo real del mercado internacional no la TRM (tasa oficial) del día, sin embargo es un buen aproximado, además de permitirle a la extensión mostrar los precios en cualquier moneda del mundo :-). El precio aparece entre parentesis luego del precio original en dolares (depronto cambio esto en el futuro cercano).

Dado que es la primer aproximación el código no es de lo mejor, adicionalmente hay algunos inconvenientes en los que trabajaré si el tiempo me lo permite:

  • Cuando el precio hay que verlo en el carrito ("see price in cart") para que se muestre el precio hay que darle click al link, cerrar el frame y darle click otra vez.
  • Los precio desaparece cuando un producto tiene varias opciones de configuración (como el Kindle 3G).

Pueden descargar la extensión desde la Google Chrome WebStore.

El código fuente (licenciado como MIT) pueden verlo en Github.

Creo que debería hacer un post similar a este en inglés pero es algo tarde y tengo sueño.

Buena noche.

Multimonitor and Productivity

I have always loved multi-monitor set-up. There has been evidence that having multiple monitors with the appropiate screen size can make people more productivem, specially programmers. A lot of people (including Randy Pausch, R.I.P) supports this idea.

I personally I believed in the same and since 2006 I use multimonitor setup in my home. I haven't measured how more "productive" I am (at home I don't do a lot of programming) However, I can say it is definetly a pleasure to work this way.

I always wondered if there was some scientfically based evience of this, However I did not bother to search for them. Today I found a question on Skeptics (a StackOverflow backed site) about the same topic. And a lot of scientific literature is referenced. You can see them on the top answers to this topics.

NOT my setup :'(.

So, it looks like may help having multiple monitors, at least it will save a little bit of time. From my experience, and when programming, generally I like to have the reference manual or examples of what I am particulary doing. When using one monitor I have to switch between windows in order to get the info I need. If I have two or more displays I am able to put the info side to side without wasting my time in window management.

Sadly, in my current job I don't have access to a second display, the main reason is that I only posses a single video card with a single output (VGA). So, it is imposible to have a second independent display. However, there are some alternatives. One many usb-based video card (pretty much of all them based in DisplayLink technology) that cost arround 40-80 USD. They are sometimes laggy and does not wokr for video. But, for a programmers life which is pretty much text based or web surfing I think it will be enough.

In my case I've got the lugable UGA-125 USB 2.0 to VGA/DVI/HDMI . I found an a spare monitor that no one was using and moved it to my place. The installation was easy under windows (my job official OS).

After some time using two monitors I feel totally happy and although I don't have the data, I that feel I waste less time while writing code, and well, doing other not so enjoyable tasks :-).

Operations vs Development

Since I graduate from college (actually a little bit before that) I always felt like I was in between worlds. I had a lot of friends from the university that had very defined profiles and skill sets. Generally, they were either Developers (some of them very good coders) or they were oriented towards networking and systems administration (many of them literally hated programming).1

Nowadays, I still feel like a hybrid between the Sysadmin and Software Developer. Even though now I am "Software Architect" in a software development department, I really do a lot of stuff that is related to the operations part. As my team generally defines the best practices and the technology to use company-wise, It is crucial for us to be well versed in sysadmin tasks.

As I mentioned above, my team has to define/develop many of the technologies that the other development teams use, that includes SCM procedures tools, integration technologies, application servers, shared libraries, development environments, common functionality libraries and so on. As you see, many of these activities require a lot of interaction with operations people. So, we generally end up working, or at least talking, with the operations crew much more frequently that the common Software Developer. Sometimes, we even have to perform "operation's" activities on our development environment first, and then send a "How-to" manual to the operation people to perform.

As is common in many enterprises, Operations is clearly separated from Development and from QA. Moreover, QA is also split in two different teams: the "Technical QA" which "belongs" to Operations and the "Functional QA" which belongs to Software Development department 2. So, my company is no different from a common enterprise, both areas have different agendas and they both claim to be "aligned" with the "strategic objectives" of the business. However, when it comes to get a new application to production (which includes getting the hardware, testing, preparing the environments, and other related task) or simply releasing a new version of an already existing application into production, all the process (even in our development department) are either manual, duplicated or extremely tedious. And generally a combination of all of them.

Currently, we are in the process of improving our Software Development Methodology. I am in charge of the SCM process definition, but only for the dev team. But this is no easy task, given the broad scope of the process and that we are basically in diapers when referring to CM. Some could think that this is a great opportunity for us to automate and improve these process, including Release Management and Build Engineering (namely, continuous integration, unit testing and other industry best practices). However, although we certainly would do better if we apply this to our processes, at the end, we would hit operations' "wall" nevertheless.

In the beginning I believed operations was a bottle-neck because they were just not agile as they should, or not as good as they should. But there was another factor I did not take into account. Operations inherently wants to prevent change, given that they are the responsible for the stability of the system and they are also rewarded for that. If you make changes (e.g deploys, new applications, etc) possibilities of making the whole system unstable increases. But if you do stop changes (or make the process of releasing new changes extremely cumbersome) the change will be accumulative and big changes are far more dangerous than small ones.3

http://dev2ops.org/storage/WallOfConfusion.png

The "wall of confusion" Source

So, what are the specific problems I think we have when comes to our overall SDLC process:
  • Information silos. We have different systems to handle requirements from users, task planning, bug database, test results and deployment requirement. That is not necessarily bad, but none of those systems are connected, so each of them have a work-flow and database. Therefore, there is no way to trace back a change with a release to production or to bug (issue).
  • Cumbersome Processes: The process of getting a new application on-line is cumbersome, filled with a lot formats that ask impossible question to answer.
  • Manual Build & Release Process: Once the application is "on-line" and we want to release a new version of the software all is done "manually", from the compilation, testing to the configuration of environments. Some of those task are requested using ticketing system, asking for the same information over and over (We have even two different process for asking the same stuff and performing the same task). In other words a Build and Release process should be created.
  • Manual Environment Management The environment administration is done also manually, and a lot of problems occurs when a change is requested. Finding the origin of the change is difficult if not impossible. Environment configuration should be baselined and handled using appropriate tools. (Like or Chef or Puppet, just to name some Open Source alternatives). That is, the environments should be first class citizens and automated process for managing the changes should be put in place.
  • Dependency Management is not managed at all by operations, I had to create a Subversion repository with some manual procedures in order to stabilize the system. (See my older post). We have minimized the problem of "It works on my machine". However, there is still problems with configuration files that are not managed at all.
  • Split QA Teams: The QA department is split in two, technical and "functional", each managed differently and with different tooling and objectives. Many of the test are manual, making them difficult to re-schedule. There is no Code Coverage or Automated Unit Testing, only System testing. This not only makes the QA process slow but also may prevent a proper identification of application issues. I believe also the communication between teams (QA, Ops and Dev) can be improved.

We have more or less a broad view of the problems, and It is evident that if Operations and and Development worked together this could a lot of them could be tackled. Recently, a new "approach" called DevOps have taken strength in the last few years. Wikipedia (and the Original article) defines DevOps as

[…] a set of processes, methods and systems for communication, collaboration and integration between departments for development (applications/software engineering), technology operations and quality assurance (QA).

DevOps Approach vs Traditional Thinking:

Based on the This presentation by John Allspaw (from Flickr) here's the traditional thinking (slightly modified):

Developers job is to create software and add features.
Operations job is keep the site stable and fast.

But the truth is that

Operations job is NOT to keep the site stable and fast.
Operations job is to ENABLE the business
Change is the root of all failures and outages

http://upload.wikimedia.org/wikipedia/commons/4/4e/Devops.png

Basically, what DevOps is saying is that we areas should communicate more, or at least more assertive, tools and methodologies should be used to automate from the build process to release process. Which is an area that "belongs" to the Configuration Management set of processes. In other words, it creates new ways of integration between QA, Operations by Development by creating a culture, a set of process and automation tools, to lower the risk and support change, instead of avoiding it. Right now the definition is still somewhat unclear, however, at the end, what is being proposed is a pattern for managing IT areas.

Let me be clear, I am not arguing that my company should jump into the DevOps approach in order to succeed. However I do believe that DevOps people propose is valuable, those thing need to be taken into consideration urgently in my organization. They are:

  • Serious Change in the culture in both areas.4
  • Unified processes: The SDLC should be unified and the appropiate metrics should be defined.
  • Unified Tooling: Tools using in both sides should be the same, including versioning, ticketing system and version control system.
  • Version controlled Software Library.
  • Version controlled Environments
  • Automation of Manual Task, including testing and deployment.
  • Assertive communication (whatever that means in context).

Some folks in my organization argue that they are just following ITIL to counter my argument a about their responsibilities in some of the task I just mentioned above. Either they forget completely about the ITIL Service Transition process or their interpretation is quite limited to the minimum effort to get it done. In either way, you can implement the process in any way you like. The fact that you follow ITIL by doing some archaic process does not make you better than a organization that does not know what ITIL is, but has a highly automated and optimized processes. I mean, it is just a matter of common sense.

To summarize, I believe that Suramericana should re-think the whole SDLC process, with a strong emphasis in the definition and application of a good Configuration Management process across the areas (including Operations), with specific emphasis in the Build Engineering, Release Management, Environment Management processes and strong emphasis in inter team communication in order to solve the issues I just described.

Footnotes:

1 There was also the ones who did not think to hard about that, they were more attracted towards the "management" of software development.

2 I really believe that QA department should be a completely different area, as it seems to be the best practice.

310 Deploys Per Day - Dev and Ops Cooperation at Flickr by John Allspaw

4 I really like the hard way recipe of Ted Dziuba in his DevOps bashing article, which includes putting developers on call rotations, making develop in the same operating system they deploy and that a making sure a downtime never happens again.

OC4J, Shared Libraries Ruby and Graphviz

(all of that, in just one post)

Since July of 2010 I have been working in a insurance company called "Suramericana":http://www.suramericana.com.co. There, we have a software development department and I work as "Architecture Analyst" whatever that means. Anyway, what I do there is all the non-functional stuff that "supports" the department software (security, messaging, environment, software development methodology, etc.).

Like many enterprises, applications are built using Java (specifically J2EE or JEE) using "Oracle Application Server":http://www.oracle.com/technology/software/products/ias/htdocs/utilsoft.html (OC4J) and Oracle Database. Many of these J2EE containers support what is called in java shared libraries. A library is a bunch of jars (therefore a bunch of classes), so this is a way to "elegantly" organize class loaders defining dependencies between them and assigning them to the the required applications. In OC4J, the libraries are defined in a file called server.xml. You can see an example "here":http://gist.github.com/444545#file_gistfile1.xml

When I got to Suramericana, there was no one was in charge for administering the shared libraries, and there was a lot of disorganization in all the enviroments causing delays in the when deploying to the test or production environment. And a lot of people asking for support to the Architecture team (my team), so we basically couldn't focus on our project because the support load was to high, and the "shared libraries dependencies issue":http://en.wikipedia.org/wiki/JAR_hell#JAR_hell was the one of the main reasons. So I decided to do something about it. I talked to my boss and we decided to organize the whole thing and create a process (some part are manual but that is another story) to organize the shared libraries and put them on a Subversion repository. Now, all containers have the same shared libraries and there is a control when someone wants to modify or add a shared library. We now have almost not support regarding shared libraries use.

Well, while I was doing all this I wanted to have like a graphic representation of the shared libraries and its dependencies. I though that maybe "Graphviz":http://www.graphviz.org/ could help me doing that. As I needed to parse the XML quickly and I am Ruby fan I chose Ruby to implement it, I discovered a Ruby "gem":http://github.com/glejeune/Ruby-Graphviz that generates dot files (Graphviz file format) using Ruby as a DSL for it. So I wrote a small script (see the end of the post) that took the xml file, parsed it, and based on the references to other libraries, created a graph. I obtained a cool image like:

As you see above, the name of the shared libraries with the version are the nodes and directed edges represent the dependencies. For example, we see that log4j have no dependencies and pretty much all of the other libraries depend on it.

I really liked doing this in Ruby. Ruby have powerful meta-programming capabilities and a flexible syntax that allows a programmer to create such DSL really easily. I also discovered a small bug and sent a trivial "patch":http://github.com/glejeune/Ruby-Graphviz/commit/b2204d908a1254c2520b0cc7ae71720b93c88ae2 to fix it ;-P.

You can see the code below. Remember, I am not a Ruby expert, so comments are welcome :-)

Interesting Articles on Machine Learning

I have done a little bit of Machine Learning back in college, I paralellized a transductive SVM to get improvement over the a really slow algorithm so the topic still interest me. I just discovered a cool article by Google Research about empiric lesson learned while developing a real world machine learning algorithms.

Now while reading my feed I discovered this article that introduces a cool machine learning algorith for ranking and matching players for the Xbox live. It also have a good introduction to statistical machine learning. Totally recommended.

Happy reading :-) .

N900 and Installing Maemo SDK on Ubuntu x86_64

Well, this is my first post on my new blog. It have been a while since I blogged and I really want to do it again. I think that with this new tool which is simpler and is text based I will be able to get more easily the thoughts out of my head.

Around mid-February I bought a Nokia N900 (see video below) from a local Ebay-like Web. The N900 is a Linux based "Internet Table" with phone functionality. Others prefer to call it a Linux Smartphone. In any case is a device that gives you the basic functionality of a phone plus the experience of a desktop Internet experience providing you among others things:

  • Mozilla-based web browsing with full flash support
  • Common IM platform supported integrated into one (Conversations)
  • Skype support
  • Music, Video, and Radio receiver and transmitter.
  • Mail for exchange with Calendar sync.

And given that it is a Linux-based device, porting applications is somewhat easier, so with minor efforts you can get Gimp, Open Office and a extra bunch of application running smoothly on this device.

The SDK for this device is free of charge and the supported Languages are C,C++ and Python. I would have liked support for Java, Ruby and Mono. I thing the lack of support of Java is one the grey spot of this device.

In general I am happy with the device. It pretty much fulfill all my expectations, however here some things I believe could be improved:

  • More applications: The lack of commercial application could hurt badly this device.
  • Battery life: Life duration really suck. I will have to get an extra battery.
  • More documentation and support for developers.
  • Support for multiple accounts in mail for exchange.
Installing the SDK on Ubuntu x86_64

I am planning to code some application for this device (while learning some Python) so I decided to install the sdk on my Ubuntu 9.10 box. I ran into problem using the GUI installer that is related to the vdso32 kernel option. In order to install the "Maemo 5 SDk" you should put "vdso32=0" in your kernel command line. As it is common in Ubuntu, wich each realease a lot of stuff changes so I couldn't find where to put this option. But doing it could be more easy. Look for the file /etc/default/grub and append "vdso32=0" to the GRUB_CMDLINE_LINUX variable. Mine looks something like this:

bc. # /boot/grub/grub.cfg.
GRUB_DEFAULT=0
#GRUB_HIDDEN_TIMEOUT=0
GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT=10
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX="vdso32=0"
(...)

After that reboot and the installation is just a matter of clicking "next" :-).