Category Archives: programacion

Procastinacion para geeks: Project Euler

Eres programador y tienes mucho tiempo libre? Aquí hay un buen reto para las mentes inquisitivas.

El proyecto euler es un sitio que contiene muchos problemas diseñados especialmente para aprender y pensar. Los problemas usualmente consisten en enigmas matemáticos que puedes resolver con una computadora, por lo que saber programar es requerido.

Un problema tipico es por ejemplo:

Si listamos todos los números naturales menores a 10 que son múltiplos de 3 o 5, obtenemos 3,5,6 y 9. La suma de esos múltiplos es 23. Encuentre la suma de todos los multiplos de 3 o 5 menores a 1000

Por cierto, la respuesta es 233168.

Una linea en python: print sum([x for x in range(1000) if x % 3 == 0 or x % 5 == 0])

Muchos de estos problemas pueden ser resueltos por fuerza bruta pero una de las condiciones es que los programas que resuelvan los problemas corran abajo de 1 minuto. Por lo que tienes que pensar un poco.

La pagina lleva un registro de todos los problemas que has resuelto y hay existe la “pared de la fama” en la que están los nombres de quien ha resuelto la mayor cantidad de problemas.

Si te interesa, registrate, y a resolver problemas.

StallmanFacts.com

Lo que hace la aburrición. Ayer tras un día libre (día feriado, benditos sean nuestros diputados) y tras meses de no tirar código, nació el sitio StallmanFacts.com.

Que es? Bueno, si conoces los chucknorrisfacts.com te parecerá muy similar.

Todo nació cuando Stallman anuncio que el no usa un navegador, sino tiene programado un demonio al que le envía un correo pidiendo una pagina Web, y le regresa dicha pagina por email. Bromas empezaron a saltar sobre que Stallman es el nuevo Chuck Norris.

Así que porque no hacerle honor al maestro de LISP y GNU?  Tomando de base este thread de reddit, empezó a girar la rueda.

En el sitio puedes votar por tus favoritas, al estilo reddit. También puedes sugerir ideas para incluirlas en el listado. Ahora mismo, no hay muchas validaciones. En especifico, pueden votar las veces que quieran. Nada mas no abusen :P

Tomo un par de horas levantar el sitio. Lo mas complicado fue darme el tiempo y evitar las interrupciones (jeje!). Usando una plantilla de andreas viklund y una imagen de xkcd, le di la imagen al sitio. Los que me conocen saben que el diseño no es una de mis virtudes. Es mas, es un defecto. :P

El sitio usa un poquito de ajax para los votos, con prototype. Esta hecho con PHP. El sitio debe ser de unas 200 líneas de código.

Pues eso. Enjoy! :)

El test ACID3 esta listo

Al parecer, el test ACID3 esta listo. Se publico hoy que Ian Hickson, ya tiene listo el test ACID3. Este test prueba capacidades que aun no están listas en los navegadores, como CSS3, SVG, entre otras. Aunque no he podido encontrar confirmación aun de esto, ni en el blog de Ian, ni en la pagina del Web Standards Project.

Suponiendo que este test es el final, la pregunta siguiente es: En que estado se encuentran los navegadores el día de hoy?

Haciendo unas pruebas rápidas, ninguno de los navegadores mas populares (IE, Firefox, Opera) tiene soporte completo, pero algunos fallan mas espectacularmente que otros.

Estas son screenshots del test en una máquina con Windows XP. Hacer click para agrandar la imagen.

IE 6
Tiene flojera de siquiera empezar
acid-ie6
IE7
Falla espectacularmente, solo un punto mejor que el anterior
acid-ie7
Opera 9.25 (versión oficial)

Ahora si ya empezamos a ver resultados. Se comenta que la versión de desarrollo llega a 60%

acid-opera
Firefox 2.0.0.11
Aquí ya empezamos a ver un progreso de como se vería el test, pero todavía le faltan muchas cosas
acid-ff2
Firefox 3.0 B2
Por fin, un navegador que falla con estilo. La animación corre, aunque todavía le falta mucho.
acid-ff3
Firefox 3.0 B3pre
W00t!! Tenemos un ganador.
Ok, no llega al 100%, pero deja mordiendo el polvo a todos los demás :)
acid-ff3b3

Se supone que el test estará completo pronto, si no es que este es el final. Pone la vara bastante alta para los navegadores actuales y mucho para aquellos que van muy retrasados (te estoy viendo [con odio] a ti IE).

Y a tu navegador, como le va? :)

P.D. Están fregones los nuevos iconos para el FF3, no? :)

Curiosidades de la programación

Para el articulo anterior hice un poco de investigación para algunas definiciones y me encontré cosas muy curiosas, aquí les presento algunas de estas.

  1. Cuantos lenguajes de programación conoces? 10? 30? 50? Novato. Que te parece 1150 lenguajes diferentes de programación?. En la pagina http://99-bottles-of-beer.net/ muestran 1150 lenguajes diferentes haciendo una sola cosa: Un programa que imprime la canción “99 botellas de cerveza”. No conozco un listado mas grande de lenguajes.
  2. Sabes cual es el lenguaje de programación mas difícil que existe? Tache si contestaste “Perl”. El lenguaje de programación mas difícil se llama Malbolge. Entre las peculiaridades de este lenguaje están:
    1. En el 98, su programador lo lanzo al dominio publico.
    2. Desde su aparición, se tardo mas de 2 años en aparecer su primer programador.
    3. Porque digo “aparición”? Malbolge es un lenguaje de programación generado por un programa escrito en LISP, fue pues, generado por una máquina.
    4. Cada instrucción es encriptada (le resta 33, le suma el puntero y le realiza mod 94) después de que se ejecuta. Por lo que cada instrucción es diferente cada vez que se ejecuta. Es altamente impredecible.
    5. Crees que exagero? Esta seria la versión de hello world de Malbolge.
         1: (=<`:9876Z4321UT.-Q+*)M'&%$H"!~}|Bzy?=|{z]KwZY44Eq0/{mlk**
         2: hKs_dG5[m_BA{?-Y;;Vb'rR5431M}/.zHGwEDCBA@98\6543W10/.R,+O< 
    6. Existe también la versión de 99 bottles of beer para este lenguaje. El propio creador del lenguaje no creía que esto fuera posible. Solo por curiosidad, velo. Es impresionante
    7. Alguien planteo crear un convertidor de Brainfuck a Malbolge. Brainfuck probablemente es el segundo lenguaje mas complicado que existe. Y esta, la idea mas masoquista que se me puede ocurrir. Casi como programar en java :P
  3. El primer lenguaje de programación no fue en una computadora. Los primeros lenguajes de programación, o mas específicamente lenguajes de dominio especifico fueron los telares o los pianos del siglo 19.
  4. Existe un lenguaje de programación basado en las obras de Shakespeare. Usa palabras reservadas como Juliet, Romeo y Ophelia.
  5. Has oído hablar del “Spaghetti code”? Si crees que PHP es el rey en ese campo, no conoces el lenguaje Spaghetti.
  6.   
                           
                               
                                         
                                
                                         
                                       
                                         
                       
             
                                                       
                                        
                                 
                                        
                   
                                               
                                                       
                     
                
                                                       
                                         
                                         
                                         
                                         
                                                
                        
             
                                         
                          
                                                
                               
                                                
                        
                                                       
       
           
                 

               

                             

                      
           
                
              

             

               

    [hello world en Whitespace]

  7. No todos los lenguajes tienen for, do, while, etc. Hay lenguajes que se programan con colores. Si, con colores. El lenguaje Piet recoge colores para realizar sus instrucciones. Sus programas parecen pinturas abstractas. Este es el ejemplo de un hello world:

    Piet_hello_big 

    Y este es un programa que parece una pintura de Mondrian… y lo que hace es imprimir “Piet”.

    Piet

    Su nombre viene de Piet Mondrian, un pintor abstracto.
    Y por supuesto, también tiene su programa de 99 botellas de cerveza.

    1269

  8. Por supuesto, se tiene que mencionar el LOLCODE, basado en los Lolcatz. Este es un hello world escrito en LOLCODE.
       1: HAI
       2: CAN HAS STDIO?
       3: VISIBLE "HAI WORLD!"
       4: KTHXBYE [8]

    531257569_e405cb8660 524925307_5a372d5dd3

  9. Así como el primer lenguaje de programación no fue una computadora, la primer computadora no era … err.. una computadora como hoy las conocemos. Vamos ni siquiera era una máquina. La primer noción de la palabra computadora viene del siglo 17, que significa precisamente, “aquel que computa. Una computadora pues era, una persona que computaba, que hacia cálculos.
  10. Para finalizar, el programa de las 99 botellas de cerveza, en perl:
       1: ''=~(        '(?{'        .('`'        |'%')        .('['        ^'-')

       2: .('`'        |'!')        .('`'        |',')        .'"'.        '\\$'

       3: .'=='        .('['        ^'+')        .('`'        |'/')        .('['

       4: ^'+')        .'||'        .(';'        &'=')        .(';'        &'=')

       5: .';-'        .'-'.        '\\$'        .'=;'        .('['        ^'(')

       6: .('['        ^'.')        .('`'        |'"')        .('!'        ^'+')

       7: '_\\{'      .'(\\$'      .';=('.      '\\$=|'      ."\|".(      '`'^'.'

       8: (('`')|    '/').').'    .'\\"'.+(    '{'^'[').    ('`'|'"')    .('`'|'/'

       9: '['^'/')  .('['^'/').  ('`'|',').(  '`'|('%')).  '\\".\\"'.(  '['^('(')).

      10: "'.('['^  '#').'!!--'  .'\\$=.\\"'  .('{'^'[').  ('`'|'/').(  '`'|"\&").(

      11: ^"\[").(  '`'|"\"").(  '`'|"\%").(  '`'|"\%").(  '['^(')')).  '\\").\\"'.

      12: '^'[').(  '`'|"\/").(  '`'|"\.").(  '{'^"\[").(  '['^"\/").(  '`'|"\(").(

      13: |"\%").(  '{'^"\[").(  '['^"\,").(  '`'|"\!").(  '`'|"\,").(  '`'|(',')).

      14: "\\}'.+(  '['^"\+").(  '['^"\)").(  '`'|"\)").(  '`'|"\.").(  '['^('/')).

      15: ,\\",'.(  '{'^('[')).  ('\\$;!').(  '!'^"\+").(  '{'^"\/").(  '`'|"\!").(

      16: |"\+").(  '`'|"\%").(  '{'^"\[").(  '`'|"\/").(  '`'|"\.").(  '`'|"\%").(

      17: ^"\[").(  '`'|"\$").(  '`'|"\/").(  '['^"\,").(  '`'|('.')).  ','.(('{')^

      18: ).("\["^  '+').("\`"|  '!').("\["^  '(').("\["^  '(').("\{"^  '[').("\`"|

      19: ).("\["^  '/').("\{"^  '[').("\`"|  '!').("\["^  ')').("\`"|  '/').("\["^

      20: ).("\`"|  '.').("\`"|  '$')."\,".(  '!'^('+')).  '\\",_,\\"'  .'!'.("\!"^

      21: ).("\!"^  '+').'\\"'.  ('['^',').(  '`'|"\(").(  '`'|"\)").(  '`'|"\,").(

      22: |('%')).  '++\\$="})'  );$:=('.')^  '~';$~='@'|  '(';$^=')'^  '[';$/='`';

Guerra de lenguajes? Irrelevante

Cual es mejor? Php o Ruby? Java o C#? Python o Perl? La respuesta definitiva es: No importa.

Me resulta muy divertido como la mitad del Internet se puede resumir en discusiones irrelevantes como esta. (La otra mitad se dedica a otra cosa). Lo dudas? Mira esta tabla:

búsqueda en Google Numero de resultados
Php sucks 286,000
Perl sucks 298,000
Java sucks 139,000
C# sucks 248,000
You suck 10,300,000

Tal vez decir “la mitad” fue una exageración, pero aun así, litros y litros de tinta se han escrito sobre si tal o cual lenguaje es mejor o porque java apesta o porque Php es un lenguaje de juguete. Pero todas esas discusiones están respondiendo a la pregunta incorrecta:

¿Para que me sirve ese lenguaje?

Un lenguaje de programación no es mas que una herramienta para lograr un fin. Así como puedo escribir un CRM en ensamblador o en bash, si eres lo suficientemente masoquista, también puedes escribir un script para shell en C#. O en cobol. O en whitespace.

Dadas las suficientes herramientas, cualquier lenguaje es capaz de cualquier cosa. La diferencia es el esfuerzo necesario para lograrlo.

¿Que quiero decir con todo esto?

Conoce tu lenguaje.

Y no me refiero a que te aprendas todos los namespaces o clases o funciones del lenguaje, sino que aprendas los conceptos que son posibles con el lenguaje y que entiendas para que sirve.

En especifico:

  1. Paradigma: Es procedural? OOP? Funcional? Lógico?
  2. Acepta programación funcional (aunque no sea lenguaje puramente funcional)?
  3. Es compilado o interpretado?
  4. Es tipado o no tipado?
  5. Es estáticamente tipado cada expresión tiene un tipo)  o dinámicamente tipado (solo los valores tienen tipo)?
  6. Es fuertemente tipado (no puedes convertir un valor sin un cast) o es débilmente tipado (se puede convertir el tipo dinámicamente)?
  7. Es latentemente tipado (no es necesario escribir la declaración de tipo) o manifiestamente tipado (debes explícitamente declarar el tipo)?
  8. Es nominalmente tipado o estructuralmente tipado (similar al duck typing)?

Tu sabes a que categoría pertenece tu lenguaje de preferencia?

Para que me sirve esto (a parte de la cultura general)? 
Para crear código mas eficiente, o para hacernos la vida mas fácil.

Por ejemplo:

Si necesitas hacer un programa que recibe datos del usuario, un lenguaje fuertemente tipado hace mas fácil la programación en cuanto a seguridad, ya que si el dato que recibes, no concuerda con el dato que esperas, simplemente lanzas una excepción. En comparación, si tu lenguaje es dinámicamente tipado tienes que hacer comprobaciones extras. Sin embargo en el segundo ejemplo es mas fácil de programarlo y en muchas menos líneas de código, ya que te ahorras toda la conversión de tipos.

Caso especifico: Quieres construir una cadena de SQL y no sabes que campos usaras y tampoco los tipos de estos campos (por ejemplo, si quieres construir tu ORM). En un lenguaje latente, dinámico y débilmente tipado (como Php, por ejemplo), es un trabajo sumamente sencillo . En un lenguaje como Java que es prácticamente todo lo contrario, se requieren líneas y líneas de definiciones de tipos, casts y otras cosas. Y a mas líneas de código, mas posibilidad de errores y dificultad de mantenimiento.

O tocando el punto de los lenguajes funcionales. En un lenguaje funcional (o que acepta programación funcional) típicamente se pueden escribir funciones con mucho menos líneas de código.

Por ejemplo, estas dos funciones en Python son equivalentes:

   1: target = [] # create empty list
   2: for item in source_list: # iterate over each thing in source
   3:    trans1 = G(item) # transform the item with the G() function
   4:    trans2 = F(trans1) # second transform with the F() function
   5:    target.append(trans2) # add transformed item to target
   1: compose2 = lambda F, G: lambda x: F(G(x))
   2: target = map(compose2(F,G), source_list)

Tal vez la segunda función parezca mas complicada, para aquellos expertos en programación funcional, les parecerá de lo mas sencillo. Y justamente ese es el objetivo.

Volviendo al punto, y concluyendo. No importa que lenguajes uses: Aprende a usarlo. Y si vas a discutir por cual es el mejor o por cual tiene la declaración de tipos mas grande[jeje], por lo menos conocelo bien a fondo. Así por lo menos las discusiones irán mas allá del típico “java sucks”.

 

Detengan la locura de AJAX

Con la llegada de AJAX, el desarrollo de internet dio un avance gigantesco. Las compañias s se empezaron a interesar de nuevo por el web y el internet.

Sin duda, AJAX is a good thing®. Hoy si no usas AJAX en tus desarrrollos, no estas en la ola del web 2.0 (yuck!). Pero ahora yo les pido: Por favor, detengan la locura.

Como siempre, en mexico, somos los ultimos en enterarnos de la tecnologia y como siempre los PHB (o sea, tu jefe) son los ultimos de los ultimos en enterarse. Leyeron en un articulo del periodico reforma que AJAX era lo ultimo, lo nuevo, lo "IN" y te empiezan a pedir que todo lo que hagas, sea lo que sea, tenga AJAX.

Tu link va a cambiar de color? Hazlo con ajax. Tu pagina es solamente informativa? No importa, que cambie los textos con AJAX (aunque esto rompa tu posicion en buscadores). Vas a tomarte un cafe? Que sea con dos de azucar y un poco de AJAX.

AJAX (como en el siglo pasado fueron los frames [jeje!]) es solo una herramienta. Con ella se pueden crear aplicaciones interactivas y altamente usables, pero como todo, tiene su lugar y su momento. Aprende bien para que sirve (actualizar contenido del servidor dinamicamente, no mas, no menos) y no te dejes llevar por la "moda" (o por tu jefe) y aprende a usar las herramientas que tienes a la mano. Hay veces que una simple liga o un boton normal es lo correcto, no sobrecompliques el diseño solo por que asi te lo requieren aunque no tenga mucho sentido.

Yo soy un gran fanatico de las nuevas tecnologias y soy gran fan de Ajax. Pero por favor, ayuden a detener esta locura. Ignora aquellos que, como solo conocen los martillos, todos los problemas les parecen clavos.

Fibonacci en una linea

Hoy leo en 3monkeyweb una especie de reto en donde con una linea de perl se escriben los primeros 20 numeros de la serie de fibonacci. El reto es escribir el programa mas pequeño en el lenguaje que tu desees.

Para las 3 personas que no saben que es esa serie, en terminos mundanos, es una serie de numeros en la que el siguiente numero es la suma de los dos anteriores, empezando con los numeros cero y uno.

Es decir, los primeros 7 numeros serian

0,1,1,2,3,5

Yo quiero hacer mi contribucion a la ciencia (jeje!), solo por diversion.

El lenguaje que yo escogi es Javascript, porque a traves de la historia ha sido terriblemente vilpendiado pero hoy gracias a Ajax y otras monerias, esta tomando un segundo aire. Y porque ademas, para los gustos no hacen falta razones.

Tengo 2 versiones, una de 52 y una de 53 caracteres, ambas no recursivas.

p=1;for(k=0;k<4182;){document.write(k);t=p;p+=k;k=t}

k=0;p=1;while(k<4182){document.write(k);t=p;p+=k;k=t}

Ambos programas imprimen lo siguiente:

 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181

Si quieren una con salto de linea, agreguenle 2 caracteres a ambas (cambiando document.write a document.writeln).

Pueden hacer una version mas pequeña? O quieren compartir la suya? Quien lo intenta en Java? :P

Se aceptan sugerencias y comentarios.

Le mando pingback a Michoacano y a B3co que se que gustan de estos temas :)

Update:

Gracias a las ideas de b3co y de derkeNuke!

Con sus dos propuestas se pueden llegar a 47 caracteres
for(k=0,p=1;k<7!;t=p,p+=k,k=t)document.writeln(k)

No es que vayamos a salvar al mundo con estos ejercicios. Solo por diversion y por no dejar que la mente se nos atrofie :P

Usabilidad: Arte y ciencia

En los ultimos tiempos el termino “usabilidad” esta en boca de todos los informaticos. Los sistemas no solo deben ya funcionar y funcionar bien, sino deben de ser sencillos de usar para los usuarios finales.   El tema en el area de informatica ha tomado fuerza desde hace relativamente poco tiempo. A principios de este siglo es cuando se empiezan a dar los trabajos mas fuertes sobre el tema. Sin embargo hay pocos estudios sobre el tema que es ademas, bastante subjetivo.

Es muy comun escuchar las frases “yo creo” y “yo siento” cuando se habla de usabilidad. En resumen, todos somos expertos.

Por eso es refrescante leer trabajos como los de Alex Faaborg, quien trabaja en el area de Experiencia de Usuario para mozilla, especificamente en Firefox 3.

En este post suyo (Diseño cuantitativo), Alex nos explica lo que se esta haciendo en terminos de usabilidad para el siguiente release de Firefox 3. Despues de leer la entrada, nos damos cuenta de todo el trabajo que hay detras en la interfaz de Firefox.

Nos podemos dar cuenta que la eleccion de los elementos de la interfaz de Firefox no esta decidida al azar ni esta asi porque a un desarrollador se le ocurrio o creyo que asi debian ser las cosas.

De esa entrada yo rescato varios tips para el analisis de diseños de interfaces.

  1. Lo que los usuarios tecnicamente mas avanzados quieren y necesitan no es necesariamente lo que quieren los usuarios normales. De hecho, lo mas probable es que si tu como programador quieres una cosa, el usuario quiera otra completamente distinta.
  2. Las estadisticas son tu mejor aliado, pero no son la unica fuente de informacion.
  3. Existen herramientas de simulacion de usuarios que pueden ayudarnos a definir la mejor interfaz para el usuario. CogTool es solo una de ellas.
  4. NO PUEDES PREGUNTAR A LOS USUARIOS QUE ES LO QUE QUIEREN. La pongo en mayusculas y negritas porque es un error MUY comun en el diseño en general. La mayoria de las veces los usuarios no saben lo que quieren (o como diria House, todos mienten). Y aun si saben lo que quieren la mayoria de las veces no tendran los conocimientos tecnicos para decidir lo que es posibleo y lo que no. Los usuarios no son fuente confiable de informacion para la decision en el desarrollo de interfaces.

Se ha realizado mucho trabajo en cuanto a la usabilidad en los sistemas informaticos, pero hay aun mucho por hacer. La usabilidad es un arte pero mas que nada una ciencia y como tal, si quieres ser un experto en ella, debes capacitarte y aprender de los que han realizdo un trabajo serio en la materia.

Si te interesa el tema te dejo unos links en los que puedes obtener mas informacion al respecto.

The center for universal design: http://www.design.ncsu.edu/cud/

Jakob Nielsen, guru de Usabilidadhttp://www.useit.com/

Guias de experiencia de usuario de Windows Vista: http://msdn2.microsoft.com/en-us/library/aa511258.aspx

Gnome Human Interfaces Guidelines: http://developer.gnome.org/projects/gup/hig/

KDE usability project: http://usability.kde.org/

Google Feed Api y The Daily show

Ya todos saben que Google libero su Api para el uso de Feeds. Entre sus caracteristicas, es que con ella puedes darle la vuelta a la restriccion de ajax que no permite acceder a datos que no se encuentren dentro del mismo dominio (Same origin policy).

Pues decidi probar el api para resolver un problema real. Soy un fan declarado de The Daily Show y de Colbert Report. Se pueden conseguir los mejores clips de ellos en YouTube, pero hay que estarlos buscando. En mexico tambien se puede ver tambien una version reducida semanal a traves de CNN International, por Sky. Tambien existe la fuente original. Es posible verlos a traves del sitio de Comedy Central. Desgraciadamente, para ello tienes que chutarte la infame interfaz que se llama Motherload. Es una interfaz en flash que hace inusable el sitio en la mitad de las maquinas ademas que es pesadisimo.

Pues bien, gracias a el api de google, y usando el RSS que provee comedy central hice un mashup que trae los ultimos videos publicados en ambos feeds (el de Colbert y el de TDS) y los muestra en un listado simple. La lista de videos es traida directamente del feed via ajax y el video cargado via javascript.

Lo pueden ver aqui:

http://www.masio.com.mx/feedapi/

(alerta, no tiene diseño, solo es el listado simple y limpio)

El script me tomo 20 minutos producirlo. El api es limpio y sencillo, aunque puedo decir que es un poco limitado, pero para empezar esta muy bien.

Los videos se muestran usando la interfaz que provee comedy central, para evitar algun problema de copyright ;). Hice otra version que no es publica que accede directamente al flv y usa una interfaz mas amigable que la que provee Comedy Central. Esa talvez la muestre despues , si a alguien le interesa.

Visual Studio Orcas Beta1 – Download

Para aquellos que les interese, Microsoft acaba de lanzar la beta 1 de su Visual Studio Codename Orcas.

Lo pueden bajar de aqui
http://www.microsoft.com/downloads/details.aspx?familyid=36b6609e-6f3d-40f4-8c7d-ad111679d8dc&displaylang=en&tm

Es una imagen de Virtual PC, con password, solo disponible en ingles y japones.
Por si lo necesitan y les da flojera leer…
Username: Administrator
Password: P2ssw0rd