jueves, 10 de diciembre de 2009

Blog sobre productividad

Echando un vistazo en una lista de twitter que sigo he encontrado un enlace de un blog sobre productividad, concretamente un post sobre los errores que ha cometido el autor, he leído varias cosas sobre el tema (que si GTD, que si ZTD... todo muy bonito) me ha gustado bastante porque habla, por encima, de los típicos errores con los que mas de uno se ha encontrado, sé que ha escrito un libro sobre el tema (un libro por el que no niego haberme interesado), no avanzo nada, aquí os pongo los enlaces:
El post que he leído: Mis errores en el mundo de la Productividad
La lista de posts sobre el tema: ThinkWasabi::Productividad

viernes, 4 de diciembre de 2009

Manifiesto “En defensa de los derechos fundamentales en 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á de acuerdo y quiere sumarse a él, difúndalo por Internet.

Enlaces en Facebook:

lunes, 30 de noviembre de 2009

Copyscape: quien copia tus contenidos

Deambulando por la web esta fría mañana de finales de Noviembre, me he topado con una aplicación web llamada Copyscape cuya función es la de, tras introducir una dirección web, buscar en los índices de Google quién podría estar copiando tus contenidos, es interesante para el tema del posicionamiento que no se dupliquen, así que con esto te puedes ahorrar tiempo buscando tú a mano a base de búsquedas a lo bruto.
Da algún falso positivo que otro, pero vale la pena probarlo :D.

miércoles, 25 de noviembre de 2009

Ubuntu: problemas en flash al hacer click (Solucionado)

Navegando por páginas con vídeos en flash, por ejemplo Megavideo, me inflaba a darle clicks al botón central de play y no iba... bueno lo solucionaba a base de darle a tabulador hasta llegar al elemento del botón y darle a enter, pero lo malo era cuando quería avanzar, subir o bajar el volumen... como es normal, esto crispa a cualquiera, pensaba que era cosa del plugin pero no podía ser puesto que era el oficial de Adobe, así que debía ser cosa del entorno, que no le gustase hacer click ahí por alguna razón.
He buscado y he encontrado una página que explica los siguientes pasos que a mi me ha funcionado con Ubuntu 9.10 Karmic Koala (¡¡que alguien me explique lo del koala kármico por favor!!):
  1. Le das a Alt+F2, esta combinación abre una ventanita para ejecutar cualquier aplicación (como Ejecutar en Windows XP).
  2. Escribe en la ventana: gksudo gedit /usr/lib/nspluginwrapper/i386/linux/npviewer
  3. Lo anterior te ha abierto el gedit con un documento con unas líneas de texto, pues antes de la última línea (en mi caso . /usr/lib/nspluginwrapper/noarch/npviewer), debes escribir: export GDK_NATIVE_WINDOWS=1
  4. y nada, guardas y reinicias cualquier aplicación que ejecute flash (los navegadores web mayormente).
  5. Disfrutar del click en las animaciones y vídeos flash :D.
¡Ale! ¡p'a quien le valga!

lunes, 23 de noviembre de 2009

FireUnit: pruebas unitarias en javascript

He encontrado por la web un plugin para firefox, realmente es un plugin para otro plugin existente, el firebug, mi favorito :D.
El componente al que me refiero es uno llamado fireunit, creado por Jan Odvarko y John Resig (el creador de jQuery y mas cosas), por lo visto es para pruebas unitarias de código en javascript, como el jUnit para Java.
En la página de John Resig, tiene un post sobre el uso de fireunit en el que hay algunos ejemplos de uso. He mirado en la página del repositorio en GitHub, pero no he encontrado documentación tal cual sobre API alguna, os pongo algunas cosas recopiladas que he deducido en la sección internals apoyándome en los ejemplos que he visto:
//Hay funciones para comprobar si una función devuelve lo que se espera:
fireunit.ok( true, funcion)
//Funciones que comparan cadenas:
fireunit.compare("Cadena uno", "cadena dos", "cadena por si son iguales")
//Con expresiones regulares:
fireunit.reCompare(/cadena .* prueba/, "cadena de prueba", "cadena por si son iguales")
//Función para mostrar los resultados finales:
fireunit.testDone()

Aparte, se pueden simular eventos del navegador por si es necesario para el testeo:
fireunit.mouseDown( input );
fireunit.click( input );
fireunit.focus( input );
fireunit.key( input, "a" );

Y como en jUnit, se pueden ejecutar varios tests a la vez:
// Ejecutar varios tests
fireunit.runTests("test2.html", "test3.html")
// Se pone esto al fin de cada test
fireunit.testDone()

Bueno, todo es probarlo, yo ya lo he instalado, en tener un rato un día de estos (¡no paro!) miro como va...

jueves, 5 de noviembre de 2009

He borrado mi blog de Wordpress

Tenía este mismo blog en Wordpress (http://haprobadoconreiniciar.wordpress.com), para ver con cuál me quedaba, me gustan mas los diseños de ese sistema, pero no me dejaba cambiar ni el CSS (bueno dejaba, pero si no pagaba no lo podía ver nadie, lo cual es lo mismo que no dejar... :P).  También estaba interesado en unos plug-in de resaltado de código (lo que aquí medio "arreglo" poniendo un fondo amarillento, algún día me lo curraré mas).

No me molestaba tener ambos blogs en marcha, lo único es que estaba totalmente penalizado por tener el contenido completamente copiado de este, es decir que era invisible, es posible que incluso haya penalizado este en alguna ocasión (aunque aparece primero en varias búsquedas referentes a las entradas que tiene).

Me ha dado bastante lástima, ya que digo que es un sistema que me gusta más que blogger, pero me limita en algunas cosas... lo que no descarto (y llevo un tiempo con la idea en la cabeza) es pillarme un dominio y un hosting e instalarme wordpress, migrar todas las entradas de los blogs que tengo (este y el de esto va a doler) para así tener mi pequeño portfolio de cosas.

Ya iré informando sobre el asunto ^^.

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...).

martes, 12 de mayo de 2009

Do's y don'ts de la programación web

He encontrado una web en la que se listan consejos sobre buenas (Do's) y malas (Don'ts) costumbres a la hora de programar páginas, la verdad es que siempre hay cosas en las que dudas si las estás haciendo bien o mal. En esta web se aclaran con una pequeña explicación y un enlace a una página que te da una mas amplia explicación.
Ah!... está en perfecto inglés (no tengo el nivel de saber si es perfecto o no, pero me lo huelo ¬¬).
http://webdosanddonts.com
Tiene categorías como nivel (principiante, intermedio y avanzado), mejor valoradas, etc.

lunes, 23 de febrero de 2009

¡UTF-8 Vale la pena!

Llevaba un tiempo buscando en qué codificación basar mis proyectos web, estaba entre iso-8859-1 o UTF-8. Es un asunto muy delicado ya que una vez elegido una codificación, debes tener todo, tanto bases de datos como ficheros fuente en este formato o tendrás problemas a la hora de mostrar la información.
Me he topado con esta web, que da una explicación que a mi me ha valido para decantarme por UTF-8:

lunes, 9 de febrero de 2009

Business Intelligence

Este es un artículo que escribí en la sección de artículos de opinión en la web de El Taller Digital de la Universidad de Alicante, lugar donde trabajo:
Desde las tarjetas perforadas, allá por los años cincuenta, utilizadas para el almacenamiento de información y la creación de programas, hasta los grandes sistemas de almacenamiento y ayuda a la toma de decisiones de nuestros días, parece que haya pasado un abismo de tiempo...
Hoy en día es normal encontrarse con sistemas que buscan patrones en enormes amasijos de datos, recabados día a día por las empresas. Patrones que, bien combinados, generan conocimiento que aporta gran ayuda a predecir, con un cierto porcentaje de certeza, lo que un individuo puede llegar a necesitar.
Por ejemplo, el hecho que te encuentres con golosinas cuando llegas a la caja del supermercado, no es un simple capricho del gerente, es algo que está estudiado, se ha demostrado que cuando alguien hace una gran compra... necesita endulzar un poco todo lo que va a pagar, curioso, pero cierto.
Y no solo estamos hablando de individuos, sino también entra en juego la idea de la segmentación de éstos. Por ejemplo, no es lo mismo enviar un plan vivienda a unas personas con entre cuarenta y sesenta años, que a una persona de entre veinte y treinta, o un plan de jubilación para el caso contrario.
Toda empresa mediana que se precie, por lo general tiene un ERP, que no es otra cosa que un sistema que guarda todo tipo de datos de la trastienda o también llamado back-office, es decir, qué trabador hizo qué cosa, control de stock, nóminas, contabilidad... y un CRM, que sería lo que hay de cara al cliente, o front-office, éste se encarga de gestionar las relaciones con el cliente, tomando información sobre él, de modo que se tenga una ayuda para mejorar la oferta de nuestro producto respecto a sus gustos o necesidades. De todo esto únicamente obtenemos informes de datos que no hacen nada más que dar datos, dando la responsabilidad de hacerse una idea de cómo irá la empresa al mismo empresario.
Con la inclusión de los sistemas decisionales, los sistemas ofrecen algo más que mera información, aportan una ayuda a descartar datos que realmente son de relleno, o a tomar en cuenta datos que podrían ser de interés para el funcionamiento de la empresa. Un ejemplo lo tenemos cuando se realizan búsquedas en Google y dice que tiene mas de diez millones de documentos relevantes a lo que buscas, realmente si hay uno puedes dar gracias.
El cerebro que maneja todo esto, son unos almacenes de datos, llamados Data Warehouse, que son alimentados con los datos de las aplicaciones anteriormente nombradas, de una forma ordenada, enfocada a lo que se busca siguiendo unas técnicas concretas de extracción de información. En estos almacenes, mediante técnicas de inteligencia artificial para la búsqueda de patrones, es donde se obtiene, combina y divide la información, presentando finalmente unos informes que aportan algo más que mera información.
Sobre todo esto se sustentan los sistemas expertos, que emulan a un experto en una
materia concreta. Estos sistemas toman el conocimiento anteriormente obtenido, para
aportar mayor rapidez y calidad en las respuestas, dando así lugar a una mejora de la
productividad del humano experto que utiliza este sistema como apoyo, también por ellos
mismos llegan a generar más conocimiento.
Pero bueno, hay que tener en cuenta que todo esto no es un fin en sí mismo, la última
palabra siempre depende del empresario...
Luis Sánchez Castellanos

miércoles, 4 de febrero de 2009

[Off-Blog] El mejor anuncio de la historia

Tenía que ponerlo.. ¡que fuerte que tenga que ser de lavadoras! me habría gustado haber visto al tío del casting "tu sí.. tu sí.. tu también..."


martes, 3 de febrero de 2009

Otra frase..

Internet es el sistema nervioso del mundo y nosotros debemos ser neuronas que aporten pequeños pulsos electricos para que el gran cerebro funcione bien.
Angel Arens

sábado, 31 de enero de 2009

Paralelismo con AJAX

La idea de probar con un tema así, me vino a principios de curso, por un miniproyecto libre que nos pidió un profesor relacionado con el paralelismo, había probado PVM, MPI (a nivel de librería) en C y me animé a probar hacerlo con AJAX a ver que pasaba.
Lo malo de AJAX es la plataforma sobre la que se mueve, hay que pensar que los clientes (los usuarios) tendrán como ésta su navegador, por lo que no puedes esperar la velocidad de C.
Lo bueno es, aparte de la multiplataformidad (hasta las neveras tienen navegador de Internet), la cantidad de aplicaciones cliente que pueden entrar. Con los navegadores de Internet pasa un poco como con los zombies: Son lentos. Son débiles. Son tontos. Pero ante todo, son MUCHOS.
Hice dos aplicaciones, una para calcular números primos a base de fuerza bruta, y luego otra que consistía en adaptar un algoritmo de RayTracing en javascript a una versión paralela, para la comunicación utilicé la librería DWR para poder utilizar Java y las páginas en JSP.
He subido ambos miniproyectos a mi cuenta en Box.net (debajo del post lo tenéis) para que podáis probarlos si queréis, tienen la documentación tal cual se la envié al profesor con las pruebas. De todos modos os pongo una pequeña explicación:

Números primos
Por la parte del servidor hay una base de datos en MySQL y sus funciones son las de etiquetar a los que entran (algo así como un ID para saber quien hace qué), bajo petición decirles qué valor deben mirar y recibir resultados... simple. Claramente ante la preguntas ¿ya pero si entran dos a la vez? o ¿cuando hay tanta distancia entre dos primos que no recibe datos y siempre va a pedir empezar desde el mismo valor a todos los que entren? o ¿no sería preferible enviar varios valores a mirar a enviar valor por valor de forma individual? hay una fácil respuesta: esto es para probar hacer paralelismo con AJAX, no para calcular todos los números primos del mundo, obviamente fuerza bruta no es la mejor forma de hacer las cosas, pero sí experimentar con tecnologías que permiten la creación de grids sin necesidad de descargar software de terceros, con los riesgos que ello suele conllevar.
El cliente por otra parte, lo que hace es entrar, recibir el id y pedir números para empezar a calcular como loco, por cada resultado que reciba lo manda junto con su id al servidor, y punto.

RayTracing

El algoritmo de raytracing va pixel por pixel, calculando el recorrido que hace un rayo de luz desde ese punto hasta un cierto número de niveles que se especifica en el código.
Me explico, desde un punto, se lanza un rayo hacia delante, si se topa con un objeto (por ejemplo una esfera) calcula la dirección que tomaría el rayo dependiendo del material de dicho objeto, si por ejemplo es transparente o semitransparente, habría reflexión y refracción, este rayo se prolongaría rebotando entre el número de objetos que desees (niveles) y así pixel por pixel, al final de tanto rebote obtendrías una información de color en tres valores (rojo, verde y azul).
Pues la idea era que los clientes hicieran la fila que el servidor les dijese y devolviesen la información de todos esos colores en un array de X elementos, donde X se corresponde con la anchura de la imagen.
Tal y como se programó, básicamente el maestro ante de hacer una fila pregunta al servidor ¿esta fila está hecha?, si es que sí, recibe la información de los colores, si no los calcula él. Los clientes calculan partiendo desde la parte inferior de la imagen y el master desde la parte superior, hice esto, mas que nada para ver hasta que fila se llega con los clientes, es una forma de medir cuanta mejora hay añadiendo clientes al sistema.
Recuerdo pensar que habría ido mejor si hubiese granulado más las filas de la imagen, por ahora se pide a cada cliente que vaya dibujando una fila de pixels, una fila entera, pero cuando la imagen es muy ancha, tiene que calcular un array de X elementos, que a su vez tiene tres elementos más en coma flotante (los tres colores). Total, que al final tienes X*3 elementos para enviar por Internet, por lo que no salía rentable, ya que el ordenador maestro también va calculando y en casos de tardar mucho en llegar la información, sale mejor que haga todos los cálculos éste. La idea era dividir bajo algún concepto esa fila, de modo que realmente se pediría un rango de pixels al cliente.
Buff, madre mía que mareo de palabras, el caso era símplemente que hay mucho potencial en Internet respecto al tema del paralelismo y más aún con herramientas como puede ser AJAX o Comet, lo único es echarle imaginación.


jueves, 29 de enero de 2009

Síndrome de Diógenes cibernético

Tras el paso por alguna que otra party (o lan-party como también les llaman), siempre me he dado cuenta de detalles que me han llamado la atención. No me refiero a la capacidad del ser humano de dormir sobre su propio ordenador (hecho que me ha demostrado la capacidad de aguantar peso de los teclados), o a la de los amiguetes que juegan a poner cosas sobre el que duerme y el que lo despierta pierde, o a la capacidad de correr muerto de sueño detrás de los amiguetes que te han puesto esas cosas mientras dormías, o que te toque aguantar despierto los tres días, solo por el hecho de no querer darle la oportunidad a un amigo cabroncete, que se dedica a tirarte fotos mientras duermes, para luego mostrar al mundo una de tus facetas mas tiernas (siempre y cuando sean fotos y no se dedique a grabar tus ronquidos).

Lo que me ha sorprendido siempre, y me incluyo en el conjunto de seres humanos que lo realizan, ha sido la capacidad de acumular el montón de información (resumamos el amasijo de fotografías, vídeos, películas, series, imágenes chocantes, porno, música y software en la simple y llana palabra información). Al final resulta enfermizo, entrar en todas esas carpetas compartidas o las listas personales del DC++ (o programas similares) de los amigos, ves basura a raudales. Te pones a ver todo lo que comparten y preguntas al poseedor ¿pero todo esto lo has visto o vas a verlo alguna vez? la respuesta suele ser típicamente que no a ambos tiempos verbales (o no y no sé), el caso es que acabas descargándolo todo por si acaso. A veces no sé, parece que se quiera guardar por si viene una glaciación y nos toca quedarnos atrapados en casa, me imagino la escena:

- ¡¡Oh!! ¡vamos a estar semanas sepultados en la nieve!
- ¡Tranquilos, tengo las cuatro temporadas de House!

Claro, ya nada puede pasar, si viene un oso polar a comernos, pues nada se le invita a ver House y quien sabe... quizá traiga algún hallazgo... o quizá sea el oso que sale en Lost, por lo que habrá que usar palanca y un poco de paciencia para poder meter al oso polar en tu disco duro, pero vamos, nunca se sabe, el mundo es un lugar misterioso.

El caso es que te das cuenta que la gente descarga por el simple hecho de coleccionar, también por el mero hecho de tener disco duro suficiente, quizá también porque vas a una party y te mola decir, así como el que habla de golondrinas, Na... pues pasaba por aquí y me he dicho, "pues mira voy a compartir estos cinco teras de hallazgos con los plebeyos estos" y quedas como Dios.

También, porque la gente que comparte estas aficiones se pica a comentar hallazgos que... como no, necesitas tener en tu frágil soporte de información, para algún día poder disfrutarlo... tengo mi móvil repleto de nombres de películas y series raras para.. ejem, comprarlas. Pero conforme vas recibiendo información sobre nuevos hallazgos, empiezas a cambiar de soporte esos que te metiste anteriormente, que te prometiste ver algún día y aún no lo has hecho, por otros que te prometes ver antes de volver a hacer un trasiego de datos de ese tipo y que por cierto, te adelanto que no verás. Vamos... acumular basura por si algún día me pasa algo y me quedo en casa atrapado.

Mi conclusión tras todos estos años de ver la evolución de buscar servidores ftp en Yahoo, o usar el protocolo Archie, la aparición de Napster, gnutella, limewire, el eDonkey2000, Morpheus, eMule, Bittorrent, Pando... buff.. la solución es que da igual, borra, no pasa nada, siempre podrás volver a bajar o pedirlo a un amigo... (eso sí, siempre que sus derechos no hayan sido comprados en tu país).

miércoles, 28 de enero de 2009

Comet o Reverse AJAX, o como más os guste llamarlo...

Muy buenas :), una vez mas vuelvo a escribir para hablar de algún tema que ha suscitado mi interés (la verdad es que tengo varios para escribir y demasiado poco tiempo :P).
El caso es que una vez un amigo mío me comentó que había salido algo que era como AJAX pero en versión push, antes una aclaración, una conexión pull es que tu tiras de los datos hacia tí de algún modo (en el caso de AJAX tu naveador hace una petición y el servidor en base a eso da una respuesta), y con una push es que el servidor te manda información (la empuja) cuando ocurra algún evento interno suyo o necesite dar algún tipo de información.
Pues he estado buscando y resulta que el inventillo, obviamente, existe y se llama Comet y como no, lleva ya un tiempo existiendo...
Básicamente Comet se basa en la idea de que, a diferencia de AJAX para el que cada vez que quieres recibir datos, debes hacer una petición. Con Comet la cosa cambia, funciona de modo que haces una petición de tipo multipart, que lo que significa es que se va a abrir un canal de comunicación que va a ir recibiendo el dato en varias partes, por lo que no se cierra y para lo cual el servidor tiene la posibilidad de ir enviando datos a cascoporro.
Esta técnica de programación tiene cabida en muchas salidas en el mundo de la comunicación por Internet, desde programas de chat, como el Google Talk para el que ya no tienes que ir mandando peticiones para ver si alguien ha escrito algo, también para servidores de correo en los que pasa parecido a los programas de chat, sistemas de estadísticas en tiempo real, sistemas para ver el estado de los servidores... y un sinfín de utilidades.
He encontrado un esquema de comunicación comparando AJAX y Comet, se nota la disminución de peticiones y, por lo tanto, de ancho de banda así como de sobrecarga del navegador por la eliminación de timers, podéis hacer click en él para verlo en grande.
Si queréis probarlo (yo aún no lo he hecho, escribiré un post con las pruebas que haga), el Toolkit de Dojo lo implementa.

Una frase..

Al principio no había ordenadores en las casas, tuvimos que hacer que la palabra ordenador fuera compatible con las casas.

Steve Wozniak

lunes, 26 de enero de 2009

clases javascript para json

En el trabajo, decidí utilizar JSON para el trasiego de datos, que la verdad, es bastante grande y por lo tanto lo mejor es organizarse, buscar alternativas a ir creando parámetros de forma dinámica para enviar por POST y sobre todo, ligeras (XML acaba metiendo muchos caracteres).
Por si alguno aún no sabe lo que es JSON, nada más que decir que es un formato de intercambio de datos ligero y fácilmente entendible para el ser humano (a menos que el chorizo sea muy grande claro :P). Un ejemplo de dato es:
["nombre":"Manolo","apellido":"Kabezabolo"]

Y un ejemplo de array y luego los mezclo:
["hola",4,"foo","bar","etc]
["nombre":"Manolo","array1":["hola",4,"foo","bar","etc],"objetoJSON":{"obj":"valor"}]

Como habéis visto, se puede encadenar entre objetos también, bueno, símplemente se manda como una cadena por un único parámetro y luego accedes como el objeto JSON que es, podéis utilizar la librería oficial o alguna librería que haga alguien, yo para javascript me he un par de clases simples para la crearme objetos y arrays:

function JSONObject(){
this.key = new Array();
this.value = new Array();
this.addObject = function(key, value){
if(key==null)
key = "";
if(value==null) value = "";

this.key.push(key);
this.value.push(value);
};
// función que pasa a string
this.toString = function(){
var string = "";
for(var i=0; i<this.key.length; i++){
if(i!=0) string+=",";
string+='"'+this.key[i]+'":';
// si es un string, se pone entre comillas
if((typeof this.value[i]) == "string")
string+='"'+this.value[i]+'"';
else
string+=this.value[i];
}
return "{"+string+"}";
};
// función para obtener un objeto de una posición concreta
this.getObject = function(index){
var ret = null;
if(0<=index && index<this.key.length)
ret = "{"+this.key[index]+":"+this.value[index]+"}";
return ret;
};
// Función para devolver una clave de una posición
this.getKey = function(index){
var ret=null;
if(0<=index && index<this.key.length)
ret=this.key[index];
return ret;
};
// Función para cambiar una clave que está en una posición concreta
this.setKey = function(index,key){
if(key==null) key = "";
if(0<=index && index<this.key.length)
this.key[index]=key;
};
// Función que cambia una clave a partir de otra (cambia la primera que ve)
this.setKeyByName = function(old_key,new_key){
if(new_key==null) new_key = "";
for(var i=0; i<this.key.length; i++)
if(this.key[i]==old_key){
this.key[i]=new_key;
// salgo porque solo modifica
// el primero que encuentra
break;
}
};
// obtiene el valor de una posición
this.getValue = function(index){
var ret=null;
if(0<=index && index<this.value.length)
ret=this.value[index];
return ret;
};
// Modifica el valor de una posición
this.setValue = function(index,value){
if(value==null) value = "";
if(0<=index && index<this.value.length)
this.value[index]=value;
};
// Modifica el valor de un objeto con un valor concreto (el primero que se encuentre)
this.setValueByName = function(old_value,new_value){
if(new_value==null) new_value = "";
for(var i=0; i<this.value.length; i++)
if(this.value[i]==old_value){
this.value[i]=new_value;
// salgo porque solo modifica
// el primero que encuentra
break;
}
}
// para ver el tipo de objeto que es
this.getType="JSONObject";
}

function JSONArray(){
this.elements = new Array();
// añade un item al array
this.addItem = function(value){
// si es un string lo entrecomilla
if((typeof value) == "string")
value = '"'+value+'"';
this.elements.push(value);
};
// pasa a string el array
this.toString = function(){
return "["+this.elements.join(",")+"]";
};
// devuelve un item
this.getItem = function(index){
var ret = null;
if(0<=index && index<this.elements.length)
ret = this.elements[index];
return ret;
};
// cambia el valor de un item
this.setItem = function(index,item){
if(item==null) item="";
if(0<=index && index<this.elements.length)
this.elements[index] = item;
};
// obtiene unos valores en un rango pedido: array.getRange(2,4)
this.getRange = function(from,to){
var ret = null;
if(from<=to && 0<=from && to<this.elements.length)
// a slice hay que decirle en el "to" que uno mas, porque es a partir
// de donde corta
ret = this.elements.slice(from,to+1);
return ret;
}
// para ver el tipo de objeto que es
this.getType="JSONArray";
}
// Ahora probamos ambas clases
// creamos el objeto: '{"obj1":"valor1","obj2":"valor2","obj3":"valor3"}';
// creamos el array: '["item1","item2","item3","item4"]';
var object = new JSONObject();
object.addObject("key1","value1");
object.addObject("key2","value2");
object.addObject("key3","value3");
object.addObject("key4","value4");
var array = new JSONArray();
array.addItem(2);
array.addItem("item1");
array.addItem(4);
array.addItem("item2");
document.write(object.toString()+"
");
document.write(array.toString()+"
");
object.addObject("array!",array);
document.write(object.toString()+"
");
object.setKeyByName("key3","3yek");
document.write(object.toString()+"
");

Las salidas que se obtienen son las siguientes:

{"key1":"value1","key2":"value2","key3":"value3","key4":"value4"}
[2,"item1",4,"item2"]
{"key1":"value1","key2":"value2","key3":"value3","key4":"value4","array!":[2,"item1",4,"item2"]}
{"key1":"value1","key2":"value2","3yek":"value3","key4":"value4","array!":[2,"item1",4,"item2"]}


No solo para enviar datos entre cualquier plataforma y lenguajes sirve JSON, usando esto con AJAX, tenemos lo que llaman JSON-RPC, sí las llamadas a procedimientos remotos utilizando como plataforma de intercambio de datos a JSON. De modo que, por ejemplo con el mundo Java, tenemos JSON-RPC-Java que es una tecnología que permite realizar comunicaciones Ajax entre el cliente y el servidor J2EE, hacer llamadas a funciones de clases Java desde JavaScript, con capacidad para serializar objetos Java y convertirlos en objetos JavaScript y todo ello, de forma transparente al programador. He encontrado un ejemplo bastante exhaustivo sobre este tema, con el cual veo una tontería escribir nada aquí, de modo que os pongo el enlace y si tenéis curiosidad pues le pegáis un vistacillo :D:
http://www.ateneatech.com/blog/json-rpc-java-comunicaciones-ajax-transparentes-tutorial-completo-y-ejemplos

viernes, 23 de enero de 2009

Extendiendo javascript con prototype y herencia

Hay una forma de extender los objetos de javascript, me explico, digamos que tienes que hacer algo tan simple como es borrar un elemento de un tipo Array, es decir, hacer un array.remove(1), o quieres obtener la posición de un elemento, por ejemplo array.indexOf("string").
Para ello se puede hacer uso de una propiedad llamada prototype, es un objeto que se utiliza como constructor para poder añadir propiedades a los objetos que se crean en este lenguaje.
Por ejemplo para los dos anteriores casos tendríamos algo como:

// remove: elimina un elemento de un array situado en una posición dada,
// o un rango de ellos dando el de inicio y fin
Array.prototype.remove = function(desde, hasta) {
var rest = this.slice((hasta || desde) + 1 || this.length);
this.length = desde <>desde : desde; return this.push.apply(this, resto);
}

// indexOf: devuelve la posición del primer elemento que coincida con el parámetro
Array.prototype.indexOf = function(elemento) {
var retorno = -1;
for(var i=0;i<this.length;i++)
if(this[i] == elemento)
{
retorno = i;
break;
}

return retorno;
}

De modo que cada vez que quieras eliminar algo, en lugar de escribir algo tan sencillo como
var_array.remove(3);
o cuando te interese si un elemento existe y de paso su posición
var_array.indexOf(elemento);
.

El paradigma Prototype permite herencia entre objetos de tipo Prototype Chaining, el cual no permite herencia múltiple, veamos..
Como bien sabréis, en javascript, para definir una clase no hay mas que crear una función:

function objeto()
{
this.atributo1 = "valor";
this.atributo2 = "valor";
this.metodo1 = function(){ ... };
}
var varible = new objeto();


Fácil, ¿no? bueno, al grano, si hiciéramos un objeto que tuviera que heredar de éste, utilizando prototype, la cosa quedaría así:

function objeto2()
{
this.atributo3 = "valor";
this.metodo1 = function() { ... };
}
objeto2.prototype = new objeto();


Quedando así que si te creas un objeto de tipo objeto2 tendrás los atributos de ésta clase, de la de su padre (objeto) y tendrás sobrecargado el metodo1(), por lo tanto utilizarás el del objeto2.
Tal y como he dicho, esto no permite herencia múltiple, para ello existe otro modo de heréncia, el llamado Object Masquerade.
Este tipo de herencia, hace uso del objeto this, cuando se crea el constructor, se le asigna a ese objeto todas las variables y métodos internos de esa clase (a la que llamaremos Base). Pero en javascript, el constructor no es más que una función, por lo cual, puede usarse como método en otra clase que derive de Base (a la que llamaremos Derivada), de modo que las variables y métodos que se creaban en Base, se crean en Derivada. Voy a poner un ejemplo para aclarar:

// Tenemos la clase Base
function Base(valor)
{
this.valor = valor;
this.mostrarValor = function()
{
alert(this.valor);
}
}

// Y ahora la Derivada
function Derivada(valor)
{
this.base = new Base;
this.base(valor); // al hacer esto, el this al que se refiere Base es el this que tiene Derivada
delete this.base;
}


De modo que puedes hacer eso con todas las clases que quieras, luego permite heréncia múltiple.

WP-Cumulus: plugin para mostrar la nuve de tags en Wordpress

Navegando por una página he podido observar un plugin que me ha encantado (a pesar de estar hecho en flash). Se llama WP-Cumulus es para mostrar la típica nuve de tags, pero de forma esférica que rueda conforme mueves el ratón, un ejemplo que muestra la página es el siguiente:





¿habrá algo para blogger?

miércoles, 21 de enero de 2009

Cross browser SVG: gráficos vectoriales en tu navegador

Esta semana he estado experimentando con SVG, es un lenguaje para la creación de gráficos 2D vectoriales y aplicaciones gráficas XML creado por la w3c. Es bastante fácil de utilizar y permite manejo de eventos y animaciones, incluso animaciones rollo imagen que recorre una ruta y elementos tipo spline y cosas así.
Obviamente, en Explorer no va, para el cual existe otra especificación llamada VML, para ello hay dos visores que se pueden instalar, uno de Adobe, y otro llamado Renesis... bueno, no es nativo como en otros navegadores, pero si funciona... aunque para obligar a un cliente a instalarse un plugin, antes le digo que se instale un navegador que vaya bien. Pero vamos, eso son formas de pensar.
Existen varias librerías y frameworks que permiten la creación de este tipo de gráfico, yo he probado tres y al final me he quedado con la tercera, aquí os las pongo con alguna anotación sobre mi punto de vista:
  • jQuery: he visto dos soluciones:
    • La de una página llamada openstudio: con este no tuve problemas de compatibilidad, utiliza el anterior y si es Explorer utiliza el método de uno llamado Walter Zorn. Pero tuve que rechazarla por no permitirme trabajar con eventos, no sé por qué pero cuando hacía, por ejemplo:
      variable.onclick = function(){alert("como molo!!");};
      Nada mas arrancar el navegador me ejecutaba el alert y ya no me iba :|.
  • Raphaël: ¡no! no es el cantante ese de "yo soy aqueeel.." por el que nuestras madres se derretían cuando sonreía, es una librería que la verdad me ha gustado bastante. Es compatible con los navegadores que he podido probar, Explorer 6, Firefox y Opera. La combiné con prototype y scriptaculous (esta última por necesitar el efecto de dragndrop) y la verdad es que muy bien, es simple, pero era lo que necesitaba para lo que tenía que hacer. En su web hay ejemplos que parecen hechos por flash o algo similar, pero no, está hecho todo a base de javascript.
Mientras buscaba una librería que me gustara, dí con algunas específicas, como PlotKit especializada en la creación de gráficos, en su página encontramos una demo que muestra distintos tipos de gráficos que se pueden hacer.


La w3c tiene un programita llamado Amaya que es gratuito, para la realización de los gráficos de forma visual. Uuumm... tendré que probarla..

En futuros posts os pondré pruebas que voy haciendo.

viernes, 16 de enero de 2009

Google Maps

Desde que lo conocí, Maps (de Google) siempre me ha guiado cada vez que voy a algún sitio, para trazar la ruta, antes usaba otras soluciones como la guia michelín o no recuerdo cual mas... el caso es que siempre me ha parecido genial, te traza rutas tanto a coche, transporte público y andando.

Una prima mia que es muy fan de Stephen King me comentó que se marcaba en un mapa los lugares donde ocurrían las historias que escribía este escritor, la mayoría de los lugares para ver los recorridos que realizaban los personajes y poder buscar coincidencias entre las historias según el lugar, vamos algo que yo haría si no fuera porque yo suelo leer ciencia ficción y no tengo el mapa de Marte ni Coruscant ni Trantor..

El caso es que se me ocurrió que para esto sería genial Google Maps, veamos, tenemos un mapa, quizá desactualizado obtenido de la página oficial de este escritor y Google maps al lado:



Ver mapa más grande

La cosa sería ir poniendo rutas y puntos clave de las historias.

¿Alguien lo ha hecho alguna vez con alguna saga de libros o algo parecido?

Streetview


Hace un tiempo conocí streetview, es una aplicación de Google que agrega a los maps. Por lo visto la gente esta va con un coche que tiene unas camaras para tomar imágenes a 360 grados por todo el mundo.

De ese modo nosotros, humildes usuarios, podemos decir "vaya, pues quiero ir a ver el recorrido que haré en el coche por Valencia para poder" saber, más o menos, como son las calles y todo eso.

Pues nada, no hay mas que ir a Maps y buscar la ciudad, vemos sobre la regla que tenemos a la izquierda, para acercar o alejar el mapa, un muñequito amarillo, no tenemos mas que arrastrarlo a donde queremos y.. tachaaan!.


Ver mapa más grande

Pero ojo, no se puede con todas las ciudades (la gasolina es cara!), sólamente por donde hayan decidido hacerlo y claro.. la mayoría está en Estados Unidos..  No obstante no deja de ser un recurso curioso.. ¿tendrá el API liberado?

¿ha probado con reiniciar?

Bueno, creo que antes de seguir escribiendo, debería explicar las razones y de dónde saqué la idea de ponerle este estúpido nombre al blog:
Razones:
  1. No estaba disponible el nombre generalfailure (por lo del chiste ese de "¿quién será ese tal general failure que está husmeando en mi disco duro?"), ni controlaltsupr ni alguna otra variante parecida.
  2. Poner un acrónimo tal como el que iba a poner: ispronute (queriendo englobar los temas a tratar en el blog: ingeniería del software, programación y nuevas tecnologías) era un poco feo y no daba pié a poder explayarme con artículos como el anterior.
Tras esto, recordé los primeros tres minutos de una de mis series favoritas I.T. Crowd, tras la cual añadí a mi lista de cosas factibles a hacer en mi vida el que tenía que, en una situación real decir a alguien did you try to turning off and of again?, y conseguí hacer hace cosa de un año, pero bueno, esto de la lista de cosas factibles a hacer en mi vida os lo explicaré con más detenimiento otro día o en el otro blog. El caso es que esa frase era un poco larga para ponerla como nombre, de modo que preferí ponerla en castellano... y voliá!
Para los que no conozcan esta serie, aparte de merecer morir (es coña), os pongo el trozo inicial del primer episodio, para verlo subtitulado en castellano pincha aquí:

El teorema de los infinitos monos



Ayer, un compañero de trabajo me dió a conocer la existencia del Teorema de los infinitos monos, consistente en, básicamente la idea de que si juntas infinitos monos tecleando (bueno, aporreando) una máquina de escribir (supuse que una por mono), casi seguramente podrá escribir finalmente cualquier libro que se halle en la Biblioteca Nacional Francesa.
Por lo que he leído en la wikipedia, el caso es que se realizó un experimento, sin monos, por si los ecologistas decían algo, esta gente prefiere matar las especies trayendo a sus familiares provenientes de otros continentes (tal como está pasando con el cangrejo de río autóctono). Bueno, que me hierve la sangre, el caso es que se ve que se puso en marcha el uno de julio de 2003 un applet en un sitio web llamado
the monkey shakespeare simulator, el cual simula una laaarga problación de monos escribiendo al azar, para ver sobre cuanto tardarían en escribir una obra de Shakespeare de principio a fin. En 2005, concretamente el tres de enero, se miró a ver cómo iba la cosa y se encontraron con la sorpresa de hallar veinticuatro letras consecutivas que formaban un pequeño fragmento de Enrique VI, parte 2:
“RUMOUR. Open your ears; 9r"5j5&?OWTY Z0d "B-nEoF.vjSqj[..."

Posteriormente, el mismo experimento, logró 30 letras de Julio César de Shakespeare:

Flauius. Hence: home you idle CrmS3RSs
jbnKR IIYUS2([;3ei'Qqrm'

Debido a limitaciones en la capacidad de procesamiento, el programa usa un modelo probabilístico (mediante el uso de un generador de números aleatorios) en lugar de generar texto aleatorio y compararlo con Shakespeare. Cuando el simulador detecta una similitud (esto es, cuando el generador de números aleatorios genera un determinado valor dentro de un determinado rango), el simulador emula la coincidencias generando el texto de la misma.

En 2003, científicos en Paignton Zoo y la Universidad de Plymouth, en Devon, Inglaterra, reportaron que dejaron un teclado de computadora en la jaula de seis macacos durante un mes. No sólo los monos no hicieron más que producir cinco páginas consistentes en una larga serie de la letra S, sino que comenzaron a atacar el teclado con una piedra y siguieron orinando y defecando sobre él.

Seguro que no pensaron en simular esto anterior cuando realizaron el applet. Pero creo que es lo más seguro que podría pasar, han pasado millones de años y creo que el
planeta de los simios está aún un poco lejos, aunque, vistas algunas teorías como la que se ha presentado en este post, no creo que sea imposible.. símplemente lejos :)