A Django site.
August 17, 2008

Antonio Ognio
gnrfan
Gnrfan.org
» Typing Spanish characters in Mac keyboards

I want to share this information with other spanish speaking users of Apple computers. Yes, this can be found in several places all over the web but republishing it once again won’t hurt anyone:

  • á = Opt + e, then a
  • é = Opt + e, then e
  • í = Opt + e, then i
  • ó = Opt + e, then o
  • ú = Opt + e, then u

For the ñ, hold down the Option key while you type the n; release and type n again.

  • ñ = Opt + n, then n

To place the diaeresis over the u, hold down the Option key while pressing the u key; release and type u again.

  • ü = Opt + u, then u

The inverted punctuation marks are achieved as follows:

  • ¡ = Opt + 1
  • ¿ Opt + shift + ?

¡Allí está! Realmente útil, ¿no? :)

August 15, 2008

Antonio Ognio
gnrfan
Gnrfan.org
» Import this

Since i’m still new to the Python culture I wasn’t aware of the “import this” eastern egg. I just heard my friend Gustavo mentioned that IronPython is lacking “import this” and my curiosity was invoked. I quicky tried a few Google searches with no results. Maybe I should had tried something like “import this eastern egg” but I was only suspecting that could be the case so I changed the strategy and fired up a python interpreter on an xterm with this result:

Once the eastern egg had been confirmed I googled a bit to learn more and found it even has a PEP of its own, PEP-20. The text featured is The Zen of Python by Tim Peters. It’s a great teaching! It even appears listed as the first item in this list of python must-read documentation. Nice to know :)

There are some more Python import eastern eggs. Try import __hello__ and from __future__ import braces. Well, for the last one you always have Tim Hatch’s pybraces.

August 9, 2008

Antonio Ognio
gnrfan
Gnrfan.org
» The Evolution of Java

I’m coding some Java this days due to academic reasons: mostly  J2EE web stuff using the now ubiquitous MVC pattern using servlets, JSP, JSLT and JSF. Unless you are a bit of a clueless programer it should be no news to you that Java development is a little bit bloated and no, even if some people like to think that way, Java is NOT the language Bjarne Stroustrup would have designed if he hasn’t had to remain compatible with C as he clarifies in the FAQ of his website. So you shouldn’t be that surprised after all when reading how Cay Horstmann, a computer science professor at the San Jose State University, has summed up the evolution of Java from C and C++:

1980: C
printf(”%10.2f”, x);
1988: C++
cout << setw(10) << setprecision(2) << showpoint << x;
1996: Java
java.text.NumberFormat formatter = java.text.NumberFormat.getNumberInstance();
formatter.setMinimumFractionDigits(2);
formatter.setMaximumFractionDigits(2);
String s = formatter.format(x);
for (int i = s.length(); i < 10; i++) System.out.print(' ');
System.out.print(s);
2004: Java
System.out.printf("%10.2f", x);
Don’t know you but I really found it funny :)

July 28, 2008

Antonio Ognio
gnrfan
Gnrfan.org
» Peru’s National Day on Google

Today it’s Peru’s national day. Liberator Jose de San Martin declared Peru’s independence from Spain the 28th of July of 1821 so this is Peru’s Independence’s 187th anniversary. Acording the Netcraft Google operates a localized search portal using the domain google.com.pe since April 2003. Nonetheless I don’t recall seeing our national flag in the Google Logo before so he I’m posting an screenshot I just took some minutes ago.

It was a cool way to realize our national day has arrived, at least for an Internet geek like me. I took the screenshot in my Mac pressing Shift + Command (Apple) + 3 then cropped it and resized using Seashore, an image editing app for the Mac based on the GIMP built using OS X’s Cocoa framework.

July 25, 2008

Antonio Ognio
gnrfan
Gnrfan.org
» TinyURL got custom aliases

I’ve just realized TinyURL got custom aliases, that is, you can customize the part of the URL beyond their domain to point to the desired URL. I like it. I had that idea myself some time ago. So now http://tinyurl.com/gnrfan redirects to this blog. Pretty neat, huh? The only problem, in this specific case it’s I’ve got a 17 characters url shortened to 25 :)

It looks like not all words are available. When I tried to point to the RIAA homepage using the custom alias “suckers” I got a message telling me that custom alias is not available and no, it’s not somebody grabbed it before. Seems fair.

What are you waiting for? Go grab your custom alias now!

July 20, 2008

Antonio Ognio
gnrfan
Gnrfan.org
» Keyboard freezes on Mac OS X

I got a white Macbook Santa Rosa a few months ago basically because I wanted to have a long-period first-hand experience using OS X on proper hardware. I’m a Linux fan and FLOSS advocate and surely Apple is a gross propietary-minded corporation and yes, I know I should be rejecting their products as the plague but I’m also a curious geek and I came to the point where I was clearly feeling I was missing 1/3 of today’s desktop action if I only used Linux and Windows. So I bought it and can’t regret it, I’ve been quite happy so far.

It’s no news Apple computers just work. When you switch, you learn your way around the new system in the first couple of weeks. Of course you don’t get to know every aspect of the OS but you get to learn all the stuff you really care about and use everyday.

Macbook

So everything was really fine with Leopard until I started to notice this very rare keyboard freezes. Wait! Keyboard freezes? I guess I had never experienced something like that with Windows and Linux before unless it was a bad cable or the keyboard cord got disconnected so at the very first time the concept seemed a bit alien. I’m a geek and the most of the times I know may way around computers and even without the keyboard to perform some basic testing and diagnosis I concluded that most of the running software was doing just fine and you could continue browsing the net and doing anything else that only required the use of the mouse so this was something strange that only compromised the use of the keyboard. But having no keyboard is quite annoying! Specially for a Linux guy that has at least one terminal open under OS X in order to feel sane taking my daily dose of bash, vim, wget and a few other command line utilities I can’t live without.

I realized that the keyboard freeze got fixed when I closed the current session and started a new one. Despite the session fix finding I must admit I was worried the thing was some weird hardware issue and I was somewhat expecting it to be gone by itself because it was happing once every week or two weeks and I could handle that.

Now a couple of weeks ago this freezes started to happen more and more often and the last days almost daily. Sometimes I had too many apps opened or I was using Windows under VMware so I was really a hassle so I searched the web for a solution and quickly found the patches from Apple in the form a small 978K update that requires a bigger 110 MB update that upgrades the system to version 10.5.1.

The upgrade process requires you to reboot your Macbook twice: first after the upgrade to OS X 10.5.1 has been completed then after installing the keyboard freezes fix. I’ve been using the Mac for a while and the problem seems to be gone.

I’m posting this as a reminder to myself because I might be trying a full reinstall of the software in my laptop in a few weeks in order to get a clean triple boot system up and running and because someone else may find the post useful.

May 4, 2008

Antonio Ognio
gnrfan
Gnrfan.org
» PHP Best Practices

Yesterday I attended the Ubuntu 8.04 Hardy Heron LTS Release Party event the folks from Ubuntu Peru and Linurp organized here in Lima at Universidad Ricardo Palma. Nice talks on Ubuntu, KDE, GNOME, Drupal and PHP among some other stuff. I particularly liked the talk by the good old Jesus Castagnetto of PEAR and Professional PHP Programming fame. His slides (spanish) are posted at his site. My summary including bits i’ve been adding follows:

  • PHP is an easy language to pick up & learn but it’s a bit tricky to master
  • During the development phase of your project set the error_reporting value of php.ini to E_STRICT in order to get all sort of errors
  • Please set an error log and read it! You are going to need it to monitor your application when it’s deployed for production. Don’t forget to stop displaying errors to the end user in production sites. If you do, chances are you’re disclosing very useful information for an attacker trying to take control of your site or shutting it down.
  • If you’re using clean urls (and you should!) and not using the .php extension for your pages you don’t need to disclose that you’re site is running PHP. Setting the expose_php value to zero in php.ini might be a good idea.
  • Please get rid of code (yours or written by someone else) that depends on registers_globals = On. This configuration option won’t even exists when PHP 6 is released. Having PHP or your own code create global variables automagically from data sent by the user is a major security threat. So please resit the temptation of using it.
  • Please stop using magic quotes. Today they’re not a good idea. Actually they never were a good idea and will be depracated in PHP 6. As the programmer you’re responsible for adding quotes properly to any string that might need them.
  • Since version 5, PHP got exception handling. Please don’t abuse then exception handling mechanism by raising an exception at the minimal user-generated error. Raise an exception instead when a critical condition that is need for your program to continue working properly is not met, specially when you expect some other part of you code catching the exception and doing something about it.
  • Exceptions can consume considerable memory if your stack trace gets big. They are useful but not cheap.
  • Don’t debug you’re code using exclusively echoes, prints and var_dumps. You should be using a proper debugger instead. A very good one is XDebug. You get the extra advantages of getting a full stack trace and profiling capabilities.
  • No matter if you’re a solo coder or part of a team you need to follow coding standard in order to produce a consistent-looking codebase that can be easily read by anyone including yourself. PEAR has a good coding standard that has been proved in many PEAR contributions over a good few years. The Zend Framework provides you with a newer coding stardard (draft) that is also based on PEAR’s.
  • Documenting might be a bit boring but it’s critical for the success of your project over it’s lifetime. If you’re code is non-trivial you’re much better embedding good documentation in it that will help you in the first place to understand that are those lines of code doing when you come back to make changes. A quality tool for generating PHP documentation is phpDocumentor. It’s fast and can generate not just only API docs but tutorials by parsing your code if you learn to use it properly.
  • Please don’t reinvent the wheel. PHP has lots of useful functions that are implemented in C and will definitely run faster than you’re code. If you caught yourself reimplementing native functionality it’s your fault for not reading the manual and keep up with the changes and additions to PHP and it’s core extensions. Know your tool. Investing a bit of time in reading the manual will definitively pay off.

There are a few tips related to OOP with PHP, specially PHP 5:

  • Don’t over-engineer your code. PHP is not Java and in many circumstances you’ll be good using just a simple array which is a native data structure instead of a user defined class. Keep things simple.
  • Don’t use is_a() but instanceof() instead for checking if an object is a member of a class since is_a() was depracated as of PHP 5.

In order to improve the security of your code you can follow this guidelines:

  • You must ALWAYS initialize your variables, specially those involved in authentication, authorization and security checks.
  • Never ever trust your user on providing the right kind of input for your program to work properly. You must always validate that the user’s input is good for you
  • PHP has the filter and ctype extensions for validating user input. You can always use regular expressions for custom validations.

Finally, for performance improvements you have this recommendations available:

  • Don’t use double quotes in strings if there’s no variable interpolation or character escaping taking place. This saves a few miliseconds in each string so if you have many strings in your code and many visits in your website this alone can be a huge CPU and time saver.
  • In many places you can speed things a bit up by avoiding string concatenation. Just use a comma in echo to get the same output effect.
  • Prefix variable incrementation is a bit faster than postfix incrementation so if you’re not assigning the value of the variable before incrementing it you can easily gain a few extra milliseconds and consume less server CPU with this simple change so you ++$i instead of $i++ whenever you have the chance.
  • By all means you must avoid recreating the same dynamic content over and over again if you can be sure it won’t be changing. This is when content caching comes handy. Something as simple as reading a generated HTML chunk from a file in the filesystem instead of issuing again the database queries and/or performing the calculations needed to generate can be a big improvement. Generally cached content is not useful or trusty after some period of time has passed so put your attention in regenerating the cached content when it’s no longer valid.
  • Your own PHP can benefit a lot from using a caching mechanism so PHP doesn’t have to compile your code over and over again if it hasn’t change. Avoid wasting server CPU and response time. APC is a very good code caching solution for PHP and is mantained by Rasmus Lerdorf, the creator of PHP himself.
  • Don’t guess which parts of your code are the bottlenecks. Use a profiling tool instead. Remember XDebug includes a profiler.
  • Even if it’s not something you do at the PHP level you can always take advantage of a data compressing mechanism like Apache’s mod_gzip. Compressing content in both requests and replies is something that has been available in the HTTP specs for a while and you can easily save up to 80% of the bandwidth and response time.

I really think it’s a good idea to use lists like this as check-lists and use the techniques in your projects.

November 12, 2007

Antonio Ognio
gnrfan
Gnrfan.org
» Resolviendo el problema de Google

La verdad llego tarde a la fiesta que se originó cuando Cesar Soplin publico este slide con un problema que suelen plantear en las entrevistas de trabajo de Google:



Yo recién he visto el problema hoy, hace unas horas, y la verdad, me temo que no lo habia visto nunca. Digo “me temo” porque resulta que el problema es todo un clásico de la optimización via modelos matemáticos y es conocido en los círculos de la Ciencia de la Computación. En el artículo The Joy of Egg-Dropping in Braunschweig and Hong Kong hay abundante información sobre el problema incluyendo un formulario que muestra la solución para el número de pisos deseado.

Gustavo Picón publicó hace ya varios dias en su blog una solución al problema, que es absolutamente correcta, pero no explica realmente la lógica que está detrás del algoritmo.

Bueno, resulta que yo también tengo una solución al problema y la pude implementar en menos de 2 minutos en PHP luego de tomarme cerca de cuatro horas en entender realmente lo que el problema pide que uno haga:



Mi código lo tiene en este link de pastebin.com. Como ven parece trivial y realmente sería trivial si yo les planteara el problema de esta manera:

Escribe un programa que encuentre el menor número entero positivo que sumado a todos los enteros positivos menores que él de un resultado igual o mayor que cien

Bueno, eso es exactamente lo que hace mi programa y de una manera bastante simple y obvia. La pregunta es ¿Porqué este problema y el problema planteado por Google son equivalentes?

El texto del problema, tal como lo plantea Google dice asi:

Tienes 2 objetos y un edificio de 100 pisos.

Los objetos se rompen si caen desde una altura de N pisos o más
pero quedan intactos si caen de una altura menor de N pisos.

Es decir, un objeto puede caer desde el piso N-1 todo el día y
no se rompería, pero siempre se rompe si se deja caer del piso N.

Diseña un algoritmo que determina el piso N minimizando la caida
de objetos en el peor de los casos.


Al principio puede costar un poco entenderlo pero los dos objetos tienen exactamente el mismo grado de resistencia a romperse si se tiran desde cualquier altura, entonces, si uno encuentre una altura a la que el primer objeto se rompe, necesita ir probando con el segundo objeto con alturas menores hasta encontrar si el piso encontrado con el primero objeto es efectivamente el más bajo desde donde estos se rompen.

Lo que confunde bastante es pensar que uno tiene que dar como respuesta cual es el piso desde donde se rompen los objetos y ese no es el caso. Nunca sabemos desde que piso se rompen los objetos con exactitud.

Lo que nos preguntan realmente es ¿Desde que piso me conviene comenzar a tirar el primer objeto para encontrar el piso más bajo desde donde se rompen haciendo el menor número de intentos?

Lo díficil del problema es entender realmente que significa “minimizando la caida de objetos” por una parte y por otra parte “en el peor de los casos”.

Después de mucho pensarlo creo que encontré una manera mas o menos fácil de explicarlo:

¿Que significa “minimizando la caida de objetos”?

Significa lanzando los objetos el mismo número de veces o incluso menos que si tuviera la suerte de hacer el primer intento justo en el piso más bajo desde donde se rompen y confirmándolo haciendo intentos desde el piso 1 hasta el piso anterior para comprobar que el segundo objeto no se rompe.

¿Que significa “en el peor de los casos”?

Significa el mayor número de intentos por hacer desde la posición de inicio mas óptima, que es justamente, el número de intentos necesarios si logro romper el primero objeto al primer intento, porque si el objeto se rompe en el piso 100 o no se rompe nunca, con la estrategia óptima el número de intentos puede ser incluso menor.

La explicación final comienza por entender que si tengo la suerte de  romper el primer objeto justo lanzándolo desde el piso X adecuado y al primer intento solo me faltarían X-1 intentos más, desde el piso 1 hasta el anterior para estar 100% seguro de que ese es el piso buscado.

Entonces la solución optima, rompiendo al menos el primer objeto, se obtiene tirando el objeto desde el piso X haciendo un total de X intentos.

Pero, ¿Qué pasa si en ese primer intento el objeto no se rompe? Solo me quedarían como máximo X-1 intentos más para no superar el número de intentos de la estrategia óptima.

La pregunta entonces es ahora determinar con que piso sigo probando si ya se que en el piso A no se rompe. Como ya se que en A no se rompe, el siguiente piso necesariamente va a estar mas alto, y el valor mas bajo posible sería justamente el piso siguiente, es decir A+1. Sin embargo como solo tengo X-1 intentos, el piso con el que más me conviene seguir probando, es aquel en que, en caso que se rompa el objeto, el número de intentos con el segundo objeto me permitiera llegar al piso inferior, es decir, el piso A+X-1 donde “A” es el primer piso probado (sin éxito) y X es el número optimo de intentos.

Lo interesante es que, aplicando esta técnica, el número de intentos necesarios para llegar al piso 100, nunca supera al número de intentos que hubieran sido necesarios para obtener la confirmación ya sea que uno hubiera logrado romper el primero objeto al primer intento, o al segundo intento, o al tercero, o cuarto, etc.

Entonces, ya llevándolo a un algoritmo basta con calcular la suma de  X + (X-1) + (X-2) hasta cero, que no es otra cosa que la suma total de intentos fallidos de romper el primero objeto para todos los valores posibles de X comenzando desde 1 hasta encontrar el primer valor que llegue o supere a 100, el número de pisos del problema.

¿Veamos entonces cuál es la solución?



Efectivamente, 14. Si comienzo lanzando el primer objeto desde el piso 14 y se rompe (sauuu!!!) logro confirmar con el segundo objeto en 13 intentos más que hasta el piso 13 un objeto no se rompe. Sin embargo, si no tengo suerte al primer intento y tampoco en los siguientes, voy a llegar hasta el piso 100 en menos de 13 intentos adicionales, un número de intentos que no es mayor a 14.

Piso 14, quedan 13 intentos
Piso 14 + 13 = 27, quedan 12 intentos
Piso 27 + 12 = 39, quedan 11 intentos
Piso 39 + 11 = 50, quedan 10 intentos
Piso 50 + 10 = 60, quedan 9 intentos
Piso 69 + 9 = 69, quedan 8 intentos
Piso 69 + 8 = 77, quedan 7 intentos
Piso 77 + 7 = 84, quedan 6 intentos
Piso 84 + 6 = 90, quedan 5 intentos
Piso 90 + 5 = 95, quedan 4 intentos
Piso 95 + 4 = 99, quedan 3 intentos
Piso 100, el objeto se rompe y sobraron 2 intentos inclusive.

¿Porqué sobraron dos intentos? Porque si ya probé con el piso 99 y el objeto no se rompió queda demostrado que el piso 100 es el menor piso desde donde los objetos se rompen al soltarlos.

Espero que te sirvan estas notas si estas tratando de comprender el problema. Si lo conoces mejor que yo por favor escribeme y cuéntame al respecto.


November 11, 2007

Antonio Ognio
gnrfan
Gnrfan.org
» Instalando los mismos paquetes instalados en otra m&Atilde;&iexcl;quina

Hace un rato, despues de unos 5 minutos de ensayo y error logré refinar este comando para instalar en una máquina con Ubuntu los mismos paquetes que ya están instalados en otra máquina:

sudo apt-get install `ssh usuario_at_host COLUMNS=300 dpkg -l | grep -v “Desired” | grep -v “| Status” | grep -v “|/” | grep -v ”||/” | grep -v “+++-” | awk ’{ print $2}’ | tr ’\n’ ’ ’`

Se ve un poco complicado pero no lo es tanto realmente. Eso si, es todo un pequeño testimonio del poder de la línea de comandos de Linux ;)

Evidentemente hay que reemplazar “usuario” y “host” por tu nombre de usuario y el nombre del host de la máquina desde donde se obtiene la lista de paquetes.

En realidad lo único que estoy haciendo es obtener remótamente via ssh una la lista de paquetes instalados en otra máquina. Como la idea es pasar esta lista con nombres de paquetes como argumentos del comando apt-get utilizamos tr para convertir los saltos de linea en espacios en blanco y listo. Lo demás es usar backsticks para hacer referencia a la salida de un comando externo y pasar toda la lista de paquetes al comando apt-get install.

Como no es nada mas sofisticado hay una serie de pre-condiciones para que funcione. Algunas de las que se me ocurren son:

  • Las distribuciones deben ser las mismas respetando las versiones
  • Los repositorios de las dos máquinas deben ser los mismos
  • No deben haber paquetes instalados a mano que no esten disponibles en los repositorios

Es por eso que quizás sea mas útil obtener la lista de paquetes, pasarla a la otra máquina y editarla manualmente.

Eso se podria hacer de la siguiente manera:

a) En la primera máquina, obtenemos la lista de paquetes con este comando:

COLUMNS=300 dpkg -l | grep -v “Desired” | grep -v “| Status” | grep -v “|/” | grep -v ”||/” | grep -v “+++-” | awk ’{ print $2}’

No estoy convirtiendo los saltos de linea en espacios para poder depurar la lista de paquetas con mayor comodidad.

b) Una vez que la lista de paquetes esta depurada (producto de un poco de ensayo y error) se puede instalar en la segunda máquina:

apt-get install `cat paquetes.txt | tr ’\n’ ’ ’`

Y listo! Esa es la idea. Yo lo he hecho varios veces pero ahora me di un  poquito de tiempo para ponerlo en el blog.



October 31, 2007

Antonio Ognio
gnrfan
Gnrfan.org
» Ubuntu 7.10 Install Party Lima

Hace buen rato que no blogueaba algo y todavía no escribo nada sobre lo bueno que estuvo el Encuentro Linux en Arica Chile pero en fin, aqui van algunas fotos de lo que fué la Ubuntu 7.10 Install Party Lima en el Centro Open Source el Sábado pasado.


Afiche del evento


Lo interesante es que estas charlas se armaron al toque en el irc solo dos semanas antes de la fecha elegida y entre menos de 10 personas le dimos forma al evento bastante bien coordinando en #ubuntu-pe de irc.freenode.net.


Público asistente


Al parecer, durante todas las charlas habían unas 20 personas escuchan, que fueron rotando. Para una charla en Perú parece poca gente pero para bastantes charlas en Europa por ejemplo la cantidad de asistentes estuvo bastante buena.


Alvaro Pereyra hablando de Rails



Alfonso de la Guarda, Michael Garrido, Cesar Soplín, Juan Oliva y Alvaro Pereyra


/>
Las máquinas XO estuvieron circulando entre los asistentes



No, ese pelado no es Droper



Clever demostrando Compiz Fusion



Yo, aburriendo a los últimos que quedaron :)


Pueden ver el albúm completo y más fotos cortesía del COS. Yo personalmente agradezco a todos los involucrados: organizadores expositores y asistentes. Nos vemos en la próxima! A mas tardar para el lanzamiento de Ubuntu Hardy Heron 8.04 LTS.


September 23, 2007

Antonio Ognio
gnrfan
Gnrfan.org
» gTwitter en Ubuntu Gutsy

Acabo de probar la versión de gTwitter que viene con Ubuntu Gutsy y está bastante decente:



gTwitter en Ubuntu Gutsy

El programa está escrito en C# y requiere de Mono para correr en Linux. Está bastante bien pero me gustaría que uno pudiera habilitar la opción de que aparezca una notificación por cada post nuevo que realizan tus amigos. Mejor aún sería poder definir una lista de amigos sobre los que te interesa ver los post como notificaciones. Si estás siguiendo las actualizaciones sobre alguna noticia o evento, esto puede ser bastante útil.


» Ubuntu Gutsy y GNOME 2.20

Anoche instalé Ubuntu Gutsy a través del CD Tribe 5 que es anterior a la beta y durante la madrugada actualicé los paquetes para que tuviera GNOME 2.20.0, la última versión publicada oficialmente.


Mi escritorio con Ubuntu Gutsy


Asi es como quedó mi escritorio después de modificar un poco la apariencia e instalar uno que otro paquete. El tema que uso en Metacity es Silicon y se instala con un simple apt-get install silicon-theme. El tema de íconos es Tangerine, que también viene instalado por omisión y el fondo es uno que ya había descargado anteriormente y que tiene todo el estilo de los típicos fondos de escritorio de Mac OS X. Habilité los efectos de sombras y transparencias normales cortesía de XGL/Compiz pero he seguido usando Metacity como manejador de ventanas.


Ubuntu Gutsy con AWN y Cairo Clock


Luego de trabajar un rato con él me animé a probar algo nuevo y ponerle un poco mas de eye candy al asunto e instalé del Cairo Clock con apt-get install cairo-clock y luego Avant Window Manager para lo que si tuve que seguir las instrucciones encontradas en este hilo del foro de Ubuntu en donde hay que agregar un nuevo repositorio de APT para poder instalar la última versión directamente desde bzr.


Configuración de complementos de AWN


AWN es un dock, como el de Mac OS X, lo que significa que no es un simple lanzador de programas sino que ofrece mayores funcionalidad. Por ejemplo, al hacer click en uno de los íconos la aplicación se abre si no estaba abierta. Sin embargo, si ya ha sido iniciada muestra la ventana asociada. Ajusté la configuración de AWN para que muestre una superficie en 3D a manera de una repisa y para que los íconos giren sobren eje vertical también con un efecto de sólido en 3D a la hora a la hora que uno pasa el puntero del ratón encima de ellos.


Menú principal de AWN


Lo que hice luego fué activar 3 de los plugins de AWN de manera que tengo un menú parecido al menú principal, un medidor de uso del CPU y el ícono de la papelera.


Uno de mis scripts en Ruby con el estilo de color Oblivion


Lo demás ha sido encontrarme con gratas sorpresas y poder probar de primera mano características de las que había venido leyendo en blogs en las últimas semanas. Por ejemplo, ahora Gedit soporta estilos que no son otra cosa que esquemas de colores o temas como una capa de personalización al resaltado de sintáxis. Si has usado GVIM o si has visto esos vistozos pantallazos de TextMate en la Mac esta nueva característica definitivamente te va a gustar. En el pantallazo estoy usando la famosa fuente Monaco de la Mac, pero debo admitir que no se ve tan redondita y bien definida como se ve en el OS X.


Configurando auto_hide_size en gconf-editor


Estoy probando el AWN pero no he querido deshacerme del todo del panel inferior de GNOME. Así que una solución que encontré es hacer que se oculte al máximo posible para lo que tuve que hechar mano a gconf-Editor y ajustar la propiedad auto_hide_size del panel inferior y ponerla a un solo pixel.


Xterm con apariencia similar a Gnome Terminal


Otra cosa que acostumbre personalizar es la aperiencia del programa xterm. Editando el archivo /etc/X11/app-defaults/XTerm y agregando estas dos lineas es posible controlar el tipo y tamaño de letra a ser mostrado:

*faceName: Consolas
*faceSize: 9

Así mismo, para configurar el color, es necesario editar estas otras dos lineas en el archivo /etc/X11/app-defaults/XTerm-color:

*VT100*foreground: black
*VT100*background: white

Sin embargo, he tenido algunos problemas. Primero, la utilidad command-not-found presentaba errores para acceder a la base de datos de programas disponibles. Por suerte al actualizar el sistema el problema se solucionó tal como lo prometian el reporte del error. El otro problema que tengo es que cuando uso compiz solo tengo dos escritorios virtuales y no los 8 que acostumbro tener. Esto ya lo había visto antes y espero poder solucionarlo en algún momento.

Esta instalación se produjo como parte de una reorganización de las particiones en mi disco duro. Ahora si he hecho espacio para instalar en paralelo un sistema Debian así que espero poder instalar en los próximos dias o quizás la próxima semana un escritorio similar a partir de Debian Unstable.


September 22, 2007

Antonio Ognio
gnrfan
Gnrfan.org
» Algunas fotos de COMSYS

Acabo de encontrar en el sitio web de Alvaro algunas fotos que no habia visto y que creo que no está de mas publicar por acá


Mi charla en COMSYS 2007


Hablando de los espacios de comunicación de las comunidades


Terminando mi charla


Charla de Jorge Sarmiento


Charla de Alvaro Lopez


Jorge, Alvaro y Miguel apanando al Pio’s Chicken! Ah no! Es Tux!


Jorge y Alvaro vs el el logo de Window$


September 4, 2007

Antonio Ognio
gnrfan
Gnrfan.org
» Vala: un compilador optimizado para GObject con sintaxis similar a C#

Hoy me enteré de la existencia de Vala, un nuevo lenguaje de programación que permite programar para GNOME en C utilizando GObject pero con la comodidad de una sintaxis casi idéntica a la de C# solo que optimizada para este sistema orientado a objetos en C, si C, no C++.

Para muestra, que mejor un poco de código fuente:

using GLib;
public class Sample : Object {
       public string name { get; set; }
       public signal void foo ();
       public Sample (construct string! name) {
       }
       public void run () {
               foo += s => {
                       stdout.printf (“Lambda expression %s!n”, name);
               };

               /* Calling lambda expression */
               foo ();
       }
       static int main (string[] args) {
               foreach (string arg in args) {
                       var sample = new Sample (arg);
                       sample.run ();
                       /* Object will automatically be freed
                        * at the end of the block */
               }
               return 0;
       }
}

Este código, example.vala se compila de la siguiente manera:

valac -o example example.vala

Mas ejemplos disponibles:


Esto realmente no tiene nada que ver con Mono. Estamos hablando de un compilador que simplemente traduce una sintaxis mucho mas amigable y moderna que la de C e incluso C++ a archivos de código fuente y cabeceras de C que se compilan con las herramientas ya existentes contra las librerías ya existentes. Simplemente genial! Y es una idea que yo mismo había tenido varias veces en todos estos años en los que he venido siguiendo el desarrollo de GNOME, incluído Mono.

Esto no hace sino alegrarme. De hecho, muchos programadores empezaron a reportar importantes aumentos de productividad utilizando C# en lugar de C y todo este movimiento se ha traducido en la aparición de aplicaciones que hoy muchos consideran esenciales como Beagle y Tomboy.

Así como KDE apostó desde el comienzo por C++, GNOME apostó por C, porque ser mas portable y compatible con cualquier plataforma que el propio C++. Este proyecto, durante años, luchó contra la corriente programando de manera orientada a objetos en un lenguaje que no lo facilita.

Con el paso de los años, las tecnologías han venido depurándose y refinándose y ahora hablamos incluso de introspección en C en la librería GNU. Sin embargo, la sintaxis de C tiene que haber venido jugando en contra de este proyecto y pasando factura, elevando quizás innecesariamente la barrera de entrada para nuevos desarrolladores. Esto se nota desde cosas tan simples como
la falta de soporte nativo a tipos de datos como las cadenas, construcciones como las clases, el tener que usar punteros a funciones previamente definidas en lugar de lambdas y todo ese tipo de cosas, que ahora con Vala quedan elegantemente solucionadas sin tener que cambiar realmente de plataforma base.

Pienso que C# y .Net tienen muchos puntos válidos pero al menos en GNOME el mayor impacto de estas tecnologías venia por parte de la sintaxis clara y elegante de C#. El
poder tener esta misma comodidad para programar en C  no puede sino impactar muy positivamente en este proyecto.

Sin embargo, las razones no quedan ahi. GNOME no solo necesita aplicaciones sino especialmente librerías (bibliotecas) y no es aceptable para el proyecto escribirlas en C# o Java. Con Vala si se podrán escribir librerías con lenguaje de alto nivel que podrán ser aceptadas y distribuidas como parte de GNOME ya que el código generado es C y no hay ningún runtime ni librería adicional que distribuir. Esta es la ventaja de utilizar un lenguaje especialmente diseñado para GNOME.

El otro tema importante es el uso de memoria. Java y C# utilizan bastante memoria a pesar de haber mejorado enormemente con el paso de los años. GNOME es una plataforma que ahora también se usa mucho en sistemas empotrados y con pocos recursos como las tablets de Nokia, los celulares de OpenMoko y las laptops de OLPC. El hacer un uso eficiente de la memoria pero sin consumir demasiados recursos se vuelve un tema clave y Vala también ayuda en ese sentido.

El compilador de Vala incluye un contador de referencias, del tipo de los que se utilizan en un recolector de basura lo facilita mucho el manejo automático de la memoria pero puede agregar un overhead comparado con el código en C, sin embargo, en partes de programas donde sea necesario
mejorar el rendimiento se pueden relajar estos chequeos con el operador weak.

Vala esta tomando como referencia el lenguaje C# para minimizar la curva de aprendizaje para desarrolladores que ya conozcan este lenguaje. Eso si, hay existen algunas diferencias:

  • No hay bloques checked/unchecked/unsafe
  • No hay etiquetas ni existe la palabra clave goto
  • No existen las sentencias yield
  • No hay sobrecarga de métodos
  • Las estructuras no pueden heredar de la clase base ni implementar
    interfases
  • No hay soporte para clases parciales
  • No hay soporte para métodos que no sean abstractos en interfases

Puesto que no se soportarán los bloques unsafe no me queda claro si se permiten punteros en cualquier parte del código. En todo caso, Vala está evolucionando en este momento y la idea es aproximarse a C# desde el punto de vista sintáctico hasta donde sea posible pero teniendo en cuenta que el objetivo es sacarle el máximo provecho a GObject y que la tecnología subyacente no es un entorno de tiempo de ejecución que utiliza bytecode y puede hacer otro tipo de trucos sino un simple compilador de C.

Creo que son muchas posibilidades interesantes las que se abren con tecnologías así. Se me ocurre que una aplicación bastante atractiva fuera del escritorio podría ser escribir un servidor web de alto rendimiento como Lighttpd o Cherokee pero con la comodidad de la sintaxis de un lenguaje de alto nivel y sacando partido a las características de introspección lo que podría facilitar mucho la creación de modulos por terceras partes.

Esta es una gran noticia y voy a estar siguiendo el tema con mucho interés. Yo siempre he sido un fan del entorno GNOME y soy un usuario bastante antiguo,  de hecho lo he venido usando desde antes de la versión 1.0 a principios de 1999, asi que como se imaginaran, le tengo bastante cariño. Seria realmente genial poder participar de la próxima GUADEC.

Se vienen tiempo interesantes para GNOME.Si programas para esta plataforma, descarga Vala y pruébalo.


July 21, 2007

Antonio Ognio
gnrfan
Gnrfan.org
» Simpsons: The Movie









Yo no salgo en la pelicula pero si quiero ir a verla. Consigue tu avatar en el sitio SimpsonsMovie.com.


June 28, 2007

Antonio Ognio
gnrfan
Gnrfan.org
» Conferencia del PLUG con Eduardo Silva





Para mas información, audios, videos y novedades del evento por favor visita:

www.linux.org.pe/olpc07

Te esperamos ahi! No faltes!


June 16, 2007

Antonio Ognio
gnrfan
Gnrfan.org
» Internet Blog Serial Number

En una clara referencia a los códigos ISBN (International Standard Book Number), nace el código IBSN ó Internet Blog Serial Number como una forma de protesta ante la negativa de las autoridades a (¿de USA?) para asignar códigos ISSN a los blogs de Internet.


Código IBSN de gnrfan.org


La iniciativa no parece haber sido tomada aún muy en serio pero bueno, como te dejan escoger a ti mismo el número con tal que tenga 10 digitos y tres guiones yo ya me escogí el mio: 00-000-76-123.


June 8, 2007

Antonio Ognio
gnrfan
Gnrfan.org
» Soulse, just in case...

Soulse, solo en caso de que tus opciones para hacer algo diferente sigan aún por el lado de la tecnología podrias considerar meterte un poco en el proyecto OLPC, quizás investigando los detalles Bitfrost, la plataforma de seguridad implementada en las laptops XO. Estamos en #olpc-peru en Freenode. No se pierde nada comentándolo ;)


» Proyecto Indiana &Acirc;&iquest;La ultima cruzada?

Gracias a un comentario en el blog de lasarux me enteré de Pollycoke, un excelente blog de tecnología italiano, uno de los más leidos incluso. Così non mi dimentico tanto della lingua italiana.

Ahi también se hacen eco del proyecto Indiana, un esfuerzo de Sun por crear ellos mismos  un distribución binaria de OpenSolaris impulsada por nada menos que Ian Murdock, quien hace meses dejó The Linux Foundation para unirse a Sun.

Hasta el momento Sun solo distribuye OpenSolaris como fuentes. Por eso Nexenta ó Belenix llenan el vacio con sus propias distribuciones, ensayando ideas distintas. Sin embargo, no dejará de ser interesante ver al creador de Debian, una distribución clave de GNU/Linux iniciar un proyecto posiblemente clave para el futuro de OpenSolaris.


Ian Murdock y el proyecto Indiana ¿La última cruzada?


Hay un video (557 Mb) y un audio (85 Mb) de la charla que dio Murdock en el Grupo de usuarios de OpenSolaris del Silicon Valley, por si están interesados.


June 5, 2007

Antonio Ognio
gnrfan
Gnrfan.org
» Reprobabilidades

Recién descubrí reprobabilidades, un nice little hack (no se como decirlo mejor en español) del siempre prolífico jgwong.

Si estas leyendo esto las probabilidades son..

1. Que seas el propio Jaime leyendo Chichaplanet (3%)
2. Que ya hayas descubierto que en reprobabilidades las probabilidades nunca llegan a 100% (1%)
3. Que te animes, al menos un poquito, a hacer click y ver por ti mismo de que se trata el asunto. (94%)