Translate

sábado, 15 de agosto de 2009

Rest con Restlet

Restlet es un framework que lleva el concepto de los servlet para generar servicios web. Si vamos a una definición de Rest (http://diegograf.blogspot.com/2009/08/una-alternativa-mas-simple-soap-en-lo.html) veremos que la idea principal es hacer servicios web simples.

La simpleza puede verse de quien consume el servicio web. Restlet hace simple el desarrollo de web services. Veamos un “hola Mundo” usando Restlet 2.0

1. package firstSteps;

2.

3. import org.restlet.resource.Get;

4. import org.restlet.resource.ServerResource;

5.

6. /**

7. * Resource which has only one representation.

8. *

9. */

10. public class HelloWorldResource extends ServerResource {

11.

12. @Get

13. public String represent() {

14. return "hello, world";

15. }

16.

17. }

Vemos que hemos creado un recurso el cual se va a publicar por medio del método GET. Ahora hagamos una aplicación:

1. package firstSteps;

2.

3. import org.restlet.Application;

4. import org.restlet.Restlet;

5. import org.restlet.routing.Router;

6.

7. public class FirstStepsApplication extends Application {

8.

9. /**

10. * Creates a root Restlet that will receive all incoming calls.

11. */

12. @Override

13. public Restlet createRoot() {

14. // Create a router Restlet that routes each call to a

15. // new instance of HelloWorldResource.

16. Router router = new Router(getContext());

17.

18. // Defines only one route

19. router.attach("/hello", HelloWorldResource.class);

20.

21. return router;

22. }

23. }

Como vemos creamos un router el cual es el encargado de publicar nuestro servicio web. Ahora configuramos el contexto para que cuando le enviemos un pedido a una URL, nuestro servidor lo delegue al servlet de rest.

1. <?xml version="1.0" encoding="UTF-8"?>

2. <web-app id="WebApp_ID" version="2.4"

3. xmlns="http://java.sun.com/xml/ns/j2ee"

4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

5. xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee

6. http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

7. <display-name>first steps servlet</display-name>

8.

9. <context-param>

10. <param-name>org.restlet.application</param-name>

11. <param-value>

12. firstSteps.FirstStepsApplication

13. </param-value>

14. </context-param>

15.

16.

17. <servlet>

18. <servlet-name>RestletServlet

19. <servlet-class>

20. org.restlet.ext.servlet.ServerServlet

21. </servlet-class>

22. </servlet>

23.

24. <!-- Catch all requests -->

25. <servlet-mapping>

26. <servlet-name>RestletServlet</servlet-name>

27. <url-pattern>/*</url-pattern>

28. </servlet-mapping>

29. </web-app>

Bueno con eso estamos, mmm…

Todavía nos faltan los jars por suerte se pueden importar con maven. Dejo el link para configurar el repositorio de restlet http://www.restlet.org/downloads/maven

Si no podemos instalar los jars necesitamos 2 :

org.restlet.jar

org.restlet.ext.servlet_2.5.jar

Lo pueden bajar de http://www.restlet.org/downloads/2.0/restlet-jse-2.0m4.zip e instalar de esta forma :

mvn install:install-file -DgroupId=org.restlet -DartifactId= org.restlet -Dversion=2.0.0 -Dpackaging=jar -Dfile=dondeDejasteElJar/elJar.jar

mvn install:install-file -DgroupId=org.restlet -DartifactId= org.restlet.ext -Dversion=2.0.0 -Dpackaging=jar -Dfile=dondeDejasteElJar/elJar.jar

1. <dependency>

2. <groupId>org.restlet</groupId>

3. <artifactId>org.restlet</artifactId>

4. <version>2.0.0</version>

5. </dependency>

6. <dependency>

7. <groupId>org.restlet</groupId>

8. <artifactId>org.restlet.ext</artifactId>

9. <version>2.0.0</version>

10. </dependency>

Levanten el jetty o tomcat y luego http://127.0.0.1/contexto/ hello y hay esta nuestro servicio!!

domingo, 9 de agosto de 2009

¿Qué es OSGi?


Se preguntan ¿Qué es OSGi? y supongo que todos hemos usado eclipse alguna vez y con eclipse, equinox. Equinox es un contenedor OSGi implementado por eclipse.

Equinox, es el contenedor en donde viven los plugins, donde pueden convivir entre ellos y comunicarse con el core de eclipse.

Bueno en pocas palabras eso es OSGI, OSGi proporciona funciones más parecidas a un contenedor web, pero es más versatil. Un contenedor web (Tomcat) te permite cargar varias aplicaciones que trabajan de manera independiente. El aislamiento de las aplicaciones se logra a través de diferentes "class loaders" (cargadores de clases?). De esta forma, una aplicación queda aislada de los efectos de otras -ya que las clases son cargadas en memoria de manera independiente-. OSGi proporciona dicha función, pero no pone restricciones en las aplicaciones (no tienen que ser servlets o aplicaciones web). OSGi es más flexible. OSGi permite que aplicaciones cooperen con otras a través de interfaces declaradas en archivos de configuración. Así, por ejemplo, puedes cargar dos aplicaciones que comparten las mismas componentes comunes, sin que las clases se carguen independientemente en memoria pero sin que una afecte a la otra.

En otras palabras, OSGi te permite crear aplicaciones a partir de componentes. Estos componentes son cargados en distintos class loaders. Dos ( o mas componentes) pueden interactuar entre si únicamente a través de interfaces declaradas explícitamente en archivos de configuración (en xml).

OSGi te permite el cargar o descargar componentes. O cargar diferentes versiones de dos componentes y reemplazar los componentes existentes de manera dinámica. (Tal como Tomcat te permite el cargar y descargar una aplicación web, pero con mucha mayor flexibilidad)

OSGi es utilizado en teléfonos celulares y PDA; me parece que fue esta industria la que creo el concepto y las primeras especificaciones. El aislamiento proporcionado por OSGi permite que la falla en una aplicación o componente no afecte a las aplicaciones que no los usan.

Si has desarrollado plugins para Eclipse entonces ya te abras dado cuenta de que aporta OSGi. Netbeans usa un framework con funcionalidad similar, pero no es OSGi. Mientras que Eclipse esta basado en OSGi (por lo menos el kernel de Eclipse). Cabe mencionar que OSGi no tiene ninguna relación con desarrollo de IDEs o GUIs, pero que el concepto utilizado por Eclipse y/o Netbeans para cargar los plugins es similar a la funcionalidad proporcionada por OSGi.

OSGi también proporciona especificaciones para seguridad. (Por ejemplo, para cargar únicamente componentes que han sido firmados y verificados en su integridad).

Sin embargo, yo no he notado que se generalice el uso de OSGi. (Basta con buscar empleo con la palabra OSGi como termino de búsqueda para darse cuenta que aun no se usa mas que en ciertos nichos o en en algunos start-up).

OSGi es solo una especificación. Hay diferentes implementaciones. Wikipedia puede darte más información al respecto.

Existen varios frameworks OSGI como equinox, o apache felix. Ahí les dejo los links.



sábado, 8 de agosto de 2009

Maven para desmemoriados!!!

Normalmente usamos maven, pero normalmente no creamos un proyecto, no instalamos un jar o configuramos plugins, por esta razón nuestra memoria nos juega una mala pasada.

Para todos los no memoriosos dejo este link para recordar comandos en maven:

http://jcesarperez.blogspot.com/2009/08/chuleta-maven.html

miércoles, 5 de agosto de 2009

“El que sabe cuándo puede luchar y cuando no, saldrá victorioso.”

Como este blog también es para humanos, voy a hacer un post no informático.

Estoy leyendo un libro llamado “El arte de la guerra” es un libro escrito por Sun Tzu

El núcleo de la filosofía de Sun Tzu sobre la guerra descansa en estos dos principios:


Todo el Arte de la Guerra se basa en el engaño.
El supremo Arte de la Guerra es someter al enemigo sin luchar.

Dejo unos párrafos que me gustaron en demasía:

Así pues, los verdaderamente hábiles en la guerra someten al ejército enemigo sin batallar. Capturan las ciudades enemigas sin asaltarlas, y se apoderan del estado enemigo sin campañas prolongadas. Su meta es tomar intacto todo cuanto hay bajo el cielo, mediante consideraciones estratégicas. Como resultado, sus tropas no se desgastarán, y las ganancias serán completas. Este es el arte de la estrategia ofensiva.

En consecuencia, el arte de usar tropas es éste: Si se es diez veces superior al enemigo, rodeadle. Si se es cinco veces más fuerte, atacadle. Si se tiene el doble de fuerzas, divididle. Si se está a la par, superadle mediante un buen plan. Si se está en inferioridad numérica, sed capaces de mantener abierta una vía de retirada. Y si se está en desventaja en todos los aspectos, sed capaces de eludirle, pues una fuerza pequeña no es nada excepto botín para una más poderosa, si se enfrenta a ella temerariamente.

Por otra parte, hay cinco casos en los que puede predecirse la victoria:

  • El que sabe cuándo puede luchar y cuando no, saldrá victorioso.
  • El que comprende cómo luchar, de acuerdo con las fuerzas del adversario, saldrá victorioso.
  • Aquél cuyas filas estén unidas en un propósito, saldrá victorioso.
  • El que está bien preparado y descansa a la espera de un enemigo que no esté bien preparado, saldrá victorioso.
  • Aquel cuyos generales son capaces y no sufren interferencias por parte de su soberano, saldrá victorioso.

el comandante hábil toma una posición en la que no puede ser derrotado, y no pierde la oportunidad de vencer a su enemigo. Un ejército victorioso siempre busca batalla después de que sus planes le indiquen que la victoria es posible, mientras que un ejército destinado a la derrota lucha con la esperanza de vencer, pero sin ningún plan. Los que son expertos en la guerra cultivan sus políticas y se adhieren estrictamente a las reglas trazadas. De este modo, tienen en su poder el control de los acontecimientos.

Lo mejor de todo es que ustedes también pueden leerlo, una publicación en: http://www.gorinkai.com/textos/suntzu.htm

A medida que vaya adelantando en la lectura, comparto los que para mi son buenos parrafos.

Jetty no es para producción ?


Jetty es un servidor HTTP y un contenedor de Servlets escrito en Java. Jetty se publica como un proyecto de software libre bajo la licencia Apache 2.0.

Debido a su pequeño tamaño, Jetty se complementa para ofrecer servicios Web en una aplicación Java empotrada.

Jetty es una gran herramienta de desarrollo ya que configurando un plugin de maven podemos tener nuestras aplicaciones web listas para probar. En este link detalla como hacer esto: http://docs.codehaus.org/display/JETTY/Maven+Jetty+Plugin De esta forma al hacer mvn jetty:run va a levantarse el servidor jetty.

Pero este pequeño servidor puede usarse para producción?

Claro que SI !!!

Y si no me creen, lean este link: http://www.infoq.com/news/2009/08/google-chose-jetty en el que explica porque Google eligió a jetty como servidor para su servicio Google App Engine.

Y ustedes que utilizan como servidor web ?

martes, 4 de agosto de 2009

En los detalles esta el diablo

Hoy me apareció un cartel preguntando si deseaba actualizar la jre de java, bueno dale!
Sorprendido vi esto:


Claramente el Gigante rojo comenzó la fusión. Porque vean el logo de sun, no era azul?

Me estoy volviendo paranoico o de a poco se ve la compra ?

Que opinan? La compra de oracle afectara a java?


sábado, 1 de agosto de 2009

Super Saiayin, con el qi al maximo!!!!


Quien alguna vez no miro dragon ball z y se volvio loco cuando Goku aumentaba su ki para pelear contra vegeta o para transformarse en super saiayin?

El qì o ki es el término empleado para referirse a la bioenergía o energía biológica según la tradición de China y otros países de Extremo Oriente (Japón, Corea). De acuerdo a la medicina tradicional china, el qì es una energía que fluye naturalmente por la Naturaleza, y la interrupción de su libre flujo en el cuerpo es la base de los trastornos físicos y psicológicos.

Los practicantes de ciertas disciplinas afirman que el ser humano puede controlar y utilizar esta energía, a través de diversas técnicas, acrecentándola, acumulándola y distribuyéndola por todo el cuerpo o usarla en forma concentrada, como en el Tàijíquán, el Aikido u otras artes marciales. Otros afirman poder curar cierto número de enfermedades y otros efectos liberando el libre flujo del qì por el cuerpo humano. Éste es el caso de medicinas alternativas como el reiki, la acupuntura la digito puntura y de algunas disciplinas como el qìgōng.

Qi4j™ es una implementación de Composite Oriented Programming usando el java 5 como estándar.

Composite Oriented Programming está construido sobre principios que no están dirigidos por POO. Los principios son:

- Un objeto depende de su contexto (este problema hoy no lo resuelve POO)

- Modelos desacoplados son una virtud

- Reglas de negocio como prioridad

- Las clases murieron, Larga vida a las interfaces.

Un objeto depende de su contexto

Este concepto se pueden resumir en un ejemplo: yo en la facultad soy estudiante, en el trabajo soy empleado y así sustantivamente...

Es decir un objeto cambia según su contexto. El problema de la POO es que no está totalmente orientada a objeto sino es un modelo orientado a Clases. Es decir que hay objetos que dependiente del contexto, son de una o otra clase.

Modelos desacoplados son una virtud

Modelos desacoplados es lo más importante, que debes pensar cuando programas. Si vos pensas clases desacopladas, piensas en clases reutilizables. Cuando una clase referencia a otra y otra referencia a otra ... Así sustantivamente, una cadena que no termina. Esto hace que se pierda la reutilización.

Programación Orientada a Objetos sufre mucho de esto, y se han introducido mecanismos en el tiempo para contrarrestar esta problema. Lo mejor que se puede manejar es la funcionalidad del sus sistema; estos sus sistemas suelen relacionarse con infraestructura de la aplicación pero no con objetos del modelo. Hay que escribir objetos del modelo cada vez, y muchas son muy similares.

Reglas de negocio como prioridad

Cuando pensamos un problema la mayoría de los desarrolladores, pensamos en frameworks, bases de datos, infraestructura. Esto está mal ya que lo principal es el modelo de dominio. El Modelo de dominio refleja la necesidad actual.

Si la mayoría de los desarrolladores pueden centrarse en las reglas de negocio y modelo de dominio, y no tener que preocuparse por cuestiones de cualquier infraestructura, como la persistencia, las transacciones, la seguridad o de los frameworks.



Qi4j ™ está tratando de resolver las deficiencias de la POO.

Qi4j ™ no es un Framework. Es una nueva forma de escribir código.

Fuente: www.qi4j.com

viernes, 31 de julio de 2009

SOA

En Facultad nos enseñan que para comprender una realidad compleja se debe dividirla y de esta manera analizar cada componente y comprenderlo para luego analizar la totalidad de la realidad. Utilizaremos este método para definir la Arquitectura orientada a Servicio. Primero analicemos el término servicio.

Servicio tradicionalmente se ha utilizado para describir una función de negocio autocontenida, con una interfaz bien definida y estable, que recibe requerimientos de sus clientes. El servicio no depende del contexto de sus clientes y puede ser consumido por varios sistemas sin ser modificado. Los servicios son instalados (o desplegados) una única vez, esto lo diferencia de los componentes que deben ser incluidos dentro del contexto de cada aplicación que requiera de su uso y permanecen disponibles, sin consumir recursos hasta que son invocados.

Propiedades de un servicio:

· Interfaz bien definida

· Autocontenido

· No depende del contexto de sus clientes

· No requiere ser desplegado con cada cliente

Luego de definir servicio nos especificaremos arquitectura. Una definición reconocida es la de Clements: La Arquitectura de Software es, a grandes rasgos, una vista del sistema que incluye los componentes principales del mismo, la conducta de esos componentes según se la percibe desde el resto del sistema y las formas en que los componentes interactúan y se coordinan para alcanzar la misión del sistema. La vista arquitectónica es una vista abstracta, aportando el más alto nivel de comprensión y la supresión o diferimiento del detalle inherente a la mayor parte de las abstracciones.

Una vez aclarada la definición de servicio y arquitectura, podemos avanzar sobre la de SOA. Se podría definir como un estilo arquitectónico que propone modelar la empresa como una colección de servicios expuestos en la red. Nos propone ver a la empresa no como sistemas aislados si no como un todo.

La principal utilidad de los servicios web es que promueven la interoperabilidad entre diferentes plataformas, sistemas y lenguajes. Con servicios web, por ejemplo, sería posible integrar una aplicación Windows desarrollada con Microsoft .NET con una aplicación desarrollada en J2EE desplegada en un servidor de aplicaciones bajo un sistema Linux.

Alrededor de los Web services, que dominan el campo de un estilo SOA más amplio que podría incluir otras opciones, se han generado las controversias que usualmente acompañan a toda idea exitosa. Al principio hasta resultaba difícil encontrar una definición aceptable y consensuada que no fuera una fórmula optimista de mercadotecnia. El grupo de tareas de W3C, por ejemplo, demoró un año y medio en ofrecer la primera definición canónica apta para consumo arquitectónico, que no viene mal reproducir aquí:

Un Web service es un sistema de software diseñado para soportar interacción máquina-a-máquina sobre una red. Posee una interfaz descripta en un formato procesable por máquina (específicamente WSDL). Otros sistemas interactúan con el Web service de una manera prescripta por su descripción utilizando mensajes SOAP, típicamente transportados usando HTTP con una serialización en XML en conjunción con otros estándares relacionados a la Web

Un servicio es una entidad de software que encapsula funcionalidad de negocios y proporciona dicha funcionalidad a otras entidades a través de interfaces públicas bien definidas.

Los componentes del estilo (o sea los servicios) están débilmente acoplados. El servicio puede recibir requerimientos de cualquier origen. La funcionalidad del servicio se puede ampliar o modificar sin rendir cuentas a quienes lo requieran. Los servicios son las unidades de implementación, diseño e implementación.

Como todos los otros estilos, las SOA poseen ventajas y desventajas. Como se trata de una tecnología que está en su pico de expansión, virtudes y defectos están variando mientras esto se escribe.

SOA no es un concepto concreto para un área de la empresa, si no que dependiendo del punto de vista que se emplea. Ya que un ejecutivo de negocio lo puede ver como un conjunto de servicios de negocio, un arquitecto de software lo vera como un estilo arquitectónico y el desarrollador un conjunto de estándares, herramientas y tecnologías concretas que permiten llevar a cabo sus tareas.

miércoles, 29 de julio de 2009

¿Otro más?


Estaba leyendo un articulo y me llamo la atención que hay un lenguaje script soportado por la JVM de java que yo no conocía, Clojure muy parecido a List por lo poco que vi.

Esto me hizo reflexionar cuantos lenguajes conozco que corran sobre JVM. Acá va la lista:

-Jython

-JRuby

-Groovy

-Scala

-IoKe

-PHP

-BeanShell

-Rhino

-JavaFX

-Clojure

Y cuantos son soportados por spring, es decir que yo puedo hacer mi bean en uno de estos lenguajes:

-Groovy

-BeanShell

-JRuby

-Jython (esta adquisición fue hace muy poco: http://blog.springpython.webfactional.com/2009/07/01/spring-python-makes-final-1-0-0-release/)

Y ustedes conocen otro??

Java va a terminar soportando más lenguajes que .net?? (esto es broma no se enojen)


domingo, 26 de julio de 2009

Los poderes de Super Vaca


En Linux los poderes de Super Vaca son los poderes que tienen algunos programas, como apt-get, pero aptitude no tiene los poderes de super vaca y hay esta la mayor diferencia entre apt-get y aptitude.
$ apt-get
[...]
Este APT tiene poderes de Super Vaca.
$ aptitude --help
[...]
Este aptitude no tiene poderes de Super Vaca

aptitude, a diferencia que apt-get, no dispone de poderes de Super Vaca, que pueden comprobarse mediante:



$ apt-get moo

con lo que APT nos devolvería:


        (__)
(oo)
/------\/
/
* /\---/\
~~ ~~
...."Have you mooed today?"...



Sin embargo, en aptitude, al invocar la ayuda, dice:


$ aptitude help

[...]
-u : Descarga una nueva lista de paquetes al arrancar.
-i : Realiza una instalación al arrancar.

Este aptitude no tiene poderes de Super Vaca.




Sin embargo, invocando la opción «moo» y agregando v como parámetro, aptitude nos irá negando que posea huevos de pascua, hasta que finalmente confiesa. Según la versión, puede cambiar el contenido. En aptitude 0.4.0 en español, mostraría lo siguiente:


$ aptitude moo
No hay ningún huevo de pascua en este programa.
$ aptitude -v moo
Realmente no hay ningún huevo de pascua en este programa.
$ aptitude -vv moo
¿No le he dicho ya que no hay ningún huevo de pascua en este programa?
$ aptitude -vvv moo
¡Deje de hacer eso!
$ aptitude -vvvv moo
Vale, vale, si le doy un huevo de pascua, ¿se irá?
$ aptitude -vvvvv moo
De acuerdo, usted gana.

/----\
-------/ \
/ \
/
-----------------/ --------\
----------------------------------------------
$ aptitude -vvvvvv moo
¿Qué es? Un elefante siendo devorado por una serpiente, evidentemente.

Si siguiéramos añadiendo más «v», mostraría siempre la última respuesta. Este huevo de pascua es una referencia al libro El Principito.

Esta es la principal razón por la que yo uso apt-get y no aptitude. Los poderes de Super Vaca!!!

Open Source University

Sun abrio como una universidad libre, onda para compartir conocimiento, paso el link: http://studentdevelopers.ning.com/

Espero que lo disfruten.

this, self, Me y Yo!!!

this en un puntero a el mismo objeto. Bueno puntero en c++, para ser más generico es una referencia a si mismo, a nuestro mismo objeto. Por ejemplo:

this.hacerAlgo()

Es lo mismo que decir yo hago algo.
Este puntero a si mismo es muy útil. Ya que en un lenguaje no totalmente orientado a objeto. Como se que estoy llamando un método que esta dios sabe donde esta, o es un método que esta dentro de la clase. Con this queda mucho más claro.

Bueno this es en C++, java, php, javascript; es decir todos los derivados de c++.
self es en object pascal, simula, smalltalk y ruby.
Me es en visual Basic.

La verdad creo que es la primera (y va a ser la única) vez que diga que la gente de vb hizo bien las cosas. Me me parece más intuitivo, bueno self también esta bueno pero son 4 caracteres, mucho para escribir. Me es el ganador sin duda, intuitivo y corto.

Auque no entiendo porque ningún lenguaje uso I, es intuitivo y corto. Si programáramos en castellano seria “yo” que a mi por ser de lengua española me gusta más.
Por ejemplo podría escribir:

yo.voyAHacerAlgo();

Y ustedes, ¿que piensan cual es la palabra que les gusta más para referirse a nuestro mismo objeto? ¿this, self o Me?

viernes, 24 de julio de 2009

Inyección de dependencias


Originalmente, La inyección de dependencia se la llamaba de otra forma: inversión de control (IoC). Pero en un artículo escrito por Martin Fowler preguntaba qué aspecto del control se estaba invirtiendo. Llego a la conclusión de que la adquisición de la dependencia lo que se invertía. Basándose en esa revelación, acuño la frase “inyección de dependencia”, un término que describe mejor lo que ocurre.

Pero ahora bien ¿ qué es la inyección de dependencia? La wikipedia nos dice algo así: http://es.wikipedia.org/wiki/Inyección_de_dependencias

Cualquier aplicación no trivial está formada por dos o más clases que colaboran entre sí para realizar alguna lógica. Tradicionalmente cada objeto se hacía cargo de obtener sus propias referencias a los objetos a los cuales colaboraba (sus dependencias). Esto lleva a código acoplado y difícil de probar.

Cuando se aplica inyección de dependencia le decimos a una entidad externa que provea las dependencias a los objetos. Esto nos resuelve el problema del acoplamiento.

El acoplamiento es un mal necesario ya que sin él los objetos no podrían interactuar para resolver problemas, pero cuan menor sea el acoplamiento es más reutilizable, comprobable y flexible.

La ventaja clave de inyección de dependencia es el acoplamiento débil. Si un objeto solo conoce sus dependencias mediante su interfaz (no su implementación o como fueron definidos) entonces la dependencia puede intercambiarse con una implementación diferente sin que el objeto dependiente sepa la diferencia.

Por ejemplo si defino una interfaz la implementación de la misma pude ser un objeto plano, web service, objeto remoto, etc.

Inyección de dependencia es la llave para minimizar el acoplamiento.



Lua


Lua es luna en portuges y tambien es un lenguage de programación extensible diseñado para una programación procedimental general con utilidades para la descripción de datos. También ofrece un buen soporte para la programación orientada a objetos, programación funcional y programación orientada a datos. Se pretende que Lua sea usado como un lenguaje de script potente y ligero para cualquier programa que lo necesite. Lua está implementado como una biblioteca escrita en Climpio (esto es, en el subconjunto común de ANSI C y C++).

Siendo un lenguaje de extensión, Lua no tiene noción de programa principal (main): sólo funciona embebido en un cliente anfitrión, denominado programa contenedor o simplemente anfitrión (host). Éste puede invocar funciones para ejecutar un trozo de código Lua, puede escribir y leer variables de Lua y puede registrar funciones C para que sean llamadas por el código Lua. A través del uso de funciones C, Lua puede ser aumentado para abarcar un amplio rango de diferentes dominios, creando entonces lenguajes de programación personalizados que comparten el mismo marco sintáctico. La distribución de Lua incluye un programa anfitrión de muestra denominado lua, que usa la biblioteca de Lua para ofrecer un intérprete de Lua completo e independiente.


Los programas en Lua no son interpretados directamente, sino compilados a código bytecode, que es ejecutado en la máquina virtual de Lua. El proceso de compilación es normalmente transparente al usuario y se realiza en tiempo de ejecución, pero puede hacerse con anticipación para aumentar el rendimiento y reducir el uso de memoria al prescindir del compilador.


Debido a que Lua compilado es pequeño, veloz y tiene una licencia permisiva ha ganado seguidores entre los desarrolladores de videojuegos. Algunos usos de Lua:

World of Warcraft, donde el usuario tiene la posibilidad de personalizar casi completamente la interfaz creando añadidos que permiten informarle de cualquier cosa en su correspondiente carpeta Interface en la qué el WoW.exe tiene el intérprete de lua y ejecuta en su Interface el Addon creado en lua.

También en un mod tipo "sandbox" para Half-Life 2 llamado Garry's Mod, pudiendo modificarlo casi completamente. Gran parte de Garry's Mod está escrito en lua.

También en un mod para Half-Life 2 llamado Fortress Forever que permite configurar altamente los mapas.

El RTS a gran escala Supreme Commander, el cual es modificable por el usuario en casi todos sus aspectos.

El juego de RPG Tibia

Parte de S.T.A.L.K.E.R. - Shadow Of Chernobyl, permitiendo al jugador modificar armas, armaduras y aspectos varios del juego.

Grim Fandango y La Fuga de Monkey Island (cuarta entrega de la saga Monkey Island) utilizan internamente scripts en Lua para definir la historia y los eventos que ocurren durante la partida.

Worms 4: mayhem utiliza lua y xml para definir las misiones y desafios.

Mediante un programa casero(o homebrew), el LuaPlayer, permite ejecutar archivos .lua en la conocida consola portatil de Sony.

Ragnarok Online usa LUA para programar la inteligencia artificial de los homunculos.

Regnum Online usa LUA para la mayoria de scripts del juego como interfaz, modo de juego, acciones, étc.

Lua es software libre, y se proporciona, como es usual, sin garantías, como se establece en su licencia. La implementación descrita en este manual está disponible en el sitio web oficial de Lua, www.lua.org.

miércoles, 22 de julio de 2009

Y te gustan esos raros Lenguajes nuevos...

Estuve leyendo sobre lenguajes script y encontré gran similitud entre Ruby y SmallTalk. Le dejo un link que es muy recomendable leer:

http://www.rubyist.net/~slagell/ruby/index.html

No solo porque explica Ruby; sino que se ve como el creador de Ruby va buscando todo lo bueno de otros lenguajes para agregarlo a Ruby.

Hay otros lenguajes nuevos basados en ruby por ley transitiva en smalltalk:

Scala : http://www.scala-lang.org/

Groovy: http://groovy.codehaus.org/

Si bien tienen operadores (if, for, while) son mucho más puros. Lo bueno de estos últimos es que corren en la JVM de java. Bueno jRuby corre también jvm.

Por ejemplo scala tiene dos formas de que un objeto envié un mensaje a otro.

1 + 1 (se envía el mensaje + con un espacio sintaxis smalltalk)

1.+(1) (se envía un mensaje con sintaxis java)

Personalmente me gusta mucho scala.

¿Conocen otros lenguajes nuevos? ¿Cuál les gusta más?