Translate

sábado, 16 de julio de 2011

Java 7


Vamos a ver algunas características de la nueva versión de Java:

Switch con string: la verdad que esto tendría que haber estado hace tiempo, ahora podemos hacer lo siguiente:

switch (color) {
case “red”:

break;
case “blue”:

break;

case “black”:

break;
}



Diamante: el operador diamante nos permite no declarar 2 veces el tipo en objetos generic.

List colores = new ArrayList<>();



Try de recursos: Esto esta bueno, antes de java 7 cuando abriamos un archivo debíamos cerrarlo, ahora no! Veamos un antes y despues para ser más claro:
Antes:

try {
fis = new FileInputStream(source);
fos = new FileOutputStream(target);

byte[] buf = new byte[8192];

int i;
while ((i = fis.read(buf)) != -1) {
fos.write(buf, 0, i);
}
}
catch (Exception e) {
e.printStackTrace();
} finally {
if ( fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}

if ( fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}



Ahora:

   try (InputStream fis = new FileInputStream(source);
OutputStream fos = new FileOutputStream(target)){

byte[] buf = new byte[8192];

int i;
while ((i = fis.read(buf)) != -1) {
fos.write(buf, 0, i);
}
}
catch (Exception e) {
e.printStackTrace();
}


Multiple declaraciones de excepciones: Es un alivio y genial. Seguro que les paso que hacian un try y tenian que capturar muchas excepciones, pero siempre hacian lo mismo; ahora ya no es necesario:

try {

} catch (Exception1 | Exception2 e) {
...
}


Estas son algunas de las nuevas características. Pinta lindo!

Java 7 launch pack: múltiples presentaciones y un libro gratis


Leyendo Javahispano me entere del Java 7 launch pack, es un pack con multiples presentaciones para ponerse al día con Java 7

Dejo link:

Eiffel y el diseño por contrato.


Eiffel es el lenguaje pionero en el diseño por contrato. Diseño por contrato es un concepto basado en la calidad del software.

Diseño por contrato es una metafora de como los objetos deben colaborar entre ellos. La metafora se puede explicar como un cliente que debe contratar un servicio; lo cual lo hace por medio de un contrato.

El proveedor debe proporcionar un producto determinado o servicio y tiene derecho a esperar hasta que el cliente pague.

El cliente debe pagar y tiene derecho a obtener el producto o servicio.
Ambas partes deben cumplir con ciertas obligaciones, tales como las leyes y reglamentos, aplicables a todos los contratos.

Las relaciones entre componentes de software estan definidas de forma formal por medio de los contratos, los cuales especifican las precondiciones, postcondiciones y invariantes.

La idea central de diseño por contrato como los componentes de software colaboran entre si, teniendo obligaciones y beneficios. Cuando definimos una función tenemos:
  • Precondiciones: Son los requisitos que debe cumplir quien llama esta función.
  • Postcondiciones: Es lo que debe hacer la función, es su obligación y un beneficio para el que llama a la función.
  • Invariantes: Mantener una cierta propiedad, que garanticen que ante tal entrada se obtenga determinada salida.
Muchos Lenguajes que proveen la capacidad de hacer asserciones, pero en el diseño por contrato estas se escriben antes de escribir el código y estas son parte del diseño.

El diseño por contrato es central en eiffel. Eiffel provee la expresión require para las precondiciones, ensure para las poscondiciones y invariant para las invariantes.

Veamos como se declara una clase en eiffel:

indexing
description: "Simple bank accounts"
class
ACCOUNT
feature -- Access
balance: INTEGER
-- Current balance
deposit_count: INTEGER is
-- Number of deposits made since opening
do
… As before …
end
feature -- Element change
deposit (sum: INTEGER) is
-- Add sum to account.
require
non_negative: sum >= 0
do
… As before …
ensure
one_more_deposit:
deposit_count = old deposit_count + 1
updated: balance = old balance + sum
end
feature { NONE } -- Implementation
all_deposits: DEPOSIT_LIST
-- List of deposits since account's opening.
invariant
consistent_balance: (all_deposits /= Void) implies
(balance = all_deposits . total)
zero_if_no_deposits: (all_deposits = Void) implies
(balance = 0)
end -- class ACCOUNT

Por ejemplo en el método o característica deposit es requerido que el valor a sumar no sea negativo y se asegura que la cantidad de balances haya aumentado.

En Java existen diferentes framework que nos proveen el diseño por contrato iContract2, Contract4J, jContractor, Jcontract, C4J, Google CodePro Analytix, STclass, OVal con AspectJ, Java Modeling Language (JML), SpringContracts de Spring framework, Modern Jass.

Para satisfacer las necesidades de las aplicaciones a gran escala y misión crítica de hoy, el diseño por contrato puede ser una gran solución.

Dejo links:

jueves, 14 de julio de 2011

JBoss Application Server 7 is here!


Hoy me llego un mail de la gente de DZone, por el release de JBoss 7.
Indican 7 ventajas de usar la nueva versión del servidor:
  1. El tiempo asombrosamente más rápido hasta 10 veces.
  2. Java EE 6 - entre las primeras implementaciones. No es cabeza ya que WebSphere V8, soporta Java EE 6.
  3. Muy ligero
  4. Modular - proporciona aislamiento de la aplicación real.
  5. Gestión Elegante - consola simplificada y APIs.
  6. Administración - administración servidores como grupos.
  7. Testeable - simplifica las pruebas a través del proyecto Arquillian.

Bueno es el momento de bajarlo, probarlo y ver si es verdad lo que dicen!

Dejo links:



domingo, 10 de julio de 2011

¿Compartimos el conocimiento?



En una entrevista Linus Benedict Torvalds, le preguntaron si hacia backup y el dijo que hacer backup es tonto. La persona inteligente publica lo que quiere resguardar y deja que la gente lo copie, lo mejore.

Esto sucede también con el conocimiento, yo tengo una memoria paupérrima pero si transmito el conocimiento tengo a quien preguntar cuando me olvide.

Dejo este post muy interesante y recomiendo que lo lean:

Como Optimizar tus Contenidos para Google

Es importante hacer algo de SEO para tener mayor audiencia dejo un o post muy interesantes:

sábado, 9 de julio de 2011

Plugins útiles para Eclipse


Gracias al amigo Mario descubrí dos plugins muy útiles para eclipse.

Mousefeed es un plugin que te va indicando los shortcut del teclado cuando hacemos una acción con el mouse, que podriamos hacer con el teclado.

Eclipsenotepad es un Notepad embebido en eclipse, el cual podemos usar para diferentes tareas, por ejemplo un porta papeles auxiliar y lo que se nos ocurra.

Estos plugins pueden ser instalados desde el Marketplace de eclipse o de la forma tradicional.

Conocen otros plugins utilies para eclipse?

Dejo los links:

Cambios en blogger


Gente!! Ojo; google piensa cambien el nombre de blogger. Todavia no se si esto me afecta, dejo toda la noticia de genbeta:

El cambio de diseño en la interfaz de sus aplicaciones web no va a ser lo único nuevo que vamos a ver en Google estos días: nos acaba de llegar la noticia de que la compañía de Mountain View va a cambiar el nombre de los servicios Picasa y Blogger, las herramientas para compartir imágenes y mantener bitácoras.

Sus nuevos nombres aún no se han revelado, pero la fuente indica que Blogger pasará a llamarse Google Blogs y Picasa se conocerá como Google Photos. También es de suponer que con los nuevos nombres llegue una nueva interfaz semejante a la que ya está presente en Google Calendar, Maps y Gmail gracias al tirón de Google+. Parece que otros servicios también tendrán un cambio de nombre, pero han asegurado que YouTube no va a sufrir ningún cambio. Normal, teniendo en cuenta su enorme popularidad.

Los cambios de nombre pueden ser efectivos dentro de cuatro o seis semanas, fecha en la que Google+ puede abrirse al público (para esto último ya se rumorea el día 31 de julio como muy tarde). Ya sabemos que Blogger va a tener un profundo lavado de cara, pero… ¿Y Picasa? Es una buena oportunidad para que Google relance un servicio de imágenes ahora que Flickr está de capa caída. No parece que tengamos que esperar mucho para ver todos estos cambios… Google nos va a mantener bastante ocupados este mes.

viernes, 8 de julio de 2011

7 proyectos Java que cambiaron el Mundo

Estaba leyendo un articulo sobre los 7 proyectos java que cambiaron el mundo: JUnit, Eclipse, Spring, Solr, Jenkins o Hudson, Apache Hadoop, Android.

Me sorprendió la parecencia de Solr y Hadoop; nunca los he usado; debería probarlos.

Que proyecto agregarían o sacarían?

Dejo el link:

http://radar.oreilly.com/2011/07/7-java-projects.html

martes, 5 de julio de 2011

Consumir servicios JSON and REST con jQuery


La verdad es que la simplicidad de jQuery me sorprende. Como recordamos en post anteriores habíamos hecho servicios REST que eran expuestos con Json:

http://emanuelpeg.blogspot.com/2011/07/rest-con-cxf.html
http://emanuelpeg.blogspot.com/2011/06/resteasy-con-spring.html

Ahora vamos a consumirlos con jQuery:

$.getJSON(url, function(data) {

//data es el objeto Json, con el que obtengo los datos
//Vamos a recorrerlo y mostrarlo
$.each(data, function(index, objetoDelListado) {
$("#algunaDiv").append(objetoDelListado.name);
});
});




Y listo!

Increíble!

Libros Gratuitos!





Dejo Links de libros gratuitos el primero es de 5 libros sobre Java:

sábado, 2 de julio de 2011

Rest con CXF

Apache CXF es un framework open source, que nos permite construir servicios web tanto soap como rest. Su principal característica es que esta integrado total mente con spring.

Lo que vamos a hacer es exponer un bean de spring con cxf usando Rest y json.

Primero debemos agregar los siguientes jars, es bueno usar maven por lo tanto dejo la entrada del pom:

  


org.apache.cxf
cxf-rt-frontend-jaxws
${cxf.version}



org.apache.cxf
cxf-rt-transports-http
${cxf.version}




org.apache.cxf
cxf-rt-transports-http-jetty
${cxf.version}



org.apache.cxf
cxf-bundle-jaxrs

${cxf.version}


org.eclipse.jetty
jetty-server









org.codehaus.jackson
jackson-mapper-asl
${jackson.version}



org.codehaus.jackson
jackson-jaxrs
${jackson.version}



org.codehaus.jackson
jackson-xc
${jackson.version}




Las versiones de los framework pueden buscarlas en mvnrepository.com. En el caso de cxf depende también la versión de spring, con spring 2.5 se usa hasta 2.3.5; si queres usar versiones mas nuevas deberás usar spring 3.

Luego debemos agregar la siguiente entrada al web.xml:

 
CXFServlet
CXF Servlet

org.apache.cxf.transport.servlet.CXFServlet

1



CXFServlet
/rest/*



Ojo que tienen que levantar spring en el web.xml, si ya lo hacen esta todo bien, si no deben agregar la siguiente linea en el web.xml:


contextConfigLocation
/WEB-INF/applicationContext-hibernate.x
ml


...

context

org.springframework.web.context.ContextLoaderServlet

1




Luego de esto vamos a escribir nuestro bean, yo no voy a hacer una interfaz para este bean pero es bueno que si pueden la hagan.

package org.assembly.post;

import javax.ws.rs.GET;
import javax.ws.rs.Path;


/**
* @author emanuel
*/
@Path("/posts")
public class PostsRest {

@GET
public String getPosts() {
return "posts";
}


}



Este bean tiene un método que solo devuelve un string. Ahora vamos a definir el bean en el applicationContext.xml de sprint y además configurar el servicio REST:























Se deben incluir estos archivos de cxf para que funcione el framework estos archivos son del framework, así que no hay problema por eso.

Como vemos primero se define el servicio Rest y luego se define el bean.

Si vamos a la url http://localhost:8080//rest/posts nos devolverá el string "post".

Y no iba a usar Json? Si si, para un cachito. Ahora vamos a devolver un objeto por json.Para esto vamos a usar un framework llamado Jackson.

Vamos a modificar nuestro bean para uqe tenga como provider Jackson :

  



























Luego modificamos nuestra clase para tener métodos donde podamos devolver json:

package org.assembly.nornas.web.rest.post;

import java.util.List;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;

import org.assembly.dto.post.PostDTO;
import org.assembly.nornas.service.post.PostService;


/**
*
*
* @author emanuel
*/
@Path("/posts")
public class PostsRest {

private PostService postService;

public void setPostService(PostService postService) {
this.postService = postService;
}

@GET
@Path("/{blogId}/{from}")
@Produces("application/json")
public PostDTO findPostsPublishedByBlogId(@PathParam("blogId") Long blogId, @PathParam("from") Integer from) {
PostDTO post = new Post(1,"hola Mundo","Este es mi Hola Mundo");
return post;
}

@GET
@Produces("application/json")
@Path("/test")
public List< String> test() {
List< String> strings = new ArrayList< String>();
strings.add("hola");
strings.add("mundo");
return strings;
}

}



PostDTO esta anotado con anotaciones de jaxb para generar el objeto json correctamente:

@XmlRootElement(name="post")
public class PostDTO implements Serializable {

private static final long serialVersionUID = -6319037835355763839L;
@XmlElement(name="id")
private Long id;
@XmlElement(name="title")
private String title;
@XmlElement(name="content")
private String content;

//geters y seters
}


Ojo Jaxb necesita el constructor por defecto.

Luego vamos a la URL http://localhost:8080//rest/posts/1/0 por ejemplo.

Si vamos al método test http://localhost:8080//rest/test nos devolverá lo siguiente:

["hola","mundo"]


Y listo!!

Dejo Links:

http://cxf.apache.org/docs/jax-rs.html

sourcemaking.com

Sitio para aprender sobre Refactoring, Patterns, Antipatterns y UML.


Muy recomendado.

Usuario Linux


Me registre para que me cuenten como usuario linux.

Soy el usuario nro: 536423



Si quieren registrarse dejo el link:

miércoles, 29 de junio de 2011

GOBERNAR ES DAR TRABAJO


“GOBERNAR ES DAR TRABAJO” lo decía el general Peron. No estoy haciendo campaña proceditista simplemente me puse a reflexionar sobre la tarea del Líder de proyecto.

En mi opinión una de las ocupaciones más importantes es que todo el mundo este trabajando, que todos los desarrolladores sean productivos. Uno de los principales clientes del Líder de proyecto son los desarrolladores, que están esperando trabajo.

Ojo, no digo que el Líder tenga que imponer trabajo; el equipo de desarrollo debe ser lo suficientemente maduro para autogestionarse. Lo que digo es que el líder de proyecto tiene que quitar los palos del camino cada vez que la carreta amaga detenerse. Tiene que luchar para que cada persona sea productiva y haga mejor su trabajo. Sobre todo que el desarrollador sea feliz. Cuanto más como do trabajas mejor lo haces.

Por lo tanto el Líder debe ser más amigo de los desarrolladores, que del project o excel o power point. Debe ser capaz de decir, que dale una mano a Pepe que esta trabado, “No sigas por ahí que para mi no esta la solución”, “Si no podes avanzar llamame”. El Líder velar por la productividad del equipo, dado que si el equipo es productivo se llega con los tiempos.

La preocupación de la fecha de entrega, es un riesgo negociable; mientras que el cliente este informado y haya visto una demo o algo, un atraso es negociable. En cambio si un desarrollador estuvo 2 hs sin saber que hacer, trabado en un problema; el tiempo perdido no se negocia. Es una perdida, un pasivo del Líder.

Dejo unos link, que sería bueno leer:

domingo, 26 de junio de 2011

RESTEasy con Spring


RESTEasy es un framework de jboss que nos ayuda a generar servicios RESTfull. Este framework es una implementación de JAX-RS (JSR 311). JAX-RS es una nueva especificación de jcp que provee una API para servicios RESTfull bajo el protocolo http.

Anteriormente ya hablamos de este framework:

http://emanuelpeg.blogspot.com/2009/11/resteasy.html

Rápidamente pasemos a ver un ejemplo, quiero exponer un servicio por medio de rest con spring.

Primero agregamos la entrada en el pom (usemos maven please)


org.jboss.resteasy
resteasy-jaxrs
2.2.0.GA



org.codehaus.jettison
jettison



org.jboss.resteasy
resteasy-jettison-provider
2.2.0.GA


org.jboss.resteasy
resteasy-spring
2.2.0.GA



Para que estas funcionen hay que agregar los siguientes repositorios en el pom:



java.net
http://download.java.net/maven/1
legacy


maven repo
maven repo
http://repo1.maven.org/maven2/



jboss
jboss repo
http://repository.jboss.org/nexus/content/groups/public/





Además el web.xml queda similar a este:




RestEasy con Spring


org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap


org.jboss.resteasy.plugins.spring.SpringContextLoaderListener



Resteasy
org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher



Resteasy
/serviciosRest/*




Ahora vamos a hacer anotar nuestro servicio para que funcione con rest:

@Path("/posts")
public interface HolaMundoService {

@GET
public String getSaludo();
}


Luego debemos implamentar este servicio y hacer un bean de spring.

Luego de hacer esto ya tenemos nuentro servicio rest en http://localhost:port//serviciosRest/posts

RESTEasy esta bajo licencia Apache ASL 2.0 y es una perfecta opción compatible con Spring.

Dejo links:


lunes, 20 de junio de 2011

SQLFire

vFabric SQLFire es una alternativa a las base de datos NoSQL, es una base orientada a memoria. Diseñada para aplicaciones que requieren alta velocidad, escalabilidad y disponibilidad.

SQLFire ofrece algunas de las mejores características que normalmente sólo se ve en las bases de datos NoSQL, tales como la escalabilidad horizontal, tolerancia a fallos, una arquitectura “Shared Nothing”

Pero que es una arquitectura “Shared Nothing”?

La arquitectura “Shared Nothing” consiste en una arquitectura distribuida en el que cada nodo es independiente y autosuficiente, y tiene un único punto de contención en todo el sistema. Típicamente se contrasta con los sistemas que mantienen una gran cantidad de almacenados en forma centralizada, ya sea una base de datos, un servidor de aplicaciones, o cualquier otro donde este centralizada la funcionalidad.
Se puede utilizar SQLFire desde java atravez de JDBC, y desde .net usando ADO.net.

Si tenes problemas para ampliar tu base de datos o preocupado por la alta disponibilidad, SQLFire es una gran alternativa.

Dejo un video:


Dejo Links:

miércoles, 15 de junio de 2011

Forks de MySQL




Como ustedes ya saben mysql es de oracle y suena feo... No me quiero unir a el pesimismo general de esta situación pero por las dudas; veamos alternativas:

MariaDB: Después de salir de Sun, Widenius (creador de MySQL) decidió crear su propia empresa a la que denomino Monty program AB. Su principal objetivo era el desarrollar un motor de almacenamiento alternativo a MyISAM y a InnoDB, pero con la particularidad de soportar transacionalidad. Así mismo tomo código de MySQL para empezar a desarrollar un nuevo gestor que utilizara este nuevo motor de almacenamiento, su nombre MariaDB. Esta empresa junto a Percona son las principales fundadoras de Open Database Alliance.

MariaDB nace con la clara idea de partir el código de base de Mysql y establecer paralelismo entre las versiones. De esta forma MariaDB 5.1. parte de MySQL 5.1. La misma política se aplicara en futuras versiones.

XTRADB: es el nombre de un nuevo motor de almacenamiento desarrollado por Percona, uno de los principales socios del Open Database Allince. Esta compañía, especializada en desarrollo servicios y productos basados en MySQL decidio crear un nuevo motor para mejorar InnoDB. XtraDB esta diseñado para funcionar en entornos de alto rendimiento y para escalar sin problemas.
En la actualidad XtraDB presenta una compatibilidad total con InnDB permitiendo remplazar a este.

Drizzle: nació a iniciativa de un ingeniero de MySQL llamado Brian Aker. La movida surgido cuando Brian mostro su desacuerdo con modificaciones en 4.1. Finalmente en julio del año parado comenzó el desarrollo de drizzle. La idea es la optimización para aplicaciones web.

Ourdelta: En este caso, Arjen Lentz comenzó el desarrollo en 2008 y el objetivo es generar código para hacer mejoras en mysql. OurDelta mantiene dos ramas testing y producción.

Sin duda la compra de oracle por parte de Sun a generado diferentes postura; este es un conjunto de forks que ayudan a decidir por otra solución libre de similares característicamente.

Dejo links:



martes, 14 de junio de 2011

Todos somos alumnos y profesores.

Un post para hacer catarsis.

Este blog siempre promovió el uso de software libre, más allá de cualquier licencia . Lo mejor de el Open Source es que hay gente que puede hacer mejor las cosas y de esa gente puedo aprender. Sea con mi código y con el de otra persona, nunca tengo toda la razón y si la tuviese de que sirve? El código libre enseña y seria un tonto si no quisiera enseñar o trasmitir lo que se.

“Siempre estamos equivocados” es la premisa que debe regir tu vida y posta, es verdad. Siempre alguien nos marca el camino y a los pocos meses nos dice que se equivoco que el camino no era ese. Todas las empresas son iguales y todos optamos diferentes caminos, por lo tanto cuando veas a alguien que te dice “Yo” resuelvo todos tus problemas. Por favor no le creas, no existe mayor hipócrita que el que no quiere aprender y solo el que cree tener toda la verdad nunca va a aprender.

Que importa tener toda la verdad, si no se puede ser abierto, y si no puedo escuchar. En estas condiciones puedo enseñar? Me huele a dictadura más que a enseñanza. Cuando vemos donde estamos y somos realistas, entendiendo nuestros errores, por menores, o flaquezas es cuando convencemos.

Sip, este post empezó con bronca pero ojo, si no me enojo nunca es porque no hago nada. Creo sinceramente que el que se enoja es porque trabaja y valora su trabajo. Es feo estar equivocado, pero más feo es estar solo con la razón absoluta. Abramos nuestras mentes, la mejor forma de hacer las cosas es como lo voy a hacer mañana, por ahora aprendamos.

jueves, 9 de junio de 2011

Aprender python


No se nada de python pero nunca es tarde para empesar, me pasaron estos links de la lista de usuarios de python:

Cómo Pensar como un Informático 2da. Edición
http://www.openbookproject.net/thinkcs/archive/python/spanish2e/
Esta es la segunda edición y esta traducido hasta el capitulo 7, este
libro esta orientado para que sea leido por aquellos que no tienen
conocimientos de programación, de hecho es el material que uso para
enseñar python en jornadas de apoyo al plan ceibal
Aqui esta la primera edición en español:
http://www.gulic.org/almacen/httlaclwp/index.htm
(en el sitio de OpenBook no lo tienen más, en ingles van por la tercera edición)

Python para Todos (tutorial en español)
http://mundogeek.net/tutorial-python/
Este esta muy bueno.

Del mismo autor de Python para Todos hay unos de artículos interesantes:

Guía de estilo del código Python
Guía de estilo de Guido van Rossum, creador de Python, y Barry Warsaw
http://mundogeek.net/traducciones/guia-estilo-python.htm

Modismos y Anti-Modismos en Python
Idioms o modismos a usar o evitar al escribir código Python.
http://mundogeek.net/traducciones/modismos-python.htm

Programa como un Pythonista: Python Idiomático
Documento que trata varias técnicas y modismos que pueden ser de
utilidad al trabajar con Python.
http://mundogeek.net/traducciones/python-idiomatico/

Otro recurso en español que le puede servir es el Tutorial escrito por
Guido van Rossum traducido al español por el grupo de usuarios Python
Argentina (pyar)
http://docs.python.org.ar/tutorial/contenido.html
http://python.org.ar/pyar/Tutorial?action=AttachFile&do=view&target=TutorialPython.pdf

Hay un libro de python hecho por la universidad española Jaume para la
iniciación a la programacion. Si bien tiene tiempo sirve para empezar:
http://marmota.act.uji.es/mtp/pdf/python.pdf

aqui ya tiene bastante material para estudiar.

+1


Google nos presentó su apuesta más social, Google+1, un servicio del que se habían dicho muchas cosas y que, aparentemente, resultó ser un botón con el que recomendar páginas y anuncios que aparecen en los resultados de búsqueda y que, además, podíamos visualizar desde nuestro perfil (que se volvía público). Uno ve un botón para compartir y, lógicamente, enseguida uno piensa en el botón de Facebook, el famoso “me gusta”, que anda circulando a lo largo y ancho de la red.

Si les gusta el Blog o leen algo, no sean perezosos y presionen este botón. Si no lo ven es porque no están logeados, no sean ratas y logeense.

Es importante compartir el conocimiento y con estas pequeñas acciones lo hacemos!!!

Saludos!!

domingo, 5 de junio de 2011

Thrift



Thrift es un framework de apache que tiene como fin acelerar el desarrollo e implementación de servicios backend eficientes y escalables. El principal objetivo es permitir comunicaciones eficientes y fiables a través de lenguajes de programación mediante la abstracción de porciones de cada lenguaje en una librería común, específicamente Apache Thrift permite a los desarrolladores definir los tipos de dato e interfaces de servicios en un archivo único en lenguaje neutral y generar todo el código necesario para construir clientes RPC y servidores. Actualmente soporta los siguientes lenguajes C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk y OCaml.

Apache Thrift fue desarrollado y usado por Facebook; para luego ser donado a Apache. Hoy en día thrift no es solo utilizado por facebook sino que lo utilizan paginas como last.fm y reCaptcha.

Podría decirse que Thrift es un kit de herramientas, uno especializado en la interoperabilidad de lenguajes de programación. A través de Thrift Facebook ha combinado el uso de lenguajes tan distintos entre sí como C++, Java, Python, PHP, Ruby, Haskell, y más, a lo largo de todos sus equipos de desarrollo. Facebook no podría crear servicios de software a la velocidad que requiere sin la ayuda de Thrift.

Thrift incluye un stack completo para la creación de software clientes y servidor.

Entre las ventajas podemos resaltar :

  • Serialización cross-lenguaje con poco overhead dado que usa formato binario
  • Una biblioteca limpia, sin configuración de xml o frameworks.
  • Los lenguajes se bindean de forma natural. Por ejemplo Java usa ArrayList y C++ usa std::vector.
  • La llamadas entre diferentes lenguajes son a nivel aplicación, esto permite que se modifiquen de forma separada.
  • No tiene dependencias a software no estándar. No tiene un mix de software con diferentes licencias.
Como funciona?

De hecho las principales tareas de thrift son sencillas:
  • Primero en un archivo .thrift se escriben los objetos y procedimientos que queremos compartir entre diferentes lenguajes.
  • Luego usamos las herramientas de thrift para construir la los archivos para los lenguajes que se deseen utilizar.
  • El paso más importante es crear el cliente y el servidor en el lenguaje que quisieramos utilizar, usando el código generado en el paso anterior. El servidor debe implementar procedimientos descriptos en el archivo .thrift mientras que el cliente debe utilizarlos.
  • Por ultimo y no menos importante se debe correr el servidor usando un script
Esto fue una pequeña introducción a Apache Thrift.

Dejo links:


sábado, 4 de junio de 2011

Equals


Cuando creamos una clase es una buena práctica definir el método equals, dado que este representa con que campos se identifica esta clase; es decir dos objetos van a ser iguales si son iguales las propiedades usadas en el equals.

El EqualsBuilder de apache common nos puede hacer la vida más fácil a la hora de hacer los equals. Pero a la vez tenemos comprobaciones repetitivas que se pueden factorizar usando herencia.

Veamos un ejemplo de equals:
@Override
public boolean equals(Object obj) {
if (obj == null)
return false;
if (obj == this)
return true;
if (!obj.getClass().isAssignableFrom(getClass()))
return false;

Author otherAuthor = (Author) obj;

return new EqualsBuilder().append(this.user, otherAuthor.getUser())
.isEquals();
}


Si hacemos otro equals vamos a hacer algo muy similar. Una forma de factorizar las lineas que se repiten es mediante herencia podemos hacer una clase padre de todas las clases del modelo que haga lo siguiente:

@Override
public boolean equals(Object obj) {
if (obj == null)
return false;
if (obj == this)
return true;
if (!obj.getClass().isAssignableFrom(getClass()))
return false;

return businnessEquals(obj);
}

public abstract boolean businnessEquals(Object obj);


Y businnessEquals sea abstracto y obligue a todas las clases del modelo a implementarlo. Todos los objetos que hereden de la clase abstracta deben implementar bussinnessEquals pero se olvidan de hacer las validaciones repetitivas.

@Override
public boolean businnessEquals(Object obj) {
Author otherAuthor = (Author) obj;

return new EqualsBuilder().append(this.user, otherAuthor.getUser())
.isEquals();
}



Les gusto la solución? Se les ocurre otra?

jueves, 2 de junio de 2011

Oracle dona Open Office a Apache Software Foundation


Si! Oreacle dona OpenOffice a Apache, esto es una muy buena noticia para nosotros los usuarios de OpenOffice dado que es muy posible que la gente de LibreOffice se una a este proyecto.

Personalmente creo que fue la única jugada que pudo hacer Oracle, luego de que se cree el fork LibreOffice y se lleve los principales commiter de OpenOffice. Recordemos que este fork se hizo dado que mucha gente se canso de las decisiones tomadas por Oracle con respecto a su suite de oficina.

La verdad me pone muy contento y es una muy buena noticia para el Software Libre.

Dejo Links:

sábado, 28 de mayo de 2011

SweetDEV RIA


SweetDEV RIA es un framework usado para el desarrollo de RIA (Rich Internet Applications), este provee componentes para interfaces gráficas ricas las cuales se ejecutan en el browser.

A la vez maneja el problema de la incompatibilidad de los diferentes browsers (Internet Explorer, Mozilla Firefox, etc.) y este usa un gran numero de funcionalidades provistas por javascript y ajax.

SweetDEV RIA es un framework JEE basado en tags jsp.

La parte Java es muy simple. SweetDEV RIA no provee workflow, services, o mapping management. El solo se limita a la capa GUI. Solo es necesario configurar un servlet y mantener un map en la sesión.

Los componentes son generados con JSP tags y usan comunicación cliente/servidor basado en ajax.

SweetDEV RIA es un completo conjunto de tags ajax.

Algo muy importante es que su licencia es libre, mas específicamente licencia Apache 2,0.

Este framework se puede bajar y si usan maven dejo la entrada del Pom


sweetdev-ria
sweetdev-ria-core
3.3.12




Para configurarlo se debe crear un archivo ria-config.xml en la carpeta src/main/resources con el siguiente contenido:







Ria-config.xml es el archivo utilizado para setear las configuraciones del framework.
Luego hay que declarar el servlet en web.xml, este maneja las request que vienen por pedidos ajax:


SweetDevRiaServlet
com.ideo.sweetdevria.servlet.SweetDevRiaServlet


SweetDevRiaServlet
/RiaController




Luego hay que configurar un listener que maneje las configuraciones de los componentes y el ciclo de vida de los componentes de la sesión.


com.ideo.sweetdevria.webapp.RiaLoaderListener




Es recomendable que se configure la cache de diferentes objetos para que la pagina sea más rapida:


BrowserCacheFilter
com.ideo.jso.filter.BrowserCacheFilter


BrowserCacheFilter
*.js


BrowserCacheFilter
*.css


BrowserCacheFilter
*.jpg


BrowserCacheFilter
*.gif


BrowserCacheFilter
*.png




Un ejemplo de jsp sería:

< %@ taglib prefix="ria" uri="http://sweetdev-ria.ideotechnologies.com" % >
< %@ page contentType="text/html;charset=iso-8859-1" language="java" % >
< !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >

< html>
< head>
< title>Window test< /title>
< meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
< meta http-equiv="Cache-Control" content="no-cache" />
< meta http-equiv="Pragma" content="no-cache" />
< ria:resourcesImport skinName="BleuF"/>
< /head>
< body>
< ria:newwindow id="myWindowId" title="My Window" openAtStartup="false" loadAtStartup="false">
My text in the window !
< /ria:newwindow>
< input type="button" onclick="SweetDevRia.$('myWindowId').open()" value="Open window"/>
< /body>
< /html>



Dejo links:http://wiki.ideotechnologies.com/display/SWDRIA33/Introduction
http://sweetdev-ria.sourceforge.net/3.5.2.1/

Inyección de dependencias

Hagan click en la imagen sino se ve bien.

Contexts and Dependency Injection o CDI


CDI son las siglas de “Contexts and Dependency Injection for the Java EE platform” aunque no es solo para JEE sino que se puede utilizar también en la JSE. Esta especificado en la JSR-299.

A diferencia de otros motores de manejo de beans, CDI no necesita de ninguna anotación para que una clase se registre y sea manejada. Por defecto todas las clases de un archivo (jar) son manejadas por CDI. La anotación @Named tan solo hace que los atributos de la clase sean accesible desde expresiones EL.

La búsqueda de clases y el registro de las mismas en el motor de CDI hace que el deploy de una aplicación sea mas lento. Por lo tanto, necesitamos de una manera de decirle al container si queremos o no usar CDI. La manera de especificar esto es creando un archivo xml vacío (beans.xml) en los directorios WEB-INF o META-INF.

Se puede por ejemplo tener varios jar, donde uno solo contiene un archivo beans.xml. De esta manera, el contenedor solo registraría las clases de este jar y no de los otros, haciendo que el deploy de la aplicacion sea mas rápido

La sola existencia del archivo WEB-INF/beans.xml o MET-INF/beans.xml ya activa CDI.

CDI no se preocupa por estandarizar el lenguaje xml que se utiliza para la inyección, propone el uso de anotaciones, por ejemplo:

private @Inject @JmsPolicy(ERROR) JmsTemplate errorQeueTemplate;

@Inject indica que campo debe ser inyectado, cuando el motor CDI (un contenedor JEE por ejemplo) encuentra esta anotación busca una instancia del tipo y si no encuentra crea una.

miércoles, 25 de mayo de 2011

Apache JEXL


JEXL es una librería que intenta facilitar la implementación dinámica y scripting en una aplicación o framework.

JEXL su nombre viene de Java EXpression Language, y fue inspirado por Apache velocity y the Expression Language definido en jsp versión 2. Aunque JEXL es similar a EL no es una implementación del mismo.

Veamos que puede hacer JEXL con un ejemplo:

// Create or retrieve a JexlEngine
JexlEngine jexl = new JexlEngine();
// Create an expression object
String jexlExp = "foo.innerFoo.bar()";
Expression e = jexl.createExpression( jexlExp );

// Create a context and add data
JexlContext jc = new MapContext();
jc.set("foo", new Foo() );

// Now evaluate the expression, getting the result
Object o = e.evaluate(jc);


Cuando usar JEXL? Cuando la lógica de mi sistema cambia muy seguido pero usar un motor de reglas de negocio como drool nos queda muy grande esta es una buena opción.

jueves, 19 de mayo de 2011

Tipos de datos en MySQL

Vamos a ver los tipos de datos en MySQL.

MySQL soporta una gran variedad de datos, uno para cada necesidad.


Cadenas de caracteres

Los subtipos de datos existentes aquí son CHAR, VARCHAR, BLOB, TEXT, ENUM y SET.


CHAR y VARCHAR

Son muy similares, y quizás la diferencia más notable sea la forma de almacenamiento: cuando definimos una columna tipo CHAR de tamaño N, e ingresamos un valor (de menos de N caracteres) en esa columna, MySQL rellenará con espacios lo que sobra, mientras que si hacemos lo mismo con una columna de tipo VARCHAR, en este caso no se rellenará con espacios. Cuando obtenemos información a través de una consulta SQL, no obtenemos los espacios sobrantes: MySQL los remueve.

Si se ingresa una cadena de mayor cantidad de caracteres que el tamaño prefijado al definir la columna, la cadena se truncará al llegar al límite.
Por defecto, las comparaciones (en cualquiera de los dos tipos de datos) son insensibles a mayúsculas y minúsculas.

BLOB y TEXT

Se usan para cadenas con un rango que dependerá del tamaño que queramos almacenar.

La diferencia entre ambos es que TEXT permite comparar dentro de su contenido sin distinguir mayúsculas y minúsculas, y BLOB las distingue. Otra diferencia podría ser su uso. TEXT tiende a ser usado para cadenas de texto plano (sin formato), mientras que BLOB se usa para objetos binarios, o sea, cualquier tipo de datos o información, desde un archivo de texto con todo su formato, hasta imágenes, archivos de sonido o video.

BLOB (es un acrónimo de Binary Large OBject, objeto binario de gran tamaño) se subdivide en cuatro tipos que difieren sólo en la capacidad máxima de almacenamiento.

Con TEXT sucede lo mismo, e incluso, hay correspondencia entre la capacidad máxima de almacenamiento de unos y otros.

ENUM

Este tipo de string puede seleccionar su valor únicamente de una lista finita (máximo de 65.535 elementos) de opciones definidas por el usuario, y otras dos por defecto (índice 0 que significa error por ingresos fuera de rango, por ejemplo y está representado por "", e índice NULL con valor NULL).

Por ejemplo:

Definiendo columnas de tipo ENUM("argentina","mexico","paraguay"):

CREATE TABLE user (
nombre enum('juan','pedro') NOT NULL,
pais enum('argentina','paraguay', 'mexico')
);



SET

Similar a ENUM en su funcionamiento, sólo que aquí se puede seleccionar ninguno
o más de un valor de la lista (hasta 64, los muestran separados por comas).

Al ser ENUM semejante a una lista, podemos realizar consultas tales como:

SELECT * FROM nom_tabla WHERE set_col LIKE '%value%';
SELECT * FROM nom_tabla WHERE FIND_IN_SET('value',set_col)>0;
SELECT * FROM nom_tabla WHERE set_col = 'val1, val2';



Numéricos

Se definen los subtipos DECIMAL (o NUMERIC, o DEC), INTEGER (o INT), TINYINT, BIT, BOOL, MEDIUMINT, BIGINT, SMALLINT, FLOAT y DOUBLE (o DOUBLE PRECISION, o REAL).

Todos los tipos numéricos pueden definirse con dos parámetros opcionales: UNSIGNED (impide que los campos numéricos acepten signo negativo, es decir, sólo se aceptarán el cero y los valores positivos) y ZEROFILL (completa con ceros a la izquierda hasta la longitud máxima). La forma de uso es:

TIPO_DATO [UNSIGNED] [ZEROFILL]

Veamos las características de cada tipo de dato:

TINYINT[(M)]

M es el número de dígitos que serán visibles al mostrar el contenido del campo. Si
el campo que se va a mostrar sobrepasa los M dígitos, se mostrarán M dígitos.

  • Si se omite o se sobrepasa la capacidad de TINYINT, se toma la cantidad máxima soportada por este tipo de dato.
  • Si se define con signo va desde -128 a 127.
  • Sin signo (UNSIGNED) va desde 0 hasta 255.
BIT

Es un TINYINT de un dígito (TINYINT(1)).

BOOL

Es un TINYINT de un dígito (TINYINT(1)).


SMALLINT[(M)]

M es el número de dígitos que serán visibles al mostrar el contenido del campo. Si
el campo que se va a mostrar sobrepasa los M dígitos, se mostrarán M dígitos.

  • Si se omite o se sobrepasa la capacidad de SMALLINT, se toma la cantidad máxima soportada por este tipo de dato.
  • Si se define con signo va desde -32768 a 32767.
  • Sin signo (UNSIGNED) va desde 0 hasta 65535.


MEDIUMINT[(M)]

M es el número de dígitos que serán visibles al mostrar el contenido del campo. Si
el campo que se va a mostrar sobrepasa los M dígitos, se mostrarán M dígitos.


  • Si se omite o se sobrepasa la capacidad de MEDIUMINT, se toma la cantidad máxima soportada por este tipo de dato.
  • Si se define con signo va desde -8388608 a 8388607.
  • Sin signo (UNSIGNED) va desde 0 hasta 16777215.

INT[(M)]

M es el número de dígitos que serán visibles al mostrar el contenido del campo. Si
el campo que se va a mostrar sobrepasa los M dígitos, se mostrarán M dígitos.

  • Si se omite o se sobrepasa la capacidad correspondiente a INT, se toma la cantidad máxima soportada por este tipo de dato.
  • Si se define con signo va desde -2147483648 a 2147483647.
  • Sin signo (UNSIGNED) va desde 0 hasta 4294967295.

INTEGER[(M)]

Sinónimo de INT.


BIGINT[(M)]

M es el número de dígitos que serán visibles al mostrar el contenido del campo. Si
el campo que se va a mostrar sobrepasa los M dígitos, se mostrarán M dígitos.

  • Si se omite o se sobrepasa la capacidad correspondiente a BIGINT, se toma la
  • cantidad máxima soportada por este tipo de dato.
  • Si se define con signo va desde -9223372036854775808 a 9223372036854775807.
  • Sin signo (UNSIGNED) va desde 0 hasta 18446744073709551615.

Todas las funciones matemáticas trabajan internamente con valores BIGINT.

FLOAT[(M,D)]

Sirven para definir números con coma, con menos precisión que DOUBLE.
M es el número de dígitos que serán visibles al mostrar el contenido del campo. Si
el campo que se va a mostrar sobrepasa los M dígitos, se mostrarán M dígitos.

El rango de posibles valores va de -3.402823466E+38 a -1.175494351E-38 , 0, y desde 1.175494351E-38 hasta 3.402823466E+38.

DOUBLE[(M,D)]

Sirven para definir números con coma, con más precisión que FLOAT.

M es el número de dígitos que serán visibles al mostrar el contenido del campo. Si
el campo que se va a mostrar sobrepasa los M dígitos, se mostrarán M dígitos.

El rango de posibles valores va:
de -1.7976931348623157E+308 a -2.2250738585072014E-308, y de 2.2250738585072014E-308 a 1.7976931348623157E+308.

DOUBLE PRECISION[(M,D)]

Sinónimo de DOUBLE.

REAL[(M,D)]

Sinónimo de DOUBLE.

DECIMAL[(M[,D])]

Debemos saber que aquí el número es almacenado internamente como una cadena de caracteres (un carácter por cada dígito). Ni el separador decimal (,) ni el
signo menos (-) para números negativos son parte de M.

Si no se le da ningún argumento, por defecto M es igual a 10, tomando un rango de -9999999999 a 99999999999 para números con signo.

Y por defecto, D es igual a 0.

DEC[(M[,D])]

Sinónimo de DECIMAL.

NUMERIC[(M[,D])]

Sinónimo de DECIMAL.

Fecha y hora

Los subtipos de datos existentes son DATETIME, DATE, TIMESTAMP, TIME y YEAR.

DATETIME

DATETIME: Se utiliza cuando se necesita trabajar con fechas y horarios a la vez. El
formato por defecto es ' YYYY-MM-DD HH:MM:SS' pero se le puede dar uno diferente si por algún motivo necesitáramos hacerlo, por ejemplo: 'YYYY/MM/DD HH%MM%SS'.

El rango va desde:

'1000-01-01 00:00:00' hasta '9999-12-31 23:59:59'.

Si al momento de ingresar un DATETIME definimos un valor inválido (por ejemplo,
minuto superior a 60) se almacenará la fecha nula. Por ejemplo: para el formato
'YYYY-MM-DD HH:MM:SS' sería '0000-00-00 00:00:00'.

DATE

DATE se utiliza cuando se necesita trabajar sólo con fechas. El formato por defecto
es 'YYYY-MM-DD' pero se le puede dar un formato diferente si por algún motivo necesitáramos hacerlo, por ejemplo: 'YYYY*MM*DD'. Rango '1000-01-01' a '9999-12-31'.

Si al momento de ingresar un DATE definimos un valor inválido (por ejemplo, mes
superior a 12) se almacenará la fecha nula. Por ejemplo: para el formato 'YYYY-MM-DD' sería '0000-00-00'.

TIMESTAMP

Combinación de fecha y hora. El rango va desde el 01-enero-1970 al año 2037. El formato de almacenamiento depende del tamaño del campo y se visualiza como un número.

Si al momento de crear la tabla se define un TIMESTAMP mayor a 14, se redondea a 14; si se define un número impar, se redondea al par inmediatamente superior.

Si al momento de ingresar un TIMESTAMP definimos un valor inválido (por ejemplo, minuto superior a 60) se almacenará la fecha nula. Por ejemplo:

Para TIMESTAMP(2) sería 00.

Para TIMESTAMP(12) sería 000000000000.

Otro punto importante es que al ingresar una fecha o un horario se toman los datos no ingresados como ceros: esto supone un problema para las fechas, ya que si
tenemos un TIMESTAMP(2) no podemos ingresar sólo el año porque eso supondría
algo como 990000 (día y mes no pueden ser cero, estarían fuera de rango). En cambio, la hora, los minutos y los segundos sí pueden ser cero. Es decir que no podemos insertar cadenas de menos de 6 caracteres.

En PHP hay una gran cantidad de funciones que precisan trabajar con TIMESTAMP.

TIME

Debemos saber que TIME se utiliza cuando se necesita trabajar sólo con horarios. El formato por defecto es 'HH:MM:SS' (aunque también soporta 'HHH:MM:SS'
para períodos largos de tiempo), pero se le puede dar un formato diferente si por
algún motivo necesitáramos hacerlo, por ejemplo: 'HH*MM*SS'.

El rango va de '-838:59:59' a '838:59:59' (es importante que el hecho de poder almacenar TIME negativos nos da la pauta de que existen más usos que el de simplemente guardar el horario de un determinado suceso).

  • Si al momento de ingresar un TIME definimos un valor inválido (por ejemplo, minuto superior a 60) se almacenará la fecha nula. Por ejemplo: para el formato 'HH:MM:DD' sería '00:00:00'.
  • Si ingresamos valores fuera de rango, éstos se terminan reemplazando por el extremo más cercano.

YEAR

Se usa para representar años. Su formato es por defecto YYYY' (puede definirse como 'YY'). El rango va desde 1901 hasta 2155.

  • Si se representa el año con sólo dos dígitos, surge la siguiente particularidad: si se define el campo tipo YEAR como un número, no podemos representar el año 2000 con 00 (sería interpretado como el año 0000); debemos hacerlo con la cadena 00 o con 0.
  • Si ingresamos un valor ilegal, éste será convertido a 0000.

martes, 17 de mayo de 2011

Mi nuevo Linux


Por cuestiones personales he cambiado mi linux antiguo (un debian) por nuevo linux. Y he elegido Linux Mint; por que? Su simpleza, facilidad de uso y como es de uso hogareño. Es excelente para mi.

Si consultamos la wikipedia nos dira:

Linux Mint es una distribución del sistema operativo GNU/Linux, basado en la distribución Ubuntu (que a su vez está basada en Debian). A partir del 7 de septiembre de 2010 también está disponible una edición basada en Debian, es compatible con ésta última y comparte los mismos repositorios.

Linux Mint mantiene un inventario actualizado, un sistema operativo estable para el usuario medio, con un fuerte énfasis en la usabilidad y facilidad de instalación. Es reconocido por ser fácil de usar, especialmente para los usuarios sin experiencia previa en Linux.

Ademas de esto su comunidad es muy activa, encontre una web de habla hispana.

Dejo Links:
http://www.linuxmint-hispano.com/
http://www.linuxmint.com/

domingo, 15 de mayo de 2011

AppFuse



Appfuse es una aplicación web base donde el trabajo de conectar todos los frameworks ya está hecho (por Matt Raible, lo que es garantía de bastante calidad). Es muy útil para ciertos proyectos, sobre todo aquellos que tienen gran cantidad de reglas de negocio asociadas a los usuarios y a sus permisos en la aplicación. Sin embargo, para lograr esto, el “pegamento” usado es demasiado fuerte, y es difícil modificar el comportamiento de lo que se conoce como el “core” de Appfuse.

Para aplicaciones más simples, o para controlar más el proceso de desarrollo, existe Appfuse Light. Siempre en torno a Spring como implementación de inyección de dependencias, es posible elegir entre 60 combinaciones de frameworks MVC y de persistencia.

Appfuse utiliza Maven para toda la automatización, desde la compilación y generación del WAR, hasta la ejecución de las pruebas unitarias o de la propia aplicación en un contenedor Jetty.

Lo que se debe hacer es ir a la siguiente URL y buscar el framework que necesitamos. Esta consulta nos devolvera el archetype de maven para crear nuestro proyecto.

Por ejemplo si quiero un proyecto con tapestry multimodulo el archetype de maven sería:

mvn archetype:generate -B -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfuse-basic-tapestry-archetype -DarchetypeVersion=2.1.0 -DgroupId=com.mycompany -DartifactId=myproject -DarchetypeRepository=http://oss.sonatype.org/content/repositories/appfuse

Dejo links:

Ajax con Prototype


Prototype, uno de los frameworks JavaScript que implementa Ajax. Es orientado a objetos y de propósito general, es decir que puede utilizarse incluso en proyectos en los que no intervenga Ajax.

Prototype introduce un objeto llamado Ajax que, como todos los demás objetos y todas las demás funciones busca eliminar las incompatibilidades entre los navegadores. En el caso de Ajax, las diferencias entre el objeto XMLHttpRequest de Mozilla Firefox y el objeto ActiveX de Microsoft Internet Explorer. Internamente, Prototype inicializa un objeto XMLHttpRequest de la siguiente manera:

var Ajax = {
getTransport: function() {
return Try.these(
function() {return new XMLHttpRequest()},
function() {return new ActiveXObject('Msxml2.XMLHTTP')},
function() {return new ActiveXObject('Microsoft.XMLHTTP')}
) || false;
},
activeRequestCount: 0
};

Externamente, deberemos invocar los métodos necesarios para realizarle peticiones al servidor desde el lado cliente:

url = ‘servidor.php’;
var peticion = new Ajax.Request(
url,
{
method: ‘get’,
parameters: ‘a=1&b=2’,
onComplete: funcionReceptora
}
);


El método Request recibe dos argumentos: la URL destino en donde se resolverá la petición (página, servicio web, archivo plano, etcétera) y una serie de datos en notación JSON. Algunos de los posibles son:
  • method: método de comunicación (POST o GET).
  • parameters: parámetros.
  • onComplete: función que se invoca cuando se completa la transacción.
  • asynchronous: comunicación asincrónica (true por defecto) o sincrónica (false).
  • onSuccess: función por invocar cuando se complete satisfactoriamente la transacción.
  • onFailure: función por invocar si surge algún inconveniente durante la transacción.
  • evalScripts: true para evaluar el código JavaScript de la respuesta.

La función que tomará el control cuando se complete la transacción (conocida como funcionReceptora) automáticamente toma la respuesta como argumento:

function funcionReceptora (respuesta) {
$(‘resultado’).innerHTML = respuesta.responseText;
}

La respuesta admite las propiedades del objeto XMLHttpRequest, por ejemplo:

  • responseText (respuesta devuelta por el servidor).
  • responseXML (respuesta devuelta por el servidor, se valida como XML).
  • status (estado de la respuesta).
  • statusText (descripción del estado).

Esto fue un pequeño resumen del uso de Prototype, dejo links: