» Publishers, Monetize your RSS feeds with FeedShow: More infos (Show/Hide Ads)
La principal ventaja de no guardar tus datos localmente, sino guardarlos en la “nube” (es decir, en cualquier servicio que se ofrezca mediante internet) es que puedes acceder a dichos datos mientras tengas acceso a internet desde cualquier parte del mundo. Algunas aplicaciones requieren la instalación de algún cliente especial, otras simplemente son accesibles desde tu navegador. Aquí va mi lista personal de servicios que uso y que explotan el concepto de “nube”.
Correo
Usar Gmail (o cualquier otro correo web) como correo electrónico con un cliente de correo local IMAP (no POP3). IMAP mantiene sincronizado tus correos locales con los del servidor, por lo que si borras, respondes o mueves un correo de carpeta en tu cliente local, se queda reflejado en el servidor también. Recomiendo Gmail por su capacidad de almacenamiento y porque la interfaz web para leer el correo es simplemente la mejor. Échale un vistazo a las ventajas de IMAP y ten a mano la guía de acciones a realizar en Gmail de Google. (Bola extra: como usar Gmail con IMAP y taguear tus correos también)
Contactos y calendario
Puedes utilizar Google Contacts y Google Calendar para guardar tu agenda y tus citas, para después sincronizarla con tu móvil. Android lo hace automáticamente sin configurar nada. Con iPhone tienes que añadir la cuenta específicamente, pero es muy sencillo: Sincronizar Google Gmail contacts y calendarios con iphone. La ventaja añadida de este sistema es que si pierdes o cambias de móvil, no pierdes la agenda ni las citas.
Favoritos
Si usas Firefox, instálate el plugin de delicious.com. Después importa todos tus favoritos con este plugin y bórralos de tu Firefox. A partir de ahora, solo necesitas Firefox + plugin para acceder a tus favoritos desde cualquier ordenador. Yo lo uso principalmente en el portatil del trabajo y el ordenador de casa, donde tenía los favoritos repartidos entre los dos ordenadores y hacia una copia manual periódicamente. Con el plugin de delicious, mis dos Firefox usan los mismos favoritos. Y si me voy fuera de vacaciones por ejemplo, siempre puede meterme en un cibercafé y entrar en delicious.com.
- Descarga el plugin de la página de Mozilla o desde la página de delicious
- Página de delicious para darte de alta y organizar tus favoritos: http://delicious.com
Actualización 15-Nov-2009: Martín en un comentario me recomienda Xmarks, una herramienta que te permite sincronizar los favoritos entre Firefox, Chrome, IE y Safari con su propia red de favoritos. Recomendable si usas distintos navegadores. La única pega que le veo es que si llevas utilizando tiempo delicious (como yo), no parece que tenga una integración fácil con Xmarks (por lo que he podido mirar por ahí).
Compartir archivos
Comparte y sincroniza archivos entre carpetas de ordenadores distintos con Dropbox. Requiere la instalación de un cliente en tu máquina (lo hay para Windows, Linux y MacOS). Una vez instalado, defines una carpeta compartida (pública o privada) donde todo lo que copies en dicha carpeta, sera subido a los servidores de Dropbox y sincronizado con el resto de clientes que usen la misma cuenta. Me explico: si instalas el cliente de Dropbox en dos ordenadores distintos y usas la misma cuenta (es decir, mismo login y password), lo que copies en la carpeta compartida de un ordenador, además de subirse a internet (y ser accesible desde la página web de Dropbox), también se bajará en el otro ordenador automáticamente. Ejemplos de uso:
- Hacer backups: copias en tu carpeta local los archivos que quieras. Como se suben automáticamente, si algún día se borran o los pierdes, puedes recuperarlos bajándotelos desde la página web. Además, Dropbox mantiene versiones de los archivos, así que si sobreescribes un documento por accidente con información errónea, puedes deshacer el cambio usando el histórico de ese archivo en Dropbox.
- Compartir información pública: copias en una carpeta local definida como pública los archivos que quieras. Dropbox los sube automáticamente y te proporciona una url con un acceso directo a dichos archivos en modo lecutra. Le envías la dirección a tus amigos y ellos se descargan la información. Cuando quieras dejar de compartir dichos archivos, solo tienes que quitarla de la carpeta pública que se encuentra en tu ordenador y Dropbox los eliminará de su servidor.
- Compartir archivos entre varios ordenadores: usando la misma cuenta, lo que copias en la carpeta de un ordenador, aparece en los otros (Dropbox se encarga de subirlo y bajarlo automáticamente).
Tienes hasta 2Gb de almacenamiento en su versión gratuita, que luego puedes ampliar hasta 50Gb y 100Gb pagando.
- Página de Dropbox: http://www.dropbox.com
- Un buen artículo de gordopilos donde explica como funciona.
- Y una guía para empezar a funcionar con DropBox en 5 minutos.
Compartir documentos
Comparte, sincroniza y gestiona información y documentos con Evernote. Al igual que Dropbox, requiere un cliente en tu máquina (lo hay para Windows, MacOS y también para móviles Blackberry, iPhone, PalmPre y Windows Mobile). Se trata de un almacen de notas y documentos, donde todo lo que escribes se queda guardado en sus servidores. Al igual que Dropbox, si usas la misma cuenta (login y password) desde dos ordenadores distintos, lo que escribes en uno, se envía al otro. También puedes acceder a tus documentos y notas a través de su página web, te permite organizar tus anotaciones por carpetas y tags, y acepta incrustar imágenes y PDFs, con la genialidad de que tantos las imágenes y los PDFs son escaneados y procesados con un OCR (reconocimiento óptico de caracteres), por lo que las palabras que contengan forman parte del índice de búsqueda de Evernote. Esto quiere decir que puedes buscar una palabra entre tus anotaciones y Evernote buscará entre tus textos y también, entre tus imágenes y PDFs. Cualquier cosa que redacto (por ejemplo, este post), anotaciones rápidas, ideas, apuntes, etc. lo hago desde Evernote. Es el sustituto ideal a cualquier sistema de Postits que haya utilizado antes.
- Berto, de Thinkwasabi, es un auténtico fan de Evernote. En su blog podrás encontrar tutoriales, screencast y artículos dedicados exclusivamente a explotar al máximo Evernote: Introducción a Evernote y resto de artículos.
- Página de descarga Evernote.
Otras maneras de compartir documentos sin Evernote podría ser utilizar Word u OpenOffice para escribir y depués guardar los documentos en una carpeta compartida con DropBox. O directamente utilizar Google Docs, donde puedes compartir la información además con otras personas. Como ves, dejar la información en la nube proporciona muchas ventajas. Y si el miedo a no hacerlo es pensar que si algún día no tienes internet, el servicio se cae o deja de existir, ten siempre una copia en local. Con Dropbox y Evernote no hace falta hacerlo, pues la información primero se crea y guarda en tu ordenador, después se sube a la nube y finalmente acaba en tus otros ordenadores que tengas asociados a la misma cuenta. Pero con los servicios de Google, donde todo se crea y se guarda directamente desde internet, si que puede llegar a ser necesario hacer una copia de seguridad (backup de todos tus correos en Gmail y backup de todos tus documentos en Google Docs).
Pocas personas de las que sigo en Twitter tienen tanta gracia como tiene @ateenagewhore. Tengo que publicarlo porque me mondo:
- Me encanta contestar a las preguntas de datos personales en el médico. Siempre me las sé todas y me siento muy realizada.
- “¿Alergia a madicamentos?No¿Claustrofobia?No¿Diabetes?No ¿Posibilidades de quedarte embarazada?(Llanto desesperado y patético)..NOOOOO”
- Como creí que estaba decepcionando a la pobre enfermera le dije “Eh, pero tengo alergia a los ácaros” “No, eso no importa”
- ¿¿No importa?? Zorra desagradecida, ¡Lo hice por ti! “¿Tienes algún objeto metálico dentro de tu cuerpo?” SOY UNA REPLICANTE.
- Entonces, me llevaron a la máquina de hacer resonancias magnéticas. La manejaba un ANDALUZ.
- Me volví preocupada a la enfermera y le pregunté “¿Y si ahora voy y tengo claustrofobia, resta puntos en el test para la nota final?”
- SUPE en cuanto me metieron allí que me iban a criogenizar, como a Nina Williams para el Tekken 3. Era la MISMA MÁQUINA.
:-D
… nos encontramos con un entorno laboral que tiende a estresar y cabrear al empleado, suele aplicar el Teorema del Botones Sacarino: “un Jefe, hasta que demuestre lo contrario, es siempre un cretino”. Al mismo tiempo que cualquier jefecillo siempre tiene presente la Ley de Jonás: “un empleado siempre quiere trabajar menos y ganar más”.
Hacer tu trabajo más divertido te ayuda a trabajar mejor y llegar a casa con menos estres. Esta afirmación puede parecer elemental, pero lo cierto es que a veces es todo lo contrario. David Bonilla explica en su blog las ventajas de aplicar la teoría de la diversión para trabajar mejor (que no más), mejorando las relaciones entre empleados y responsables, y hacer, a fin de cuentas, que el día a día sea, simplemente, más divertido. Con ejemplos tan gráficos como el jefe estilo “Don Pimpon”, al que todos quieren y respetan, y el jefe estilo “Terminator”, al que todos temen y una lista sobre cosas interesantes para hacer tu día a día más divertido en la oficina. Muy recomendable: The Fun Theory
En JSGB 0.02 podéis encontrar un completo emulador de Gameboy que Pedro Ladaria ha programado integramente en Javascript y Html5. Contiene un depurador y el código fuente completo de todo el proyecto lo podéis ver y descargar investigando simplemente el html de la página. Para que funcione rápido se recomiendo Google Chrome.
Se incluyen los juegos Mario Land, Tetris, Dr. Mario, Bomberman, Kirby’s Dream Land, Space Invaders, Motocross Maniacs, Bomb Jack, Bubble Ghost, Boxxle 2, Drop Zone, Castelian, Serpent y Centipede.
(Vía: pixfans)
Otros posts de juegos programados en Javascript:
- Un Tetris en 560 bytes
- Leisure Suit Larry y todos los juegos de Sierra con canvas HTML
- Alogritmo de ajedrez en 5kb
Half duplex allows data transmission in but one direction. A half-duplex connection is much like talking with any teenager, you can talk until you are blue in the face, but they won’t hear a word you say.
Sacado de la propia documentación de Voxeo sobre ccxml (me lo sopla Alberto, que lo tengo aquí al lado y está flipando… :D )
Gracias a Ecos del futuro (vía discover magazine), me entero de que la serie The Big Bang Theory es la única que tiene a David Saltzberg, un asesor físico a tiempo completo entre los guionistas. En The Big Bang Theory blog se explica, capítulo a capítulo, todos los aspectos físicos de la serie.
Esto me hace recordar que Futurama también tienes algunos colaboradores interesantes, como J. Stewart Burns (licenciado en matemáticas en Harvard) y David X. Cohen (licenciado en física en Harvard y máster en ciencias computacionales en Berkeley), ambos productores y guionistas de la serie. En gaussianos.com tenemos 5 posts interesantes (1, 2, 3, 4 y 5) con una buena recopilación de los detalles matemáticos y de la ciencia en general que hay en esta serie.

Muchas veces se utiliza Photoshop para crear títulos o textos con sombras, bajo-relieves, bordes, etc. creando para ello primero una imagen que después será utilizada en nuestra página. Sin embargo, podemos simular el mismo efecto (más o menos) utilizando solamente HTML/CSS con el estilo text-shadow. Este estilo fue propuesto para CSS2 aunque no ha sido aceptado hasta la aparición de CSS3. La mayoría de los navegadores lo soportan completamente: Konqueror, Firefox 3.1, Safari 4, Opera 9.5, Chrome 2, Epiphany (Linux). Y otros los soportan parcialmente (sin múltiples sombras) como Safari 3.1, Shiira e iCab (MacOS), iPhone Safari. Se queda fuera Internet Explorer, aunque siempre se pueden utilizar algunos trucos.
La sintaxis es:
name { text-shadow: X Y size radius; }
Los parámetros que acepta son:
- X: desplazamiento lateral (en px, pt, em). Un valor positivo para X significa que la sombra aparecerá a la derecha. Ejemplo: 2px.
- Y: desplazamiento vertical (en px, pt, em). Un valor positivo para Y significa que la sombra aparecerá abajo. Ejemplo: 2px.
- radius: tamaño de la sombra (en px, pt, em). A menor valor, más nítida aparecerá la sombra. Y a mayor valor, más difuminada (borrosa). Ejemplo 0.5px.
- color: Color de la sombra. Ejemplo: #000000.
El color se puede indicar al final o al principio de la definición. Se pueden concatenar varias sombras, separándolas por comas.
El objetivo del estilo es crear una sombra bajo el texto en la dirección indicada por X e Y, con el radio (o difusión) y color especificados. Combinando el color, la difusión y la posición de la sombra con el colo del texto y el fondo, podemos conseguir diversos efectos de una manera sencilla y limpia, ahorrándonos el trabajo de crear el mismo texto como una imagen en Photoshop o cualquier otro software de edición gráfica.
Ejemplos de sombras:
text-shadow: 1px 1px 0.25em black; color:black;
Esto es un ejemplo de sombra
text-shadow: 0.25em 0.25em 0.05em #8888FF; color: blue; background: #EEF
Esto es un ejemplo de otra sombra
text-shadow: 2px 2px 0.05px #000; color: white; background: #897;
Y esto es otra sombra más
También se puede combinar varias sombras en el mismo estilo, separándolas por comas:
text-shadow: 0.2em 0.5em 0.1em #F66,
0.6em 0.1em 0.1em #3B3,
0.4em -0.3em 0.1em #66F;
color: #000;
background: #EEF;
Ejemplo de triple sombra multicolor
Con el mismo color de fuente que de fondo, y creando una sombra más oscura arriba y otra más clara abajo, podemos hacer resaltados de bajo relieves:
text-shadow: -1px -1px white, 1px 1px #333; color: #BBB; background: #BBB;
Ejemplo de 2 sombras para hacer bajo relieves
text-shadow: 1px 1px white, -1px -1px #333; color: #BBB; background: #BBB;
Otro ejemplo de sombra para hacer bajo relieves
Y con cuatro sombras y diferentes colores de fondo y de letra, podemos hacer bordeados nítidos para resaltar letras, o de colores y borrosos para darles un efecto de iluminación por detrás, o incluso de fuego:
text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black; color: #FFF; background: #FFF;
Mismo color de fondo que de letra, y bordes oscuros
text-shadow: 0 0 0.2em #87F, 0 0 0.2em #87F, 0 0 0.2em #87F; color: #FFF; background: #FFF;
Mismo color de fondo que de letra, luz trasera
text-shadow:0 0 4px white, 0 -5px 4px #FFFF33,
2px -10px 6px #FFDD33, -2px -15px 11px #FF8800,
2px -25px 18px #FF2200;
color: #222;
background: black
Efecto de fuego con varias sombras
De todas formas, no es necesario limitarse a buscar efectos impresionantes para hacer títulos que llamen la atención. Podemos utilizar las sombras sutilmente para resaltar el cuerpo de un texto y mejorar su lectura. El siguiente texto es un texto normal sin sombra:
Todas las rayas que vieres en las manos, oh curioso lector, significan que la mano se dobla por la palma y no por arriba, y que se dobla por las junturas; y por eso están las grandes en las coyunturas désas, como es cuero delicado, resultan las otras menudas. Y para ver que esto es así mira que en el pescuezo y frente, caderas, corvas y codos y sangraduras y nalgas, por donde se arruga el pellejo y en las plantas de los pies hay rayas. Y así había de haber, si fuera verdad (como hay quirománticos), nalguimánticos, y frontimánticos y codimánticos y pescuecimánticos y piedimánticos
FRANCISCO DE QUEVEDO, MADRID (1580-1645)
Y el mismo texto, pero con style="text-shadow: 1px 1px 2px black".
Todas las rayas que vieres en las manos, oh curioso lector, significan que la mano se dobla por la palma y no por arriba, y que se dobla por las junturas; y por eso están las grandes en las coyunturas désas, como es cuero delicado, resultan las otras menudas. Y para ver que esto es así mira que en el pescuezo y frente, caderas, corvas y codos y sangraduras y nalgas, por donde se arruga el pellejo y en las plantas de los pies hay rayas. Y así había de haber, si fuera verdad (como hay quirománticos), nalguimánticos, y frontimánticos y codimánticos y pescuecimánticos y piedimánticos
FRANCISCO DE QUEVEDO, MADRID (1580-1645)
El resultado final es que el texto posee una sombra que casi no se percibe, pero que realza el texto. Como conclusión final tenemos que con el estilo text-shadow y un poco de imaginación, se pueden conseguir resultados muy diferentes, tanto si queremos simplemente decorar o realzar un texto hasta crear títulos con efectos. Un consejo: hay que evitar abusar del efecto, o el resultado final es que el texto quede muy recargado y sea más difícil de leer, consiguiendo el efecto contrario al deseado. Las ventajas de usar este estilo frente a usar una imagen hecha con Photoshop son:
- Menor cantidad de espacio ocupado, mayor rapidez de carga: solo HTML/CSS frente a descargarte una imagen (2kb ó 20kb).
- Al conservar el texto como parte del HTML, los buscadores y robots lo podrán detectar y leer. El contenido de una imagen es invisible a los buscadores.
- Posibilidad de crear efectos en textos dinámicos. Es decir, es posible modificar el texto y el efecto se mantiene. El contenido de una imagen es inmutable.
- El texto es accesible. Por ejemplo, la gente que tenga configuradas fuentes grandes por tener poca visión podrán leerlo mejor, y los invidentes también tendrán más facilidad para leerlo, sin tener que acudir al texto alternativo de la imagen (por Akbarr, en un comentario, gracias!)
Inconvenientes
- No es soportado por todos los navegadores y puede haber diferencias sensibles entre unos y otros. La única manera de asegurarse de que el texto se ve como realmente quieres que se vea, es creando una imagen.
Y algunos enlaces de interés:
- Referencia y ejemplos en w3.org.
- Algunos hacks para que funcionen las sombras en cualquier navegador.
- Una buena guía con más sombras.
Vía redferret me encuentro con una tabla periódica completamente útil. Se trata de una tabla que en vez de incluir cosas “aburridas” como su peso atómico, muestra un listado de cosas que utilizan dicho elemento, ya sea porque lo consumen o porque se necesita para construirlo.
La tabla es un trabajo entre la Universidad de York y la Chemical Industries Association, en el Reino Unido y ocupa 1.3Mb. La verdad es que es un gran trabajo, no solo ayuda a comprender un poco mejor los elementos y para que sirven, sino que seguramente facilite aprendértelos (si es que estás estudiando y lo necesitas). ¡Ideal para colgarla en el aula de química de todos los colegios!
¿Te imaginas jugar y disfrutar de Leisure Suit Larry (1987, 16 colores) y de todos los juegos antiguos de Sierra desde tu navegador, sin flash, ni applets, ni runtimes, simplemente HTML y Javascript? Pues ahora ya es posible en Sarien.
Para empezar, su autor, Martin Kool, ha desarrollado un sistema de código abierto para crear aventuras gráficas directamente en el navegador, utilizando la etiqueta canvas de HTML5. Y además de crear este motor ha portado los siguientes juegos:
- Leisure Suit Larry in the Land of the Lounge Lizards
- Gold Rush!
- King’s Quest: Quest for the Crown
- King’s Quest II: Romancing the Throne
- King’s Quest III: To Heir is Human
- Police Quest: In Pursuit of the Death Angel
- Space Quest I: The Sarien Encounter
- Space Quest II: Vohaul’s Revenge
- The Black Cauldron
Personalmente lo he probado y me parece una pasada. El tiempo de respuesta es inmediato y la jugabilidad ha mejorado al no necesitar teclear las órdenes. Hay que recordar que en estas aventuras gráficas tan antiguas de Sierra, los personajes se movían con los cursores (ahora se puede usar el ratón también, aunque al algoritmo para resolver la ruta entre dos puntos no sea perfecto) y las acciones se escribían en inglés (take flower, talk to girl, order a drink) con el teclado. Sin embargo, con el nuevo sistema de Martin Kool, es posible abrir un menú contextual con el botón derecho del ratón y navegar por todas las acciones disponibles y todos los objetos visibles en la escena actual, lo que lo hace mucho más sencillo. Incluso podemos descubrir objetos nuevos (la mayoría parte del decorado) que podemos examinar para ver su descripción original y que en su momento no pudimos ver. Por ejemplo, nunca se me habría ocurrido examinar el arce “moose” o el ventilador “fan” en el primer Larry cuando lo jugué hace más de 15 años.
Estas son las características técnicas del motor para crear aventuras (y jugarlas).
- Compatible con Firefox 2+, IE 6+, Opera, Safari y Chrome
- Funciona en iPhone y Wii (aunque todavía necesita algunos arreglos)
- Se puede jugar con el ratón o con el teclado. Si te quedas atascado en algún punto (el algoritmo no es perfecto), puedes hacer doble click y el personaje se “teletransportará” a dicha posición.
- Multijugador: varias personas pueden jugar la misma aventura, ¡a la vez! sin necesidad de crear rooms o establecer conexiones. Tu vas jugando y simplemente aparecen más jugadores en la escena. Les verás moverse, coger cosas (tranquilo, cogen las suyas, no las tuyas, así que nadie te estropeará nada) y podrás hablar con ellos (chat multiplayer). Simplemente genial (se puede deshabilitar)
- Todas las áreas del juego son directamente accesibles a través de la barra de direcciones y es posible crear un bookmark con ellas.
- Se pueden salvar y cargar partidas simplemente a través de una url. Es decir, al salvar una partida se genera una dirección (que puedes guardar como bookmark) con tu estado actual (posición, objetos, puntuación, etc). Al acceder de nuevo a esa dirección, se recupera el estado anterior y puedes seguir jugando.
Si jugaste a las aventuras de Sierra antiguas, este es un buen momento para rendirles un homenaje y volverlas a jugar de nuevo de una manera mucho más comoda. Puedes navegar entre escenas, teletransportación del personaje con doble click, jugar y chatear con otros jugadores. Y gracias a su menú contextual, puedes explotar todos esos detalles del juego que en su momento no viste (acciones que no se te habrían ocurrido hacer u objetos que se te pasaron por alto).
Como se hizo
Todas estas aventuras antiguas de Sierra fueron desarrolladas con AGI, un intérprete propietario desarrollado por la compañía específicamente para estos juegos. Cuenta Martin Kool en su página que, allá por el 2003, estuvo trabajando en un proyecto que consistía en extraer todas las imágenes de los juegos de Sierra, utilizando para ella la herramienta WinAGI, un moderno editor de aventuras AGI. Cuatro años después, desarrolló una herramienta en .NET que convertía estas aventuras AGI en Javascript, extrayendo el código y los gráficos internos que faltaban, listos para ser mostrados en la web. Pero hubo un gran y enorme problea: Sierra usaba instrucciones GOTO por todo su código, incluso dentro de bloques ifs anidados, y esto hacía imposible de transformar en código Javascript, ya que carece de esta instrucción y no es fácilmente simularla. Martin Kool y Sjoerd Visscher, un colega suyo, dieron con la solución: modificaron el decompilador para que extrajera los secciones internas de las estructuras if y las pusieron todas juntas en un gran switch/case, el cual podía imitar los números de línea de las instrucciones GOTO, manteniendo el rendimiento.

Menuda locura…
Finalmente, con el código en Javascript “tuenado” para aceptar todos los GOTOs que tenían las aventuras de Sierra, los gráficos y un poco de programación, creó sarien.net con todas las aventuras. Una labor realmente dura, pero que ha tenido un resultado muy satisfactorio. La historia completa en su página.
Bola extra: Leisure Suit Larry in the Land of the Lounge Lizards (descarga juego original)
Si quieres jugar a este juego completo, aquí puedes descargarlo junto con sus manuales originales, donde se explica como jugar y algunos detalles interesantes más. También se incluyen algunos enlaces con la solución, una guía a las preguntas de la edad y a DOSBox, el emulador necesario para hacerlo funcionar en cualquier plataforma:
- Juego completo – Leisure Suit Larry in the land of the lounge lizards, formato ZIP.
- Enlace a la página de descarga de DOS Box, un emulador de un PCx86 con MSDos, con soporte para gráficos, sonido, ratón, joystick, etc necesario para jugar a todos estos juegos antiguos. Versión Windows, MacOS y Linux.
- Lista de respuestas a las preguntas que verifican que tienes más de 18 años, necesario para empezar a jugar (como es un juego de adultos, te hará 5 preguntas para verificar tu edad antes de empezar a jugar. Las preguntas son sobre temas americanos y jerga inglesa, por lo que pueden ser complicadas para los no americanos)
- Leisure Suit Larry 1 – Reference en PDF.
- Leisure Suit Larry 1 – Manual en PDF.
- Una guía para acabarse el juego y otra guía distinta más, por si acaso.
Vía: Sarien: Multiplayer Game Engine goes Open Source y Play Kings Quest, Space Quest, and More… Using Canvas Tag
Qué lo disfrutéis. :-)
JUnit es un sistema para realizar pruebas unitarias que cuando te acostumbras a utilizarlo, se convierte en una herramienta indispensable. La mayoría de las veces (casi siempre), el método de trabajo es el mismo: se crea la clase de pruebas con los métodos a probar y ya está.
Pero ¿qué pasa si queremos hacer pruebas unitarias creadas dinámicamente en función de datos externos? Es decir, no tenemos las clase de test A con sus métodos y la clase B con sus métodos, etc. si no que tenemos una sola clase, la cual queremos reutilizar una y otra vez como si fueran test distintos basándonos en datos distintos. Por ejemplo, hacer una prueba determinada como tantos ficheros haya en un carpeta X. La prueba consiste en algo tan tonto como validar que el fichero en cuestion contenga la letra “z”, en caso de que no la tenga, fallará.
Una solución pobre sería hacer una única clase de prueba con un método donde nos recorremos todos los ficheros a testear y realizamos la prueba pertinente en cada de ellos con sus assert o fails. .
Solución mala
import junit.framework.TestCase;
import java.io.File;
public class BadTest extends TestCase {
public void testFiles() {
File[] files = new File("/var/tmp").listFiles();
System.out.println("Probando "+ files.length);
for (File file : files) {
System.out.println("Probando "+ file.getName());
assertTrue(file.getName().contains("z"));
}
}
}
El problema de la solución mala es que si falla un fichero, toda la prueba finaliza y se dejan de validar los siguientes ficheros (y podemos tener miles y fallar en el primero), así que la prueba no vale.
Para este caso, lo ideal sería poder ejecutar una prueba distinta e independiente, basada en la misma clase de test, por cada uno de estos ficheros. Pero ¿cómo haríamos esto? Para hacerlo debemos crear primero una suite. Una suite no es más que una clase cualquiera (no tiene porqué heredar de ninguna otra clase de JUnit) que implementa el método estático suite(), retornando un instancia de la clase TestSuite de JUnit. Dentro de este método, es responsabilidad nuestra crear una nueva instancia de dicha clase y añadir las clases de test con el método addTest(). Y para hacer tantas pruebas como ficheros, lo que hacemos es crear una clase anónima que hereda de TestCase. Durante su creación, le pasamos el fichero a probar como parámetro final. A continuación, una prueba que si funciona.
Solución buena
import junit.framework.TestCase;
import junit.framework.TestSuite;
import java.io.File;
import java.io.IOException;
public class DinamicSuite {
public static TestSuite suite() throws IOException {
TestSuite suite = new TestSuite();
for (File file : new File("/var/tmp").listFiles()) {
suite.addTest(createDinamicTest(file, "Validando "+file.getName()));
}
return suite;
}
private static TestCase createDinamicTest(final File file, String name) {
TestCase test = new TestCase() {
public void runTest() throws Throwable {
assertTrue(file.getName().contains("z"));
}
};
test.setName(name);
return test;
}
}
Bastante sencillo y elegante, ¿no crees?
Un buen gráfico que muestra lo que consumen los aparatos eléctricos por el simple hecho de estar enchufados. Una buena razón para utilizar regletas y apagarlos por la noche. ¡Atención con las televisores! ¡Cómo chupan!

A veces nos puede hacer falta saber el contenido de una cadena en Javascript sin los espacios del principio y del final. Por ejemplo, es común hacer la siguiente validacion de un campo de un formulario para saber si esta vacío:
function valida() {
if (document.forms['f'].campo.value == "") {
alert('Campo vacio');
}
}
O algún mañoso habrá intentado:
function valida() {
if (document.forms['f'].campo.length == 0) {
alert('Campo vacio');
}
}
Estos dos sistemas funcionan, pero solo aparentemente. El usuario puede engañarte y meter un espacio, dejando el campo en blanco, pero que ocupa una posición (o más) y no es exactamente la cadena vacía (””) con la que comparamos.
Podemos intentar algunos trucos para eliminar los espacios, pero buscando por internet, he encontrado el método más eficaz.
String.prototype.trim = function() { return this.replace(/^s+|s+$/g, ""); };
Con esta línea, estamos declarando una función llamada trim() en la clase String. Es decir, que en cualquier cadena de texto podemos llamar al método trim() para que nos devuelva el contenido sin espacios por delante ni por detrás. La sustitución se hace con una expresión regular. Más elegante y sencillo imposible.
Ahora nuestra podemos completar nuestra validación como sigue:
String.prototype.trim = function() { return this.replace(/^s+|s+$/g, ""); };
function valida() {
if (document.forms['f'].campo.trim().length == 0) {
alert('Campo vacio');
}
}
Y aunque inserten espacios en blanco, funcionará.
De todas formas, siempre es más comodo utilizar alguna librería en Javascript de validación de formularios, además de volver a validar los parámetros en el servidor.
Un test de la función:
String.prototype.trim = function() { return this.replace(/^s+|s+$/g, ""); };
var str = " esto es una prueba ";
alert("Cadena original: '" + str + "'");
alert("Sin espacios: '" + str.trim() + "'");
La función la he cogido de este post en Bigbold. Fijaos bien en los comentarios porque el primer método propuesto no funciona correctamente, he cogido el del primer comentarista. Ese es el que funciona y el que os acabo de poner aquí.
Shared by Beto
Desde wwwhatsnew.com nos traen una lista de herramientas, trucos y enlaces para explotar al máximo Google Wave.
1 – Usando Twitter desde Google Wave
Podemos añadir como…
Hay que buscar el equilibrio entre la falta de información total y la saturación de la misma, o lo que es lo mismo: eliminar el ruido.
¿Cuántos feeds lees? ¿Ninguno? ¿O más de cien?

Un buen gráfico que muestra lo que consumen los aparatos eléctricos por el simple hecho de estar enchufados. Una buena razón para utilizar regletas y apagarlos por la noche. ¡Atención con las televisores! ¡Cómo chupan!

Para acompañar al viejo post sobre PL-SQL Oracle desde Java (en algunos comentarios y mensajes) voy a explicar a continuación como establecer una conexión contra la base de datos sin usar un pool de conexiones.
1 Lo primero que necesitaremos son los drivers JDBC en formato jar, incluir este archivo jar en el CLASSPATH de nuestro proyecto y cargarlos en memoria:
Oracle: JDBC Download page Oracle
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
MySql: MySQL Connector J
Class.forName("com.mysql.jdbc.Driver").newInstance();
2 Para crear la conexión, necesitamos una url JDBC, la cual contiene toda la información necesaria para conectarse:
Oracle: necesitaremos saber el host (el nombre de la máquina o su IP), el puerto de escucha del listener de Oracle (1521 por ejemplo), el servicio o sid, el usuario y la clave. Diferentes formatos de la url JDBC pueden ser:
jdbc:oracle:thin:@host:puerto:sid jdbc:oracle:thin:usuario/clave@host:puerto:sid jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=host)(PORT=puerto)))(CONNECT_DATA=(SERVICE_NAME=servicio)(SERVER=SHARED))) jdbc:oracle:thin:usuario/clave@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=host)(PORT=puerto)))(CONNECT_DATA=(SERVICE_NAME=servicio)(SERVER=SHARED)))
Más información en FAQ JDBC Oracle: Connections
MySql: host (nombre de la máquina o su IP), puerto de escucha (3306 por defecto), nombre de la base de datos, usuario y clave. El formato de la url es:
jdbc:mysql://host:puerto/database jdbc:mysql://host:puerto/database?user=usuario&password;=clave
(Más información en MySql JDBC Reference)
Una vez tengamos la url JDBC, podemos crear la conexión contra la base de datos:
Connection connection = DriverManager.getConnection(ulr, usuario, clave);
Si la url ya contiene el usuario y la clave (hay formatos que ya la llevan):
Connection connection = DriverManager.getConnection(ulr);
Con el objeto connection ya podemos trabajar, sin olvidarnos de que una vez hemos acabado, hay que cerrar la conexión. Esto es muy importante hacerlo, ya que si se queda abierta, estamos desaprovechando recursos, creando lo que se llama connection leaks (conexiones perdidas) con la base de datos.
La mejor forma de hacerlo es englobar todo el código en una estructura try/catch/finally y efectuando el cierre de la conexión en el finally. De esta manera nos aseguramos de que falle o no falle el código, se cerrará la conexión.
Connection connection;
try {
// ...
connection = DriverManager.getConnection(ulr);
// ...
} finally {
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Veamos ahora un par de ejemplos completo. Para Oracle definimos una url que incluye el usuario y la clave, por lo que no necesitaremos pasarle esta información en el método getConnection():
import java.sql.*;
public class OracleConnection {
public static void main(String args[]) {
String usuario = "vil";
String password = "secreta";
String host = "localhost"; // tambien puede ser una ip como "192.168.1.14"
String puerto = "1521";
String sid = "prueba";
String driver = "oracle.jdbc.driver.OracleDriver";
String ulrjdbc = "jdbc:oracle:thin:" + usuario + "/" + password + "@" + host + ":" + puerto + ":" + sid;
Connection connection = null;
try {
Class.forName(driver).newInstance();
connection = DriverManager.getConnection(ulrjdbc);
// Ya tenemos el objeto connection creado
ResultSet result = connection.createStatement().executeQuery("SELECT 'hola mundo' FROM DUAL");
result.next();
System.out.println(result.getString(1));
} catch (Exception e) {
e.printStackTrace();
} finally {
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
}
}
}
}
}
Y para MySQL (usaremos una url sin usuario y clave, por lo que pasaremos esta información al método getConnection):
import java.sql.*;
public class MySQLConnection {
public static void main(String args[]) {
String usuario = "vil";
String password = "secreta";
String host = "localhost"; // tambien puede ser una ip como "192.168.1.14"
String puerto = "3306";
String database = "prueba";
String driver = "com.mysql.jdbc.Driver";
String ulrjdbc = "jdbc:mysql://" + host + ":" + puerto + "/" + database;
Connection connection = null;
try {
Class.forName(driver).newInstance();
connection = DriverManager.getConnection(ulrjdbc, usuario, password);
// Ya tenemos el objeto connection creado
} catch (Exception e) {
e.printStackTrace();
} finally {
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
}
}
}
}
}
Resumen para crear una conexión con cualquier base de datos:
- Insertar en el CLASSPATH el jar con los drivers de nuestra base de datos (drivers Oracle, drivers MySQL o buscar en Google “drivers jdbc basededatos”)
- Cargar los drivers con
Class.forName(sdriver).newInstance();, siendo sdriver un String con la clase del driver. - Crear la conexión con
DriverManager.getConnection(ulrjdbc, usuario, password);, siend urljdbc una url con el formato que define la propia base de datos (Oracle:jdbc:oracle:thin:@host:puerto:sid, MySQL:jdbc:mysql://host:puerto/databaseo buscar en Google “jdbc url basededatos”) - Cerrar siempre la conexión dentro del finally.
Después de estar sin postear nada desde Abril (y de esto hace ya casi 6 meses), se podría decir que el blog está casi muerto. Así que he decidido darle un empujón y lo he migrado a http://tumblr.com. Es decir, ya no uso Wordpress ni hospedo el blog en mi propio servidor. Ahora todo se gestiona desde los servidores de tumblr: tengo el dominio albertovilches.com redirigido y todo está ahí.
No lo llevo usando mucho, pero por ahora estas son mis conclusiones.
- Me despreocupo del mantenimiento del hospedaje, solo me preocuparé de postear.
- Facilidad de uso. Postear en tumblr.com es extremadamente simple: puedes hacerlo mediante email, mediante móvil, mediante el dashboard de la web, desde un widget en tu escritorio… Así que ahora la “pereza” que me podría dar al escribir un post se reduce muchísimo, ya que puedo postear algo que vea por internet con tan solo un par de clicks. Si toca escribir un post largo, entonces da igual: cuesta el mismo trabajo. x’D
- Cosas malas: no hay sistema de comentarios (me tendré que instalar algún plugin) y todos los enlaces que antes apuntaban al blog antiguo se han perdido. El blog antiguo todavía está visible tal y como lo dejé en abril. Lo puedes ver en http://wp.albertovilches.com
La operación ha sido facil, me he dado de alta, he copiado y pegado a mano los posts mas interesantes (basicamente los tutoriales en java, el resto ya está todo obsoleto), he redirgido el dominio y he modificado el feed de feedburner.
Bueno, espero veros por aquí. No olvidéis suscribiros a http://albertovilches.com/rss












































