miércoles, 21 de abril de 2010

Cursos Android de O'Reilly

O'Reilly, muy conocida por sus buenos libros, ha lanzado unos cursos para iniciarse en Android. El primero de ellos ya ha concluido, pero estamos a tiempo del segundo, que incluirá un repaso del primero y en el que se desarrollará una aplicación Twitter.

El curso es totalmente gratuito y se sigue online.

Si estais interesados, aqui tenéis la página de registro y aqui los contenidos del primer curso.

miércoles, 2 de diciembre de 2009

Scripting en Java

Desde la versión 6, Java incorpora el API de scripting para permitir la ejecución de scripts desde programas Java. Aunque existen múltiples lenguajes disponibles (Javascript, Python, Groovy, etc..), en el JDK únicamente se incorpora el motor de Javascript Mozilla Rhino

En este primer ejemplo vamos a mostrar los motores disponibles y sus múltiples nombres, es decir, los nombres con los que podemos obtener ese motor.

import java.util.List;

import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineFactory;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class SimpleTest{
public static void main(String[] args) throws ScriptException{
ScriptEngineManager manager = new ScriptEngineManager();

List factories = manager.getEngineFactories();

for(ScriptEngineFactory sef : factories){
System.out.println(sef.getNames());
}
}
}

En este segundo ejemplo ejecutamos un script que muestra un saludo y seguidamente evaluamos una función para ser llamada posteriormente pasandole un parámetro.

ScriptEngine js = manager.getEngineByName("js");
js.eval("println('Hola Mundo !');");
js.eval("function holaMundo(msg){" +
" println('Hola Mundo desde funcion: ' + msg);" +
"}");
Invocable invocable = (Invocable)js;
invocable.invokeFunction("holaMundo", "¡parametro desde Java!");

El casting a Invocable es necesario porque es una interface opcional. Normalmente se debería consultar su disponibilidad con el operador instanceof.

La llamada a funciones no solo puede recibir argumentos sino que también podemos recoger sus valores de retorno tal como se muestra a continuación:

js.eval("function suma(a,b){" +
" return a+b;" +
"}");

Invocable invocable = (Invocable) js;
double total = (Double)invocable.invokeFunction("suma", 2,3);
System.out.println(total);

Los objetos Java de nuestra aplicación pueden ser puestos a disposición de los scripts tanto para su uso como modificación:

Point punto = new Point(2,3);
js.put("punto",punto);

js.eval("println(punto);");
js.eval("println('X: ' + punto.x + ' Y: ' + punto.getY());");
js.eval("punto.setLocation(5,6)");

System.out.println(punto.toString());

En este último ejemplo comprobamos el uso de otro tipo de objetos, en este caso colecciones:

List ides = Arrays.asList("Eclipse","Netbeans","IntelliJIdea",
"JDeveloper");

js.put("ides",ides);

js.eval("println(ides);");

js.eval("var i;" +
"var idesArray = ides.toArray();" +
"for(i in idesArray) {" +
" println(idesArray[i]);" + "}");

Defensa de los derechos fundamentales de Internet

Ante la inclusión en el Anteproyecto de Ley de Economía sostenible de modificaciones legislativas que afectan al libre ejercicio de las libertades de expresión, información y el derecho de acceso a la cultura a través de Internet, los periodistas, bloggers, usuarios, profesionales y creadores de internet manifestamos nuestra firme oposición al proyecto, y declaramos que:

1. Los derechos de autor no pueden situarse por encima de los derechos fundamentales de los ciudadanos, como el derecho a la privacidad, a la seguridad, a la presunción de inocencia, a la tutela judicial efectiva y a la libertad de expresión.
2. La suspensión de derechos fundamentales es y debe seguir siendo competencia exclusiva del poder judicial. Ni un cierre sin sentencia. Este anteproyecto, en contra de lo establecido en el artículo 20.5 de la Constitución, pone en manos de un órgano no judicial -un organismo dependiente del ministerio de Cultura-, la potestad de impedir a los ciudadanos españoles el acceso a cualquier página web.
3. La nueva legislación creará inseguridad jurídica en todo el sector tecnológico español, perjudicando uno de los pocos campos de desarrollo y futuro de nuestra economía, entorpeciendo la creación de empresas, introduciendo trabas a la libre competencia y ralentizando su proyección internacional.
4. La nueva legislación propuesta amenaza a los nuevos creadores y entorpece la creación cultural. Con Internet y los sucesivos avances tecnológicos se ha democratizado extraordinariamente la creación y emisión de contenidos de todo tipo, que ya no provienen prevalentemente de las industrias culturales tradicionales, sino de multitud de fuentes diferentes.
5. Los autores, como todos los trabajadores, tienen derecho a vivir de su trabajo con nuevas ideas creativas, modelos de negocio y actividades asociadas a sus creaciones. Intentar sostener con cambios legislativos a una industria obsoleta que no sabe adaptarse a este nuevo entorno no es ni justo ni realista. Si su modelo de negocio se basaba en el control de las copias de las obras y en Internet no es posible sin vulnerar derechos fundamentales, deberían buscar otro modelo.
6. Consideramos que las industrias culturales necesitan para sobrevivir alternativas modernas, eficaces, creíbles y asequibles y que se adecuen a los nuevos usos sociales, en lugar de limitaciones tan desproporcionadas como ineficaces para el fin que dicen perseguir.
7. Internet debe funcionar de forma libre y sin interferencias políticas auspiciadas por sectores que pretenden perpetuar obsoletos modelos de negocio e imposibilitar que el saber humano siga siendo libre.
8. Exigimos que el Gobierno garantice por ley la neutralidad de la Red, en España ante cualquier presión que pueda producirse, como marco para el desarrollo de una economía sostenible y realista de cara al futuro.
9. Proponemos una verdadera reforma del derecho de propiedad intelectual orientada a su fin: devolver a la sociedad el conocimiento, promover el dominio público y limitar los abusos de las entidades gestoras.
10. En democracia las leyes y sus modificaciones deben aprobarse tras el oportuno debate público y habiendo consultado previamente a todas las partes implicadas. No es de recibo que se realicen cambios legislativos que afectan a derechos fundamentales en una ley no orgánica y que versa sobre otra materia.

Este manifiesto, elaborado de forma conjunta por varios autores, es de todos y de ninguno. Se ha publicado en multitud de sitios web.

Si estás de acuerdo y quieres sumarte a él, difúndelo por Internet.

miércoles, 10 de junio de 2009

Google I/O y Page Speed

Acabaron las conferencias Google I/O y nos dejaron un montón de presentaciones MUY interesantes. Las encontrareis aqui.

Por otro lado, Google ha liberado un proyecto interno para mejorar la carga de webs muy similar a YSlow de Yahoo! pero más preciso. Se llama Page Speed y es open source.

miércoles, 20 de mayo de 2009

Ejecutando únicamente código firmado

En algunos casos puede ser necesario impedir la ejecución de código no firmado por motivos de seguridad.

Java proporciona un mecanismo bastante sencillo para establecer este comportamiento, el policy file.

Para que se comprueben los permisos establecidos en ese fichero, es necesario que un gestor de seguridad los aplique. Este gestor de seguridad o SecurityManager, puede ser cargado desde código o en este caso más cómodamente como opciones de máquina virtual:

-Djava.security.manager

El fichero por defecto de la JVM es ${java.home}/lib/security/java.policy donde asignaremos los permisos deseados o ninguno:

// Standard extensions get all permissions by default

grant codeBase "file:${{java.ext.dirs}}/*" {
permission java.security.AllPermission;
};

// default permissions granted to all domains

grant {
};

Seguidamente asignaremos los permisos necesarios para nuestro código firmado, en este caso, todos:

grant SignedBy "jordi" {
permission java.security.AllPermission;
};

Es muy importante modificar un par de propiedades del fichero ${java.home}/lib/security/java.security para impedir establecer un policy file distinto o cambiar los valores establecidos en java.security:

policy.allowSystemProperty=false
security.overridePropertiesFile=false

En el siguiente ejemplo, se intenta obtener una propiedad del sistema para la que no tenemos permisos, incluso se intenta establecer un policy file que da privilegios absolutos pero el gestor nos lo impide:

public class Simple{
public static void main(String[] ar){
System.out.println(System.getProperty("java.vm.name"));
}
}

El resultado es:

java -Djava.security.manager -Djava.security.policy=java.policy Simple
Exception in thread "main" java.security.AccessControlException: access denied (java.util.PropertyPermission java.vm.name read) at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)
at java.security.AccessController.checkPermission(AccessController.java:546)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
at java.lang.SecurityManager.checkPropertyAccess(SecurityManager.java:1285)
at java.lang.System.getProperty(System.java:652)
at Simple.main(Simple.java:3)

Los pasos a seguir para crear y firmar el JAR son:

jar cvf Simple.jar Simple.class
keytool -genkey -alias jordi -keypass xxxxxxx -keystore test -storepass xxxxxxx
jarsigner -keystore test -signedjar SimpleSigned.jar Simple.jar jordi

Si se quiere ejecutar el JAR en una máquina distinta, deberemos extraer el certificado y mandarlo para que sea importado:

keytool -export -keystore test -alias jordi -file jordi.cer
keytool -import -alias jordi -file jordi.cer

En el policy file podemos especificar el keystore donde hemos importado el certificado, quedando así:

keystore "file://c:/.keystore", "jks";

grant codeBase "file:${{java.ext.dirs}}/*" {
permission java.security.AllPermission;
};

grant {
permission java.util.PropertyPermission "java.vm.vendor", "read";
};
grant SignedBy "jordi" {
permission java.security.AllPermission;
};


Si ahora ejecutamos nuestro programa: (he modificado el manifest.mf para establecer la clase principal a Simple)

java -Djava.security.manager -jar SimpleSigned.jar
Java HotSpot(TM) Client VM

Sé de alguien que me va a invitar a comer ;-)
Hasta pronto!

lunes, 20 de abril de 2009

Oracle va a comprar Sun

Después de varias semanas sobre si IBM iba a comprar Sun o no, Oracle se quedará con Sun.
Ya veremos que va a suceder con Glassfish (Oracle tiene WebLogic), con MySQL y con NetBeans( vs JDeveloper) entre otros.

Podéis leer la noticia en la propia web de Sun.

Actualizado: Aquí tenéis el FAQ de Oracle relativo a la compra.