¿Se puede arreglar el RSS?

Viernes 28 de Septiembre de 2007

Hace poco leí un artículo en Reddit (y ni me acuedo del link) que decía que el RSS nació para arreglar un problema que nunca existió, y crear otro en su lugar: desperdiciar ancho de banda.

Según dice, demasiado tráfico se desperdicia por el hecho de que, como la Internet es anónima, “Suscribirse” a un RSS NO ES suscribirse a un RSS. Suscribirse quiere decir que alguien te lo manda, pero al RSS se lo pide. (Hay algo para decir con respecto a los “pings” sobre esto, pero no viene al caso.)

Entonces, cada 2 minutos, alguien hace click en su botón de actualizar, y manda varios paquetes a todas las URLs donde está “suscrito”. Cada una procede, entonces, a mandarle sus últimos 10 posts, que, digamos, son de 1kB cada uno. 10kB * 10 posts * 50 URLs * 1000000 de usuarios, y se nota para donde va esto.

En uno de mis momentos de ideas repentinas (estúpidas e inútiles, casi siempre, pero repentinas), pensé: Y… ¿por qué no mandar una simple cadena: un GET del tipo ?latestpost=1190961528. Si no está, bueno, se mandan los 10 posts. No arreglamos nada, pero al menos no rompemos nada. Es compatible con lo que ya existe… ¿Y si está? y si está, simple: $query .= " WHERE date >". date("Y-m-d",$GET['latestpost']);.

Supongamos que ponemos eso en nuestro feed RSS:

Ventajas: ahorrar ancho de banda (asumiendo que alguien lo aplique).

Desventajas potenciales:

  • Seguridad: el date() solo va a morirse si la cadena llega a tener algo más que números… y si no? /[^0-9]/.
  • Tiempo de procesador: dos palabras: Un. If.
  • Retraso en el acceso a la base de datos: Idem: Un. Where.
  • Pedir una fecha demasiado vieja: Uhm… LIMIT?

¿Y del lado de los clientes RSS? Para aplicar, lo único que tienen que guardar es la fecha del último post recibido…

La verdad que esto es tan estúpido que, si no existe ya, guau… y si existe… ¿por qué el problema de “mucho ancho de banda”?

Fantasía y Ciencia Ficción (Septiembre 2007)

Viernes 14 de Septiembre de 2007

Je, que lindo que es reddit… Por algún motivo, una noticia de que la famosa revista Fantasy & Science Fiction estaba regalando ejemplares a cambio de reviews en blogs se coló por entre miles de geeks y llegó a mi lector RSS. Lo gracioso es que la primera vez que lo vi dije “Bah, ya se habrán terminado”, y, cuando lo leí de nuevo, “No tengo nada que perder”.

Mandé el mail sin esperanzas, pero aún así recibí una pronta respuesta. (Interesantemente, poco tiempo después el post que lo avisaba también reportaba que el último número ya había sido entregado; suerte, supongo…)

La única queja es que me dijeron que me lo mandaban el 17 de julio, y lo tuve en mi escritorio hoy —13 de septiembre— a la mañana, a pesar de que el sobre dice repetidamente “correo aéreo”.

La tapa está muy grosa (y la revista no se queda atrás con 160 páginas más-o-menos-A5). El dibujo del alquimista/mercader de la tapa está muy bien hecho. Y, hey, por 4,50 dolares más que vale la pena (estoy considerando suscribirme).

Pero, bueno, como dice que tengo que dar el review sobre –este– tomo, y no la revista en general, me pongo a eso…

Las primeras historias que leí fueron Wrong Number de Alexander Jablokov, que empezó lento pero después me atrapó, y Atalanta (que 9 de cada 10 veces leí “Atlanta”) loses at the interpantheonic trivia bee de Heather Lindsley, que, a pesar de su raro nombre, era genial; la historia que mezclaba las deidades de todo el mundo, una Afrodita cabreada, y un Hipomenes dispuesto a darlo todo… literalmente.

La siguiente fue Requirements for the Mythology Merit Badge, de Kevin N. Haw, que en solo 9 puntos desconectados logra tirar indirectas confusas que lo pierden a uno, hasta que de repente todo cierra, aunque uno no se decide si alzar una ceja o tirarse al piso riendo. Im-per-di-ble.

El artículo de Ciencia me dio por los huevos… Snowcrash + Second Life lo resume.

Si hago una review de las columnas “Books” y “Books to look for” va a terminar siendo una metareview… pero bueno… se ven lindas, completas, y cada una con su propio estilo (la primera analiza lo suyo de forma más detallada, a primera vista, y más sobre la trama). También un cuadrito llamado “Coming attractions” nos cuenta qué leeremos en algunos de los números por venir.

No leí la columna de Películas (tengo algo en contra de sentarme por más de una hora mirando una imagen que se mueve, si no puedo interactuar con ella…).

¡Y todavía no termina!

Aún me falta leer uno de los cuentos cortos (que sólo lo tiene de nombre), y dos de las “novelets”.

Si se lo compran, en serio, no se arrepentirán.

(Y no, esto no es sólo porque me dieron el número gratis; en serio está muy buena.)

Ah, y para los que digan “esto no tiene nada que ver con programacion/informatica/cuando vas a seguir el “curso” de programacion/deja de escribir/conseguite una vida (aunque esa es mi frase)”, bueno, es MI blog. Si no les gusta, hagan un post en el suyo (pero asegúrense de linkearme).

Experiencia W

Miércoles 5 de Septiembre de 2007

Bueno, ahora me conseguí un disco nuevo, lo particioné, y le puse Windows XP.

Luego de la instalación del sistema, no tenía sonido, así que instalé los drivers de audio, los de la placa madre, y los de la placa de video. Me bajé Firefox, Foobar, y iTunes para probar daap (que en Amarok anda, pero no es «uh, que bien anda»). Por último, el AVG free.

Mientras bajaban las actualizaciones de Windows, me puse a jugar al Trackmania Nations. Después de un rato me aburrí, y miré cuanto faltaba para que terminen las actualizaciones. Al notar que ya estaban listas, reinicié.

Al volver, me puse a navegar un rato, me bajé el MSN Messenger y— ups, resetear de nuevo.

Vuelvo, veo cómo hago para instalar el Visual Studio, y veo que trae 2 ISO. No me quejo —salió gratis—, pero cuando me pongo a buscar un programa para montarlo, es nuevamente hora de reiniciar.

A la tercera, me bajé el GetRight, porque algunas cosas se toman la vida en bajar, y si se cortan, Firefox empieza desde 0. Windows activado, WGA me dice que es de verdad, me pongo contento, y al ver el cartelito una vez más, apago la máquina hasta que se instala todo lo que falta. Antes de reiniciar ya había borrado el GetRight, porque tenía ya demasiada publicidad.

Este proceso repetitivo de entrar y salir duró cerca de 15 repeticiones. Windows en total instaló cerca de 80 actualizaciones. En el panel de control me puse a ver qué hacían, y noté algunas cosas particularmente molestas: muchas de las actualizaciones eran “Actualización acumulativa para X”, o “Nueva versión de Y”… si son actualizaciones acumulativas, y el sistema es capaz de identificar qué tengo instalado en la máquina, ¿por qué no puede simplemente bajarse un parche de mi versión a la última?… Ni hablar de las 5 versiones de Windows Media Player.

Al finalizar todo, tengo ocupados casi 7 gigas de la partición de 40. Con la instalación recién hecha, tenía 4. Viendo que lo que yo bajé no pudo haber ocupado más de 500 megas (todavía no instalo el Visual Studio), me bajé 2,5 GB de actualizaciones de Windows.

A pesar de que sigo con la queja de que ¿por qué no puede hacer Un Gran Parche?, no me quejo demasiado porque las actualizaciones posteriores no aparecerán todas juntas.

Ah, todo esto lo hice probando lo que recomiendo a todo el mundo: me creé mi propia cuenta de usuario Limitada, y otra de Administrador. Instalar cosas no es molesto, simplemente un click derecho, “Ejecutar como…”, y poner la contraseña de algún admin.

Supongo que es soportable…

T out.

Edit: ¿Alguien sabe cómo hago para desinstalar el WMP, Windows Movie Maker, y otras de esas cosas que no uso?

Básicos PHPianos

Jueves 16 de Agosto de 2007

Tehsis dijo algo que ahora es más que obvio: estoy explicando las constantes y variables y demás en PHP… pero si se supone que el que lee esto quiere aprender PHP, no está por saber cómo ejecutar ese código…

Para ejecutar código PHP, primero hay que tener un intérprete a mano. Hay varias formas de hacerlo: Instalar sólo el ejecutable (poco recomendable para no-linuxeros), instalar el ejecutable con algún servidor web (IIS, Apache, el que más le guste a cada uno), o conseguirse un hosting que provea PHP.

Los que opten por el primer camino suelen saber cómo hacerlo solos, así que los dejo (para probar uno de sus scripts, ejecutan php < script.php). Para los que elijan el segundo, tienen amplia documentación en el sitio de PHP. Y para los últimos, a usar Google.

PHP es un lenguaje que se “embebe” en el código HTML; se lo entremezcla con el contenido estático, cosa de no tener que poner un echo adelante de cada línea.

El intérprete simplemente imprime todo el contenido que entra, hasta que encuentra uno de los símbolos de apertura. por lo general es la secuencia <?php, aunque en algunos casos basta con <?. Luego, procesa toda la entrada hasta llegar a un ?>. Entonces, un archivo test.php que contenga:

echo "hola";
&lt; ?php
echo "ejecutable";
?&gt;

Daría como salida:

echo "hola";
ejecutable

(Aunque, dado que en HTML cualquier fin de línea, espacio, tabulación, etc., se reemplaza por un espacio (independientemente de la cantidad de espacios que haya), en un navegador se vería ‘echo “hola”; ejecutable’, todo en una misma línea.)

Comienzo de clases

Lunes 13 de Agosto de 2007

Dado que hace casi un mes que puse la currícula, y no hubieron cambios, así que empiezo:

Una variable es un contenedor que almacena un valor. Una constante también. La diferencia radica, como indican sus nombres, en que el valor que guarda una variable puede cambiar en el transcurso de un programa, mientras que el de una constante se determina en un momento, y permanece igual hasta que éste se termina.

El ejemplo típico de constante es pi.

En algunos lenguajes, como en C, es necesario declarar una variable antes de poder utilizarla. En otros, como en PHP, una variable se declara tan pronto se le otorga un valor.

Variables:

$valor=1;

Constantes:

define("PI",3.14159);

Al principio puede parecer inútil una constante, después de todo se la puede reemplazar por una variable, pero con el tiempo se aprende que sí son útiles: si un valor se usa repetidamente en varios lugares diferentes, es bueno definirlo como una constante para evitar errores, o por si luego queremos cambiar su valor… en el primer caso, si en algún lugar escribimos 31.4159, el valor final estará mal. En el segundo, si queremos cambiar la precisión de PI de 3.14159 a un valor con 15 decimales, simplemente cambiamos el valor de la constante, y no en todos los lugares donde lo usemos (ejemplo: podemos calcular el área y perímetro de un círculo, y el volumen y superficie de una esfera, a partir de un radio, y todos éstos cálculos involucran a PI).

La asignación, simplemente, es el hecho de poner un valor en una variable. Se hace con el operador =. El valor asignado puede ser un literal (5, “Tordek”, 3.14159…), o el resultado de una operación (matemática, la aplicación de una función, una operación sobre cadenas, o alguna combinación de esto):

$a = 5;
$nombre = "Tordek";
$cuadrado = 4 * 4;
$saludo = "Hola, " . $nombre;

Para ver el valor de una variable (o el resultado de una operación), llamamos a echo.

Si no tuviéramos variables ni constantes, para imprimir los 4 valores que dije antes (perímerto y área de un círculo, y superficie y volumen de una esfera), deberíamos escribir algo así (para un radio 10):

(Nota: el punto es un operador de concatenación, es decir, “a”.”b”=”ab”. Cuando veamos cadenas lo explicaré más profundamente.)

echo "Perimetro: ". 2 * 3.14159 * 10;
echo "Superficie: ". 3.14159 * 10 * 10;
echo "Area: ". 4 * 3.14159 * 10 * 10;
echo "Volumen: ". 4/3 * 3.14159 * 10 * 10 * 10;

Si ahora hacemos que PI sea una constante, se ve todo más limpio:

define("PI", 3.14159);
echo "Perimetro: ".2 * PI * 10;
echo "Superficie: ". PI * 10 * 10;
echo "Area: ". 4 * PI * 10 * 10;
echo "Volumen: ". 4/3 * PI * 10 * 10 * 10;

Ahora, podemos poner el valor del radio en una variable, y si lo queremos cambiar, sólo tocamos un lugar:

define("PI", 3.14159);
$r=10;
echo "Perimetro: ".2 * PI * r;
echo "Superficie: ". PI * r * r;
echo "Area: ". 4 * PI *  r * r;
echo "Volumen: ". 4/3 * PI *  r *  r * r

Pero se sigue viendo algo apretado… podríamos hacer todos los cálculos primero, e imprimirlos después:

define("PI", 3.14159);
$r=10;
 
$perimetro = 2 * PI * r;
$superficie =  PI *  r * r;
$area = 4 * PI *  r * r;
$volumen = 4/3 * PI *  r *  r * r;
 
echo "Perimetro: ". $perimetro;
echo "Superficie: ". $superficie;
echo "Area: ". $area;
echo "Volumen: ". $volumen;

Sí, ahora es un poco más amplio, pero es discutiblemente más legible. Algún matemático en la audiencia puede notar que la operación PI * r se repite siempre, así que podría almacenar su valor en una constante, y reemplazarlo donde se lo necesite… pero esto termina haciendo que el código sea más difícil de leer (y feo), y lo que ganamos en velocidad en ahorrarnos tres multiplicaciones (se usa 4 veces, y se calcula 1) es tan minúsculo que es despreciable. Siempre se tiene que intentar que lo que se escribe sea fácil de entender, y por las variables se empieza.

Contagio

Lunes 6 de Agosto de 2007

Porque tenía ganas de poner un meme.

Y porque se ganó el link cuando me hizo reirme con ésta entrada de su blog superlacónico.

Y porque tenía ganas.

Et al…

Juguemos al contagio:

  1. Poné una entrada en tu blog invitando a jugar, y un comentario con un link a ella en el blog en que lo leíste.

Sí, bueno, es un solo paso.

Vive la Récursivité!

Un Maleducado en Internet

Lunes 6 de Agosto de 2007

En el mundo real, al hablar con alguien, siempre hay todo un protocolo para seguir: Si no estamos con la otra persona, conviene llamar antes de aparecer repentinamente; además, al verla, hay que saludar, tirar algunas preguntas vacías (”¿Cómo va?”, “¿Todo Bien?”, etcétera), y recién ahí se puede empezar la conversación. Además, aunque parezca obvio, la presencia del interlocutor es obligatoria. A todos se enseña que es de mala educación no seguir este protocolo, y todos lo aceptamos y seguimos.

En Internet, aunque les sorprenda, no. Todo eso cambia.

A menos que mi computadora de repente se apague, se resetee, o se me cuelgue el programa de mensajería que use, el mensaje queda en la pantalla; si no lo leo ya, quizá lo haga más tarde. Preguntar “¿Estás?” es lo más molesto, lo más estúpido, y lo más ofensivo que se puede hacer.

Es molesto porque hay una sola respuesta posible: “Sí.”. Decir “no” es imposible sin mentir; el otro caso es no responder (y dependiendo de que tan molesta sea la otra persona, puede repetir unas 10 veces la pregunta a las 3 de la mañana, cuando uno está durmiendo, entremezclándola con insultos por no haber contestado (venciendo las leyes de la física)), transformando una simple pregunta en una orden estúpida: “Decí sí”.

Es estúpido por lo mismo: preguntás algo que sabés. Estoy. Si no estuviera, no te respondería, y si no te respondo estás hablando a la nada como un loco.

Es ofensivo porque el que pregunta se pone a si mismo en una posición dominante: “Decí sí o no te hablo más. Quiero mi respuesta YA.” Además, si el receptor del mensaje está haciendo algo que requiere concentración, no sólo lo distrae, sino que además le hace perder tiempo. “Decí sí y te digo lo que YO necesito; no te voy a decir nada más mientras tanto.”

Ahora, a todos los que dicen que es de mala educación no saludar antes de empezar a hablar, les pregunto: ¿Ustedes se acercarían a alguien y les dirían «Necesito algo de vos, y no te voy a decir qué hasta que me digas “sí”.»? (Qué descajete de signos de puntuación.)

Lo mismo se aplica a los boludos que se meten en un canal de IRC, preguntan “¿Alguien me ayuda?”, y después empiezan a preguntar en privado a cada persona lo que querían…

Voy a dejar de escribir

Miércoles 1 de Agosto de 2007

Aviso: hoy estoy como una perra y este post no tiene nada de informativo.

¡Oh, no, alguien dejó un comentario en mi blog que indica que desconozco sobre un tema que usé como metáfora! Estoy desesperado, necesito lecciones de escritura vida.

Hmm, tengo una idea, intentaré clarificar mi punto de una manera indirecta…

¡Oh, no, la misma persona volvió a decirme “No sabés del tema.”!

Claro, lo admito, no lo sé –lo que a veces me hace preguntarme sobre la gente que usa este tipo de excusas tan directamente… but I digress–, pero esta queja en particular me da ganas de dedicarle todo un post…

Me dijo Malguzt, en un comentario en el post anterior, que no sé de horticultura/ganadería (y eso que ni empezamos con la piscicultura, apicultura, etc…), o como yo dije “ser granjero” (ni tenía tiempo de explicarme dónde me equivocaba, claro).

Mi punto era que los granjeros no se mantienen absolutamente pendientes de una de sus plantas/animales, sino que dedican un poco de atención a cada una, en paralelo, y –en algunos casos– no todos los días. Quizá no se entendió en el post original, así que lo aclaré en el comentario.

La respuesta inmediata fue “Se nota que no sabés de horticultura.”.

…Habiendo leído esas palabras, el hemisferio izquierdo de mi cerebro –como de costumbre– casi explota. Empecé a imaginarme una escena de un enorme campo, con cientos y cientos de plantas, con una casita –un rancho–… todas las cosas del campo típico… y al lado de cada una de las plantas, con todas las herramientas a mano, una persona mirándola fijamente –pero, a la vez manteniendo su atención en los ladrones, claro–.

Ahora, sé que esto es imposible; las pocas veces que estuve en un campo, no vi tanta gente… o a lo mejor siempre me fui cuando estaban de vacaciones…

Aún así sigo viendo algo raro: si hay una persona dedicada a cada planta y animal, no veo como alcanza para que, además de producir, logren vender lo suficiente como para repetir este proceso extraño… Además, bastante buenos para compartir algo que les toma 24 horas diarias.

O quizá, sólo quizá, alguien no sabe de qué carajo estaba hablando (o tiene que volver a la escuela a aprender a leer).

A los que les moleste que haya esto, mil disculpas, pero… es mi blog… :P

Sé un Cazador

Martes 24 de Julio de 2007

Estaba leyendo algo interesante en la Wikipedia; un artículo sobre “Flow” –un estado mental de concentración absoluta en la tarea que uno está haciendo– Y, gracias a la maravilla de las wikis, llegué a una “Teoría de Granjeros versus Cazadores“.

No leí el texto original, pero, como se trataba sobre el hiperfoco y el Desorden de Déficit de Atención, me imagino que dice que la gente de ahora se comporta como Granjeros: se preocupan por prestar atención a todo lo que está pasando para proteger su granja (el “hiperfoco” es inútil, porque aislarse de todo implicaría no ver algún peligro), mientras que los cazadores se enfocan en su presa, aislándose de cualquier otra distracción.

Más allá de eso, y esto ya es lo que invento yo, creo que se puede aplicar de otra manera: Los granjeros se dedican a preparar la tierra, sembrar, esperar, y cosechar. Aprenden lo que necesitan de sus padres, o con un poco de experiencia (hasta el primer granjero seguramente fue capaz de pensar “Los tomates crecen en X tiempo y se cosechan en Y temporada, así que tengo que sembrarlos en Z época”), pero básicamente se resumen a esperar que (después de haber sembrado las semillas) todo les llegue.

Los cazadores, en cambio, se ven obligados a aprender solos (se puede enseñar a usar un arma, pero hay que experimentar con ella hasta que se la usa bien); se van al bosque, encuentran un lugar cómodo, y esperan pacientemente hasta que aparece una presa para acechar y atrapar.

Y eso me recuerda a dos de los profesores que todos mis compañeros –granjeros– odian, y yo –cazador– encuentro geniales: uno de la universidad y otro de la secundaria; graciosamente, ambos de matemática. Ambos llegan al curso, explican el tema, resuelven un par de ejemplos, y dejan algún problema para resolver, o esperan alguna pregunta.

Esto, para los granjeros, es exasperante: constantemente los escucho decir “no explica nada” o “nunca entiendo lo que dice”. Para los cazadores, en cambio, es su hábitat natural: Nada se ‘encuentra’, todo se busca: estos profesores son ideales para los cazadores, que están dispuestos a preguntar o aprender solos.

Los granjeros se sientan a esperar que las cosas les lleguen. Los cazadores salen a buscarlas.

La programación es un mundo de Cazadores. La Internet es un mundo de Cazadores. La ciencia es un mundo de Cazadores.

¿Querés conseguir algo? Sé un cazador.

Belleza Textual

Lunes 23 de Julio de 2007

De todas las artes, mis favoritas son las escritas. La habilidad de poner en palabras cosas prácticamente indescriptibles es una labor por más respetable, y los mejores son capaces de generar emociones usando algo tan limitado como el lenguaje…. por eso, también aprecio que un libro no sólo sea hermoso por su contenido, sino también por su presentación.

Los editores WYSIWYG modernos pueden ser fáciles de usar y todo lo que uno quiera, pero un verdadero programa de edición tipográfica tiene características que hacen que el resultado sea miles de veces más hermoso de mirar. Por eso, me puse a aprender a usar LaTeX, y para todo el que haga algún tipo de publicación escrita, es algo que vale la pena conocer.

El Profe

Lunes 16 de Julio de 2007

Aki, uno de mis amigos, hace poco me pidió que le enseñe a programar (y a cambio, el me enseña a guitar la tocarra), entonces pensé en armar un tipo de curricula o plan que liste los conceptos que debería entender alguien que no sabe NADA de programación para aprender lo básico.

En particular, el quiere aprender a hacer sitios web (y según me dijo, cosas simples), así que elegí enseñarle PHP, aunque quiero mantener este “curso” lo más general posible (aunque, eso sí, apuntado a la programación procedimental*).

El primer borrador incluye:

  1. Variables y Constantes
    1. Asignación
  2. Operadores y precedencia
  3. Entrada/Salida
  4. Estructuras de Control I
    1. If-then-else
    2. Switch/case
  5. Arreglos
  6. Estructuras de Control II (for, while)
    1. for
    2. while
  7. Funciones
    1. Argumentos
    2. Vida/scope de una variable
    3. Recursividad
  8. Manejo de Archivos
    1. Lectura
    2. Escritura
  9. Seguridad

Y, durante el curso, siempre mantener constante la importancia de las buenas costumbres como indentación apropiada y otras buenas prácticas (nombres de variables, comentarios, etc.).

Creo haber organizado los temas de manera que cada “capítulo” necesita del anterior para ser entendido (o, en algunos casos, volverse útil). Claramente, algunos tienen mucho más lugar para explicar cosas que otros, así que serán subdivididos según sea necesario.

Esperaré un poco sus comentarios, y una vez que lleguemos a un acuerdo empezaré el curso. Todo comentario es bien recibido.

* “Procedural” no es una palabra.

Error de argumento

Viernes 13 de Julio de 2007

En un post anterior me quejé de que los posts con sólo links eran molestos, y los comentarios me dieron la razón repetidamente… pero la cantidad de este tipo de entradas parece aumentar, más que descender.

Estaba revisando uno de dichos links desde mi lector, y fue ahí que me dí cuenta que el problema afecta menos a los usuarios, y más al que debería cambiar el sitio: su dueño.

La clave, precisamente, es que revisé el link. Lo abrí en una pestaña nueva —como siempre— y lo dejé ahí mientras seguía con mi lectura. Había abierto el link, sí, pero nunca entré en el blog que lo publicó, y si no entré ahí una vez, no voy a recorrer todas las entradas de mi lector buscando una sólo para poner un comentario. Al final, el único que pierde es el webmaster. Pierde posibles visitantes, pierde comentarios que generarían tráfico, pierde vistas al sitio, que en el mejor de los casos significa alguien interesado en lo que ofrecemos.

Bueno, miento, también pierde el usuario, por razones explicadas antes…

Por favor, no sólo por los usuarios (y acuérdense que el usuario es el importante en esto), pongan los links en delicious.

Linux me aburre…

Domingo 1 de Julio de 2007

Otra linda sesión de hacking nocturno, un día después de una “productiva” noche de Magic con mis amigos. Otra vez tengo los horarios dados vuelta (son las 9 de la mañana, y hace 12 horas me desperté)… ¡qué lindo el silencio de un domingo a la mañana, sin obligaciones molestas! Incubus recién apareció en mi Amarok, y estoy leyendo un capítulo en PDF de un libro de programación… ahora mismo me siendo un poeta — un code-poet.

Que lindo es programar.

But then again… me aburro un poco… en Windows, cuando lo usaba, al menos a esta hora tenía para hacer algo — defragmentar el disco, buscar (ad|mal|spy)ware (y con cer teza encontrar algo)… pero ahora, ni eso.

Y dicen que Linux es feo…

Imágen del Feed

Martes 26 de Junio de 2007

Recién leí en el blog de Bruno que el estándar RSS deja poner un tag <image> en el feed, y como toqueto que soy me puse a modificar el generador de RSS del WP para ponerle eso. Quizá haya un plugin y todo, pero, que se yo, escribir el código fue más rápido que buscar un plugin… creo…

Bueno, primero estuve como media hora hasta que me dí cuenta que estaba cambiando el archivo que no era (a todos nos pasa… ¿no?), y lo encontré buscando otra cosa (ví que estaba puesto que el lenguaje de blog era inglés).

Bueno, en resumen: Los archivos son wp-include/feed-rss.php y feed-rss2.php, y hay que agregar (dentro del elemento <channel>) lo siguiente:

<image>
    <url>(url de la imagen)</url>
    <title>(descripción) </title>
    <link>(url del blog (bah, supongo que se podrá poner otra, pero no veo para qué))</link>
</image>

Firefox me muestra la imágen al costado; a ver quién más usa el tag este…

Planes ‘pa mi compu

Lunes 25 de Junio de 2007

Recién leí que se viene la versión 12.0 (ya hay un Release Candidate) de mi distribución favorita: Slackware (Gracias, Payaso Pogo).

En la facu, una de las facciones políticas (?) estaba repartiendo CDs y licencias de soft de Microsoft (por definición de Gratis, me agarré todo: Windows Vista, XP, Server 2003, y un pack que incluye Visual Studio, Proyect, y las librerías/bibliotecas de MSDN), por el programa académico.

Tengo una máquina que no es “Uhhh”, pero se la banca: Athlon XP 2200+, 1GB, en un GA-7N400, y una GeForce FX 5700. Para lo que juego, da.

Ahora, viendo lo que tengo y lo que tendré, estaba pensando en conseguirme un disco de 200 o por ahí, meterle Slack 12 para actualizar el actual, y en el de 80 poner Wintendo (jojo, que original), ahora que lo tengo Legal Y Gratis (R), y emularlo gracias a las maravillas de VmWare… y aunque mi micro es normalcito, me gustaría ponerle un Sempron más nuevo (el bios nuevo de la placa supuestamente los soporta); algo de 64b no, porque tendría que cambiar prácticamente todo.

Sólo hay un detalle… los discos no son como esas licencias, y hay que pagarlos…

En otras palabras… se aceptan donaciones.

Blogs, links, y RSS

Miércoles 20 de Junio de 2007

Soy uno de los tantos que aparecen en codear, y estoy suscrito a su RSS. A veces, algunos bloggers usan el medio para postear links. Y, todo bien… pero… sólo un link, apenas una descripción, y ni siquiera una opinion…

Recién leí un post en el mismo feed, y lo decía de la manera más clara posible: El blog para escribir y del.icio.us para los links.

Y para los que todavía estén obsesionados con poner links, porque a veces están buenos, por favor, o ponen varios juntos en un solo post, o si es uno solo, agreguen una descripción decente, o una opinion; en otras palabras, no me muestren lo que vieron, convenzanme de que vale la pena leerlo.

Programación Preventiva

Lunes 18 de Junio de 2007

En varios textos sobre Lisp había visto frases como “Algunos lenguajes de programación son mejores para Top-Down (Primero hacer lo más grande, y después rellenar); otros, para Bottom-Up (Primero hacer todas las funciones, y depués aplicarlas); Al programar en Lisp se suele hacer de las dos formas en un programa.”, que no había entendido.

En reddit vi un link a un programita interesante, uno que arma escaleras de palabras. Por ejemplo:

  1. Pasta
  2. Pasto
  3. Parto
  4. Harto

En cada paso cambia una sola letra. Vi como lo manejaba el que lo hizo, y en algunas partes me pareció excesivamente complejo; entonces me puse a pensar en mi propia versión del programa:

Lo primero que me dí cuenta es que es algo naturalmente recursivo: el caso base es que las dos palabras sean iguales; en caso contrario, busco todas las palabras a una letra de distancia, y les aplico la función. Hay un pequeño problema con esto, pero ya lo solucionaremos. Veamos como queda eso en Lisp:

(defun escalera (inicio fin diccionario)
  (if (string-equal inicio fin) (list inicio)
    (shortest (for palabra in (vecinos palabra diccionario)
                   collect (append (list inicio) (escalera palabra fin))))))

La macro for, bastante odiada por algunos programadores funcionales, me arma una lista de todas las sub-escaleras; aunque la única que me interesa es la más corta.

Los más audaces ya habrán notado que hay algunas cosas que no están definidas; las funciones shortest y vecinos, por un lado.

La explicación completa de shortest me ocuparía todo un post, así que lo dejo para después, convengamos en que me devuelve la lista más corta de una lista de listas, y queda así:

(defun shortest (lista)
   (cond ((null (cdr lista)) (car lista))
     ((&gt; (length (car lista)) (length (cadr lista))) (shortest (cdr lista)))
     ('t (shortest (append (list (car lista)) (cddr lista))))))

Vecinos me devuelve la lista de todas las palabras que estén a un paso de distancia (Ojo, no la distancia de Levenshtein formalmente, porque no me interesa agregar o borrar letras):

(defun vecinos (palabra diccionario)
  (loop for item in diccionario
        when (and (= (length palabra) (length item)) (un-paso-p palabra item))
        collect item))

Ahora falta un-paso-p (la p es de “predicado”, y son funciones que devuelven valores booleanos).

(defun un-paso-p (de a)
  (= (loop for ff across de
           for tt across a
           count (char-not-equal ff tt))
     1))

Ahora sí; todas las partes que necesitamos están definidas… pero si probamos el código ahora entramos en un bucle infinito: pasto es vecino de parto, y esa propiedad es reflexiva. Esto se soluciona fácilmente eliminando la primera palabra del diccionario. La nueva versión de escalera:

(defun escalera (inicio fin diccionario)
  (let ((dicc (remove inicio diccionario :test #'string-equal)))
    (if (string-equal inicio fin) (list inicio)
      (shortest (loop for palabra in (vecinos inicio diccionario)
                      collect (append (list inicio) (escalera palabra fin dicc)))))))

El problema con esto es que, cuando llega a un callejón sin salida (no hay ningún vecino de la primera palabra en el diccionario actual, retorna una lista vacía, que se agrega a la lista, y shortest se encarga de devolverme la lista más corta. Se soluciona fácilmente obligando al bucle a solo poner un valor en la lista cuando éste no sea una lista vacía… y eso sólo pasa cuando llego al final.

(defun escalera (inicio fin diccionario)
  (let ((dicc (remove inicio diccionario :test #'string-equal)))
    (if (string-equal inicio fin) (list inicio)
      (shortest (loop for palabra in (vecinos inicio diccionario)
                      for list = (escalera palabra fin dicc)
                      when (not (null list))
                      collect (append (list inicio) list))))))

Con toda honestidad, no sé si éste código funciona (aunque estoy bastante seguro) porque ya lo modifiqué y lo volví a poner acá de memoria.

El final, con un par de funciones auxiliares para optimizarlo, lo posteo después.

Después de haber terminado este programa, entendí un poco más la frase; algunas partes del programa salen naturalmente (aunque después las modifique), y usan funciones que todavía no están definidas (aunque puedo imaginar cómo funcionan) y luego implementaré; mientras otras partes surgen de analizar el programa y corregir cosas “feas”.

Programar nunca deja de sorprenderme.

Edit:Gracias a un cambio que hice en la plantilla, ahora si tengo indentación y se ve más lindo.

La última versión, incluyendo una función para cargar un diccionario y una para sólo usar las de la longitud correcta, queda así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
(defun escalera (inicio fin diccionario)
  (escalera-aux inicio fin (recortar (length inicio) diccionario)))
 
(defun escalera-aux (inicio fin diccionario)
  (let ((dicc (remove inicio diccionario :test #'string-equal)))
    (if (string-equal inicio fin) (list inicio)
      (shortest (loop for palabra in (vecinos inicio diccionario)
                      for list = (escalera-aux palabra fin dicc)
                      do (setf dicc (remove palabra dicc :test #'string-equal))
                      when (not (null list))
                      collect (append (list inicio) list))))))
 
(defun shortest (list)
  (car (sort list (lambda (x y) (< (length x) (length y))))))
 
(defun vecinos (palabra diccionario)
  (remove-if-not (lambda (x) (un-paso-p palabra x)) diccionario))
 
(defun un-paso-p (de a)
  (= 1 (loop for ff across de
             for tt across a
             count (char-not-equal ff tt))))
 
(defun recortar (longitud diccionario)
  (remove-if-not (lambda (x) (= longitud (length x))) diccionario))
 
(defun leer-diccionario (&optional (path *diccionario-default*))
  (with-open-file (s path)
    (loop for word = (read-line s nil)
          while word
          collect word)))

Tres Tristes Tipos en un DVD

Jueves 14 de Junio de 2007

Make Magazine nos muestra una foto interesante; aparentemente alguien con buen ojo y mucho tiempo libre encontró que en el DVD de Windows Vista (Nota: Está muy bueno el diseño) hay una foto de tres desconocidos…

Bueno, desconocidos para nosotros, Microsoft seguro los conoce. ¿Alguna idea?

Acceso de Admininstrador a cualquier Windows en menos de 5 minutos

Martes 12 de Junio de 2007

Bueno… noticia noticia no es, pero supuestamente un “experto” (?) finés afirma que se puede invadir cualquier instalación de Windows 2000, 2003, XP y Vista con sólo un DVD de Windows Vista (y acceso a la PC).

Oh, sorpresa.

[Via Kriptopolis]

P.D.: Creo que rompí algo… no tengo el editor visual en el Wordpress.

[Edit] Nevermind, me había olvidado de copiar la carpeta wp-includes/js.

100

Jueves 31 de Mayo de 2007

Ni me acuerdo cuando empecé el blog; no soy mucho para las fechas (historia no era una de mis mejoraes materias…), pero ya llegué a los 100 posts y eso se merece un post especial… o no, no sé; a lo mejor el blog me está robando más de la poca vida que me queda… igual, no importa, es más divertido que otras cosas.

Noticias, noticias… Estoy por empezar el club de rol Fraguas de Moradin; el martes fue la whyFLOSS (que no fui porque me quedé dormido, y Tehsis se afanó incontables remeras y demás), y este sábado son los workshops; ya estoy mejor, aunque estoy viendo para poner algo más de informática que van muchos posts off-topic seguidos; volvió el blogroll (me había olvidado desde que salí de blogger)… y, no sé, no mucho más…

Ah, bueno, si alguien quiere un review (como el que hice alguna vez de Linux de acá), me tira un link en los comentarios, y lo miro.

Nos vemos en el 101.