lunes, 30 de mayo de 2011

Todo Inventado, o...

Un poco para paliar el famoso burnout de, nosotros, los programadores, me decidí a ponerme a programar algo que me guste, en un lenguaje que no use para el trabajo (python, probablemente) y, de paso, si es útil, mejor!

Pero, o bien estoy escaso de ideas o bien, todo está inventado pero, cada cosa que se me """ocurre""" ya existe.
Dos ejemplos:

1) Un buscador de imagenes inverso. Esto es, en vez de poner una palabra y que tire imagenes, poder subir una imagen y que te tire que palabras tiene asociadas.
Ya existe.

2) Un visitador de páginas. Esto es, un servicio que, entre a una web y que, cuando hay cambios en la misma (según keywords) me genere un mail, feed o postee en algun lado o, whatever.
Ya hay algo parecido.
Otro.

Estos son 2 ejemplos cercanos, me viene pasando hace mucho. Será que estoy viejo y falto de creatividad?? O será que, realmente, la frase poco feliz "ya está todo inventado" es cierta?

Acepto donadores de ideas.

Nota: Probablemente exista un post así, en otro blog. :)

sábado, 21 de mayo de 2011

Ubuntu: Hasta los grandes deben aprender sobre interfaces

Ayer, no me andaba el teclado numérico en Ubuntu. 
Me extrañó mucho dado que hacía poco estaba funcionando y, que todo ese sector del teclado se haya roto me parecía raro.

Busqué en google.
Me encontré con que, a varios les había pasado lo mismo, en algún momento.
No se si fue al actualizarse una versión, o si hay algún atajo raro que hace esto, o que tipo de bug raro lo ocasionó.

Al parecer, existe una opción de manejar el mouse con el teclado que, se activó mágicamente.




Claro, si uno conoce que existe la opción, es probable que se de cuenta rápido de cuál es el problema.
El tema es que, yo no conocía que existía esa opción y, como al querer teclear los números, uno pasa rápidamente por las teclas, no percibía que había un movimiento en el puntero del mouse (que sí es obvio cuando uno deja apretada una de las teclas)

Entonces, para qué toda esta historieta?

Cuando hay una opción activada y esta es poco convencional y además produce un resultado confuso (en este caso, uno piensa que no funciona el teclado numérico) se debe indicar en pantalla, con un icono o algo que dicha opción está activada.

Sorry Ubuntu, pero en esta le pifiaron.

sábado, 23 de abril de 2011

Clap, clap, clap

“If Java had true garbage collection, most programs would delete themselves upon execution.”

(Robert Sewell)

jueves, 21 de abril de 2011

Escribir codigo que, simplemente funcione

No hay mucho para explicar o agregar: 
 
> can you try following change ? it will push gart to 0x80000000
>
> diff --git a/arch/x86/kernel/aperture_64.c b/arch/x86/kernel/aperture_64.c
> index 86d1ad4..3b6a9d5 100644
> --- a/arch/x86/kernel/aperture_64.c
> +++ b/arch/x86/kernel/aperture_64.c
> @@ -83,7 +83,7 @@ static u32 __init allocate_aperture(void)
>         * so don't use 512M below as gart iommu, leave the space for kernel
>         * code for safe
>         */
> -       addr = memblock_find_in_range(0, 1ULL<<32, aper_size, 512ULL<<20);
> +       addr = memblock_find_in_range(0, 1ULL<<32, aper_size, 512ULL<<21);

What are all the magic numbers, and why would 0x80000000 be special?

Why don't we write code that just works?

Or absent a "just works" set of patches, why don't we revert to code
that has years of testing?

This kind of "I broke things, so now I will jiggle things randomly
until they unbreak" is not acceptable.

Either explain why that fixes a real BUG (and why the magic constants
need to be what they are), or just revert the patch that caused the
problem, and go back to the allocation patters that have years of
experience.

Guys, we've had this discussion before, in PCI allocation. We don't do
this. We tried switching the PCI region allocations to top-down, and
IT WAS A FAILURE. We reverted it to what we had years of testing with.

Don't just make random changes. There really are only two acceptable
models of development: "think and analyze" or "years and years of
testing on thousands of machines". Those two really do work.

                   Linus

miércoles, 23 de marzo de 2011

Intención del código (o, me descargo un poco)

Este post, probablemente, parezca una pelotudez. Probablemente alguien diga "esto es obvio"o "no me digas", pero, es que lo he visto tantas veces, me he topado con esto tanto, que empiezo a creer que no es tan obvio.


Me ha tocado leer/mantener código que no fue escrito por mi. Es decir, meterme a tocar, mejorar, fixear, código ajeno en vez de escribirlo desde cero. En esos casos, me he topado con cosas como esta (*):

Function Foobar(n){
    n = n * 3
    return n
}


El tema es el siguiente, dada una función escrita en algún lenguaje de programación, puedo saber si está bien?

Esa función, es correcta o no es correcta?? Digamos, desde el punto de vista de la sintaxis (suponiendo que eso es la sintaxis de algún lenguaje) puede no fallar. Pero, está bien? Cómo se que intención tenía? Qué se supone que hace? O que esperar? Por qué nos cuesta tanto documentar eso en comentarios?

En casos peores, he visto cosas como:

Function Foobar(n){ //Devuelve n multiplicado por 3
    n = n * 3
    return n
}


Donde, no solo sigo teniendo el problema de no saber si está bien o no, sino que, además, me dice algo que es obvio.

Entonces, queridos amigos programadores, cuando comentemos procuremos poner la intención de ese cacho de código. NO quiero que me digan lo que puedo ver leyendo el código, sino, justamente, lo que se les pasó por la cabecita cuando lo escribieron. Por qué? Porque es mucho más sencillo arreglarla (si fuera necesario) sabiendo que se supone que hace, que tener que deducirlo teniendo en cuenta quien la llama, por ejemplo. Además, si la función estuviera mal, es más complejo deducir que en realidad, quisieron poner, no se, n = n + 3, por decir algo, aumentando mis posibilidades de romper algo que estaba bien, pero que parecía mal.

Gracias

(*) Aclaración para los despistados, esa función es solo ilustrativa, no es un caso real =)

jueves, 10 de marzo de 2011

Magia Negra: Un ActiveRecord en pytnon

Pensando en un proyecto cuasi muerto que tengo, me vino a la mente que, aprovechando el código ya escrito y con muy poco esfuerzo/código más, puedo armar un framework que implemente ActiveRecord


Y acá está (solo está creado el espacio y subido un commit inicial) pero promete.
El nombre, inspirado en el efecto mágico y, un tributo a las viejas bandas del metal quizá?

Status: Muerto por falta de interés.

lunes, 31 de enero de 2011

Quick Hack

Tenia que resolver lo siguiente:

Una macbook que baja mails desde un servidor propio (con un Kerio en la empresa)

Un router que no soporta loopback

Entonces, cuando la mac esta fuera de la empresa, se podia hacer referencia, en el cliente de mail, al DNS, que llamaremos empresa.dyndns.ws (para no revelar datos reales)
Pero, dentro de la empresa, el DNS empresa.dyndns.ws, simplemente no funciona.
Habia que resolverlo, y rapido[0].

Python al rescate!
Colorized Source Code


He aquí el script (es feo, muy feo, pero salio rapidisimo y con fritas!)

import os
from subprocess import Popen, PIPE, STDOUT
esta = False
p = Popen(['ping','-c','1','server'], stdout = PIPE)
output = p.stdout.read()
p.wait()

if 'bytes from' in output:
    ok = True
else:
    ok = False

f = open('/etc/hosts', 'r')
f2 = open('/etc/hosts2', 'w')

for i in f:
    if 'empresa.dyndns' in i:
        esta = True
        if ok:
            f2.write(i)   
    else:
        f2.write(i)      

if not esta and ok:
    f2.write('192.168.0.1    empresa.dyndns.ws \n')	


f.close()
f2.close()

os.remove('/etc/hosts')
os.rename('/etc/hosts2','/etc/hosts')

Basicamente, hace un ping al nombre del servidor donde esta el servidor de mail (el Kerio) con el nombre local, 'server'. Si esta, estoy en le empresa, sino, no.
Entonces, basado en eso, toco el archivo hots (gracias Apple por hacer su OS un UNIX) y listo[1]. Se agrego al inicio y se corre con permisos de root y logramos lo que esta persona queria, una solucion rapida y magica.

No estoy orgulloso del script en si, sino, del poder de python para hacer estos quick hacks, que te salvan la papas. =)


[0] Dicen que rapido y bien, es imposible.
[1] Pero, como decia TuSam, puede fallar. Por ejemplo, si justo hay otro 'server', donde esta esta persona (shit happens)