Archive for June, 2007

Steve Ballmer: Developers

Tuesday, June 12th, 2007
Ballmer se unió a Microsoft en el año de 1980 y fue el primer administrador empresarial contratado por Bill Gates. Desde entonces, Ballmer se ha convertido en un sello distintivo de su presencia en la compañía.Durante los últimos 20 años, Ballmer ha dirigido varias divisiones en Microsoft, entre las que pueden mencionarse las de operaciones, el desarrollo de sistemas operativos y las ventas y el soporte. En julio de 1998, se le dio el cargo de presidente, un puesto que le otorgaba la responsabilidad diaria de dirigir la compañía. Fue nombrado CEO en enero del 2000, puesto en el que asumió responsabilidad completa de la administración de la compañía.

Version original del video que ICeman puso en su blog:

¿Cómo aprendo a programar en Java?

Tuesday, June 12th, 2007

Trabajo programando en Java, y me gustaría resumir en pocas palabras toda la cultura popular detrás de esa simple pregunta. Hoy en día el que quiera aprender programación por su cuenta esta realizando una de estas dos cosas:

  1. Suicidio
  2. La mejor elección de su vida

Como te podrás imaginar, la opción 1 es clara dada variedad de respuestas totalmente opuestas y dispares que te pueden llegar a dar si le disparás a alguien esa simple pregunta*.

Al menos como yo lo veo, en ese aspecto no hay grises. Al día de la fecha hay demasiados lenguajes de programación, demasiadas tendencias y demasiados puntos de vista diferentes para poder encarar por uno mismo esa titánica tarea de aprender a programar de forma autodidacta.

Al mismo tiempo, eso es algo bueno ya que tenés infinidad de herramientas y materiales de los cuales uno puede ejercitarse.

Antes de dar una respuesta a esa pregunta, hay que tener algo en claro: aprender a programar es algo que lleva tiempo, dedicación y esfuerzo. Alguien dijo que es un arte, pero también hace falta disciplina. Y como cualquier disciplina, hay que dedicarse a aprender las cosas que realmente importan, en tiempo y forma.

Al menos si uno pretende hacerlo bien.

Dejando muchos detalles de lado, todos los lenguajes de programación son básicamente iguales. Las diferencias entre Ruby, Python y Java (e incluso con C++) no se comparan en relación a las cosas que tienen de parecidos.

¿Qué cosas realmente importan en la programación? No voy a dar un curso de programación, sino simplemente enumerar lo que yo creo que vale la pena aprender. Para todo lo demás, Google y la Wikipedia están para ayudarte. Algunas personas dicen que Yahoo es también una buena opción.

Y en el caso que uno se termine apasionando por la programación, siempre está la opción de seguir alguna carrera universitaria del tema. Ciencias de la Computación en una linda opción, al igual que cualquier otra equivalente (en mi caso, Licenciatura en Informática).

Lo más importante es aprender a pensar apropiadamente. Esto es algo duro de aceptar para algunas personas, pero la realidad es que uno se tiene que adaptar a ver el mundo de la programación de forma diferente. Hace algunos años estuve de profesor ayudante, explicándole a los alumnos de primer año de mi universidad cómo resolver ejercicios de programación, y ese era el mayor inconveniente de todos.

Muchos decían “yo tengo mi propia manera de programar”. He visto a varias personas quedarse estancadas en la carrera (y cometer crímenes en contra de la programación) por pensar de esa forma.

Los otros dos mayores inconvenientes que tenían era poder diferenciar un algoritmo de una estructura de datos, cuando algo era cada cosa, y cuando usarlas y cuándo no. En programación esa distinción es muy importante, pero no muchos le dan importancia.

Un algoritmo es la “receta” de cualquier programa, y la estructura de datos son los ingredientes de esa receta.

En el caso de un programa, un algoritmo son las operaciones que se realizan (asignar variables, operaciones matematicas, tomar desiciones con un if, hacer un while, etc), y las estructuras de datos es el lugar usado para guardar la información (variables, clases, registros, arrays, etc).

Un algoritmo muy simple es el de contar la cantidad de caracteres que se leen desde teclado, hasta llegar a un punto. En este caso, no hay muchas estructuras de datos sino simplemente las variables que se usan para leer los caracteres. Otro muy parecido es contar la cantidad de letras “x” que hay dentro de un String. En Java eso es muy sencillo:

static int contar_equis(String s)
{
int cantidad = 0, indice;

for (indice = 0; indice < s.length(); indice++)
if (s[indice] == ‘x’)
cantidad++;

return cantidad;
}

Un algoritmo más elaborado es el de ordenar números dentro de un vector. Hay diferentes métodos o técnicas, como la de inserción, selección, burbuja con o sin centinela, quick-sort, sorting by merge, etc.

En el cuarto y quinto puesto del ranking de dificultad de cualquier tarea de programación están los temas de punteros y recursión. En los exámenes de primer año de mi facultad esos dos temas eran los que marcaban si alguien aprobaba la materia o no.

Ésto era así no por un capricho de los docentes de la materia, sino porque históricamente fueron las dos herramientas más potentes a la hora de resolver un problema en un programa.

Los lenguajes de programación como Java existen para hacerle al programador la tarea más fácil, ocultando lo que hay debajo: un procesador con registros conectado a una memoria principal por medio de un bus, y muchas otras cosas que no viene al caso mencionar (por temas de espacio, son tantas que no terminaría nunca de nombrar) pero que responden a lo que Von Neumann alguna vez dijo.

Los punteros, a su vez, existen para recordarle al programador que el lenguaje de programación le está ocultando todo eso de ahí abajo; que hay algo llamado procesador y que nada funciona por arte de magia.

Los punteros te recuerdan que hay algo llamado caché, que hay diferentes modos de direcionamiento de los datos (cada uno con sus ventajas y desventajas), y que ciclo tras ciclo el contador de programa se incrementa y la ALU (UAL en castellano) por medio de la CU (UC en castellano) ejecuta cada una de las instrucciones en código máquina.

De esa forma siempre existió alguna clase de equilibrio entre lo que es la “realidad” y lo que es la facilidad de hacer un programa.

La recursión es lo que le permite a un programador, por medio de un programa, dividir un problema grande y difícil en algo mas sencillo y simple de manejar. Uno puede tener una base de datos con información de toda las personas de un país, y la recursión nos ayuda de alguna manera a encontrar la información de una sola persona dentro de todo ese gran volumen.

Eso, hasta que llegó Java. En este lenguaje no existen los punteros, y la recursión es algo que rara vez se usa ya que el 99% de los casos en los que uno debería usarla se termina eligiendo algo que el lenguaje Java o la JDK te provee.

Querer aprender Java no es lo mismo que querer aprender a programar. Mucha gente aprende Java solo para poder trabajar de eso y ganarse algún dinero, pero solo los que quieren aprender a programar pueden lograr algo interesante. De la misma forma que hoy en día Java es uno de los lenguajes de programación más populares, 25 años atrás lo era COBOL.

No tengo nada en contra de ese lenguaje. El problema es que los que se durmieron en los laureles y solo se quedaron con COBOL, a la larga perdieron su trabajo y se quedaron en el tiempo. El error de ellos no fue querer aprender COBOL: en algún momento hay que leer el manual de COBOL, aprender a usarlo y escribir código en ese lenguaje. El error fue no aprender lo que realmente importa: a pensar, y los algoritmos y estructuras de datos adecuados.

Dentro de 20 años, los que se quedaron con un simple curso de Java van a quedarse sin trabajo y todo lo que aprendieron no les va a servir para nada útil.

Lo mismo ocurrió hace 5 años con Visual Basic 6.0. Cualquiera que haya hecho un curso de ese lenguaje y haya pagado, lo estafaron. Microsoft, por una cuestión puramente monetaria, decidió no continuar con el soporte para los usuarios de ese lenguaje. Desde ese momento, todos los programadores de VB 6.0 tuvieron que aprender .Net o dedicarse a otra profesión.

Por último, la programación orientada a objetos no es más que esas tres cosas metidas dentro de una sola cosa (llamada objeto ^^), pero visto desde otro punto de vista, bastante más abstracto.

¿Querés aprender Java? La pagina de Sun es excelente:

http://java.sun.com/docs/books/tutorial/

¿Querés aprender a programar? tenés que aprender:

  1. A pensar
  2. Identificar los algoritmos y estructuras de datos, y ser capaz de elegir apropiadamente cuando usarlos
  3. Punteros
  4. Recursión

* De hecho es muy probable que estés por tomar la opcion 1 luego de terminar de leer esto.

El comando del dia: du

Monday, June 11th, 2007

du es un comando que te calcula el espacio en disco utilizado por los archivos/directorios indicados por parametro:

$ du -shx /*
3.6M /bin
34M /boot
0 /cdrom
112K /dev
37M /etc
5.2G /home
4.0K /initrd
0 /initrd.img
0 /initrd.img.old
163M /lib
48K /lost+found
52K /media
32K /mnt
390M /opt
898M /proc
4.5M /root
3.7M /sbin
4.0K /srv
0 /sys
100K /tmp
5.0G /usr
2.0G /var

El argumento -shx indica:

-s Muestra un sumario de los archivos, sin mostrar los directorios en forma recursiva.

-h Muestra los valores en un formato que los humanos puedan leerlo

-x se mantiene dentro de un mismo filesystem. De esta forma, si tenemos varios discos, algun CD-ROM montado o alguna unidad de red, los archivos dentro de esos otros filesystem no los tiene en cuenta.

En mi caso, /boot lo tengo en una partición aparte pero me lo muestra igual ya que se lo estoy indicando como parámetro al llamar al comando:

$ echo /*
/bin /boot /cdrom /dev /etc /home /initrd /initrd.img /initrd.img.old /lib /lost+found /media /mnt /opt /proc /root /sbin /srv /sys /tmp /usr /var

Como siempre, para más información pueden hacer:

man du

LAM MPI en Debian Etch

Monday, June 11th, 2007

Dado el siguiente código:

#include <stdio.h>
#include “mpi.h”
int main(int argc, char **argv)
{
int taskid, numtasks;


MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &taskid);
MPI_Comm_size(MPI_COMM_WORLD, &numtasks);

printf("Soy %d y hay %d tareas en total\n", taskid, numtasks);

MPI_Finalize();
return 0;
}

Cómo compilar programas y ejecutarlos con LAM MPI en Debian Etch:

1. Instalar paquetes LAM:

apt-get install lam4c2 lam4-dev lam-runtime

2. Iniciar el servicio lamd. Esto hay que hacerlo una sola vez, cada vez que se reinicia la PC:

lamboot

3. Compilar el programa:

hcc -Wall -o programa programa.c

4. Ejecutar el programa en 4 nodos:

# mpirun.lam -np 4 programa -- "parametros"
Soy 0 y hay 4 tareas en total
Soy 1 y hay 4 tareas en total
Soy 2 y hay 4 tareas en total
Soy 3 y hay 4 tareas en total

El cocinero que instaló Debian

Tuesday, June 5th, 2007

http://casidiablo.blogspot.com/…/el-cocinero-…html

Tuve mucha suerte a elegir Debian como mi distribución de GNU/Linux. Ahora me doy cuenta que no sólo es el sistema operativo más robusto y estable que jamás he tenido sino el más libre, manejable y fácil de usar, aunque llegar a este punto me ha costado cierto trabajo y esfuerzo. Pero recuerdo a Don Quijote cuando dijo: “La libertad, Sancho, es uno de los más preciosos dones que a los hombres dieron los cielos; con ella no pueden igualarse los tesoros que encierra la tierra ni el mar encubre; por la libertad, así como por la honra, se puede y debe aventurar la vida, y, por el contrario, el cautiverio es el mayor mal que puede venir a los hombres”. Así que el esfuerzo que he invertido es un costo mínimo para conseguir ser libre.

Evento: InfoSecurity

Tuesday, June 5th, 2007

http://www.infosecurityonline.org/…/agenda2007.htm

“Buenos Aires 2007″
7 de Junio - Sheraton Hotel
Salón Libertandor - San Martín 1225 - Buenos Aires - Argentina

8 de Junio - Palacio San Miguel - Oficinas I-SEC
Bartolomé Mitre 948 - Buenos Aires - Argentina

“El Evento Símbolo de Seguridad de la Información”

El Valor de la Información nos obliga a tomar decisiones para su resguardo…

InfoSecurity… el ámbito ideal para adquirir conocimientos y evadir los peligros que ponen en jaque a las organizaciones…

Conferencias académicas sobre Seguridad de la Información
Reúne a las empresas más prestigiosas de Latinoamérica
Actualización técnica, profesional y tecnológica permanente para estar en la vanguardia de las decisiones empresariales.
Workshops de trabajo

Perfil de los asistentes:

Directores Generales de empresas Nacionales e Internacionales.
Directores de Áreas de Sistemas, Seguridad y RRHH.
Directores de Consultoras y Estudios.
Gerentes de diversas Áreas funcionales y operativas.
Jefes y Responsables de áreas.
Auditores / Consultores
Representantes de Entes Gubernamentales.
Consultores independientes.
Ingenieros en Sistemas.
Programadores.

Tech Talk: Linus Torvalds on GIT

Sunday, June 3rd, 2007

Via Barrapunto:

Compilando el Kernel

Saturday, June 2nd, 2007

En Debian y Ubuntu existe el comando:

apt-get build-dep «paquete»

el cual te baja e instala automáticamente cualquier dependencia necesaria para poder compilar ese paquete. De esa forma, no debería aparecer ningún error de alguna librería faltante al compilar el paquete.

En el caso del kernel, hay otra forma. Si se está usando Debian o Ubuntu y uno quiere compilar el Kernel, hay que instalar (al día de la fecha) los paquetes:

  • linux-source-2.6.20 en Ubuntu
  • linux-source-2.6.18 en Debian

Existe una interfaz web con una base de datos de todos los paquetes disponibles en ambas distribuciones:

Debian:
http://packages.debian.org/stable/devel/linux-source-2.6.18

Ubuntu:
http://packages.ubuntu.com/feisty/devel/linux-source-2.6.20

Por otro lado (siguiendo con Debian y Ubuntu), en el directorio /boot están los archivos config-*, los cuales son los archivos de configuración utilizados para compilar el kernel que se te instala automáticamente con la distrubución:

# ls /boot/config-*
/boot/config-2.6.15-1-amd64-k8
/boot/config-2.6.17-2-amd64
/boot/config-2.6.18-3-k7
/boot/config-2.6.18-4-k7
/boot/config-2.6.8-2-386

Estos archivos no es obligatorio que estén acá si uno está compilando su propio kernel, pero si es recomendable hacerlo ya que siempre tenés a mano la configuracion usada para compilar ese kernel. (sino, podrías perderlo en el caso de que tengas que borrar /usr/src/* por cuestiones de espacio libre en disco).

Una forma muy práctica y fácil de poder recompilar uno mismo el Kernel y estar lo más seguro posible de que va a funcionar es: copiarse el archivo de configuracion del kernel que ya tenemos funcionando, y usarlo para recompilar el nuestro propio:

# Ubuntu
apt-get install linux-source libncurses5-dev build-essential

# Debian
apt-get install kernel-package linux-source-2.6.18 fakeroot libncurses5-dev build-essential

# Común a ambas
cd /usr/src/linux

# el archivo de configuracion se guarda en:
# /usr/src/linux/.config

cp /boot/config-`uname -r` .config

Llegado a este punto podemos hacer todas las modificaciones que queramos al código fuente, como aplicarle parches o instalar drivers adicionales. Para compilar el kernel y generar la imagen correspondiente hay dos formas: la forma normal o la forma Debian.

Para compilar el kernel usando la forma normal hay que hacer una metralla de comandos make’s dentro de la raíz del código fuente del Kernel (/usr/src/linux):

make menuconfig
make dep
make bzimage
make modules
make modules_install

Ahora: a esperar. Por lo general el Kernel que te viene con Debian o Ubuntu trae todo lo que puede llegar a traer para que le funcione a la mayor cantidad de personas posibles. Eso significa que puede tardar mucho tiempo en compilar.

Una vez compilado el Kernel se puede copiar la imagen a mano (arch/*/bzimage) dentro del directorio /boot. El último make es responsable de copiar los modulos al directorio correspondiente (/lib/modules/), por lo que no hay que hacer nada más al respecto.

Para compilar el kernel usando la forma Debian (ya sea si estás usando Debian o Ubuntu), hay que hacer también dentro de la raíz del código fuente del Kernel (/usr/src/linux) lo siguiente:

make-kpkg –rootcmd fakeroot kernel_image

La forma Debian es obviamente mucho más fácil y, además, nos genera un paquete .deb dentro de /usr/src listo para instalar o distribuirlo a otras PC’s:

cd /usr/src
dpkg -i \
linux-image-2.6.24_2.6.24-10.00.Custom_i386.deb

Saludos :)

Patentes de Software

Friday, June 1st, 2007

¡Así es! Llegó la hora de los golpes hacia Microsoft.

Desde el blog de Lilo78 me entero que, por varios flancos, el lío de las patentes podría quedar en /dev/null. Gracias a que Ballmer no sabe cerrar la boca, es muy probable que ahora no puedan litigar nunca más.

Además, dentro de poco tiempo estará por salir la GPL v3. En ella hay una cláusula que dice que las patentes de un software con esa nueva licencia serán automaticamente extendidas a los receptores del programa en cuestión. Y Novell incluirá ésta nueva versión de la licencia en su distrubución SUSE.

Freetype, SDL & Unicode

Friday, June 1st, 2007

Siguiendo con Unicode, les dejo el código de un pequeño programa de prueba que hice para usar Freetype 2 con SDL para hacer rendering de texto Unicode, y (¿por ahora?) funciona solo en Linux. Si alguien pudo probarlo en otra plataforma por favor deje un comentario.

Bajar Código

freetype-sdl-unicode-test