Popularidad de las distribuciones de GNU/Linux

He realizado un pequeño análisis sobre las cifras publicadas por DistroWatch acerca de la popularidad de las diferentes distribuciones de GNU/Linux en los últimos 6 meses.

Las estadísticas de DistroWatch se basan en la cantidad de visitas diarias al sitio de cada distribución, siendo una fuente bastante respetada a la hora de estimar su cantidad de usuarios. Aunque las cifras publicadas corresponden a cada distribución específica, resulta interesante realizar un agrupamiento de todas aquellas derivadas (por ejemplo, Debian, Ubuntu, etc.).

Sigue leyendo «Popularidad de las distribuciones de GNU/Linux»

Programación para redes y concurrencia (IV)

En esta última entrega analizaremos algunos de los problemas que se plantean a la hora de desarrollar programas concurrentes.

La programación concurrente (implementada a través de procesos separados o de threads) plantea una serie de inconvenientes respecto del uso de recursos o datos compartidos, que abren un campo de investigación interesantísimo y con muchos puntos aún no resueltos. Presentaremos aquí solamente una introducción a esta problemática, ejemplificando cada situación con nuestro servidor concurrente.

Nota del 19/11/2006: Ahora puede descargar el tutorial completo.

Sigue leyendo «Programación para redes y concurrencia (IV)»

Programación para redes y concurrencia (III)

Luego de que en la entrega anterior complicáramos un poco las cosas introduciendo concurrencia en el servidor, un amigo me hizo notar que quizás sería mejor dar un ejemplo un tanto más «real» de lo que estábamos haciendo.

Es por eso que dejaremos por un rato el camino planificado para jugar un poco explorando las posibilidades con un cliente en PHP (en una especie de «recreo«).

Sigue leyendo «Programación para redes y concurrencia (III)»

Programación para redes y concurrencia (II)

En la entrega anterior abordamos el diseño de un protocolo y la implementación de un servidor secuencial muy simple y un cliente. Haciendo esto, inspeccionamos los conceptos fundamentales de la programación de aplicaciones usando sockets.

En esta segunda parte, desarrollaremos un servidor capaz de recibir conexiones de varios clientes de manera concurrente (en paralelo). Para ello utilizaremos dos técnicas distintas: procesos múltiples e hilos de ejecución (threads).

Nota del 19/11/2006: Ahora puede descargar el tutorial completo.

Sigue leyendo «Programación para redes y concurrencia (II)»

Programación para redes y concurrencia (I)

Este es el inicio de una serie de artículos introductorios sobre programación para redes (usando sockets) y programación concurrente. El objetivo es presentar una serie de conceptos que iremos explorando progresivamente:

  • Programación cliente/servidor usando sockets: Cómo desarrollar programas que se comuniquen a través de la red para realizar distintas tareas.
  • Protocolos de comunicación: Explorar los principios básicos de los protocolos de aplicación (alto nivel) utilizados para intercambiar información.
  • Concurrencia: Cómo construir programas que se ejecuten paralelamente y resolver algunos de los problemas que nos plantea la concurrencia.

Nota del 19/11/2006: Ahora puede descargar el tutorial completo.

Sigue leyendo «Programación para redes y concurrencia (I)»

Libre, gratuito, portable y estándar

Discusiones sobre «estándares», «software libre», «software gratuito», «portabilidad» y cuestiones afines se dan muy a menudo. En la mayoría de ellas puede apreciarse que existen grandes confusiones que involucran a estos términos.

Desde varios ámbitos (por ejemplo, el Proyecto GNU) se insiste hasta el hartazgo en marcar diferencias importantes (como la de «gratuidad» y «libertad«), pero esto no parece suficiente para aclarar el equívoco. Este es el por qué de mi pequeño aporte.

Sigue leyendo «Libre, gratuito, portable y estándar»

Programación orientada a objetos

Cuando comencé a explorar la programación orientada a objetos (POO u OOP, en inglés), allá por el año 1994, me ocurrió lo que a muchos. Luego de casi 10 años de programar proceduralmente (en Basic, Pascal y Cobol) me encontraba con una nueva visión. Si bien creía entender los conceptos de clase, objeto, herencia y polimorfismo, no lograba ver claramente la diferencia de enfoque a la hora de diseñar un programa. No podía apreciar realmente cuáles eran las diferencias y las similitudes entre el enfoque procedural y el orientado a objetos.

A través de mi experiencia docente varias veces me vi frente a la tarea de introducir los conceptos básicos de la POO, encontrándome con la misma situación, pero desde un lugar diferente: ¿Cómo explicar el nuevo enfoque a personas acostumbradas a programar de forma procedural? ¿Cómo resaltar las similitudes y las diferencias? Fue gracias a un ejemplo del libro «C++ Annotations» que encontré una forma simple de presentar la idea básica detrás de la programación orientada a objetos.

Sigue leyendo «Programación orientada a objetos»

Microsoft y la Agencia Nacional de Seguridad de los EE.UU.

Desde el movimiento del software libre siempre se ha alertado que el software privativo, distribuido en forma de código binario cerrado, representa una grave amenaza contra la privacidad de las personas.

La reacción usual de muchos, cuando se les dice que si uno solamente recibe el código binario no puede saber a ciencia cierta qué es lo que hace el programa (y qué es lo que no hace), es de incredulidad. Generalmente se muestran excépticos ante la posibilidad de que una empresa incluya funciones ocultas en los programas cuyo código binario comercializa.

Aunque hay gran cantidad de casos demostrados de prácticas de este tipo (inclusión de Spyware, Rootkits, etc.), ninguno alcanza la magnitud que tendría, de ser cierta, la relación entre Microsoft y la Agencia Nacional de Seguridad de los EE.UU. (NSA).

Sigue leyendo «Microsoft y la Agencia Nacional de Seguridad de los EE.UU.»

Aplicaciones web con plantillas

Comencé a desarrollar aplicaciones web hace más de 6 años. Inicialmente utilicé Perl y luego también PHP, Rails, entre otros.

Al poco tiempo de escribir mi primera aplicación interesante noté algo que no me parecía apropiado. Partes de mi programa se ocupaban de obtener los datos enviados por el usuario (entrada), otras se encargaban de realizar los cómputos en función de dichos datos (proceso), en tanto que otras se encargaban de producir el código HTML que se enviaba al usuario (salida), mostrando los resultados del proceso y permitiendo la posterior interacción con el sistema (menúes, enlaces, etc.). Lo que me perturbó es que una parte demasiado significativa del programa se ocupaba de esta última función y, peor aún, no podía separarla adecuadamente del resto del sistema.

Sigue leyendo «Aplicaciones web con plantillas»

La complejidad de los algoritmos

Hace unos años presencié una discusión entre dos programadores sobre la «eficiencia de los programas«. Ellos discutían sobre la manera de especificar el problema en la herramienta CASE que utilizaban, para que el programa generado fuera más «eficiente«. La discusión era acalorada y tenían visiones muy diferentes del asunto (yo, al no conocer ni de cerca la herramienta en cuestión, no entendía ni media palabra de sus argumentos).

Hasta que en un momento no pude contenerme y decidí meter el dedo en el ventilador: A ver, una pregunta, ¿cuándo un programa es más eficiente que otro? – les dije. Para mi asombro (aunque debería haberlo intuído), ambos me respondieron al unísono: ¡Cuando es mas corto!.

Sigue leyendo «La complejidad de los algoritmos»