Translate

sábado, 20 de agosto de 2011

Iniciando con Maven


Maven es una herramienta para la construcción de proyectos en java, ya explicamos que es en este post http://emanuelpeg.blogspot.com/2011/02/maven.html ahora veamos como utilizarlo.


Instalar Maven:
  1. Bajar Maven de: http://www.apache.org/dyn/closer.cgi/maven/binaries/apache-maven-2.2.1-bin.zip, por ejemplo
  2. Copiarlo en un directorio en disco por ejemplo: c:\maven
  3. Agregar la carpeta bin de maven a la variable PATH. Para meter el subdirectorio bin en el path de ejecutables, le doy con el botón derecho del ratón sobre el icono de "Mi PC" y elijo "Propiedades", "Avanzado" y "Variables de Entorno". Busco "Path" y le doy a "Editar". Añado al final ";C:\maven\bin" (con punto y coma delante, para separlo de lo que ya haya escrito)
  4. Abrir una consola en windows ir a ejecutar y escribir “cmd”, en linux abrir cualquier consola y escribir:

> mvn --version

Y obtendrá la siguiente salida:

Apache Maven 2.2.1 (r801777; 2009-08-06 16:16:01-0300)
Java version: 1.6.0_25
Java home: /java/sdk/jdk1.6.0_25/jre
Default locale: es_AR, platform encoding: UTF-8
OS name: "linux" version: "2.6.35-22-generic" arch: "amd64" Family: "unix"

Configurar maven para que funcione utilizando una red con un proxy:

Es común el uso de proxies en empresas para brindar mayor velocidad en el uso de internet, en otros casos también es usado para restringir el uso de internet para algunos empleados. Es posible configurar maven para que funcione atra vez de un proxy.

Si la conexión a internet es a través de un proxy, necesitamos configurar maven para que sepa cómo acceder a través de él. El proxy puede además requerir un usuario y password para el acceso.
Vamos al directorio conf donde tenemos instalado maven, en mi caso c:\maven-2.0.4\conf y editamos el fichero settings.xml. Es un fichero xml y en el sitio que pone proxies, justo debajo, ponemos esto



optional
true
http
mi_nombre_usuario
mi_passowrd
ip_de_mi_proxy
80
ordenadores_de_mi_red_local_separados_por_comas

...

El id optional es un nombre que queramos darle para identificar el proxy. En vez de optional podemos poner cualquier nombre. especifica una lista separada por pipes (|) con los servidores o direcciones IP excentas de proxy.
Por ejemplo:



ConfigProxy
true
http
proxyuser
proxypass
10.10.10.1
8080
10.10.10.2|10.10.20.1



Creación de proyecto con Maven

Para crear un proyecto con maven hay que abrir la consola, y pocicionarse en la carpeta donde es necesario crear el proyecto y luego escribir en consola los siguiente:

mvn archetype:create -DgroupId=com.ejemplos -DartifactId=EjemploMaven

Veamos los parámetros
  • archetype:create es el comando/plugin, o como quieras llamarlo, de maven para crear un proyecto. Por defecto crea un proyecto de java plano.
  • -DgroupId es el conjunto de proyectos al que pertenece nuestro proyecto. Por ejemplo, yo puedo meter todos mis programas de ejemplo en un grupo que llamaré "com.ejemplos". Este nombre que pongamos aquí va a servir de paquete inicial para todas las clases del proyecto. Todos los proyectos maven deben pertenecer a un grupo, aunque sea único para él, que se denominará groupId.
  • -DartifactId es el nombre que queramos dar al proyecto. Maven creará un directorio con este nombre y el jar que genere para el proyecto tendrá también este nombre. Todos los proyectos maven tienen un nombre para identificarlos, que se denomirá artifactId
Al ejecutar este comando maven crea el proyecto y baja de internet los jar necesarios. Si todo salio bien vera el siguiente cartel:

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 30 seconds
[INFO] Finished at: Sat Aug 20 19:26:27 ART 2011
[INFO] Final Memory: 11M/490M
[INFO] ------------------------------------------------------------------------

La estructura del proyecto creado es la siguiente:

EjemploMaven
+---src
¦ +---main
¦ ¦ +---java //Para nuestros fuentes
¦ ¦ +---com
¦ ¦ +---ejemplos
¦ ¦ +---App.java
¦ +---test
¦ +---java //Para test de Junit
¦ +---com
¦ +---ejemplos
¦ +---AppTest.java
+---pom.xml

Dentro un fichero pom.xml que es un fichero que contiene datos de configuración de nuestro proyecto, como dependencias con otros jar, tipos de informes que queremos en la página web de nuestro proyecto, etc.. Inicialmente contiene una serie de cosas por defecto que podremos cambiar si lo deseamos.

Crea dos subdirectorios, uno src y otro test. Dentro de src debemos meter todo lo que sean fuentes y ficheros de configuración o datos propios del proyecto. En la parte de test debemos meter todos nuestros fuentes de prueba, clases de test de JUnit, ficheros de datos o de configuración de pruebas, etc. Es decir, en src va lo que es del proyecto y en test lo que nos ayude a probar el proyecto, pero no sea propio del proyecto.

En ambos casos, crea un directorio java. Ahí debajo es donde van los fuentes java. En paralelo a estos directorios java y si lo necesitamos, debemos crear nosotros a mano otros directorios. El nombre de estos nuevos directorios es standard en maven.

Para compilar la aplicación, por consola entramos al directorio EjemploMaven
y escribimos:

mvn compile

Si queremos correr los test 

mvn test 

Si queremos generar el empaquetado (jar, war, ear)

mvn package 

Si queremos correr los test + compilar + generar el empaquetado

mvn install

Al correr estos comandos generara una carpeta target, la cual contendra los archivos compilados y el jar generado. Si se quiere borrar esta carpeta y limpiar el proyecto se debe ejecutar:

mvn clean

Se pueden convinar los comandos por ejemplo borrar target y limpiar el proyecto para luego generar un paquete:

mvn clean install

Repositorios Maven

Una de las grandes ventajas de maven son los repositorios (almacenes) de ficheros jar que se crea.
Si miras en http://www.ibiblio.org/maven2/ tienes el repositorio oficial de jars de maven. Ahí están los groupId de casi todos los jar de libre distribución que puedas encontrar en internet. Tienes el log4j, commons-logging, JFreeChart, mysql-connector, etc, etc. Maven es capaz de bajarse cualquiera de estos jar si tu proyecto lo necesita.

Todo lo que se baje maven de internet lo mete en un repositorio (almacen) local en tu pc, de forma que si lo necesita una segunda vez, no necesita descargárselo nuevamente de internet. Este directorio, habitualmente está en

$HOME/.m2 en unix/linux
C:\Documents and Settings\usuario\.m2 en windows

Adicionalmente podemos configurar maven para que use más repositorios, tanto de internet como otros que montemos internamente en nuestra red local si la tenemos. Por ejemplo, en internet tienes otro repositorio con jars independiente de maven en http://java.freehep.org/maven2/
El repositorio interno en la red local es particularmente útil si trabajamos en una empresa y hacemos proyectos que son dependientes unos de otros o tenemos nuestras propias librerías de jars. Poniendo jars en ese repositorio de empresa, todos los programadores podrán acceder o subir jars a ese repositorio y compartirlos.

Al hacer mvn install maven agrega nuestor jar al repositorio local de nuestra PC. Es decir que lo agrega a .m2

En próximos post seguiremos esta inicialización con Maven.

domingo, 14 de agosto de 2011

JavaCC

Una de las capacidades de la tecnología Java es que no solo puede correr e lenguaje Java sino innumerables lenguajes más. Pensemos si pudiéramos hacer un lenguaje a nuestro gusto, para eso existe JavaCC

JavaCC (Java Compile) es un generador de lenguajes que funcionen sobre la plataforma java y además es open source. Es similar a Yacc pero para java.

JavaCC es una herramienta para transformar y generar un parser con código Java (similar a las expresiones regulares) para chequear la sintaxis del código fuente desde reglas definida como gramática. La gramática de JavaCC es similar a la de java por suerte.

Dejo algunos tutoriales:

http://www.codeproject.com/KB/cross-platform/CreateProgrammingLanguage.aspx
http://www.uhu.es/470004004/practicas/practica04.htm

miércoles, 10 de agosto de 2011

Rails for Zombies: Resurrection Announcement


Muy interesantes son los cursos dictados por codeschool entre los más cursados se encuentra el de Ruby for zombies. La verdad lo recomiendo porque es muy fácil de seguir y además es gratuito.


Ahora van a dictar la segunda parte titulada: Resurrection Announcement. No solo que son muy divertidos sino que muy interesantes.




Dejo links:

Java SE 7 Released

Me llego un mail hace instantes que nos dice lo siguiente:

After nearly five years of collaboration within the worldwide Java community, Java Platform, Standard Edition 7 is ready for download! The major features of Java SE 7 are Project Coin, the Fork/Join framework, the New File System API, and InvokeDynamic. It's an important step in Java’s evolution. Learn more:

Download Java SE 7
Read the Press Release: Oracle Announces Availability of Java SE 7
Watch the technical presentations from Oracle's global event on July 7
View Moving Java Forward: A Video Discussion about Java 7
Find a JUG meeting covering Java 7 near you
Access Java 7 Training
Get Involved in Open JDK

-The Oracle Technology Network Team (The Java Source Blog)

domingo, 7 de agosto de 2011

Clojure


Clojure es Lisp sobre JVM. Clojure es un dialecto de Lisp por lo tanto si entendemos Lisp entendemos Clojure. Lisp es un lenguaje funcional no puro. Lisp tiene algunas características interesantes:

Lisp es un lenguaje de listas. Una llamada a una función utiliza el elemento de la primera lista como la función y el resto como los argumentos.
Lisp utiliza sus propias estructuras de datos para expresar código

Si mezclamos estas dos ideas obtendremos un lenguaje ideal para metaprogramacion. Podemos organizar nuestro código en un árbol teniendo una base de modelo de objetos, también podemos crear un código basado en prototipos. Dándonos gran flexibilidad.

Los primeros dialectos de Lisp son Common Lisp y Scheme. Scheme y Clojure son de la familia de dialectos llamado lisp-1 y Common Lisp es de la familia llamada lisp-2.

Una de las cosas más importantes de Clojure es que funciona sobre la JVM lo que permite usar todas las librerías y frameworks ya escritos en java.

Clojure es funcional y es dinámicamente tipado, lo que hace que el código sea más fácil de leer y más divertido de escribir.

Esto es solo una introducción en proximos post seguiremos escribiendo de este lenguaje.

Dejo Link:
http://clojure.org/

jueves, 4 de agosto de 2011

UnQL


CouchDB y SQLite han creado un nuevo lenguaje de consulta de datos, aunque es similar a SQL, esta diseñado para trabajar con bases documentales, NoSQL.

El lenguaje incluye select, update, delete y inserts pero no como SQL ya que no trabaja con tablas sino con colecciones desordenadas de documentos. En UnQL un documento es un objeto que puede ser descripto con JSON, un float, un string, puede ser visto como un documento.

Al leer que todos los documentos se pueden representar con JSON, se nos viene a la mente BSON el lenguaje de MongoDB otra base de datos documental, NoSQL. Tomando caminos diferentes confluimos en casi iguales estructuras y lenguajes. Sera hora de estandarizar un lenguaje NoSQL?

martes, 2 de agosto de 2011

Ceylon


La República Democrática Socialista de Sri Lanka (cingalés:ශ්‍රී ලංකා ප්‍රජාතාන්ත්‍රික සමාජවාදී ජනරජය, Sri Lankā Prajathanthrika Samajavadi Janarajaya, tamil: இலங்கை சனநாயக சோஷலிசக் குடியரசு, Ilaṅkai caṉanāyaka cōṣalisak Kuṭiyarasu) es un país insular ubicado al sureste de India en Asia. Hasta 1972 era llamado Ceilán. Originalmente conocido como Heladiva, está habitada por más de veinte millones de personas.
La isla fue conocida en la Antigüedad como Lanka, Lankadvīpa, Simoundou, Taprobane, Serendib y Selan, llegando a ser denominada popularmente como la «Isla de los mil nombres». Durante su colonización, la isla tomó el nombre, en inglés, de Ceylon, que se siguió utilizando posteriormente. Su particular forma y su cercanía a la India hicieron que se la llame la «Lágrima de la India».

Además Ceylon es el nombre del nuevo lenguaje de Jboss para la JVM.

Ya escribí sobre este nuevo lenguaje de Jboss que corre sobre la JVM. Gavin escribe en su blog que el Lenguaje Java a quedado un poco viejo; por lo tanto el diseño un lenguaje llamado Ceylon que tiene como principal objetivo actualizar el lenguaje Java.

Los objetivos de Ceylon incluyen: Ser fácil de aprender tanto para desarrolladores Java como C#
  • Eliminar la verbosidad de Java pero manteniendo la legibilidad
  • Mejorar el tipado estático de Java
  • Proveer una expresión declarativa para eliminar dependencias con xml
  • Apoyar y fomentar un estilo de programación más funcional.
  • Proveer soporte para meta-programación
  • Proveer construcción modular.

Veamos el clasico “Hola Mundo”:
void hello() {   writeLine("Hola Mundo!");
}

Este método imprime “Hola Mundo!” por consola. Un método TopLevel como este es similar a una función C, esta es manejada directamente por el paquete que la contiene. Y esta no es parte de ningún tipo, por lo tanto no es necesario llamar a un objeto para llamar a un método TopLevel y a la vez no es necesario tener funciones estáticas.Para documentar el codigo provee una anotaciones que nos permiten hacer una documentación más natural por ejemplo:
doc "The classic Hello World program"
by "Gavin"
see (goodbye)
throws (IOException)
void hello() {
writeLine("Hello, World!");
}

Ceylon provee también mejora en el manejo de string, veamos un ejemplo:
doc "The Hello World program
... version 1.1!"
void hello() {
writeLine("Hello, this is Ceylon " process.languageVersion
" running on Java " process.javaVersion "!");
}

Para el manejo de objetos nulos provee un operador ?, veamos un ejemplo:
doc "Print a personalized greeting"
void hello() {
String? name = process.arguments.first;
String greeting;
if (exists name) {
greeting = "Hello, " name "!";
}
else {
greeting = "Hello, World!";
}
writeLine(greeting);
}

Name es declarado como String? Lo que significa que acepta valores nulos. También podemos usar el operador ? Para no devolver valores nulos:
shared String greeting = "Hello, " + name?"World";

El operador ? Devolverá name si no es nulo, sino devolvera “World”

Celyon provee parámetros por defecto, secuencias y diferentes tipos de parametros:

void hello(String name="World") {
writeLine("Hello, " name "!");
}


//sequenced parameter
void print(String... strings) {
for (String string in strings) {
writeLine(string);
}
}


//union type
void print(String|Named printable) {
String string;
switch (printable)
case (is String) {
string = printable;
}
case (is Named) {
string = printable.name;
}
writeLine(string);
}

Veamos la declaración de una clase:

doc "A personalized greeting"
class Hello(String? name) {

doc "The greeting"
shared String greeting;
if (exists name) {
greeting = "Hello, " name "!";
}
else {
greeting = "Hello, World!";
}

doc "Print the greeting"
shared void say(OutputStream stream) {
stream.writeLine(greeting);
}

}

Como se puede ver no es necesario un método constructor dado que el código se ejecuta en el cuerpo de la clase.

Ahora veamos como se usa nuestra clase:

doc "Print a personalized greeting"
void hello() {
Hello(process.args.first).say(process.output);
}


La palabra new no se usa simplemente porque no es necesaria.
Las interfaces pueden tener definiciones de metodos pero no se pueden instanciar veamos un ejemplo:

shared interface Writer {

shared formal Formatter formatter;

shared formal void write(String string);

shared void writeLine(String string) {
write(string);
write(process.newLine);
}

shared void writeFormattedLine(String formatString, Object... args) {
writeLine( formatter.format(formatString, args) );
}

}

shared class ConsoleWriter()
satisfies Writer {

formatter = StringFormatter();

shared actual void write(String string) {
writeLine(string);
}

}


Hasta aquí una pasada por este nuevo lenguaje para JVM. En mi opinión, cumple sus objetivos; pero deja mucho que desear si se lo compara con groovy o scala. Que piensan? Les gusta este nuevo lenguaje?

Dejo Link:

domingo, 31 de julio de 2011

Microsoft and Linux, un vídeo de cumpleaños

Increíble este vídeo, nunca pensé que microsoft quisiera hacer las pases con Linux. Por el cumpleaños de Linux la gente de Redmond ha hecho el siguiente vídeo:



Me da desconfianza, es muy raro... Que opinan?

jueves, 28 de julio de 2011

Blog sobre Erlang


Estoy leyendo aprendiendo-erlang.blogspot y me parece muy buena información, claro y conciso.

Una buena forma de ir aprendiendo erlang.

martes, 26 de julio de 2011

JetBrains crea un nuevo lenguaje para la JVM


Kotlin es el nombre del nuevo lenguaje de la empresa jetbrains. Recordemos que jetbrains es la creadora de la exitosa ide IntelliJ.

Kotlin es un lenguaje que intenta solucionar incombenientes al escribir codigo Java. Entre otras características podemos nombrar:

El sistema toma control de las referencias nulas, no es necesario null pointer.
Soporta Clojures

Es interoperable con Java; Java puede llamar a Kotlin y Kotlin puede llamar a Java.


Veamos un ejemplo de un Hola Mundo:

class Greeter(name : String) {
fun greet() {
println("Hello, ${name}");
}
}

fun main(args : Array) {
Greeter(args[0]).greet()
}


Dejo links:

viernes, 22 de julio de 2011

JQuery EasyUI


JQuery EasyUI es una colección de plugins para diseñar interfaces de usuario con JQuery. Entre los componentes que ofrece podemos nombrar form, validatebox, combo, combobox, combotree, calendar.

Con Easyui se pueden desarrollar interfaces profesionales de forma rapida. A la vez soporta theme como Jquery UI.

Dejo links:

http://www.jeasyui.com/
http://www.jeasyui.com/demo/

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!