Archive for the ‘Articulos’ Category

Conociendo personas por Internet

Saturday, August 18th, 2007

Cuando en enero me fuí de vacaciones, pasé una noche por Villa Gessel y no pude dejar de ir al boliche Pueblo Límite. No lo conocía, y me llamó mucho la atencion lo grande que era. Ok, no tanto. Si bien era bastante grande y nunca antes había estado en un lugar así, no era TAN impresionante.

Ok. En realidad… no pude dejar de ir porque tenía la intención de encontrarme con alguien. No estaba seguro de que esa persona realmente esté ahí ya que no habíamos podido concretar nada. Según me dijo esa persona, estaba de vacaciones en esa ciudad y era muy probable que ella se aparezca por allí.

Así que fui. Me dije a mi mismo: tengo fe de que nos vamos a encontrar.

No nos encontramos.

Claro, de eso me dí cuenta a las cinco de la mañana, cuando ya estaba asomándose el sol por sobre el horizonte. Hasta entonces, hubo que esperar.

Bailar es algo que nunca me llamó mucho la atención, ni es algo que haga muy bien. Si, entiendo que justamente para bailar bien no hay que bailar bien porque en ese caso estarías bailando mal. Y eso es algo que me confunde bastante.

Claro, porque si sabés bailar bien y bailás, no tiene ningún mérito el hecho de, en ese momento, bailar. El único mérito es lo que hiciste en el pasado: aprender a bailar (o haber nacido con algun gen de danza), y no lo que estás haciendo ahora que es simplemente repetir inconscientemente lo que ya sabés. Así que no bailo nada.

Ok, casi nada. Las pistas de música electrónica me llaman bastante la atención. Esas si me interesan. Es como el pac-man pero sin pastillas. (yo, al menos): Waca, Waca, Waca durante un rato puede llegar a ser muy divertido!

En especial, el ambiente tiene que ser el adecuado. No alcanza con poner un CD de música de DERO y apretar en Play, hace falta crear una atmósfera (como dije, sin pastillas) que te transmita un sentimiento de poder vivir la música. O como sea.

El hecho es que había un bar. Uno grande, con muchas mesas, una larga barra y un pequeño escenario con alguien tocando canciones de la década del ochenta, pero cuando yo llegué ya estaba terminando.

Me senté en la barra, y había una pareja que era la que atendía a los que necesitaban ahogar sus penas. Resultaron ser oriundos de un pueblo del que no me acuerdo el nombre. Trabajaban en ese bar juntando dinero para algo que no recuerdo, y querían hacer un viaje a una provincia que no recuerdo para poder abrir un negocio de algo que tampoco no recuerdo. En fin, yo estaba ahogando penas.

Pero no era el único. Había alguien que no solo estaba ahogando sus penas, sinó que tocó el fondo de la fosa de las marianas. En ese estado, dicen que uno puede llegar a tener una visión medianamente distorsionada de la realidad. Y cerca suyo había una persona que de lejos no se podía ditinguir si era XX o XY. En ese estado, al menos. Yo si, obvio, ¡y me mantuve siempre alejado!

Desde lejos, le dije a la chica de la barra: “está tan borracho que no se dio cuenta”. Después de eso, ellos dos se fueron de bar, juntos.

Cuando salió el sol me fuí del lugar. Me tomé el micro para volver pero me quedé dormido. Un largo rato más tarde me desperté en General Madariaga. Estaba totalmente perdido, y tuve que tomarme otro colectivo para llegar a mi destino.

CUPS: Cuatro comandos REALMENTE útiles

Tuesday, August 14th, 2007

Con tres PCs en casa pero una sola impresora, imprimir puede llegar a ser todo un problema. En especial porque para que se pueda imprimir, y en el momento en el que uno desea hacerlo, la impresora debe estar enchufada a una computadora, y ésta computadora a su vez debe estar prendida (malditos ingenieros, es por eso que yo no me dedico a la electrónica sino a la informática).

Bajo ese panorama, decidí poner la impresora en una PC con Linux, y usar el maravilloso y fantabuloso CUPS, que si bien puede llegar a ser un dolor de huevos hacerlo funcionar, una vez que sale funcionando te olvidás del asunto por siempre.

… o hasta que reinstalás el sistema operativo[*], no reconfigurás CUPS porque hace meses que no tenés hojas para imprimir y tu madre a la medianoche con una resma nueva en mano te dice que para la mañana del día siguiente necesita con urgencia imprimir algo.

Si, esa misma madre que un mes atrás no sabia diferenciar un teclado de un monitor, hoy está usando el AbiWord de taquito.

Si, mi madre usa Debian Etch pero todavia no lo sabe. Algún dia se lo confesaré. Jejejeje.

Es así que entre ayer y hoy tuve que luchar y seguir luchando con CUPS. Por suerte ya todo está funcionando, y me puedo olvidar hasta la proxima formateada.

Aún asi, les comento que econtré cuatro comandos REALMENTE útiles para CUPS. Asumiendo que su impresora la configuraron bajo el nombre Epson640, éstos son:

  1. cancel -a Epson640
    • borra todos los trabajos pendientes en la impresora. No questions asked.
  2. accept Epson640
    • acepta todos los trabajos pendientes en la impresora. No questions asked.
  3. cupsdisable Epson640
    • desactiva la impresora para que nadie pueda imprimir. No questions asked.
  4. cupsenable Epson640
    • reactiva la impresora para que puedan seguir imprimiendo normalmente. No questions asked.

Tengan en cuenta que en cada máquina de la red hay una cola de impresión, y no una sola en el “server” donde está enchufada fisicamente. Es así que, por ejemplo, si la PC que tiene la impresora está apagada, las PCs clientes van a tener su propia cola de trabajos. O sea que capaz tengan que ejecutar algunos de estos comandos en los clientes.

[*] Nunca jamás usen Debian Unstable, a menos que tengan chorreras de tiempo libre para arreglar los problemas de dependencia de los paquetes.

Día de la alpargata

Friday, July 20th, 2007

¡Así es! Hoy, 20 de Julio y al igual que año tras año, en esta región del planeta se celebra el día de la alpargata.

¿Que sería de nosotros sin esa compañera, o ese compañero?

Si. La alpargata, o el alpargata. Yo le digo lo primero ya que, si bien no es lo mismo, en realidad no importa si es masculino o femenino; eso es lo de menos, y más aún en este día. Para las alpargatas no hay género.

No importa si hay sol, si está nublado o llueve. Siempre que las necesitemos estarán para acompañarnos.

No importa el color, no importa el talle, la marca ni de dónde vienen. Uno debe poder apreciar la esencia de ellas, y saber que las apariencias siempre nos engañan. Colores claros, oscuros, lisos, con rayitas, o incluso sucias. Las alpargatas fueron, son y serán siempre alpargatas.

Adentro de ellas podremos encontrar algo que creímos perdido, o algo que no nos esperábamos.

Muchas veces nos sorprenden; si creímos que ya no eran para nosotros pero les damos otra oportunidad descubriremos, una vez más, que estaremos muy equivocados. Cada alpargata es única, y no puede ser reemplazada.

Y en esos días grises que deberemos separarnos de ellas, siempre las recordaremos por sus detalles que, a su vez, las hicieron especiales. La mancha de lavandina, el agujero del puntín o el acordeón de atrás.

Año tras año, siempre pienso lo mismo: el día de la alpargata no es diferente al resto de los días. Todos el año es el día de la alpargata, y hoy es solo un día más entre todos esos días.

Feliz dia para todas las alpargatas.

¿Faltan programadores?

Monday, July 16th, 2007

Ante todo, les prometo que éste post va a ser cortito.

Leyendo barrapunto pude encontrarme con una pregunta muy simple: ¿faltan programadores?

Según tengo entendido, hay una escacez en el mundo entero. Lo que si es cierto es que existe un grupo de gente que nunca va a sobrar: profesionales talentosos que hagan bien su trabajo, que realmente lo disfruten y por sobre todo, que les guste.

Lamentablemente, hace falta otra cosa: un lugar que sea atractivo para esa clase de gente. Que haya una cultura dentro de esa empresa que motive a las personas a dar lo mejor de sí.

El problema empieza cuando el jefe festeja que lo promueven a manager, y se pone feliz por dejar de programar. El día que eso ocurre es el dia en el que uno deberia empezar a buscar otro trabajo.

Así que ya saben: si alguien me quiere contratar, les pido por favor y a cambio que mi jefe directo sea también programador y se dedique a diario a escribir código (o que se llame Scott Berkun).

Más links:

OLPC con Debian en la UNLP

Friday, July 13th, 2007

DSCN6102

DSCN6108b

El martes pasado con motivo de las Ch.P.P.S.O. a cargo de Joaquín Bogado, tuve la oportunidad de poder estar en contacto con una OLPC.

Para los que no saben qué es eso, la OLPC es una computadora portátil de bajo costo desarrollada por el MIT y cuyo propósito es el de que cada niño del mundo (de entre 7 y 10 años) pueda tener acceso a una computadora portátil. De ahí su nombre; OLPC significa “One Laptop Per Child”, lo cual se traduce a “Una Portátil para cada Niño”.

La intención de la gente del MIT era que los gobiernos de varios países la compren en grandes cantidades, cercanas a decenas de millones de unidades. De esta forma, el precio del aparato se mantenía cercano a los 100 dólares estadounidenses. Lamentablemente esto no fué asi y la máquina hoy en día tiene un precio aproximado de 175 dólares.

En especial, se esperaba que China e India se sumen a la iniciativa, pero hasta ahora parecería que no les agrada mucho la idea de la OLPC.

La charla no fue muy profunda, ya que basicamente es una computadora de bajo costo y bajo consumo. Lo más llamativo de la máquina es la pantalla LCD que tiene una altísima resolucion de 1200×900 y una definición (cantidad de pixeles por cm2) mucho mayor que cualquier monitor estándar de PC.

Además, existe la opción de apagarle la luz a la pantalla LCD y reducir fuertemente el consumo de la batería. Bajo este modo, si hay poca luz no se puede ver nada (muy similar a la pantalla de un teléfono celular con el teclado bloqueado) y hace falta una fuerte luz solar para que sea legible (tal como ocurre en el medio del Africa).

Con un procesador de 333Mhz consumiendo solamente 0.8 Watts y todos los componentes completamente integrados, el consumo de energía es mínimo. La duración de la batería varía según el uso, pero la idea es que funcione durante varias horas sin necesidad de recarga. Según Joaquín, se espera que dure al menos 6 horas.

También dispone de los periféricos básicos de cualquier computadora: teclado, ratón, parlantes, micrófono, webcam y conectores USB 2.0 para poder enchufarle cualquier gadget, como por ejemplo pendrives.

El software instalado es una versión modificada de GNU/Linux Fedora 6, con sus propios drivers controladores de video y su propio entorno gráfico llamado Sugar. No, no usa KDE, ni GNOME, ni Xfce, ni WMaker, ni cualquiera de los otros tantos entornos libres que existen bajo Linux. La gente del MIT desarrolló su propio entorno pensando en que los usuarios serán niños de 7 a 10 años.

Lamentablemente, este entorno es demasiado simple y las aplicaciones que corren sobre él, a diferencias de los clásicos entornos de Linux, deben ser diseñadas para correr específicamente sobre Sugar. Eso significa que, en principio, no sería posible correr cualquiera de las miles de aplicaciones disponibles para GNU/Linux, aún usando Fedora 6.

Ni siquiera Firefox :(

En realidad existe una version modificada del Firefox para Sugar (obviamente bajo otro nombre ;), pero existe el problema de las actualizaciones del software. ¿Qué ocurre si salen mejoras de seguridad en las versiones originales de los programas?

Es por esto que la gente de la UNLP decidió emprender la tarea de instalar una versión de Debian GNU/Linux en un pendrive USB y bootear desde ahí. Por ahora todas las pruebas que se hicieron son de concepto, y no existe ningún plan concreto para desarrollar una distribución de GNU/Linux alternativa para la OLPC. Al menos desde dentro de la UNLP.

El aparato por ahora es una versión prototipo, el cual dispone de una memoria interna de 512 MB con un sistema de archivos comprimidos, pero hasta la fecha nadie se animó a borrarlo e instalar una distribución de GNU/Linux más estable. La idea es que la versión definitiva tenga una memoria interna flash de 4GB, que usando el sistema de archivos comprimido puede ser aprovechado eficientemente.

(no, no se duplica el espacio disponible por usar compresión de datos).

Si quieren ver más fotos pueden verlas en mi Flickr.

Asa Dotzler, Firefox, Debian

Thursday, July 5th, 2007

Tal como se anunció en CaFeLug y TechTear, el lunes y martes pasado Asa Dotzler llegó a la Argentina a dar unas charlas sobre el proyecto Mozilla, y en especial sobre Firefox. El evento fué en la UADE el día lunes, y en el Teatro de la Comedia el día Martes.

Resumiendo ampliamente, la charla en sí estuvo muy interesante. En especial porque no se ven muchos de estos eventos por este lado del planeta, y es bueno saber que hay alguien que se toma la molestia de venir a visitarnos.

Aún cuando los asistentes fueron menos de 150 y todavía quedaban butacas libres en el auditorio, nos visitó alguien como Asa, quien es uno de los encargados de coordinar la difusión del proyecto en el mundo, y quien está al tanto de todo lo que ocurre en él.

O sea, su cargo es gerencial, de liderazgo y de evangelización. Si entran en la sección Staff de Mozilla.org podrán ver que aparece en el tercer lugar de la lista.

La charla fué en inglés, y la pronunciación de él fué impecable. Si bien no hubo mucho contenido técnico, pudo verse que Asa está al tanto de los mayores problemas técnicos del momento. Por ejemplo, algo anecdótico de comentar es que al finalizar la charla del día lunes, nos quedamos en el pasillo de la UADE hablando con él y alguien más le mencionó el mayor problema que se enfrenta AJAX: el botón de atrás del browser.

Asa no se hizo esperar, y al instante dijo que actualmente la solución es modificar el hash de la URL. Sencillamente brillante. Ojalá muchos de las personas que ocupan cargos gerenciales en empresas de desarrollo de software estén tan vinculadas con los problemas del mundo real que un programador enfrenta.

Un detalle: Asa no es un programador (no le gusta y no le interesa serlo), sino que fué un estudiante de Arquitectura (si, esos que hacen casitas).

Cuando Asa terminó de dar la charla fué el momento de las preguntas. Por lo que lei en otros blogs, a diferencia del lunes, el día martes hubo menor cantidad de preguntas.

¡El lunes tuvieron que echarnos a patadas del auditorio porque los encargados se tenían que ir! En un momento la gente de traducción simultánea (Inglés-Español) de la UADE se tuvo que ir, y solo los intrépidos que podían hablar inglés siguieron insistiendo. Hubo muchas preguntas, y Asa siempre estuvo a la altura de poder responder cada una de ellas.

Incluso la que hice yo.

“¿Hay algún plan para poder incluir Firefox dentro de Debian?”

Voy a ser lo más claro posible: uno de los motivos para viajar 100 kilómetros a una charla de Firefox fue para poder hacer esa pregunta. No me interesa viajar 2 horas y quedarme sentado otras 3 escuchando a alguien diciendome lo maravilloso que es Firefox. Ya lo sé, lo uso todos los días desde la version 1.0. Logré que lo use mi padre, y logré que en en lugar donde trabajo usen Thunderbird en vez de Outlook.

Risas de por medio y luego de un momento bastante incómodo, la respuesta de Asa fué de esperarse. Basicamente dijo que no.

Para los que no están al tanto de la situación Firefox - Debian, le comento un poco como son las cosas.

Debian es una distribución de GNU/Linux que hace un FUERTE hincapié en el Software Libre. La gente de Debian es tan insistente en ese tema, que tienen su propia definición de libertad la cual llaman Contrato Social. Cualquier cosa que no cumpla con alguna de esas reglas no se lo considera “libre”.

Firefox es un navegador Web de código libre y gratuito. Cualquiera puede instlarlo sin tener que pagarle nada a nadie, y cualquiera puede modificar y redistribuir su código fuente. Como todos sabemos, el código fuente es la receta de cualquier programa, y es lo más importante de cualquier programa de software.

Al menos en principio.

Como todos sabemos, vivimos en un mundo donde hay gente que tiene su propia agenda, sus propios intereses y su propia visión del mundo. Es por eso que existen agrupaciones como GNU, la Free Software Foundation y la Open Source Initiative , que se encargan de manejar las cuestiones legales de varios proyectos de software bajo una licencia de código libre, y definir ciertos límites de uso.

El código fuente de Firefox responde a la perfección al Contrato Social de Debian. El problema es que las imágenes no, incluyendo el logo del zorro naranja. Solamente Mozilla (o cualquiera que ellos designen), puede distribuir al navegador Firefox con esas imágenes.

Específicamente, las primer y tercer cláusulas del Contrato Social de Debian dicen:

1. Libre redistribución

La licencia de un componente de Debian no puede restringir a un tercero el vender o entregar el programa como parte de una distribución mayor que contiene programas de diferentes fuentes. La licencia no debe solicitar «royalties» u otras comisiones para su venta.

3. Trabajos derivados

La licencia debe permitir modificaciones y trabajos derivados y debe permitir que estos se distribuyan bajo los mismos términos que la licencia del programa original.

Eso significa que Debian acepta a usar las imagenes solo si los usuarios de Debian tienen los mismos derechos a usarlas que Debian mismo. Mozilla no tiene problema en darle permiso a Debian, pero en lo que sí tienen problemas es con darle permiso a todos los usuarios de esta distribución de GNU/Linux.

Y dado que el nombre “Firefox” es una marca registrada de Mozilla, siendo ellos los responsables legales del producto, pidieron que usen las imágenes, o no le llamen Firefox al Firefox ya que ellos consideran que todo el paquete es una gran transacción atómica: Se llama Firefox al código fuente que sale directamente desde Mozilla y a las imágenes. Todo o nada.

La solución fue cambiarle el nombre: en Debian, se llama Iceweasel (es el que estoy usando para escribir este post en mi blog).

Lo que no quieren es que cualquier persona pueda modificar el programa y distribuirlo bajo el nombre Firefox. Si hay algo diferente a como Mozilla lo distribuye, no puede llevar ese nombre.

Lo cual nos lleva a la respuesta que me dió Asa: en ese caso, cualquiera podría distribuir una versión modificada del Firefox con modificaciones potencialmente dañinas al usuario que lo use. Mozilla no se puede hacer responsable por lo que otros hagan con su software, lo cual a mi me parece bien.

Aún así, es una lástima que existan esta clase de conflictos entre dos proyectos Open Source, ya que éstos dependen mutuamente, uno del otro. No deberían estar enfrentados sino ayúdandose entre si. Lamentablemente, la realidad es diferente.

Para terminar, yo estoy muy feliz: gracias a la pregunta que le hice a Asa, ¡me dieron una remera de Firefox! Otro día le saco una foto y se las muestro (no la busquen en el Mozilla Store porque no la van a encontrar ;).

Saludos.

Breve historia del firewall de Windows XP

Sunday, July 1st, 2007

El viernes último en la clase de Sistemas Operativos de mi facultad, Lía habló sobre varias características de seguridad de Windows, y entre ellas nombró al proceso LSASS. Este proceso de modo usuario es el Sheriff de seguridad del sistema operativo, y se encarga de regular la seguridad del sistema verificando que los usuarios que ingresan a él tengan los permisos necesarios.

Es de esperarse que un proceso tan vital e importante no tenga fallos. Lamentablemente, no siempre fué asi.

Años atrás, allá en el 2004, apareció un virus gusano llamado Sasser que aprovechaba una vulnerabilidad de seguridad del LSASS del tipo buffer overflow. El virus entraba en una PC con Windows 2000 o XP conectándose a un puerto de red en el que el Sheriff escuchaba. Hacía un overflow de algún buffer, y se metía.

El virus infectaba a la PC en forma pasiva. Nadie podía culpar a su hermanito menor de infectar la PC con bichitos por entrar a la página web de Disney, porque el virus mismo se distribuía e infectaba automáticamente cualquier Windows conectado a Internet.

En esa época, era muy cómico chatear con alguien que acababa de formatear la PC y que te digan: “che, acabo de formatear y se me reinicia la PC!! qué hago??!

Si, el mismo proceso encargado de regular la seguridad del sistema tenia un fallo de seguridad que hacía que la máquina no solo se te infecte con un virus, sino que se te reinicie. Aparecía un cartel diciendo que guardes todo porque en 30 segundos la máquina se iba a reiniciar. 29… 28…

¿Qué ganaba el virus reiniciando la PC? ¿Motivar al usuario a elegir otra opción en el GRUB? No. No ganaba nada. Irónicamente, el virus mismo tenía un fallo de programación que hacía que el proceso de LSASS muera. Cuando el Sheriff muere, el pueblo entero está de luto. En este caso, cuando LSASS moría, Windows se reiniciaba.

Actualizaciones de seguridad de por medio, Microsoft lanzó junto con el Service Pack 2 (”SP2″) de Windows XP un Firewall integrado. Por lo general los SPs no añaden funcionalidad adicional, pero para evitar futuros inconvenientes no fué tan mala idea.

Antes del SP2, Windows XP no tenía ningún firewall que un usuario estándar pueda usar. Había algunas opciones ocultas dentro de la configuración TCP/IP de la interfaz de red, aunque al día de la fecha conozco una sola persona que alguna vez usó dichas opciones.

Los únicos usuarios de Windows que no nos infectamos con el Sasser fuimos los que teníamos un firewal funcionando.

Dicho esto, un Firewall no es la solución a ningún problema de seguridad, sino simplemente un eslabón más en la cadena alimentaria de la biología informática.

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

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 :)

Unicode, wstring, wchar_t

Thursday, May 31st, 2007

Compilando el siguiente código en C++ con GCC:

C:
  1. wstring texto( L"/* lasldkj ksaka jkj àáäçÇ */" );
  2. int texto_len = texto.length();

Me apareció el siguiente error:

converting to execution character set: Invalid or incomplete multibyte or wide character

¿Cómo se resuelve? Cambiando la codificación del archivo fuente. En la línea de comandos de Linux usando iconv se puede hacer muy facil:

iconv fichero.in -f iso-8859-15 -t utf-8 -o fichero.out

Si usás algún editor de texto como KDevelop, con cambiarle la codificación el Herramientas -> Codificación -> Unicode (utf8) no alcanza, ya que solo estás cambiando la forma de interpretar el archivo, y no los caracteres mismos (en la parte en donde dice "àáäçÇ" aparecen signos de pregunta: "?????").

¡Viva Unicode!