miércoles, 18 de julio de 2007

Linus Torvalds no usa Debian

Vía Barrapunto, leo lo siguiente en una entrevista a Linus Torvalds.

"...So the only major distribution I’ve never used has actually been Debian, exactly because that has traditionally been harder to install. Which sounds kind of strange, since Debian is also considered to be the “hard-core technical” distribution, but that’s literally exactly what I personally do not want in a distro. I’ll take the nice ones with simple installers etc, because to me, that’s the whole and only point of using a distribution in the first place."


No sería la primera vez que Torvalds hace polémicas declaraciones.

lunes, 25 de junio de 2007

Compilando el kernel de Linux

Tenía que compilar el kernel de Linux para una práctica de la facultad. Lo compilé una vez para probar y después lo compilé y le agregué soporte para la placa de red. Las siguientes instrucciones están basadas en el readme que viene con las fuentes del kernel.

1)Descargar el kernel, yo utilicé el 2.6.21.5

2) Copiar el kernel al directorio de fuentes:
sudo mv linux-2.6.21.5.tar.gz /usr/src


3) Descomprimir las fuentes del kernel:
cd /usr/src
sudo tar xzvf linux-2.6.21.5.tar.gz

4) Crear un directorio aparte para poner el código compilado(se recomienda):
mkdir /home/diego/build
mkdir /home/diego/build/kernel

5) Elegir las opciones de configuración del kernel:
make O=/home/diego/build/kernel menuconfig

6) Compilar el kernel, paciencia, este proceso lleva mucho tiempo(4 hs en mi caso):
make O=/home/diego/build/kernel

7) Instalar los módulos del kernel:
sudo make O=/home/diego/build/kernel modules_install install

8) Modificando la configuración del gestor de arranque:
sudo mkinitrd -o initrd.img-2.6.21.5 2.6.21.5
sudo gedit grub/menu.lst

Agregar lo siguiente luego de ## ## End Default Options ##:
title Ubuntu, kernel 2.6.21.5
root (hd0,1)
kernel /boot/vmlinuz-2.6.21.5 root=/dev/hda2 ro quiet splash
initrd /boot/initrd.img-2.6.21.5
savedefault
boot

title Ubuntu, kernel 2.6.21.5 (recovery mode)
root (hd0,1)
kernel /boot/vmlinuz-2.6.21.5 root=/dev/hda2 ro single
initrd /boot/initrd.img-2.6.21.5
boot


9) Reiniciar para probar el nuevo kernel. Nada más me tiró unos errores(warnings más bien), pero funciona todo bien.

Donde dice /home/diego debe reemplazarse diego por el nombre de usuario real.

Más info:

Compilando el kernel
Otro tutorial

miércoles, 20 de junio de 2007

Diseño web: conociendo otros puntos de vista

Hace unos días, mientras buscaba unas cosas de diseño web, encontré el blog de Tecnología multimedia 1, una cátedra de la carrera de Diseño Multimedial (Facultad de Bellas Artes UNLP). Después me dió curiosidad y quise ver que daban, y después de ver los temas me llamó mucho la atención que se dieran temas que yo creía que ya ni eran considerados para diseño de sitios web (en concreto se enseñaba a diseñar sitios web con frames).

Yo tengo una formación distinta, plasmada en frases como: "Está mal diseñar con tablas", "No hay que usar frames", "Hay que separar el contenido de la presentación", "HTML sólo se debe utilizar para definir la estructura semántica del documento". Siempre estuve a favor de utilizar HTML para el contenido y CSS para la presentación, cuesta un poco más de trabajo, pero los resultados se ven en: modularidad del código, fácil mantenimiento, facilidad de cambiar la presentación del sitio. Es trasladar las ideas utilizadas para resolver problemas y para desarrollar programas al ámbito del desarrollo de sitios web.

Todas las páginas que hice, las hice con un editor de texto (JEdit). De hecho nunca me gustaron el Dreamweaver ni demás aplicaciones WYSIWYG, ya que considero que el código que generan es bastante malo, y es algo casi imposible de mantener.

Otro asunto es la diferencia que parece existir entre el diseñador y el desarrollador. La impresión que siempre tuve de los diseñadores es que les importaba más el aspecto visual que la funcionalidad o el cumplimiento de estándares. Los resultados me parecían siempre los mismos: páginas con frames, páginas diseñadas con tablas, diseñadas con Flash, sitios que no pasan la validación del W3C, etc. A su vez algunos diseñadores opinaban que las páginas hechas por informáticos eran funcionales, pero totalmente antiestéticas.

Como el tema me interesaba y consideré que era un lugar adecuado para debatirlo, decidí dejar un comentario en la página y recomendar algunos links. Al otro día descubrí que lo habían publicado, y me gustó mucho la idea del contacto interdisciplinario, ya que creo que enriquece a ambas partes y permite desarrollar mejores sitios.

Los 10 comandos que más uso en Linux

Siguiendo una idea que vi en el blog de Alejo, estos son los 10 comandos que más uso en Linux.

history|awk '{print $2}'|awk 'BEGIN {FS="|"} {print $1}'|sort|uniq -c|sort -rn|head -n 10

138 sudo
70 ghc
45 cd
41 ifconfig
29 plog
25 ls
17 ./compilador
15 ps
15 man
11 kill


Sí, el ghc es el Glasgow Haskell Compiler, y lo uso para hacer el trabajo de Compiladores.

martes, 19 de junio de 2007

¿Cómo aprendo a programar en Java?

Alejo escribió:

"...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..."

Instalando Xubuntu



Luego de innumerables problemas, pude hacer funcionar la placa de red en Ubuntu. Después se me ocurrió actualizar manualmente mi distribución de Ubuntu (de Hoary a Dapper), pero hubo un error y arruiné el SO. La segunda vez que quise hacer lo mismo también hubo errores, pero por suerte pude arreglar todo desde línea de comandos, la única consecuencia es que con la versión del kernel 2.6-10 no funciona el X Window.

Mirando los 'otros' Ubuntus, me dieron ganas de instalar Xubuntu. ¿Qué es Xubuntu?. Básicamente lo mismo que Ubuntu, pero en lugar de utilizar GNOME utiliza Xfce. Quizá no sea tan lindo a nivel visual, pero es mucho más rápido, ya que Xubuntu se diseñó para computadoras mas antiguas o para usuarios con máquinas más potentes que quisieran tener un sistema más eficiente.

Si ya se tiene Ubuntu, Xubuntu es fácil de instalar, sólo se instala con el Synaptic el paquete xubuntu-desktop, o con la consola:

sudo apt-get install xubuntu-desktop

Después al iniciar sesión se puede elegir el entorno que se quiera usar.

Página oficial de Xubuntu

jueves, 24 de mayo de 2007

Cuando Funcional casi me defrauda (2º parte)

¿Por qué el título del post?
Porque hubo algunos problemas que no pude resolver con funcional de forma eficiente. Uno que me molestaba hasta hace poco era el siguiente: Dado un árbol binario no ordenado, buscar un elemento en el mismo.

En Pascal

1º versión
   1:function existe (a : arbol; codigo : integer) : boolean;
2:begin
3: if (a = nil) then
4: existe := false
5: else
6: if (a^.dato.codigo = codigo) then
7: existe := true
8: else
9: existe :=
10: existe(a^.izq, codigo) or existe(a^.der, codigo);
11:end;
12:


2º versión : "optimizada"
   1:procedure existe (a : arbol; cod : integer; 
2: var encontrado : boolean);
3:begin
4: if (a = nil) then
5: encontrado := false
6: else
7: if not encontrado then
8: if (a^.dato.codigo = codigo) then
9: encontrado := true
10: else
11: begin
12: existe(a^.izq, cod, encontrado);
13: existe(a^.der, cod, encontrado);
14: end;
15:end;


La supuesta ventaja de esta solución es que termina de recorrer el árbol, ni bien encuentra el código que buscaba.

En Haskell

1)

   1:existe :: Eq a => Arbol a -> a -> Bool
2:existe Empty valor = False
3:existe (Arbol x izq der) valor =
4: if x == valor then
5: True
6: else
7: (existe izq valor) || (existe der valor)


La "desventaja" de esta solución que incluso si encuentra el elemento en uno de los subárboles, lo sigue buscando en el otro, ya que no se tiene forma de saber si se encontró.

2) En esta solución, se transforma el árbol en una lista y se busca el elemento en la lista.

   1:aplanar :: Arbol a -> [a]
2:aplanar Empty = []
3:aplanar (Arbol x izq der) = aplanar izq ++ [x] ++ aplanar der
4:
5:existe :: Eq a => a -> Arbol a -> Bool
6:existe e = (elem e).aplanar


Esta solución termina cuando encuentra el elemento, pero si el elemento no está, recorre el árbol dos veces.

Nota: El uso de lazy evaluation en Haskell puede distorsionar los cálculos.

Nunca pude encontrar una solución mejor a esas dos para resolver ese problema. Si a alguien se le ocurro alguna con gusto la posteo.

Sin embargo mientras buscaba una solución, me di cuenta de que el problema no tenía sentido. Llegué a pensar: "Si con funcional no se puede resolver elegantemente, es que no tiene sentido resolverlo". Reflexiones aparte, me puse a pensar que era lo que se hacía con la estructura, y la respuesta es: se realizan operaciones que requieren recorrer toda la estructura en el peor caso.

Estaba tratando de buscar la solución a un problema mal planteado. No tenía sentido usar un árbol binario no ordenado, sino que había que usar la vieja lista. De hecho en el único ámbito en que los árboles binarios no ordenados son útiles es en la construcción del árbol sintáctico durante el parsing.

Además la supuesta optimización no es tal, ya que la 1º solución en Haskell, al utilizar lazy evaluation (e inclusive en Pascal con los operadores short-circuit), deja de recorrer el árbol al encontrar el elemento buscado. El único caso en que está optimización es útil, es cuando la búsqueda se realiza en paralelo en ambos subárboles, utilizando concurrencia recursiva.

Esa es una de las cosas más importantes que aprendí en Funcional: las estructuras de datos se definen en base a las operaciones que proveen. Recordando un ejemplo dado en la teoría: "Si a mí me traen expedientes, pero nunca los vienen a buscar, tranquilamente puedo prenderlos fuego"