Noticias Weblogs Foros Wiki Código
Sponsors:

Meta-Info

¿Que es?

Planeta Código es un agregador de weblogs sobre programación y desarrollo en castellano. Si eres lector te permite seguirlos de modo cómodo en esta misma página o mediante el fichero de subscripción.

rss subscripción

Sponsors

Anunciarse aquí

PlanetaCódigo en inglés

Puedes utilizar las siguientes imagenes para enlazar PlanetaCodigo:
planetacodigo

planetacodigo

Si tienes un weblog de programación y quieres ser añadido aquí, envíame un email solicitándolo.

Idea: Juanjo Navarro

Diseño: Albin

La magia del Smalltalk: Capítulo 4 - ¿Qué es el compilador? ¡Un objeto!

Julio 29th, 2005 - [Enlace local]

¿Recuerdan que dijimos, al menos unas 278 veces, que en Smalltalk todo es un objeto?

Eso nos vale para contestar a casi cualquier pregunta: ¿Qué es la paz? ¿Qué es el amor? ¿Qué es Dios? ¿Qué es la nada? ¡Todos son objetos! :-)

No puedo decir nada sobre la paz, el amor, Dios o la nada así que mejor hablo de un tipo de objeto que conozco un poco mejor: Compiler.

El compilador de Smalltalk está escrito en Smalltalk. Además de los clásicos problemas de bootstrapping de los lenguajes escritos en si mismo, esto permite un gran poder dentro del ambiente.

Se pueden hacer desde cosas muy simples como evaluar código Smalltalk y procesar el resultado:

Compiler evaluate: ‘5 factorial’

A cosas un poco más bonitas como especializar el compilador para determinadas clases del ambiente. Veamos un ejemplo: Supongamos que queremos hacer un Prolog dentro de nuestro Smalltalk. Podríamos escribir un compilador específico para la sintaxis de Prolog y decirle al Smalltalk que determinadas clases (las herencias de una clase en particular) usen otro compilador y no el default.

Para eso simplemente (¿?) tenemos que escribir el compilador de Prolog, y en la clase que servirá de superclase para las cosas en Prolog, especificamos nuestro compilador:

Prolog>>compilerClass
“Answer a compiler class appropriate for source methods of this class.”
^ PrologCompiler

Les dejo un paper muy bueno que habla del compilador de Smalltalk (en Squeak y VisualWorks): The Hitch Hiker’s Guide to the Smalltalk Compiler

¡A jugar con el compilador!

» Leer más, comentarios, etc...

La magia del Smalltalk: Capítulo 3 - ¿Cuanto? ¿Facto qué?

Julio 29th, 2005 - [Enlace local]

¿Tienen una idea del pedazo de número que es el factorial de 1000?




Uhhh, perdón… Primero lo primero: ¿Tienen una idea que es el factorial? :-)




Rápidamente les recuerdo que el factorial de un número N






n



! = 1 × 2 × 3 × … × (



n



-1) ×



n


El factorial de 0, por convención, es 1. El factorial de 1 es 1, el factorial de 2 es 1×2, el factorial de 3 es 1×2x3, el factorial de 4 es 1×2x3×4, etc.




Ahora pensemos un segundo: ¿Cuanto será el factorial de 1000? Es un número monstruoso de grande. Usemos nuestro Smalltalk para experimentar un poco.




1000 factorial.


El factorial de 1000 es, según mi squeak:




402387260077093773543702433923003985719374864210714632543799910429938

512398629020592044208486969404800479988610197196058631666872994808558

901323829669944590997424504087073759918823627727188732519779505950995

276120874975462497043601418278094646496291056393887437886487337119181

045825783647849977012476632889835955735432513185323958463075557409114

262417474349347553428646576611667797396668820291207379143853719588249

808126867838374559731746136085379534524221586593201928090878297308431

392844403281231558611036976801357304216168747609675871348312025478589

320767169132448426236131412508780208000261683151027341827977704784635

868170164365024153691398281264810213092761244896359928705114964975419

909342221566832572080821333186116811553615836546984046708975602900950

537616475847728421889679646244945160765353408198901385442487984959953

319101723355556602139450399736280750137837615307127761926849034352625

200015888535147331611702103968175921510907788019393178114194545257223

865541461062892187960223838971476088506276862967146674697562911234082

439208160153780889893964518263243671616762179168909779911903754031274

622289988005195444414282012187361745992642956581746628302955570299024

324153181617210465832036786906117260158783520751516284225540265170483

304226143974286933061690897968482590125458327168226458066526769958652

682272807075781391858178889652208164348344825993266043367660176999612

831860788386150279465955131156552036093988180612138558600301435694527

224206344631797460594682573103790084024432438465657245014402821885252

470935190620929023136493273497565513958720559654228749774011413346962

715422845862377387538230483865688976461927383814900140767310446640259

899490222221765904339901886018566526485061799702356193897017860040811

889729918311021171229845901641921068884387121855646124960798722908519

296819372388642614839657382291123125024186649353143970137428531926649

875337218940694281434118520158014123344828015051399694290153483077644

569099073152433278288269864602789864321139083506217095002597389863554

277196742822248757586765752344220207573630569498825087968928162753848

863396909959826280956121450994871701244516461260379029309120889086942

028510640182154399457156805941872748998094254742173582401063677404595

741785160829230135358081840096996372524230560855903700624271243416909

004153690105933983835777939410970027753472000000000000000000000000000

000000000000000000000000000000000000000000000000000000000000000000000

000000000000000000000000000000000000000000000000000000000000000000000

000000000000000000000000000000000000000000000000000000000000000000000

000000000000000


Ufff… voy a tener que confiar en Squeak y creerle que ese número es el resultado. Para validar un poco la respuesta, voy a usar algo del poco conocimiento que me dio la escuela secundaria, y voy a usar la propiedad de los factoriales que dice que:





N! / (N-1)! = N


Entonces evaluamos en Smalltalk:




1000 factorial / 999 factorial.


Y con un poquito de suerte nos debería contestar 1000.




Volviendo al número monstruoso anterior: creo que no hace falta aclarar que ese número no cabe en un entero ni de 16, ni de 32, ni de 64 bits. Para el manejo de enteros tenemos 3 clases:





SmallInteger: para enteros que entren en 31 bits.


LargePositiveInteger: para enteros positivos que no entren en 30 bits.


LargeNegativeInteger: como la anterior, pero para negativos.




Todas tienen como superclase a Integer, que es la clase abstracta para todas las implementaciones de enteros. Justamente en Integer es donde encontramos la implementación de #factorial. Es decir: el algoritmo para calcular factoriales de número chicos, o de número grandes, es el mismo.







Algunos ejercicios más con factoriales:








¿Cuántos dígitos tiene el factorial de 1000?





1000 factorial asString size
-> 2568






¿Cuánto tiempo tarda mi Squeak en calcular el factorial de 1000?





Time millisecondsToRun: [1000 factorial]
-> 12





Sí, es verdad, el factorial de 1000 tarda en calcular 12 milisegundos en mi máquina… Si no lo creen, prueben ustedes mismos.




¿Cuánto tiempo tarda en calcular el factorial de 1000 el lenguaje de programación que están usando?

» Leer más, comentarios, etc...

Squeak de Small-Land versión 3.8 - Instalador para Windows

Julio 29th, 2005 - [Enlace local]

Germán Arduino acaba de anunciar, en la lista de correo de Small-Land, la liberación del instalador para el sistema operativo del lado oscuro (es decir, Windows).




Pide ayuda para hacer pruebas de instalación en diferentes entornos.




Pueden ver un screenshot del instalador y bajarlo desde: http://swiki.agro.uba.ar/small_land/7

» Leer más, comentarios, etc...

El arte de programar

Ejecutar una variable

Julio 28th, 2005 - [Enlace local]

Tal como se lee puede parecer algo un tanto extraño. Todo el mundo que programa usa las variables para leer o introducir datos en ellas (aunque a veces lo que se esta haciendo por debajo es realmente llamar a una función). El caso es que el C, y por extensión el C++ (ignoro si el C# tiene esta caracteristica) puede crear punteros a funciones. Estos punteros, como el resto, son una variable que contiene una dirección de memoria; sin embargo, su uso normal es asignarle el nombre de una función en vez de una variable, tal que así:

typedef unsigned int (*funcion)(const char *);
funcion pepe;
pepe=strlen;
printf("Longitud de hola:%d\n",pepe("hola"));


Pero que pasaría si en vez de asignarle una función le asignamos una variable? Pues
que el contenido de esa variable lo ejecutaría. Por supuesto, la variable no puede tener cualquier contenido; los bytes que contendría deberían ser codigo maquina. Por ejemplo el siguiente código en ensamblador:

MOV EAX,9
RET


traducido a codigo máquina del intel x86 sería:

B8 09 00 00 00
C3


Por lo que si ejecutamos las siguientes lineas:

typedef unsigned int (*funcion)(void);
funcion pepe;
unsigned char juan[]={0xb8,9,0,0,0,0xc3};
pepe=(unsigned int (*)(void))(void*)juan;
printf("Es un 9?:%d\n",pepe());


Lo que hemos hecho es llamar a una dirección de memoria que contenia una ristra de bytes, los cuales son significativos para el microprocesador. En el ejemplo hemos asignado al registro EAX (registro que almacena siempre lo que devuelve una función) el número 9 y a continuación ejecutamos un RET para retornar de la llamada de la función. Así hemos simulado una llamada a una función tal y como lo habría hecho el compilador, pudiendo incluso modificar el código (el contenido de la variable) en tiempo de ejecución sin problemas de violaciones de memoria o similares. Este código funciona tanto en Linux como en Windows siempre que sea un micro intel x86, aunque se puede usar en un motorola, power pc, o lo que querais siempre que conozcais el
lenguaje maquina del micro.

Este artículo dará pie a otro mucho más avanzado sobre como lograr que un programa original pueda acceder a un web service sin que otros se aprovechen de esa información (si usar contraseñas ni nada parecido).

» Leer más, comentarios, etc...

Ya se puede descargar la Beta 1 de Windows Vista

Julio 27th, 2005 - [Enlace local]

Hace apenas algo más de una hora, Microsoft ha puesto a disposición de los subscriptores de la MSDN la Beta 1 de Windows Longhorn, de nuevo nombre Windows Vista, así como el SDK correspondiente. Así que, adelante, machotes. Yo ya estoy en dandole caña al MFTM, que por cierto, va de pena.

También ha actualizado algunas páginas web con más información, y Paul Thurrot ha llenado su site con pantallazos del programa.

  • Home de Windows Vista
  • Para programadores
  • Pantallazos de Paul Thurrott
  • » Leer más, comentarios, etc...

    Blog de Diego Gómez Deck

    La magia del Smalltalk: Capítulo 2 - ¿IDE? no gracias

    Julio 27th, 2005 - [Enlace local]

    Es muy difícil mostrar las diferencias que tiene Smalltalk con los lenguajes de programación “tradicionales�.

    Una de las cosas que cuesta trabajo ver es la diferencia que implica el hecho que Smalltalk sea un ambiente. Un ambiente de Smalltalk no es un nuevo tipo de IDE (Integrated Development Environment). En Smalltalk los objetos sobreviven al hecho de salir del Smalltalk. Todos los objetos que tengamos instanciados son grabados, en el estado exacto que están, al disco rígido en el momento de grabar la imagen (se llama imagen porque queda en el disco una imagen de la memoria de la máquina).

    Este hecho nos expone a ciertas características que ni soñamos cuando usamos lenguajes con el clásico ciclo de desarrollo: vi/emacs > compilar > ejecutar el código > depurar > vi/emacs. Los nuevos IDEs (como el Eclipse) disimulan ese ciclo, pero no lo mejoran.

    La diferencia fundamental es que, en Smalltalk, los objetos están siempre “vivos�, y no mueren cuando uno tiene que escribir código. Este implica, entre otras cosas, que los objetos sobreviven a los cambios en las clases.

    Una de las primeras cosas que suelo mostrar cuando explico Smalltalk es lo siguiente:



    Este simple ejercicio muestra una característica fundamental de la programación con Smalltalk. Ahora imaginemos que salimos (grabando) del Squeak después del segundo paso, que nos vamos de vacaciones por 15 días, y que abrimos el Squeak y hacemos los otros 2 pasos.... ¿Qué es lo que ocurre? Nada. Sólo ocurrió que nuestro objeto (la única instancia de Customer) se "durmió" una siesta de 15 días esperando hasta que lo despertemos (¡Al mejor estilo de Walt Disney!).

    De hecho, en cualquier Squeak actual, hay objetos que llevan casi 30 años instanciados (desde el Smalltalk/76).

    » Leer más, comentarios, etc...

    Blog de Diego Gómez Deck

    La magia del Smalltalk: Capítulo 2 - ¿IDE? no gracias

    Julio 27th, 2005 - [Enlace local]

    Es muy difícil mostrar las diferencias que tiene Smalltalk con los lenguajes de programación “tradicionales�.

    Una de las cosas que cuesta trabajo ver es la diferencia que implica el hecho que Smalltalk sea un ambiente. Un ambiente de Smalltalk no es un nuevo tipo de IDE (Integrated Development Environment). En Smalltalk los objetos sobreviven al hecho de salir del Smalltalk. Todos los objetos que tengamos instanciados son grabados, en el estado exacto que están, al disco rígido en el momento de grabar la imagen (se llama imagen porque queda en el disco una imagen de la memoria de la máquina).

    Este hecho nos expone a ciertas características que ni soñamos cuando usamos lenguajes con el clásico ciclo de desarrollo: vi/emacs > compilar > ejecutar el código > depurar > vi/emacs. Los nuevos IDEs (como el Eclipse) disimulan ese ciclo, pero no lo mejoran.

    La diferencia fundamental es que, en Smalltalk, los objetos están siempre “vivos�, y no mueren cuando uno tiene que escribir código. Este implica, entre otras cosas, que los objetos sobreviven a los cambios en las clases.

    Una de las primeras cosas que suelo mostrar cuando explico Smalltalk es lo siguiente:



    Este simple ejercicio muestra una característica fundamental de la programación con Smalltalk. Ahora imaginemos que salimos (grabando) del Squeak después del segundo paso, que nos vamos de vacaciones por 15 días, y que abrimos el Squeak y hacemos los otros 2 pasos.... ¿Qué es lo que ocurre? Nada. Sólo ocurrió que nuestro objeto (la única instancia de Customer) se "durmió" una siesta de 15 días esperando hasta que lo despertemos (¡Al mejor estilo de Walt Disney!).

    De hecho, en cualquier Squeak actual, hay objetos que llevan casi 30 años instanciados (desde el Smalltalk/76).

    » Leer más, comentarios, etc...

    PDFs sobre Squeak en Castellano

    Julio 27th, 2005 - [Enlace local]

    Con esta complicada búsqueda en google podemos ver todos los PDFs, en Castellano que hablen de Squeak.

    Especialmente les recomiendo: http://dewey.uab.es/pmarques/pdigital/simo/adriana.pdf

    ¿Quién dijo que no hay material sobre Squeak?

    ¡A leer!

    » Leer más, comentarios, etc...

    Intentional Programming

    Julio 26th, 2005 - [Enlace local]

    Siguiendo con mis reflexiones anteriores, y siguiendo buscando por ahí he encontrado esto. La idea me parece genial: básicamente, describir todos los elementos de un programa de forma abstracta y con un identificador único, como la repesentación intermedia que hace un compilador, y lo representa como una base de datos… La cuestión es que casai todos los lenguajes tienen la misma estructura, por lo que sería fácil trabajar con la «estructura» de un programa en vez de como su «representación» en algún lenguaje de programación. Es lo que Microsoft llama (o llamaba) «Intentional Programming», que seguramente quedó eclipsada por la tecnología .Net. Sin embargo, la idea es genial. ¿Por qué no puedo manipular la base de datos (árbol) de una aplicación, para, por ejemplo, encontrar todas las funciones que utilizan una variable, etc.? ¿Alguien sabe dónde quedó esto?

    Buscando por ahí, he encontrado el artículo original de Charles Simonyi, comentarios de otro weblogger, y la sempiterna definición de la Wikipedia. Incluso un revelador vídeo. En algún momento le debieron dedicar bastante esfuerzo a esto, ya que este vídeo promocional me suena a los que muestran en las reuniones de Microsoft a desarrolladores.

    Actualización: Ejem… Debería haber buscado más, ya que Simonyi fundó su propia empresa, Intentional Software, cómo no, y hasta tiene un muy buen weblog corporativo, muy de moda últimamente, además de que te da la idea de qué empresas son, digamos, más dinámicas, en el que te enteras que ahí está trabajando el autor de NEdit, un editor muy bien acogido por los programadores. Parece una tontería esto de los weblogs, pero puede servir para algo. :)

    » Leer más, comentarios, etc...

    Ya hay fecha para la beta 1 de Longhorn

    Julio 22nd, 2005 - [Enlace local]

    Ya hay fecha para el lanzamiento de la beta 1 de Longhorn, dedicada a programadores y a profesionales de IT. La fecha de lanzamiento de Windows Vista (pues así se va a llamar el nuevo sistema operativo) será el 3 de agosto. Para más datos, ver aquí.
    Supongo que estará disponible para los subscriptores de la MSDN.

    » Leer más, comentarios, etc...

    No me lo puedo creer.

    Julio 22nd, 2005 - [Enlace local]

    Yo , de verdad, que he visto gente ‘chapu’, pero es que no queda otro remedio que hacer las cosas…

    » Leer más, comentarios, etc...

    Nueva distribucion GNU/Linux: Ragnarok

    Julio 22nd, 2005 - [Enlace local]

    Ragnarok es un proyecto personal de mi amigo NeCuDeCo, que nacio partir de su labor en las instalaciones de la red telematica de la UNT.

    Esta Distro esta basada en Gentoo. De momento solo existen versiones para Intel 686 e Intel P4.

    Con esta distribucion se pretende cubrir el area de desarrollo profesional, y mas no el area de ofimatica, Ragnarok viene en 4 versiones:

    De momento, solo esta disponible la version de Developer. Al no contar todavia con hosting para la ISO, Ragnarok de momento solo esta disponible para Peru y mas especificamente Trujillo. Si alguien quiere brindar un hosting por favor comunicarse con necudeco_en_gmail_com o con juanperojas_en_gmail_com.

    Aquí algunos screen shots.

    » Leer más, comentarios, etc...

    Métricas Web

    IBM interesada en Harmony

    Julio 22nd, 2005 - [Enlace local]

    Según news.com desde la semana pasada un empleado de IBM ha comenzado a colaborar en el proyecto Harmony.

    Por ahora esta persona sólo colaborará en tareas de diseño de la arquitectura aunque parece claro que IBM colabarará con código también (quizá sacado de su propia implementación de Java).

    También se da el hecho de que uno de los impulsores del proyecto Harmony es Geir Magnusson (también participa en el proyecto Geronimo) que pertenece a la empresa Gluecode recientemente adquirida por IBM.

    En la lista de correo de Harmony ya hay bastantes reacciones a este anuncio, la más destacable es el interes para saber si IBM tiene sus propias bibliotecas de clases para no utilizar las GNU Classpath cuya licencia no es compatible con la de la ASF.

    Noticia original


    » Leer más, comentarios, etc...

    La magia del Smalltalk: Capítulo 1 - ¡No entiendo nada!

    Julio 22nd, 2005 - [Enlace local]

    Creo que ya habrá quedado claro (del Capítulo 0) que en Smalltalk todo es un objeto, y que toda la computación se realiza enviando mensajes a los objetos.




    Pero, ¿qué sucede cuando le enviamos un mensaje a un objeto?.




    Lo que ocurre es que la máquina virtual busca algún método que pueda activar para resolver el mensaje. La búsqueda empieza por la clase del objeto receptor (o la instancia misma, dependiendo del sabor de Smalltalk) y, de no encontrar un método, continua buscando hasta la clase “root” que suele ser Object (o ProtoObject en Smalltalk más modernos).




    Hasta ahora no es muy diferente a lo que ocurre en los lenguajes “tradicionales” orientados a objetos (como Java, C++, C#, etc).




    ¿Qué ocurre cuando no hay un método que sirva para resolver el envío del mensaje? Ocurre que la máquina virtual activa el método #doesNotUnderstand: que, al estar implementado en Object (o en ProtoObject), está siempre disponible para ser evaluado con un objeto de clase Message como parámetro.




    En el objeto de clase Message podemos saber el nombre y los parámetros del mensaje original.




    El comentario en Object>>doesNotUnderstand: dice:







    “Handle the fact that there was an attempt to send the given message to the receiver but the receiver does not understand this message (typically sent from the machine when a message is sent to the receiver and no method is defined for that selector)”







    Veamos un ejemplo. Imaginemos un objeto de clase ClaseMágica que tiene implementado el método #doesNotUnderstand: de la siguiente forma:

    ClaseMágica>>doesNotUnderstand:



    aMessage










    “The answer is 42″





    ^

    42


    Eso hará que cualquier mensaje enviado a las instancias de ClaseMágica (y subclases) respondan siempre 42 como resultado.




    El ejemplo anterior es muy simple y no es demasiado útil (al menos que creamos que la respuesta para todo es 42), pero miremos un ejemplo un poquito más útil:

     
    Proxy>>doesNotUnderstand: 
    
    
    
    aMessage
    
     






    “delegate the message to the receiver’s target”







    Transcript

    show:

    target

    asString ,

    ‘ is going to receive the message ‘

    ,

    aMessage

    asString; cr.

        ^ 
    
    target
    
    
    perform: aMessage selector
    withArguments: aMessage arguments
      
    Lo interesante de este ejemplo es que instancias de clase Proxy pueden hacer de proxy (valga la redundancia) a objetos de cualquier clase. En lenguajes de “early binding” (como el Java, C++, C#, etc) habría que crear una clase de Proxy para cada clase de objeto que queramos envolver y mantenerlas sincronizadas.




    Otro ejemplo de uso de DNU (#doesNotUndestand:) lo pueden encontrar en mi paquete de ODBC para Squeak, específicamente en la clase ODBCRow. Este truco permite que las filas de una consulta SQL respondan a mensajes con el nombre de las columnas que genera la consulta, es decir: Si se ejecuta una consulta SQL tipo
    SELECT firstName, lastName FROM Customer
    , las filas sabrán responder a los mensajes #firstName y #lastName.




    También usé este truco en el paquete rST (Remote Smalltalk) para los proxies que delegan los mensajes desde un Smalltalk a otro.




    Si se quedaron con ganas de ver más, miren las clases ObjectTracer y ObjectViewer en sus respectivos Squeak.

    » Leer más, comentarios, etc...

    ¿Qué tiene que ver la fontanería con la informática?

    Julio 21st, 2005 - [Enlace local]

    Tengo un portátil HP modelo zd7395ea, que ya no aparece en la web de hp; es un Pentium 4 Hyperthreading a 3,4 GHz, 1 GB de RAM y 100GB de disco duro, amén de lo típico: lector de tarjetas, wireless, grabadora de DVD dual, s0porte mulitmedia completo (las pelis se ven y se oyen mejor en ese portátil que en la tele), y una pantalla de 1440×900 y 17 pulgadas panorámico. Vamos, un “portátil de escritorio”.
    Pero tiene un problema muy grave: se calienta como un demonio hasta el punto de que si lleva un rato encendido y la mesa es de madera o hay algún tipo de mantel, cuando éste se calienta, el equipo se apaga para protegerse. Y es una jodienda porque lo hace en el momento más inoportuno, sin avisar y con premeditación y alevosía. Por lo demás es un gran ordenador, y da gusto leer en esa pantalla.
    A la vista del problema, el que escribe, ni corto ni perezoso, se ha inventado un “soporte elevador” realizado con elementos de fontanería.
    El elevador puesto en la mesa
    Varilla roscada de métrica 6 y unas cuantas tuercas, cinco reductores de PVC de 50 a 40 es todo el material necesario. Un taladro, unos alicates universales, una sierra de cortar hierro y una broca del 7 para metal son las herramientas. Y aproximadamente una hora el tiempo de construcción. Y el precio es de risa: 3,35 euros. Para más detalles, las fotos.
    El soporte colocado sobre el portátil
    Por cierto, e ido al manicomio pero no me quieren.
    ;-)

    » Leer más, comentarios, etc...

    La magia del Smalltalk: Capítulo 0

    Julio 20th, 2005 - [Enlace local]

    Voy a probar suerte con una serie de artículo que cuenten las cosas que me sorprendieron de Smalltalk cuando empecé a aprenderlo. Esto NO pretende ser un curso de Smalltalk ni mucho menos, sólo pretendo divertirme un poco mostrando las cosas “raras”, “locas” o “esotéricas” del Smalltalk.




    Esta serie de artículos podría bien llamarse:
    “Pruebe esto en su lenguaje de preferencia”
    .




    Como este es el capítulo 0, no esperen gran cosa… es sólo el “concept” ;-)







    Al ruedo:






    Objeto/Mensaje:






    Lo primero, y más importante, es que en Smalltalk todo es un objeto y toda la computación se hace enviando mensajes a los objetos. Cuando digo “todo” no me refiero a ese “todo, pero…” al que estamos acostumbrados los programadores.




    Para dejarme de tanto rollo, voy a dar ejemplos concretos de cosas que son Objeto/Mensaje en Smalltalk y que no suelen serlo en los lenguajes llamados “Orientados a Objetos”. Las clases, el true, el false, el nil, el compilador, los métodos, el debuger, los contextos de activación de los métodos, los números, los arrays, etc.












    El comportamiento (aka el “código”) es un Objeto.






    Como decía antes, todo es un objeto. Por ejemplo: el comportamiento (mal llamado “código”) también es un objeto. Tenemos 2 tipos de comportamiento: Los métodos y los bloques. Los métodos son objetos que la clases tienen (claro, también las clases son objetos). Los bloques son comportamiento creados con un literal que el compilador conoce: los corchetes. Sentencias Smalltalk encerradas entre corchetes se convierten en un objeto de clase BlockContext. ¿Para que sirve eso?, sirve para lo que sirven todos los objetos: para enviarles mensajes. A los objetos Bloque se les puede enviar el mensaje #value que lo activará ejecutando el comportamiento que contenga.












    ¿Estructuras de control? - No, gracias.






    1 > 3 ifTrue: [ Transcript show: ‘Verdadero, che!!!!’ ]


    Pues sí, adivinaste… las llamadas “estructuras de control” de los lenguajes tradicionales, que suelen ocupar apartados especiales en los libros, no son más que mensajes en Smalltalk. Se puede aprender mucho viendo la implementación en las clases Boolean, True y False de los métodos #ifTrue:, #ifFalse:, #ifTrue:ifFalse:, #ifFalse:ifTrue:, etc.







    [ unStream atEnd ] whileFalse: [ Transcript show: unStream next asString; cr ]


    Para ver un poco estos mensajes, ver la implementación de #whileTrue, #whileFalse, #whileTrue:, #whileFalse:, etc en la clase BlockContext (la clase de los bloques de código).












    ¿Bucles? - No, gracias.






    Una de las razones principales para usar bucles en los lenguajes tradicionales es para procesar colecciones. Distintos lenguajes usan diferentes idioms para iterar colecciones… tenemos desde cosas muy básicas como un FOR desde 1 al tamaño del Array hasta cosas un poco menos primitivas como los Iteradores de Java o de la STL de C++.




    ¿Cómo se procesa una colección en Smalltalk? Pues sí, adivinaste de nuevo… con un mensaje. En este caso el mensaje es #do:.




    unaColeccion do: [:each | Transcript show: each asString; cr ]


    La colección recibe el mensaje #do: con un bloque como parámetro y es responsable de evaluar dicho bloque por cada elemento que contenga. Lo más importante en este ejemplo es que nosotros no tenemos ni la más mínima idea de que tipo de colección es unaColeccion, pero no lo necesitamos saber ya que ella sabrá cual es la mejor forma de iterarse a si misma.




    El idiom de #do: no termina con las colecciones, sino que cualquier cosa que se pueda recorrer lo podremos hacer con #do:. Por ejemplo: Los Streams, de esa forma reescribimos el ejemplo anterior de unStream:




    unStream do: [:each | Transcript show: each asString; cr ]


    Como verán, para iterar una colección o un stream usamos el mismo mensaje… es decir que podemos intercambiar, en cualquier momento, una colección por un stream… o una colección por otro tipo de colección… o una colección por cualquier objeto que sepa responder a #do:.







    FINAL DEL CAPÃ?TULO 0.







    Les prometo que los próximos artículos serán más entretenidos.

    » Leer más, comentarios, etc...

    código escrito

    Nomenclatura de identificadores

    Julio 18th, 2005 - [Enlace local]

    Una de las cosas a las que siempre he dado bastante importancia programando es a tener cuidado con los nombres que doy a los identificadores. Imagino que habrá quien declare una variable y le ponga el primer nombre que le...

    » Leer más, comentarios, etc...

    Presentando a Python - Programación de aplicaciones GUI (visuales) en Python

    Julio 15th, 2005 - [Enlace local]

    Python es muy utilizado como un lenguaje para crear aplicaciones de consola o scripts pero con Python se puede

    hacer mucho más, por ejemplo, desarrollar aplicaciones visuales complejas.

    ¿Cómo se hace esto? De varias formas…

    Primero os listo las bibliotecas gráficas que se pueden utilizar con Python:

    PyQT - Bindings para QT. Una buena opción ahora

    que las qt son completamente GPL para windows.

    PyGTK - Bindings para las GTK+

    WxPython - Bindings para las WxWindows. Es la más portable de todas ya que

    la finalidad de las WxWindows es la portabilidad. Si la aplicación que desarrollemos se ejecuta en Windows

    utilizará las ventanas nativas de windows si lo hacemos en Linux usará las GTK. Para wxPython tenemos Wax que es una capa de abstracción.

    TkInter - La interfaz para TK de Python. Son las bibliotecas

    gráficas que vienen "de serie" con Python. Derivadas de las tkinter existen las tix que son una extensión con más funcionalidades.

    Como podemos ver en Python podemos utilizar multitud de bibliotecas gráficas, ya es elección de cada uno elegir las

    que más le guste.

    Ahora os preguntaréis ¿Y con qué GUI-IDE podemos diseñar los interfaces?

    Para las PyQT:

    Si queréis trabajar con pyqt podéis utilizar el qt

    designer. Los ficheros ui generados por el qt designer pueden ser convertidos a ficheros .py utilizando pyuic

    que va incluido en las pyqt-tools. Una

    vez generados los interfaces sólo os falta conectar los botones y eventos con vuestras funciones.

    Para las PyGTK:

    Podéis utilizar Glade, a diferencia de las pyqt los ficheros generados por

    glade (.glade) no se convierten a ficheros python (.py) sino que se utiliza libglade. Al igual que en qt el resto es simplemente conectar

    botones y eventos con funciones.

    Para las WxWindows:

    Tenemos el excelente Boa Constructor que es una maravilla,

    porque, por ejemplo, para conectar botones o eventos con funciones lo puedes hacer desde el propio ide sin

    necesidad de teclar código. Es lo más parecido que puedes encontrar a Delphi o Visual Basic.

    Otra alternativa también muy buena es la combinación WxGlade + SPE. WxGlade es un diseñador de interfaces al estilo de Glade y SPE

    es un ide para python que se puede integrar con WxGlade para el desarrollo GUI.

    Por último, tenemos PythonCard que nos permite desarrollar

    aplicaciones sencillas en poco tiempo.

    Para TkInter:

    Desconozco si existe alguna herramienta para generar interfaces.

    Si queréis realizar programas multiplataforma os recomiendo utilizar WxWindows con Boa Constructor. Es lo más práctico y rápido. WxGlade con SPE también es otra opción bastante aceptable. Aquí tenéis un ejemplo de una aplicación desarrollada con Boa.

    Si queréis realizar programas destinados sólo a Linux, os recomiendo PyGTK con Glade y libglade, además podéis utilizar las gnome-python que es una interfaz de la gnome-libs (además incluyen las pygtk).

    Para saber más sobre el desarrollo GUI podéis consultar el Wiki de Python: GUI

    Programming.

    » Leer más, comentarios, etc...

    GPS en Squeak

    Julio 14th, 2005 - [Enlace local]

    En los últimos días estuve trabajando en un proyecto de los que más me gusta hacer: Conectar dispositivos a Squeak. Tengo a medio hacer el manejo y programación de robots Lego Mindstorms, y terminé hace un tiempo el soporte para dispositivos de vídeo desde Squeak (como el fabuloso microscopio de Intel).




    Pueden ver algo de información, como así también bajarse una versión preliminar, desde el Swiki de Squeak.




    Así se ve el GPS morf cuando está conectado:










    Y así cuando está desconectado:







    Y este es el vocabulario para hacer guiones de eToys usando la información que nos brinda el GPS:










    Ahora ya tienen la excusa que necesitaban para comprarse un GPS.




    ¡Qué lo disfruten!

    » Leer más, comentarios, etc...

    Presentando a Python. El lenguaje en sí.

    Julio 13th, 2005 - [Enlace local]

    En este primer post de mi serie sobre Python os describiré las características que me parecen más relevantes de este lenguaje. (Aclarar que estos post no van a ser un tutorial sobre Python, simplemente voy a hablar de las posibilidades que tiene el lenguaje y comentar componentes o aplicaciones para explotar dichas posibilidades. Al final de los post pondré enlaces a los mejores tutoriales para empezar con python).

    Python es es un lenguaje interpretado, interactivo y orientado a objetos. Así es como describen a Python en su web oficial pero Python es algo más que eso:

    Python es:

    Otras características de Python son:

    - Independiente del paradigma: Se puede utilizar programación imperativa, orientada a objetos o funcional (también se pueden combinar).

    - Manejo de excepciones, con la posibilidad de crear tus propias excepciones.

    - Gran conjunto de TADs. Pilas, colas, árboles, listas.

    - Biblioteca de funciones y clases extensísima. Basta navegar por la ayuda de Python o buscar por la red.

    - Consola interactiva: Útil para probar código.

    - Gratuito

    Aquí tenéis una lista de organizaciones y empresas que usan Python (Yahoo, Google, NASA, ILM). Es usado mayoritariamente como lenguaje de scripting aunque, por ejemplo, el instalador de Red Hat está hecho con Python.

    También desde aquí podéis descargar un script Python hecho por la gente de Google para su herramienta Google Sitemaps.

    Para terminar un ejemplo de lo que se puede hacer con Python. Una aplicación P2P cliente/servidor en tan sólo 15 líneas de código. Dejo para otro post explicaros cómo está hecha porque a priori es complejo entender cómo está hecha para los que no conozcan Python.

    Si queréis saber por qué bautizaron al lenguaje como Python podéis consultar este artículo que escribí hace tiempo.

    » Leer más, comentarios, etc...

    Libro gratis sobre XML

    Julio 11th, 2005 - [Enlace local]

    En unas de esas preguntas que hice al tio google :P , esta vez sobre XML, ya que estoy investigando sobre este tema para MonoBlog :) , encontré un libro escrito por Aaron Skonnard y Martin Gudgin, que por el contenido se ve muy interesante.

    Capítulos del libro:

    1. XML 1.0 and Namespaces
    2. Document Type Definitions
    3. XPath 1.0
    4. XPointer, XInclude and XML Base
    5. XSL Transformations 1.0
    6. SAX 2.0
    7. DOM Level 2
    8. XML Schema Datatypes
    9. XML Schema Structures
    10. SOAP 1.1

    Disfruten aquí :D

    » Leer más, comentarios, etc...

    Presentando a Python

    Julio 11th, 2005 - [Enlace local]

    Python es un lenguaje de programación del que todo el mundo ha oido
    hablar y con el que mucha gente ha experimentado pero
    la verdad es que este lenguaje no está siendo muy utilizado en entornos
    de producción debido al desconocimiento de las posiblidades que ofrece
    por parte de las empresas de desarrollo (muchas veces debido a que no
    hay una empresa haciendo marketing tras el como puede ser SUN con el
    lenguaje Java o Microsoft(R) con .Net).

    Voy a publicar una serie de post titulados "Presentando a Python" en
    los que hablaré de las virtudes de este lenguaje y las posibilidades
    que tiene a la hora de ser utilizado para el desarrollo software en diversos ámbitos.

    El orden de los post será el siguiente:

    Presentando a Python - El lenguaje en sí

    Presentando a Python - Programación de aplicaciones GUI (visuales) en Python

    Presentando a Python - Programación de aplicaciones web en Python

    Presentando a Python - Python en otras plataformas (.NET y Java)

    Presentando a Python - Librerías y herramientas para Python


    » Leer más, comentarios, etc...

    The Pragmatic Programmer

    Julio 10th, 2005 - [Enlace local]

    Hay libros que se convierten en clásicos nada más publicarse, este libro fue publicado en 2000 y ya es un clásico, también estoy seguro que dentro de 10 años seguirá estando tan vigente como hoy. En la primera línea resume el contenido del resto: “Este libro te ayudará a convertirte en un mejor programador”.
    El libro no engaña en ningún momento, en él se explica de una forma amena y agradable conceptos sobre el desarrollo de aplicaciones que aunque pueden parecer evidentes para un programador experimentado, nunca como ahora habían sido recogidos en un libro.
    El libro cubre conceptos sobre programación, cómo usar y construir herramientas, pruebas, refactoring, documentación, etc…

    » Leer más, comentarios, etc...

    Null Pointer Exception

    Nos hacemos mayores

    Julio 8th, 2005 - [Enlace local]

    Pues eso, que asi sin darme cuenta hoy cumplo 30 tacos y no quería dejar pasar la ocasión para dejar constancia de tan señalada efemérides.

    Después de dos duros meses de estudio y exámenes que todavía no han acabado (aunque lo peor ya ha pasado) este fin de semana me voy a tomar un más que merecido descanso para celebrar mi cumpleaños (si es que eso es motivo de celebración) y sobre todo que pasado mañana hace un añito que Vero y yo nos casamos (uff, todavía me acuerdo del viaje a Jamaica).

    Y después del descanso, a retomar unas cuantas cosas que tengo pendientes y a poner por aquí algunas cosas que me han venido a la cabeza en este periodo de reclusión mental ...

    » Leer más, comentarios, etc...

    error while loading shared libraries libXp.so.6

    Julio 8th, 2005 - [Enlace local]

    Si sois usuarios de Fedora 3 y os encontráis este error instalando Oracle, Mozilla o el Acrobat Reader:

    error while loading shared libraries: libXp.so.6: cannot open
    > shared object file: No such file or directory

    Tenéis que instalar el paquete xorg-x11-deprecated-libs, para ello basta con hacer desde un terminal lo siguiente:

    $ yum install xorg-x11-deprecated-libs

    Desde la versión 2 de Fedora se utilizan las X11 de X.org en vez de las XFree86



    » Leer más, comentarios, etc...