Bienvenido a Java Mexico

Java México es una comunidad de desarrolladores mexicanos en el lenguaje Java.

Este sitio es colaborativo, automáticamente al registrarte obtienes un Blog para compartir tus conocimientos o información acerca del lenguaje. Antes de publicar en tu blog o los foros por favor lee los lineamientos de publicación.

Para dudas y problemas con respecto al lenguaje Java puedes visitar los Foros de Discusión.

También puedes responder nuestra encuesta para saber en que estado vives!

Ceylon 1.1

Hoy liberamos la versión 1.1 de Ceylon:

http://ceylon-lang.org/blog/2014/10/09/ceylon-1/

Después de 10 meses de arduo trabajo, esta versión contiene una gran cantidad de correcciones (más de mil issues procesados), mejoras y optimizaciones, incluyendo:

  • Optimizaciones en ambos compiladores para reducir tiempos de compilación
  • Optimizaciones al IDE, para tener mejores tiempos de respuesta
  • Optimizaciones al código generado para un mejor desempeño del código ejecutable
  • Varios módulos nuevos en el SDK
  • Integración con vert.x
  • Interfaces dinámicas para el backend de JavaScript, de modo que se puedan asignar tipos estáticos a estructuras que cumplan con las características definidas en los mismos

Espero que lo prueben pronto, y nos den su opinión y comentarios.

Kata de palíndromos con Streams (en Scala)

Pues resulta y pasa que para una entrevista tuve que resolver un problema cuya definición (a lo que recuerdo) era:

Dada una lista de palabras, por cada elemento hacer lo siguiente:

  • Obtener una combinación de las letras de la palabra las cuales sea un palíndromo, i.e. una palabra que se lee indistinguiblemente al derecho o al revés; imprimirla en consola.
  • Si no se encuentra dicha combinación, imprimir "-1" en la consola.

E.g., teniendo la lista de palabras "racecar", "icicv", "dar", deberia de imprimirse algo como "racecar", "civic", -1.

Cómo usar los "templates" de eclipse - Guía básica

 

Seguramente habrás notado que cuando escribes una palabra mágica (por ejemplo main, como en la siguiente imagen) y luego presiones Ctrl + Espacio, te aparece algo como lo siguiente:

 

 

Y si seleccionas la primera opción, el código del lado derecho de la ventana emergente se insertará en tu editor. Dentro de eclipse, a esto se conoce como templates.

Los siguientes dos ejemplos te pueden dar una idea de cómo agregar tus propios templates.


 

Template para Singleton

El template para el insertar el main se encuentra dentro de las Window > Preferences > Java > Editor > Templates

Los templates son fragmentos de código de tu lenguaje favorito con unas variables especiales que eclipse reemplaza en el momento de la inserción. El template que utilizaremos para el patrón de diseño singleton es el siguiente:

/**
 * La referencia de la instancia del singleton. No es construida hasta que se carga la clase.
 */

Usando el ListeningExecutorService de Guava

Antes de conociera algo de Hystrix en una aplicacion que mantengo tuvimos varios problemas con un servicio de notificaciones. Este servicio dependia de otro servidor que, como todo, a veces fallaba.

El detalle es que el proceso de notificación se hacía durante el proceso principal de la aplicacion; cuando se realizaban las llamadas correspondientes al servicio el proceso se detiene o lanzaba excepción... pero esto era en el mejor de los casos, también ocurrio que no especificamos timeouts para el servicio y por lo tanto el proceso principal de la aplicacion podia quedarse varado hasta por un día (que era el timeout por defecto del socket que se abría por medio de otra libreria).

En fin, el perder las notificaciones no era opción y tampoco lo era detener el proceso hasta que estas notificaciones se entregaran. Por lo tanto, optamos por hacer algo como esto:

Hystrix: primer contacto

En la conferencia de Software Guru de este año, Agustín Ramos dio una charla acerca de sistemas tolerantes a fallas, en la cual mencionó un software que me llamó mucho la atención, llamado Hystrix, desarrollado por Netflix.

La idea de Hystrix es que en sistemas que se comunican mucho con otros sistemas por medio de red, poder aislar todas esas llamadas a servicios externos y permitir que sean administradas de forma robusta, es decir, que haya un control de conexiones salientes, mantener buenos tiempos de respuesta, con tolerancia a fallas integrada.

Esto suena muy bien: si tengo un sistema que hace llamadas constantes a un web service externo, generalmente el funcionamiento de ese web service afecta el funcionamiento de mi sistema: Si de repente se pone lento, se tarda mucho en contestar, mi sistema empieza a sentirse lento, porque está esperando respuesta del sistema externo. Luego empiezan los problemas porque resulta que mi sistema encola las llamadas a dicho web service, precisamente para no saturarlo, pero pues está lento y eso está fuera de mi control pero resulta que las llamadas encoladas ya se tardan mucho tiempo en ejecutarse, es decir, la tardanza del web service no solamente se convierte en esperar respuesta del mismo, sino que hay llamadas que se quedan mucho tiempo encoladas y entonces puede que ya salgan muy tarde. ¿Y si hay un usuario en línea esperando la respuesta? ¿Y si el sistema ya le respondió error, incluso antes de que siquiera se realice la llamada al servicio externo?

Ejemplo básico Quartz 2.2.1 + Tomcat 7.0.54 (con edición de expresión cron)

Quartz es una utilería que permite calendarizar tareas, o en otras palabras, ejecutar una tarea cada cierto tiempo. Funciona sobre Java SE o Java EE. El siguiente ejemplo requiere de las siguientes librerías:

  • quartz-2.2.1.jar
  • slf4j-api-1.7.7.jar
  • slf4j-simple-1.7.7.jar

No se requiere el archivo web.xml. Utiliza @WebListener y @WebServlet.

Estructura

El proyecto tiene la siguiente estructura (siguiendo la estructura de un proyecto típico de eclipse):

C:.
|
|
+---src
|   +---jobs
|   |       SimpleJob.java
|   |
|   +---listeners
|   |       QuartzListener.java
|   |
|   \---servlets
|           EditTriggerServlet.java
|
\---WebContent
    \---WEB-INF
        \---lib
                quartz-2.2.1.jar
                slf4j-api-1.7.7.jar
                slf4j-simple-1.7.7.jar

QuartzListener.java

Football Mejor y peor equipo

Se presentan los resultados de la liga premier 2001 y 20002 el programa obtiene el mejor y el peor equipo basado en los goles anotados y recibidos.

se utiliza la programacion MapReduce para resolverlo.
Este es el Mapper:

package mx.com.sinapsis.ds.test.futbol;

import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

public class ObtenerDiferenciaMapper extends Mapper<LongWritable, Text, LongWritable, Text>{
        private Text diferenciaText = new Text();
       
        protected void map(LongWritable key, Text value, Context context)
                      throws java.io.IOException, InterruptedException {
                String[] dato = value.toString().split(",");
               
                int temp = Integer.parseInt(dato[5]) - Integer.parseInt(dato[6]);
                diferenciaText.set(dato[0] + "," + temp);
               
                context.write(new LongWritable(1), diferenciaText);
               
        }

}

este es el reducer:

 

package mx.com.sinapsis.ds.test.futbol;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

Programando en Ceylon y PSeInt

Existe una herramienta para aprender a programar llamada PSeInt, en esta ocasión vamos a realizar ejemplos de programación básica y comparando esos códigos en Ceylon.

Ejemplos

1. Se requiere obtener la talla de una persona sabiendo que su peso es de 54.5 kg y su índice de masa corporal es de 22.1.
Fórmulas:
imc=peso/(talla*talla)
peso=(talla*talla)*imc
talla=sqrt(peso/imc)

Usando PSeInt escribimos:

Ahora en Ceylon:
obtenerTalla.ceylon

void run(){
variable Float peso=54.5;
variable Float talla=0.0;
variable Float imc=22.1;

function sqrt(Float x) => x^0.5; //para obtener la raíz

talla=sqrt(peso/imc);
print("talla: ``talla`` ");
}

Compilamos y ejecutamos:

Distribuir contenido