2007/01/25

23 Insanely Great Years!!!


Here's to the Crazy Ones,
The Misfits,
The Rebels,
The Troublemakers,
The Round Pegs in the Square Holes,
The Ones Who See Things Differently.
They're not fond of rules and they have no respect for the statu quo.
You can quote them, disagree with them,
Glorify or villify them...
But the only thing that you can't do is ignore them.
Because they change things.
They push the human race forward.
And while some may see them as the crazy ones,
We see genius.
Because the people who are crazy enough to think that they can change the World
Are the ones ones who do.


Ayer, día 24, se cumplieron 23 años desde que un ridículo pletórico Steve Jobs presentó la nueva línea de computadoras personales de la compañía de la manzanita: el Macintosh.
A muchos os podrá parecer una gran mierda y, qué diablos, lo es en comparación a lo que estamos acostumbrados, pero fue un hito en el avance hacia lo que hoy conocemos como PC y toda la vida digital actual, empezando por esas maravillosas interfaces de usuario que petan cada tres por cuatro hacen las delicias de los usuarios que no sabrían usar un intérprete de comandos ni en mil años de aprendizaje.

Cabe reseñar que el Macintosh presentado en el 84 fue la primera computadora personal con una voz estúpida para dejar flipada a la audiencia un sistema de interfaz gráfica y un dispositivo apuntador denominado ratón. Una puta mierda Un juguetito, lo llamaron algunos, como algunos llaman a los Apple actuales. Puede que un juguete pero no sólo eso: el tiempo ha demostrado que las ideas de Jef Raskin, que pretendía hacer llegar la tecnología de la computación al ciudadano de a pie dando un paso adelante combinando una sencilla interfaz gráfica con un equipo de bajo coste, han dado resultado, sobre todo con la plataforma PC+Windows con la que competiría años después la firma de Cupertino.
Muchos os dirán que el mérito en realidad es de Xerox, pero... lo cierto es que el proyecto de Jef Raskin en que más tarde se fijaría Steve Jobs es anterior a las visitas de los ingenieros de Apple a las instalaciones de Xerox en Palo Alto, para cuando el proyecto inicial ya tenía una base lo suficientemente atractiva como para que el actual CEO y gurú de los macarios se apropiase del liderazgo del proyecto. Además, quienes finalmente apostaron por crear un producto, refinarlo y llevarlo a los ciudadanos fue Apple. Puede parecer una apuesta sencilla hoy día, pero en un mundo reticente al cambio, realmente fue una odisea.



He comenzado esta entrada con una transcripción del anuncio de Think Different ya que me parecía muy apropiada como homenaje al grupo de desarrollo del proyecto Macintosh (y que figuran en parte en la foto de cabecera). Porque ellos fueron unos rebeldes con revolucionarias ideas. Porque ellos apostaron por hacer llegar el poder, su poder, a la gente, y dotaron al mundo de una gran herramienta con la que poder desarrollar nuestras ideas de una forma intuitiva y que se iría refinando y perfeccionando con el tiempo. Porque 23 años después los elementos que introdujo el Macintosh son fundamentales en todos y cada uno de los ordenadores personales del mundo.

Porque, en verdad, el mirar al pasado y detenerse en estos hitos nos hace darnos cuenta de que, pase lo que pase, pese a los errores de nuestros dirigentes, pese a las rencillas y las regresiones, pese a las dificultades y los engaños, la humanidad avanza. Y si la humanidad avanza es por la conjunción de la visión de estos genios que, viviendo en su mundo, han sabido pensar en todos nosotros y han luchado por ello, y los ciudadanos que saben aprovechar las posibilidades que les brindan para desarrollarse y dar un paso hacia delante.
¡¡¡Ah, y porque tengo un MacBook que me encanta!!!

En fin, espero que con este texto os hayáis detenido por unos instantes para ver por qué 1984 no fue como "1984".

Saludos y quemad vuestras localidades en las celebraciones ;)


¡Aprobados!

¡¡¡APROBADOS!!! Todos los miembros de este grupo, aunque a la espera de saber la nota final, estamos ya, a día de hoy, y en contra de la opinión de los muchos aquéllos que han pensado y pregonado a viva voz y cuatro vientos que no hacíamos más que dormir y ver pornografía (por el mero hecho de disfrutar del séptimo arte y el instinto más primario de forma concurrente) en nuestros infectos cubiles, estamos rotunda y sobradamente aprobados.


Mucha “gente” (por llamarla de alguna manera) se ha dirigido a nosotros preguntando cuál era nuestro secreto y cómo conseguimos sacarnos de encima esta asignatura de una forma tan plenamente satisfactoria para todos los integrantes del grupo.

Es obvio que no es una cuestión para la que exista una única respuesta y, menos aún, que ésta pueda ser aplicada de forma universal. Así y todo, y reuniendo las pocas fuerzas que nos restan en esta época de exámenes previa a la de los suicidios, hemos hecho un esfuerzo nada desdeñable por satisfacer las demandas del populacho que nos ama tan incondicionalmente.



En primer lugar y, como es costumbre en el buen comunicador, comenzando por la parte inaugural de la asignatura, debemos agradecer nuestro éxito a la hora de entender y emplear el paradigma de programación declarativa al amigo que figura en la imagen a la siniestra del párrafo. Mr. Tentacles se puso en contacto con nosotros y nos ofreció una total colaboración. Mr. T, como le gusta que le llamen, ha resultado ser una persona tremendamente amable, pese a ese aspecto desaliñado que presenta, que ha prestado una decisiva colaboración pues dice presentamos muchas posibilidades y se ve en la obligación de estimular nuestro intelecto para el día de mañana. También es una persona muy persuasiva que os hará ver siempre las cosas desde el prisma adecuado.

Nuestro siguiente consejo es que acudáis siempre a las tutorías. Nosotros éramos muy reticentes hasta que conocimos a Alfred. Alfred nos enseñó que las apariencias engañan y que tras la apariencia de un profesor al que no se le entiende nada y que explica como si todos fuesen ingenieros superiores, se esconde un alma con vocación docente cuya razón de ser es transmitir sus amplios conocimientos. Así, fuimos acompañados de nuestro entrañable y nada acomplejado, pese a sus evidentes problemas de acné, amigo al despacho de Moreno. Moreno reconoció a Alfred en el acto, se ve que ya le había dado clases antes, y se mostró mucho más cooperante de lo que jamás habríamos imaginado en nuestros sueños… Aunque lo cierto es que, por alguna razón, no acabamos de recordar los detalles sobre lo hablado en el despacho…


Con Fran vino la creación de este blog nuestro que es Degeneración Funcional. Para que un blog sea exitoso se requieren altas dosis de humor unidas con un inigualable sentido del estilo y la propiedad. Para adquirir una fluidez y profundidad extremas en esta hermosa lengua que es la castellana, así como para empaparnos con el buen hacer del más grande de los comunicadores, recomendamos sin ningún lugar a dudas la lectura del imprescindible “Un Libro” de Marlo Brando, un grande entre los grandes. Encontraréis que su cuidada elaboración y su diestro y sin parangón manejo del OpenOffice os abrirán las puertas a todo un nuevo Universo de palabras y palabrotas que dejarán la impronta de un genio en todos vuestros escritos.


Finalmente, con los trabajos sobre los lenguajes de programación, nos encontramos con la tremenda dificultad que entraña el distinguir entre la información fiable y la paja que se puede encontrar por Internet. Lo mejor es que no busquéis acudáis a una Biblioteca de verdad y empleéis libros de consulta de autores contrastados. No encontraréis nada bueno en Internet que no sea este blog. Así que nuestra solución fue sencilla. Si no podíamos buscar información fidedigna que nos ayudase a aprobar, buscaríamos la felicidad. Y en esto ha sido de incalculable valor el refranero popular. Todos saben que el dinero no da la felicidad, pero ayuda. Y ésa era la respuesta a nuestras plegarias. Decidimos exponerle a Fran nuestro punto de vista sobre la influencia del “dinerito” en la evaluación de los lenguajes de programación y enunciamos, asimismo, la Teoría de las Superdivisas, que intenta interconectar todo lo sucedido en el mundo con ese poderoso caballero que es Don Dinero. Fran se mostró muy receptivo hacia el dinero y nos dio el visto bueno sin dilación y sin querer conocer más detalles.


Así que todos vosotros, pecadores, que habéis caído en una espiral de comezón mental y desesperación sin consuelo, tened fe, pues en el Sentido del Humor que predicó nuestro señor el Gran Degenerado Funcional, se encuentra la verdad. Intentad llevarlo lo mejor que podáis y no abandonéis (salvo que ya llevéis cinco matrículas, caso en que deberíais ir pensando en abandonar la carrera, lo digo en serio…).

Por nuestra parte, damos por concluida la relación entre Degeneración Funcional y la asignatura de Lenguajes de Programación y, tras comunicar nuestro aprobado y nuestros consejos, os rogamos que dejéis de poneros en contacto con nosotros para organizar ese macabro atentado en el cuarto piso de la Facultad. No obstante, agradeceríamos que, como gesto de buena voluntad, lo hicieseis antes o después de las revisiones y con previa antelación para poder disfrutar del espectáculo con palomitas y refrescos dejéis de enviar esas amenazas anónimas hacia Moreno y hagáis caso a vuestra vocecita interior que de seguro os pide que vayáis a cenar abandonéis ese camino de violencia y destrucción que en realidad os está destrozando.
Concluiremos esta ya larga entrada con el siguiente anuncio:


Degeneración Funcional se desvincula de la asignatura de LPR pero va a seguir existiendo. Intentaremos ir subiendo entradas y dar contenido de forma general con nuestro generalizado (aunque ausente por desgracia en las últimas entradas relacionadas con la asignatura) divertido punto de vista sobre todo aquello que rodea a nuestro mundo, especialmente ese delicioso pastel que es la vida Geek sobre el que realmente nos consolamos de nuestras desgraciadas y asquerosas vidas. Seguidnos de forma asidua porque… ¡¡¡VAMOS A COMERNOS INTERNET!!!


Despidiéndonos por fin, damos por terminado este extenso comunicado pidiéndoos que colaboréis y toméis parte activa del desarrollo de la Teoría de las Superdivisas con desinteresadas donaciones. No os lo penséis, es por el desarrollo de la ciencia, el avance de la humanidad, y una buena causa ^_^

¡Cargad vuestros ratones y ajustad el puntero de mira!


2007/01/12

Abstracción Funcional en Java

En Java, se entiende la abstracción funcional dentro del propio modelo de orientación a objetos, de forma que el hecho de modelar los problemas reales mediante el uso de sus propiedades de abstracción, polimorfismo, herencia y encapsulamiento, da como resultado una propia abstracción funcional en que, efectivamente, se pueden emplear clases y llamar a métodos sin necesidad de conocer cómo realizan las tareas o cómo se comportan dichas clases o métodos.

Puesto que un objeto se compone de una identidad, un estado y un comportamiento, nos interesa a la hora de explicar la abstracción funcional, principalmente su comportamiento. Este comportamiento viene dado por los métodos definidos en la clase del objeto y estos métodos no son más que secciones de código autocontenidas que pueden recibir parámetros de entada y ofrecer una salida, lo que de por sí es la piedra angular de la abstracción funcional. En Java, los métodos no han de ser prototipados, aunque si es el caso de una interfaz o clase abstracta, su cometido es precisamente realizar prototipados de funciones que han de implementar otras clases que hereden o implementen esa interfaz. Asimismo, Java soporta la sobrecarga de métodos (aunque no la de operadores), es decir, métodos con distintas implementaciones según los parámetros que reciben. Así, la definición de un método en Java consiste en indicar un conjunto de modificadores, el nombre del método y, entre paréntesis, el tipo y nombre de cada uno de los argumentos que recibe. El modificador void indica que el método se comporta como un procedimiento. El paso de los parámetros para tipos simples es por valor, mientras que para los objetos es por referencia.
No se pueden declarar métodos dentro de métodos, sólo pueden formar parte directa de una clase, aunque una clase sí que puede tener clases definidas en su propia definición.

Pero para entender por completo la abstracción funcional, debe comprenderse también la comunicación entre objetos, pues un objeto debe poder acceder a los métodos de otro objeto. Para ello, se utiliza una comunicación entre objetos mediante mensajes. Estos mensajes deben corresponderse con métodos definidos en la interfaz del objeto que recibe el mensaje.
Cuando se realiza una llamada a un método desde un objeto, éste queda a la espera de que el método finalice. Una vez finalizado, el objeto continúa con su ejecución. El objeto que realiza la invocación de un método de otro objeto sólo conoce la interfaz de dicho método y su funcionalidad asociada, pero no cómo la realiza.

Sin embargo, este mecanismo requiere que para poder invocar un método, exista previamente el objeto (para recibir el mensaje). Esto no es siempre necesario y a veces puede resultar inadecuado. Para dar mayor flexibilidad al lenguaje, en Java existe un modificador para métodos y atributos static. En el caso de los atributos, este modificador provoca que el valor de estos atributos sea almacenado a nivel de clase y no de objeto, es decir, el valor en un momento determinado es el mismo para todas las instancias de un objeto. En el caso de los métodos, este modificador implica que puede ser invocado sin necesidad de que exista un objeto de esta clase, es decir, el receptor del mensaje es la clase en sí, no el objeto. Esto se debe que una clase no solo modela cómo deben ser los objetos, sino que puede mantener información global sobre sí misma o sus instancias y puede, a su vez, ser receptora de mensajes. Los métodos estáticos son invocados empleando para referenciar el método el nombre de la clase en vez de un nombre de instancia (por ejemplo, es el caso del método que da salida por consola System.out.println).
Por lo tanto, es lógico pensar, como así ocurre, que un método estático sólo puede acceder a variables estáticas. Asimismo, un método estático sólo puede invocar a métodos que también sean estáticos.

Hasta ahora hemos hablado siempre de objetos que invocaban a métodos de otros objetos o clases mediante el envío de mensajes, pero? ¿y cómo comienza la ejecución?
Bien, cuando se inicia la ejecución de un programa, el sistema localiza y ejecuta el método llamado main. Este debe presentar los siguientes modificadores: public, static, void, de forma que quedaría: public static void main(String args[]){ }
El parámetro cadena args es el único argumento que puede aceptar el método principal y, además ha de ser siempre un String []. Este argumento representa los parámetros que se pasan al ejecutar la aplicación (por ejemplo, al lanzarlo en el prompt de una consola del sistema).
Una vez dentro de éste método principal, el comportamiento es el anteriormente explicado de invocaciones mediante mensajes.

Además de los mecanismos ya mencionados, Java permite el encadenamiento de mensajes, de forma que el resultado de una invocación se puede utilizar como objeto receptor de una segunda invocación.
Por ejemplo: String cad = cad1.concat(cad2).concat(cad3);
Esta línea de código implicaría que se mandase un mensaje al objeto cad1 para invocar al método concat con cad2 como argumento. El objeto cad1 devuelve una referencia a un nuevo objeto de tipo String con el resultado de la concatenación. A este objeto resultante se le envía un mensaje para invocar al método concat con el cad3 como argumento, de forma que se obtiene una referencia a un nuevo objeto resultante de tipo String que contiene el resultado de esta última concatenación y, por tanto, la concatenación completa, que se asigna a la variable cadena.
De forma similar, existe el mecanismo de composición de mensajes, mediante el cual, el resultado de una invocación se emplea como argumento de la invocación de otro método.
Por ejemplo: String cad = cad1.concat( cad2.concat(cad3) );
El resultado final es el mismo pero la secuencia de acciones es diferente: primeramente se envía un mensaje a cad2 para invocar al método concat pasando cad3 como argumento. Así, el resultado devuelto es una referencia a un nuevo objeto String que contiene el resultado de la concatenación de cad2 y cad3. Ahora, esta referencia es pasada como argumento de la invocación de concat enviada al objeto cad1, obteniendo como resultado una referencia al resultado de la concatenación final, que se asigna a la variable cadena.

La recursividad en Java existe y funciona de forma muy sencilla: se invoca el método siguiendo el mismo mecanismo de mensajes, guardando las variables locales del método en la pila, guardando copias locales de los parámetros en la pila y guardando la dirección de retorno también en la pila.

Es interesante, además, para el concepto de abstracción funcional, conocer el uso de los paquetes (packages) en Java. Los paquetes no son más que librerías que contienen clases y/o interfaces para ser empleadas. Son unidades de software que pueden ser distribuidas de forma independiente y, también, ser combinadas con otros paquetes para desarrollar nuevas aplicaciones. Además de clases e interfaces, los paquetes pueden contener otros paquetes, y todo tipo de archivos con recursos adicionales (como ficheros de texto o de imágenes)
El contenido de un paquete puede ser empleado de dos formas diferentes: o bien se importa mediante la sentencia import, o bien, calificar el nombre del recurso incluyendo el nombre completo del paquete en que se encuentra. Hay que tener en cuenta que sólo los elementos declarados como públicos pueden ser accedidos desde fuera del paquete.

Bibliografía:

Abstracción funcional en Pascal

La abstracción funcional es una característica fundamental dentro de la programación estructurada, que nos permite trabajar de forma mucho más efectiva y eficiente con nuestro código, permitiendo su reciclaje con unas nociones básicas o incluso nulas del mismo. Para ello procuramos encerrar información de forma que no se tenga en cuenta el código escrito que estamos utilizando sino simplemente el resultado obtenido tras su ejecución. Pascal realiza la abstracción funcional mediante los módulos, que pueden ser procedimientos o funciones.

Un procedimiento es simplemente un trozo de código al que se le asigna un nombre, que se emplea en el programa para hacer una llamada que se encarga de ejecutarlo. Una función también encierra un trozo de código, pero al final del mismo se ejecuta una sentencia que devuelve un valor, que será el valor de la función (cuyo tipo viene especificado en la cabecera de la misma). De esta forma se tratan a las funciones como datos y solo se efectúan las llamadas cuando proceda un dato del tipo de la función.

Para trabajar con el resto del programa, los módulos tienen una serie de parámetros de entrada. Estos son variables definidas fuera del propio módulo y sobre los que este efectúa una serie de operaciones. Pueden pasarse estos datos de entrada de dos maneras: por valor y por referencia. La primera forma no modifica la variable en el programa fuera del propio módulo, solo toma su valor. La segunda toma la dirección de memoria en la que se almacena la variable que se le pasa y trabaja con ella ahí, de tal forma que si el procedimiento o función la modifica, esa variable quedará también modificada en el programa principal. Las propias funciones pueden ser a su vez parámetros de otros módulos (siempre y cuando se hayan definido previamente, o se emplee el forward en su declaración).

El uso de procedimientos y funciones, permite a Pascal el uso de la recursividad. Al tratar con las variables de forma interna y ajena al resto del programa, una función puede ejecutarse a si misma un número determinado de veces y a continuación volver atrás sobre si misma para obtener un resultado final.