martes, 27 de octubre de 2009

Me cambio de RaphaelJS a JQuerySVG

Bueno, tras ver que en las nuevas versiones de RaphaelJS han quitado el manejo de grupos, es decir hacer una serie de elementos e incluirlos en un grupos y poder realizar sobre estos transformaciones, tales como traslación, rotación.. en su lugar han puesto la opción de crear sets, la genial idea fué de su desarrollador (Dmitry Baranovskiy), cuya excusa era que los grupos no están en VML para la compatibilidad con Internet Explorer.

Estos sets son grupos de elementos, como anteriormente, pero para el cual las transformaciones se comportan de forma distinta, en mi caso necesitaba realizar rotaciones, con los grupos podía colocar un elemento en el centro y otro a un lado, al rotar el grupo daba la impresión que el segundo elemento orbitaba alrededor del primero, ahora con los sets lo que me hace es rotar cada uno sobre su propio centro, de modo que tengo dos elementos que dan vueltas a sí mismos, pero no en conjunto.

Pensé en usar la librería con la que empecé, la 0.8.6, la cual sí que tiene la opción de grupos, pero no tiene otra opción que han incluido en la nueva, que es la de poder destruir un elemento que haya en pantalla (cuando tienes miles de elementos svg no puedes permitirte esconderlos con css para mostrar otros, debes destruirlos o tu navegador irá muyyyy lento). Para poder disfrutar de esta segunda opción me lié a pelear con trigonometría para hacer orbitar el segundo elemento, conseguí hacerlo, pero pensé que si tengo que comerme tanto la cabeza para girar cualquier cosa sobre otro elemento... símplemente paso.

Es por ello que le he dado una oportunidad a la librería de Keith Wood, la JQuerySVG, por ahora puedo hacer lo que quería, pero no tengo compatibilidad con Internet Explorer... que le den, estoy cansado del Quirks Mode, creo que es un retraso y una forma de fastidiar buenas webs que usan estándares válidos que los navegadores viejos no soportan. Esta librería es un plugin de JQuery (como habreis podido imaginar) y, como tal, tiene total integración en este framework.

Lo único que echo de menos es la buena documentación que tenía la RaphaelJS... ya veremos qué tal me va con la otra...

jueves, 1 de octubre de 2009

Una frase mas...

La ciencia es una ecuación diferencial. La religión es una condición de frontera.

Alan Turing

viernes, 25 de septiembre de 2009

select con jQuery

Esto es un simple apunte, lo pongo aquí para quien le pueda servir.
Trabajar con select en jQuery:

  • selectedIndex:
    • $("select:#id_del_select").attr("selectedIndex")
    • $("#id_del_select").attr("selectedIndex")
    • $("#id_del_select")[0].selectedIndex

  • options[]:
    • $("#id_del_select option")

  • option actual:
    • $("#id_del_select option:selected") ó $("#id_del_select :selected")
    • value: $("#id_del_select option:selected").val()
    • texto: $("#id_del_select option:selected").text()

viernes, 18 de septiembre de 2009

cambios aceptados en jdk7 (y explicados)

Para la versión 7 del jdk se han aceptado siete de 10 cambios para mejorar la legibilidad y simplificar en algún aspecto el lenguaje, es por si veis que en un futuro vuestro proyecto dice que tenéis algo mal que sepáis por qué puede ser:

Los siete cambios aceptados:
Strings in switch statements: esto es fácil, en los switch ahora se aceptarán cadenas de texto, un pequeño ejemplo:
Con JDK7.0:
switch(s) {
case "foo":
processFoo(s);
break;
}

Automatic Resource Management: Un "resource" es un objeto que debe ser cerrado manualmente, tal como java.io.InputStream, OutputStream, Reader, Writer, Formatter; java.nio.Channel;java.net.socket; java.sql.Connection, Statement, ResultSet o java.awt.Graphics.
Como el tener que cerrar algo manualmente suele ser un nido de errores (a todo el mundo se le puede olvidar, tenemos que para lo que hasta ahora es:


Caso actual:
static String readFirstLineFromFile(String path) throws IOException {

BufferedReader br = new BufferedReader(new FileReader(path));

try {

return br.readLine();

} finally {

br.close();

}

}

Con JDK7.0:
static String readFirstLineFromFile2(String path) throws IOException {

try (BufferedReader br = new BufferedReader(new FileReader(path)) {

return br.readLine();

}

}

o un ejemplo más elaborado:

Caso actual:
static void copy(String src, String dest) throws IOException {

InputStream in = new FileInputStream(src);

try {

OutputStream out = new FileOutputStream(dest);

try {

byte[] buf = new byte[8 * 1024];

int n;

while ((n = in.read(buf)) >= 0)

out.write(buf, 0, n);

} finally {

out.close();

}

} finally {

in.close();

}

}

Con JDK7.0:
static void copy(String src, String dest) throws IOException {

try (InputStream in = new FileInputStream(src);

OutputStream out = new FileOutputStream(dest)) {

byte[] buf = new byte[8192];

int n;

while ((n = in.read(buf)) >= 0)

out.write(buf, 0, n);

}


}



Improved Type Inference for Generic Instance Creation (operador diamond): Esto símplemente quita una redundancia a la hora de crear algún tipo genérico, ahora ahora siempre que se crea un, por ejemplo, Map se pone el tipo de variable que es el key y el contenido en la declaración y en el new, ahora será solo en la declaración:

Hasta ahora:
Map<String, List<String>> anagrams = new HashMap<String, List<String>>();

Con JDK7.0
Map<String, List<String>> anagrams = new HashMap<>();




Simplified Varargs Method Invocation:
esto no supone un cambio en la programación, aquí lo que pasa es que si teníamos un método con parámetros de tipo vararg, si metías tipos no reifiables (no sé la traducción de reifiable), daba un warning donde se llamaba a la función y ahora se produce en la declaración de dicha función:



Hasta ahora:
static <T> List<T> asList(T... elements) { ... }

static List<Callable<String>> stringFactories() {
Callable<String> a, b, c;
...
*// Warning: **"uses unchecked or unsafe operations"*
return asList(a, b, c);



Con JDK7.0
*// Warning: **"enables unsafe generic array creation"*
static <T> List<T> asList(T... elements) { ... }

static List<Callable<String>> stringFactories() {
Callable<String> a, b, c;
...
return asList(a, b, c);
}



pues eso, que si veis warnings donde declarasteis vuestros métodos con parámetros vararg y con tipos no reifiables que no os extrañeis.


An amnibus proposal for better integral literals: este cambio combina dos propuestas que añadiran nuevas formas de escribir literales enteros, literales binarios y subrayados en números.
El primero propone que escribas los literales binarios del modo 0b101 o 0B101.
El segundo te ofrecerá la posibilidad (es opcional) poner subrayados en números para hacerlos más legibles, por ejemplo 9_223_312_123_345_786_343L
.

Language support for Collections: Este es otra combinación de dos propuestas, literales de Collection y sintaxis de acceso a la indexación de Lists y Maps.
Permitirá utilizar expresiones para inicializar nuevas Lists, Sets y Maps de una forma más concisa, por ejemplo:



Hasta ahora:
final List<Integer> piDigits = Collections.unmodifiableList(Arrays.asList(3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 9 ));
será del siguiente modo:
final List<Integer> piDigits = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 9];
Si quieres un Set, usa llaves:
final Set<Integer> primes = { 2, 7, 31, 127, 8191, 131071, 524287 };
Hasta ahora un mapa se inicializaba así:
final Map<Integer, String> platonicSolids;
static {
solids = new LinkedHashMap
;
solids.put(4, "tetrahedron");
solids.put(6, "cube");
solids.put(8, "octahedron");
solids.put(12, "dodecahedron");
solids.put(20, "icosahedron");
platonicSolids = Collections.immutableMap(solids);
}

Con JDK7.0
final Map<Integer, String> platonicSolids = { 4 : "tetrahedron", 6 : "cube",
8 : "octahedron", 12 : "dodecahedron", 20 : "icosahedron" };







Language support for JSR 292: JSR292 está enfocado en soportar dinámicamente lenguajes tipados en la plataforma Java. Esto cambia el lenguaje para que éstas características estén disponibles desde Java. Por ejemplo esta propuesta podría permitirte invocar dinámicamente cuialquier método en una variable de tipo java.dyn.Dinamic. Esto siempre compilará. En tiempo de ejecución si el método existe, la invocación se realizará:


Dynamic x = (aquí puede haber cualquier tipo de expresión);
Object y = x.foo("ABC").bar(42).baz()



No sé si aquí están queriendo decir que se pueden hacer closures.

Cambios descartados por el momento:

Improved Exception Handling for Java: esto es capturar varias excepciones en un solo catch:


try {
doWork(file);
} catch (final IOException|SQLException ex) {
logger.log(ex);
* throw ex;*
}


Elvis and Other Null-Safe Operators: el operador Elvis se usa en Groovy, recuerda al típico del interrogante que hay en C/C++. Hay varios:
  • ?: este es el elvis, si lo que hay a la izquierda es null, se evalua lo de la derecha.
    • variablenull ?: "es null!!"
  • ?. este funciona como el punto, pero si lo que hay a la izquierda es null, no se hace nada:
    • variable?.toString() // si variable es null, devuelve null
    • Luego tendríamos algo como variable?.toString() ?: "variable vacía"
  • ?[] para arrays, lo típico, si es null devuelve null
    • Luego tendríamos algo como array?[1].nombre?.toString() ?: "algo está a null"
Large Arrays: esto era cambiar el tamaño del índice de los arrays, actualmente de 32bit a 64bit.

Un saludo!

Las fuentes:
http://blogs.sun.com/darcy/entry/project_coin_final_five
http://www.artima.com/forums/flat.jsp?forum=270&thread=266751

jueves, 2 de julio de 2009

Pocasts que suelo oir

Muy buenas, llevaba un tiempo sin escribir (tampoco creo que nadie se haya echado a llorar), por fin voy a tener mas tiempo para poder hacerlo ya que prácticamente he terminado la carrera (oeeee oe oe oeeeeeeeeee)...
El caso es que, a fuerza de oir la misma música en el mp4 mientras trabajaba, me dió por buscar temas del mundillo del podcasting. La verdad es que nunca me había parado a escuchar alguno, en todo caso los videocasts de ejemplo de uso de algunos frameworks como Ruby on Rails, Codeigniter o Django...
Bueno, símplemente era, por si alguien estaba como yo y tiene curiosidad, si tiene gustos parecidos a los míos (programación, física, curiosidades sobre tecnología, y casos y personajes de la ciencia, conceptos de informática..), pongo los que he estado escuchando:
  • JavaHispano Podcast: un podcast sobre programación y lenguaje Java, muy completo.
  • ElTamiz: un podcast sobre física y curiosidades, la verdad es que complementa un blog muy pero que muy recomendable.
  • Triunfa En Internet: otro podcast que me ha gustado mucho, son tertulias sobre distintos temas de informática y otros asuntos muy interesantes, muy entretenido.
  • El blog de pablot: una persona que me ha caido bastante simpática, también habla de informática y cosas así.
  • Soliloquios de Javier Romero: otra persona que me ha caido muy simpática, he visto que en algunos podcasts habla de temas que también se tratan en triunfa en internet, dando su punto de vista o explicándo desde otro punto de vista (como en el de Vida artificial).
  • La rosa de los vientos: como no, un programa de radio muy interesante (en mi caso por los pasajes de la historia), el enlace lleva a recopilatorios de gente sobre este programa.
Bueno, hasta ahora esto, he oido alguno que otro mas, pero suelto, como de LinuxHispano o SpringHispano, pero vamos que los que mas oigo son esos. Iré editando el post para poner mas que vaya encontrando.

domingo, 17 de mayo de 2009

Otra frase mas...

Cualquier desarrollador puede escribir código que una máquina pueda entender, pero sólo los buenos desarrolladores saben escribir código que otro desarrollador sepa entender.

miércoles, 13 de mayo de 2009

Presentación sobre Redes Neuronales

He subido a mi cuenta de slideshare una pequeña presentación que he hecho, hablando sobre las redes neuronales, para una asignatura de minería de datos. En ella hablo, dando unas pinceladas de en qué se parecen las neuronas artificiales a las biológicas, qué es una red de neuronas artificiales y su topología, así como las aplicaciones en la vida real y las ventajas que aportan.
Como último punto he puesto los resultados de una práctica que realicé con un compañero, era sobre clasificar manos de poker, es decir, cinco cartas con su número y palo (variables contínuas y discretas) y un número que las clasificaba como posibles manos de poker (dobles parejas, trío, escalera...).