Fin de Blog

Este Blog no tendrá más actualizaciones.
Pronto se creará uno mas completo en marceloagustini.com

CrudRepository, Spring al rescate de nuestro generico.

Spring framework es algo enorme, monstruoso con patterns inagotables.
Decir que lucha codo a codo con EJB ya es comparar dos cosas cada vez mas diferentes.
Si, con Spring Boot, por ejemplo, estamos mas cerca de un Node.JS que un EJB Container simplemente porque Spring intenta ser totalmente independiente de cualquier especificación.
Pero antes de comenzar a hablar muy brevemente de CrudRepository podemos estar totalmente de acuerdo en que Spring framework evoluciona favorablemente. Eso no lo podemos discutir.

Que es CrudRepository?

Bien, por empezar CRUD es algo que todos realizamos en el desarrollo de software. Y hasta no hace mucho tiempo, cuando los genéricos se implementaron en lenguajes Java y C# pudimos utilizarlos hasta construir un DAO totalmente vacío y heredado.

Si bien, hoy no voy a hablar en detalle de un GenericDAO, lo usual es crearse uno propio por única vez para todos los proyectos que lo utilicen.

CrudRepository es una interfaz de Spring, que nos provee este mecanismo sin necesidad de construir nuestro GenericDAO.

Algunos puntos interesantes, solo se utiliza la interfaz, no se utiliza la implementación. Y lo mas interesante es que maneja métodos de búsquedas y ordenamientos de manera automática. Por ejemplo:

public interface PersonRepository extends Repository<User, Long> { … }

List<Person> findByLastname(String lastname);

El metodo finByLastName creado por nosotros no necesita implementación y Query alguna, al escribirla en la interfaz ya puede ser utilizado en cualquier Controller.

Increíble, verdad? Esto solo es el comienzo.

AngularJS, ese pequeño enorme framework

Estoy renovando web y reactivando el Blog, estos Tips que siempre son útiles para algunos developers como yo.

Si bien siempre he sido del palo del Java, voy a compartir una realidad de mi trabajo. Simplemente se trata del framework web.
Cuando mi apreciado colega, Silvio Moschen me pregunta: si hoy debes comenzar un proyecto, cuales frameworks elegirías?
Fue entonces que me di cuenta que no lo sabía en concreto, me puse a imaginar esto:

Backend y lógica enterprise:

  • Spring Framework con AOP y HIBERNATE de ORM
  • Spring Security
  • Spring MVC con REST Controllers.
  • Puede ser EJB si dispongo del contenedor. Me es igual a Spring.
  • Luego, dependiendo de otras cuestiones, en Java siempre obtenemos las librerías que quisiéramos sin movernos de Maven. Por ejemplo, si me piden Excel, cargo el Apache Poi y asunto terminado.

Hasta ahora todo Ok, pero notamos que Spring es mi solución ideal del backend… no es mi mejor opción en la web. Por que?

Tengo para seleccionar frameworks que he utilizado con mucha frecuencia y mis opiniones al respecto, porque como se sabe, sólo debemos opinar de aquello que conocemos:

  • JSF 2.x: A mi parecer, en su momento estuvo bien, a pesar de su lentitud en renderizados pero se potenciaba mucho con sus add-ons como PrimeFaces. Ahora está fuera de tiempo, por ejemplo, Bootstrap ya no es posible utilizarlo con el, por lo menos de una manera humana. La falta de novedad al respecto creo que me da la razón.
  • ExtJS: Puro JavaScript, bastante complejo y códigos algo extensos para su batería de controles. Lo bueno es que puedes controlar todo. Digamos que es un framework de bajo nivel si lo vemos desde el browser. Su calidad de propietario me han hecho desistir de ExtJS.
  • ZK Framework: Fue mi alternativa al ExtJS cuando la busqué, un framework con controles Javascript mas unificado al Java. Con opciones MVC y MVVM, este último fue el que utilicé. Me parece (solo es mi opinion) que MVC ya está sintiendo el tiempo. Es propietario con una versión Community muy completa. Tengo varios sistemas actuales en él, pues es un framework muy ágil y simple de utilizar.
  • Spring MVC: Me gustó pero luego, con Ajax a los parches, dejó de gustarme.
    Sigue flojo en Bindings de clases y prácticamente no tienes un MVVM resuelto.
    Se quedó en el tiempo y su MVC puro y duro lo hicieron complejo. Entiéndase, busco soluciones que se amolden al tiempo y la web crece día a día.
  • AngularJS o similares: Una luz dentro del túnel. Es la forma que lo describo. Con una ingeniería perfecta, la gente de AngularJS nos ofrece la perfecta solución desacoplada entre backend y frontend.
    Sin dudas sería mi opción, a pesar de su falta de controles, es una opción que no me complica el layout html y tampoco me obliga a utilizar una tecnología de servidor concreta, pero claro, se recomienda Rest.

Espero que les sea de útil referencia.

SOA, ejemplo en la vida real

Si usted ingresa a algún portal de empleos IT, verá que SOA ya es un requerimiento.
Muchos años nos vimos obligados a pensar la teoría y la práctica de SOA como un mecanismo paralelo. Ahora simplemente se está aplicando en empresas de calibre medianos y/o pesados con BMPN o similares.
Si realmente quiere ver como o en qué escenario aplicarlo, esta webpage  nos muestra de manera simple y práctica cuando podemos optar por SOA en nuestra organización desde el punto de vista IT.
Los arquitectos SOA son requeridos por fin, en este 2015.

 

 

Hola MEAN. Adios a Xampp?

Muchas veces me había preguntado…
Que alternativa tenemos en la simbiosis rápida, cómoda y para nada evolutiva Xampp?
Rápida, porque PHP nos deja escribir scripts a los revoleos, cómoda porque podemos hacerlo donde y cuando quisiéramos y para nada evolutiva simplemente porque personalmente no veo evolución en el lenguaje (revolución diríamos).

MySQL pierde terreno en favor de PostgreSQL y finalmente Apache sigue siendo Apache, un server completo, complejo y centralizado.

Está claro que en aplicaciones empresariales tengo otras preferencias (Spring Framework, Java o Net) , pero en pequeñas apps móviles distribuidas, hoy me decanto por MEAN sobre XAMPP.

Node.js es la revolución mas interesante que he visto en los últimos años y AngularJS hizo lo mismo en cuanto a clients apps.
De todo este movimiento, quizás no me convenza en demasía MongoDB pero es cuestión de aceptar que la necesidad de lectura escritura en alguna aplicaciones deberían ser mas ágiles y sencillas. json lo es, sin dudas.

Estamos en una era en la cual las aplicaciones web vuelven a dar un giro, una ves mas obligándonos finalmente a mantener un archivo html como siempre debería haber sido, simplemente un archivo html.

La pregunta es, quien usará scriptlets PHP o JSP en el 2015?

RedirectAttributes. Spring MVC 3.1

Muchas veces necesitamos redireccionar la vista en Spring MVC. Por ejemplo, en un Form la vista devuelve la URL pero convencionalmente nos queda en el navegador el llamadado POST realizado.
Para forzar a redireccionar en Spring 3.1 podemos hacerlo con “redirect:/” en el return del método.
Pero como veras, los atributos no viajan en el model…
Para solucionarlo tenemos la clase RedirectAttributes y su método:
redirectAttributes.addFlashAttribute(“objeto”,objeto);

Muy practico.

AndroidSDK, crear un botón de actualización

Algunas veces necesitamos actualizar la aplicación desde el mismo Device o Tablet.Muchas veces estas se encuentran conectadas a alguna red inalámbrica.

El cliente necesita la última versión que, en general arregla algunos bugs o simplemente mejora nuestra aplicación móvil.

En AndroidSDK tenemos la posibilidad de lograrlo con estos simples códigos:

1- Creamos un button y lo conectamos con un método del controlador

2- Creamos una tarea asíncrona

3- Instanciamos la tarea en el método que llama el botón:

A tener en cuenta: Debemos ubicar nuestro APK en una URL válida.

CODIGO DEL ASYNCTASK (TAREA ASINCRONA)


import java.io.File;

import java.io.FileOutputStream;

import java.io.InputStream;

import java.net.HttpURLConnection;

import java.net.URL;

import android.content.Context;

import android.content.Intent;

import android.net.Uri;

import android.os.AsyncTask;

import android.util.Log;


public class UpdateApp extends AsyncTask<String,Void,Void>{

private Context context;

public void setContext(Context contextf){

context = contextf;

}



@Override

protected Void doInBackground(String... arg0) {

try {

URL url = new URL(arg0[0]);

HttpURLConnection c = (HttpURLConnection) url.openConnection();

c.setRequestMethod("GET");

c.setDoOutput(true);

c.connect();


String PATH = "/mnt/sdcard/Download/";

File file = new File(PATH);

file.mkdirs();

File outputFile = new File(file, "update.apk");

if(outputFile.exists()){

outputFile.delete();

}

FileOutputStream fos = new FileOutputStream(outputFile);

InputStream is = c.getInputStream();

byte[] buffer = new byte[1024];

int len1 = 0;

while ((len1 = is.read(buffer)) != -1) {

fos.write(buffer, 0, len1);

}

fos.close();

is.close();

Intent intent = new Intent(Intent.ACTION_VIEW);

intent.setDataAndType(Uri.fromFile(new File("/mnt/sdcard/Download/update.apk")), "application/vnd.android.package-archive");

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // without this flag android returned a intent error!

context.startActivity(intent);

} catch (Exception e) {

Log.e("UpdateAPP", "Update error! " + e.getMessage());

}

return null;

}

}


CODIGO DEL METODO:


public void sincronizar(View view) throws NumberFormatException, ParseException {

UpdateApp atualizaApp = new UpdateApp();

atualizaApp.setContext(getApplicationContext());

atualizaApp.execute("http://myweb.com/android/myapp.apk");

}