Translate

jueves, 21 de julio de 2011

Sindicato Unión Informática

Siempre que estamos bien, no pensamos en el futuro. Es hora de ver y trabajar por nuestro futuro. Me llego este mail y quiero compartirlo:

Seguramente muchos no saben pero el 28-JUL hay convocado un paro en IBM.
Es raro escuchar esto, dado que nuestra profesión no está acostumbrada a estar sindicalizada.

Pero analizando los sueldos que pagan y la estructura que se conoce en empresas grandes como IBM, plantean que los profesionales comienzen a "unirse" por mejores condiciones laborales y salariales. Más datos en http://www.union-informatica.com.ar/.

Como podrán observar un sueldo en IBM evaluación 2, está por debajo de los 6000$AR (unos 1450 USD), que es el básico de muchos asalariados sin especialización (obreros, camioneros, etc).

Es decir, las lineas bajas están mejor representados y unidos, generando mejores negociaciones para todos ellos. Hace rato que había leído acerca de la próxima "rebelión" de las lineas medias (profesionales). Es decir, los que mayormente integramos esta lista :).

Se que el problema pasa mayormente en las grandes compañías que tienen las famosas software factories. Si bien, muchos trabajamos en empresas más pequeñas donde nos permiten usar hasta nuestras herramientas, no siempre es el caso. Hay grandes empresas donde usan Smalltalk también y estamos inmersos en el mismo dilema.

¿Que opinan, será favorable?

miércoles, 20 de julio de 2011

InvokeDynamic en Java 7


Ya hemos hablado en post anteriores sobre el proyecto Da Vinchi:

da-vinci-machine-project.html

InvokeDynamic es el primer fruto de este proyecto, básicamente que permite hacer InvokeDynamic, invocar métodos al vuelo; si si va ser usado para closures. Si bien no se puede usar desde java es una mejora importante para jvm preparando todo para el uso de closures en la versión 8 de java.

La pregunta es cantada, para que hacen esta mejora en java 7 si la vamos a ver en java 8. Es para los lenguajes script que actualmente corren en java.
Poder ejecutar al vuelo métodos le da la posibilidad a lenguajes script a correr mucho más rápido. Anteriormente se veían obligados a un uso de reflexión.
En conclusión en java 7 los lenguajes scripts son mucho más rápidos y la pregunta es: el futuro de la plataforma esta en otros lenguajes?

Dejo links:

http://java.sun.com/developer/technicalArticles/DynTypeLang/index.html

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.