martes, diciembre 28, 2010

Como activar el lector de pantallas (screenreader) en mac os

Hace poco por error, use command + f5 en mi mac os, intentando refrescar una pagina en lugar de function (fn) + F5, con lo que se activo un comando para leer la pantalla

El programa es muy interesante, en especial para personas con problemas visuales

Aquí un articulo para informarse mas del mismo


Un saludo,
J

jueves, diciembre 16, 2010

Como instalar grails in mac

Muy buen manual de como instalar grails, bajen la versión que sea y solo cambian el nombre de la carpeta de la nueva versión, por la que se muestra en el manual y funciona perfecto.


http://www.egtheblog.com/?p=126

Inventario anual de bebidas

Hola gente,

Solo quería compartir mi inventario anual de bebidas (así conocer gustos), excluyendo algunas cervecillas que tengo por ahí guardadas, este es mi inventario:

Ron:
Flor de Cana
  • 1 botella 5 anos.
  • 2 botellas 7 anos
  • una pacha 7 anos
  • 2 botellas 12 anos
  • 1 botella 18 anos
Ron Zacapa 15 anos
Centenario pachita 7 anos
Centanario pachita 12 anos
Bacardi limon
Bacardi Razz
Ron abuelo 7 anos
Bacardi superior 1862
Ron Boltran XL
Ron Centenario Garrafon
Ron Jamaica Appleton 7 anos
Ron Jamaica Appleton 12 anos (muchisimas gracias a Mayra :)
Capitan Morgan
Rum Jumbie, coconnut splash
Ron coconut
Malibu Ron


Tequila
Milagro Silver (muchisimas gracias a Pablito :)
Sauza Gold
Sauza Reposado
Don Julio Reposado

Vino
Luigi Borer Malbec 2006
Casillero del Diablo, Caberut Sauviguon 2009

Vodka
2 botellas smirnoff
y una smirnoff con sabor cranberry

Cremas y otro licores
Cahuita pacha
Amaretto Barinet
Licor de menta
Licor de agave Rancho Escondido
Bayleys 2 botellas (muchisimas gracias a Brian B :)
Licor de Cafe
Chivas 12 anos
Jagermeifer
Amarula Garrafon
Cade Costa Rica pacha (muchisimas gracias a Mayra :)
Locor de cafe, crema
Absinthe superior
Arbor Mist, strawberry (muchisimas gracias a Mayra :)
Bols Limoncello
Irish cream, Marries
Irish cream, Brogans

Espero para el ano que viene, retomar el arte del barman y el barismo :)

martes, agosto 10, 2010

Pasos para remover Postgresql 8.3 en MAC OS

Tomado de: http://forums.enterprisedb.com/posts/list/1437.page

In Mac OSX: (Assuming Default Locations)

Via uninstaller:

1) In the installation directory, there will be a uninstall-postgresql.app file will be there, executing (double clicking) that will uninstall the postgresql installation.

Manual Uninstallation:

1) Stop the server

sudo /sbin/SystemStarter stop postgresql-8.3

2) Remove menu shortcuts:

sudo rm -rf /Applications/PostgreSQL 8.3

3) Remove the ini file

sudo rm -rf /etc/postgres-reg.ini

4) Removing Startup Items

sudo rm -rf /Library/StartupItems/postgresql-8.3

5) Remove the data and installed files

sudo rm -rf /Library/PostgreSQL/8.3

6) Delete the user postgres

sudo dscl . delete /users/postgres

jueves, agosto 05, 2010

Apache Lucene - Indexando Archivos

El presente articulo (uno de varios que espero publicar), muestra como hacer una pequeña introducción a la indexación con Apache Lucene.

Este ejemplo, esta basado en el libro Lucene In Action, pero fue adecuado para funcionar con la versión 3.0 en lugar de la versión 2.0 que se comenta en el libro.

Veamos el siguiente ejemplo y comentemos al respecto:


package org.crjug.lucene.example1;

import java.io.File;
import java.io.FileFilter;
import java.io.FileReader;
import java.io.IOException;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.Field.Index;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.store.SimpleFSDirectory;
import org.apache.lucene.util.Version;

/**
* Ejemplo sencillo de como utilizar el indexador.
*
* @author jsanca
*
*/
public class IndexerExample {

public static void main(String[] args) throws IOException {


if (2 != args.length) {

System.out.println("Use como: java "
+ IndexerExample.class.getName()
+ " ");
} else {


makeIndex(args[0], args[1]);

}
} // main.

public static void makeIndex (String sindexDir, String sdataDir) throws IOException {

File indexDir = null;
File dataDir = null;
int numDocsIndexed = 0;
IndexerExample indexer = new IndexerExample ();

indexDir = new File(sindexDir);
dataDir = new File(sdataDir);

numDocsIndexed = indexer.doIndex(indexDir, dataDir);

System.out.println("Numero de documentos indexados: "
+ numDocsIndexed);
} // makeIndex.

/**
* Indexa un directorio (dataDir) y almacena los segmentos del indice en (indexDir)
* @param indexDir
* @param dataDir
* @return Retorna el numero de documento indexados.
* @throws IOException
*/
private int doIndex(File indexDir, File dataDir) throws IOException {

int numDocsIndexed = 0;
IndexWriter indexWriter = null;
boolean createIndex = true;
// Determino si el directorio a indexar, es realmente
// un directorio y existe.
if (!dataDir.exists() || !dataDir.isDirectory()) {

throw new IOException(dataDir + ", no existe o no es un directorio");
}

indexWriter = new IndexWriter(
// Pueden ser directorios virtuales basado en RAM, BD o Archivos.
new SimpleFSDirectory(indexDir),
// El analizador de texto por defecto.
new StandardAnalyzer(Version.LUCENE_30),
// Deseo crear el indice.
createIndex,
// No me preocupa limitar el tamaNo de los campos.
IndexWriter.MaxFieldLength.UNLIMITED);

indexWriter.setUseCompoundFile(false);

// Indexo el directorio.
this.doIndexDirectory (indexWriter, dataDir);

// Obtengo los archivos indexado (aunque no esten merge)
numDocsIndexed = indexWriter.numDocs();
// Llamo al optimizador.
indexWriter.optimize();
// No voy a escribir, cierro el indice.
indexWriter.close();

return numDocsIndexed;
} // doIndex.

/**
* Indexa un directorio en particular.
* @param indexWriter
* @param dataDir
* @throws IOException
*/
private void doIndexDirectory(IndexWriter indexWriter, File dataDir) throws IOException {

File[] files = dataDir.listFiles(new FileFilter () {
// Filtramos para solo leer archivos txt y directorios
public boolean accept(File pathname) {

return pathname.isDirectory() || pathname.getName().endsWith(".txt");
}
});

// Recorro archivos y directorios.
for (File file : files) {

if (file.isDirectory()) { // si es un directorio, entro y lo recorro

this.doIndexDirectory(indexWriter, file);
} else {

// Si es un archivo lo leo e indexo.
this.doIndexFile (indexWriter, file);
}
}
} // doIndexDirectory.

/**
* Realiza la indexacion de un archivo plano.
* @param indexWriter
* @param file
* @throws IOException
*/
private void doIndexFile(IndexWriter indexWriter, File file) throws IOException {

Document document = null;
// Si no es un archivo oculto
// si existe
// y puedo leerlo.
if (!file.isHidden() && file.exists() && file.canRead()) {

System.out.println("Indexando: " + file.getCanonicalPath());

document = new Document ();

// Agrega un campo de texto indexado pero no almacenado.
document.add(new Field("contents", new FileReader (file)));

// Es almacenado pero no indexado, sirve viene como parte de los resultados
// pero no se desea hacer busquedas por el nombre del archivo.
document.add(new Field ("filename", file.getCanonicalPath(), Store.YES, Index.NO));

// Finalmente agrego el archivo al indice.
indexWriter.addDocument(document);
}
} // doIndexFile.
} // E:O:F:IndexerExample.



El ejemplo anterior, muestra la clase IndexerExample. El mismo en términos generales crea un indice invertido, indexando solo archivos extensión .txt, de una carpeta en particular pasada por parámetro y almacenando los segmentos del indice en otro directorio.

La linea 28, simplemente checkea que se envíen al main, dos parámetros, el primero es trata de la carpeta para almacenar el indice y la segunda, la carpeta con los archivos que deseo indexar; el sistema realiza indexación recursiva de directorio.

Seguidamente se invoca al método “makeIndex”, y simplemente se invoca al método de la clase “doIndex”, que retorna la cantidad de archivos indexados.

La siguiente linea, que nos debe interesar es la 76; la misma crea nuestra clase para escribir el indice “IndexWriter”; el primer argumento es un Directory object, el mismo puede tratarse de:

Un directorio en RAM, el cual puede ser útil para indexar unos datos en memoria y consultarlos. Esto por supuesto proporciona mayor velocidad al tener que evitar el acceso al disco duro para leer el archivo, aunque los S.O modernos cuentan con mecanismos de cache, que proporcionan un desempeño bastante aceptable.

También existen dos posibilidades mas, almacenarlo en un directorio en el disco duro (la opción que estamos utilizando) y en base de datos.

El siguiente argumento, se trata del analizador de texto, el mismo sirve para tokenizar, eliminar palabras con poca relevancia o aplicar algoritmos para la optimización del texto, en nuestro caso utilizamos una versión muy sencilla, pero existen analizadores para diferentes idioma o corpus de información para lucene, agregado como contribuciones.

El tercer argumento indica al IndexWriter que se desea o no crear un nuevo indice, en caso que sea false el argumento, el indice será actualizado y no remplazado o creado de cero.

Por ultimo, se indica si deseamos limitar o no, el tamaño de los campos a guardar.

Método DoIndexDirectory

Linea 109, esta linea simplemente obtiene todos los archivos con extensión “txt” o directorios.

A continuación en la linea 118, se iteran todos los archivos, en caso de tratarse de un directorio se indexan los elementos dentro del mismo, de lo contrario se indexa el contenido del archivo “txt”, utilizando para tal objetivo el método: “doIndexFile”.

Método doIndexFile

En la linea 143, se determina si el archivo no es oculto, existe y se puede leer (asunto de permisos)

A continuación creamos el objeto Documento (Document; en Lucene, los objetos indexado son tratados como documentos, el mismo se conceptualiza como una colección de campos, llave, valor, similar a un hash table)

Una vez creado el documento, agregamos al mismo dos campos; 'contents' y 'filename'; el primero es almacenado por defecto como un campo indexado, pero no guardado, lo que quiere decir que el texto indexado no se almacena para su posterior recuperación pero si quedan indexado su contenido, por su lado filename, simplemente se trata de meta información, no es indexada (osea que no se podrá buscar por este campo), pero se volverá parte de los resultado al buscar en contents.

Si seguimos este sencillo flujo y volvemos al método 'doIndex' notaremos los llamados a 'optimize' y 'close'. La invocación del primero permite que Lucene utilice algoritmos de optimizacion sobre el indice, similar a un VACUM en una base de datos, se realiza cuando existen muchas actualizaciones en la base de datos.

El método close, simplemente cierra el indice y probablemente libera algunos recursos que ya no necesitamos utilizar.

Así pues, después de recorrer todo este código y ejecutarlo utilizando alguna colección de archivos de texto veremos que se genera una serie de archivos binarios, en próximos artículos, mostraremos como utilizar estos archivos para hacer búsquedas utilizando varios tipos de consultas.

martes, julio 27, 2010

PROX CRJUG 11 agosto

Estimados lectores,

Al parecer la hora por fin llego y la presentación del padrón electoral, será el 11 de Agosto del 2010, en el marco de la reuniones del CRJUG, lugar la U latina, donde han sido tradicionalmente!

Aquí el link para que puedan registrarse (Aquí también pueden ver el indice):


-------
Desarrollo de un sistema de consulta del padron electoral con Apache Lucene

Introducción y objetivos de la presentación
- Motivo de la presentación
- Breve mención acerca del sistema del Padrón electoral y la comunidad de software libre de la UCR
- Breve introducción a la arquitectura del sistema
- Por que lucene y no una base de datos relacional.

Introducción a lucene
- Que es lucene
- Como generar un indice
- Como leer un índice
- Como hacer consultar
- Algunos proyectos asociados, Nutch, Solr, etc.

Presentación de la app del padrón electoral
- Ejemplo de como generar un índice (Opencsv y Lucene).
- Ejemplo de como leer el índice (Lucene)
- Ejemplo de como hacer una interface con Swing

Conclusiones


Lugar: U.Latina

Hora: 6:30 PM

Fecha: 11 de Agosto del 2010

----------


Básicamente daremos una introducción a Apache Lucene y explicaremos el sistema del padrón electoral.

Un saludo,
J

martes, junio 29, 2010

Hosteado el padron electoral cr

Hola,

Con mucho orgullo quiero contar que el proyecto, padrón electoral cr; ha sido hosteado bajo la licencia GNU Lesser General Public License

https://code.google.com/p/padronelectoralcr/

Por razones lógicas, solo el código se encuentra ahí! los archivos para crear el índice y el índice propiamente no se encuentra!

Por ultimo comentar, que como fecha tentativa; este proyecto podría ser presentado en la siguiente reunión del grupo de usuarios de Java, a efectuarse en la ULatina, el 11 de agosto del 2010!

Un saludo,
J

Como descomprimir el contenido de un jar

Para descomprimir el contenido de un jar, tan solo tienes que ejecutar el siguiente comando:

jar -xvf rutadeljar.jar

Por ejemplo

jar -xvf spring-core.jar

martes, junio 22, 2010

Repo Maven para Jira 4.x

Estoy construyendo uno plugin de Jira y este repo me ha ayudado montones con las dependencias:

lunes, junio 21, 2010

Sqlite Latino

Hola,

Recientemente he iniciado un proyecto open source, del cual comentare mas adelante cuando tenga algo decente que presentar, pero como parte de la persistencia he estado evaluando a sqllite, el cual consiste en un pseudo-motor de bd (pseudo, xq no implementa algunas cosas).

El motivo del hilo, es que he encontrado este sitio: http://sqlite-latino.blogspot.com/

Es la comunidad latina de sqllite, me parece un buen sitio para iniciar, aun le falta mucho, pero lo considero un buen esfuerzo para iniciar.

Un saludo,
J

sábado, junio 12, 2010

Libreria Java para utilizar Recaptcha

Hola, para utilizar el servicio: http://recaptcha.net/
He encontrado la libreria: http://code.google.com/p/recaptcha/

La verdad con la ayuda del sitio, el servicio funciona perfecto :)

lunes, junio 07, 2010

LightBox con JQuery

Para crear el efecto de lightbox, con JQuery puedes valerte del siguiente plugin:

http://github.com/krewenki/jquery-lightbox/

Para que funcione tenes que depositar en tu sitio Web; el javascript jquery.lightbox.js, el css lightbox.css y las imagenes de la carpeta images.

Seguidamente, tienes que incluir tanto el javascript como el css en tu pagina.

Adicionalmente, tienes que modificar el archivo js (regularmente al final) y el css, para asegurarse que las direcciones de las imagenes en el css y el js, apunten al lugar correcto.

Por ultimo, dos pasos:

Incluir este pequeño código de Javascript:

$(document).ready(function(){
$(".lightbox").lightbox();
});

Si desea mostrar el lightbox solo sobre una imagen, coloque la misma como valor del href y agregue el class lightbox, al atributo class del link:

href="/images/jquerylightbox/image-0.jpg" class="lightbox" title="Titulo inferior del lighbox"

Tome en cuenta que el valor del atributo title, saldra en ell dialogo del lighbox, en la parte inferior.

Ahora si desea que varias imagenes, formen una especie de galeria en el lightbox, simplemente agregue a cada imagen, el atributo rel, con un valor que funcionara como id, por ejemplo:

a href="images/image-1.jpg" class="lightbox" rel="roadtrip"
a href="images/image-2.jpg" class="lightbox" rel="roadtrip"
a href="images/image-3.jpg" class="lightbox" rel="roadtrip"

Las tres imagenes se encuentra asociada bajo el id, roadtrip, por lo tanto cuando le pulsen el mouse sobre alguna de ellas, apareceran las fechas de desplazamiento izquierda y derecha, al mejor estilo de una galeria.

Un saludo,
J

Como publicar un share en Facebook

Si desean publicar un share, desde su aplicación en facebook, si utilizar FB connect; puede hacerlo con solo utilizar HTML;

http://www.facebook.com/sharer.php?u=URL&t=TITLE

Solo cambia el valor del parámetro URL, por el URL que us desea

Y TITLE, por el titulo para el share en FB

Un saludo,
J

Averiguar mi IP y HOST con Java InetAddress

System.out.println(InetAddress.getLocalHost().getHostAddress()); // ip
System.out.println(InetAddress.getLocalHost().getHostName()); // host

viernes, mayo 28, 2010

Si quiere eliminar las lineas extras, que deja el contenido no-rendered de los JSP, es decir, las lineas y espacios por utilizar tag lib, utilicen esta sentencia en sus JSP's




<%@page trimDirectiveWhitespaces="true"%>:



[+] info: http://java.sun.com/developer/technicalArticles/J2EE/jsp_21/
Por si desean leer acerca de user stories (técnica para toma de requerimiento, ágil) aquí tienen este vinculo:


Un saludo,
J

jueves, mayo 27, 2010

Libreria Java para Scribd

Estaba haciendo un research, acerca de como utilizar scridb, la base de datos documental en linea, en una aplicación y di con la biblioteca: http://code.google.com/p/javascribd/

A juzgar por los ejemplos, me parece bastante sencilla y funcional!

Un saludo,
J

sábado, mayo 22, 2010

20 plugins para jquery

Me apunto por aquí estos 20 plugins para Jquery, de fijo más adelante usaré alguno de ellos

http://addyosmani.com/blog/20-amazing-jquery-plugins-to-improve-your-user-interface/

Un saludo,
J

10 razones para no usar facebook

Aquí un listado de 10, razones para no usar facebook:

http://www.rocket.ly/home/2010/4/26/top-ten-reasons-you-should-quit-facebook.html

En resumen, pone en evidencia que Facebook, es una compañía poco ética, en el manejo de la información que colocas en tu perfil (nada nuevo), también denuncia los actos de aprovechamiento ilícito departe de las cabezas de facebook (nada nuevo), de sus contratos de privacidad no éticos (igual nada nuevo) y pone en claro las deficiencias del sistema, en cuanto a seguridad y acceso; nada nuevo, recuerden el problema que tienen las redes sociales para eliminar información deprecada como las imagenes, etc.

Nada de lo que dice el articulo es nuevo, pero igual no quiere decir que usar FB es malo del todo, simplemente si no quieres que información personal sea compartida, pues no la pongas ahí; fuertemente recomendado utilizar una clave diferente a la de alguno de tus correos, principalmente el correo con el cual, te inscribiste en el servicio.

Un saludo,
J

Cap 6. Freaklances

Nuevo capitulo de freaklances

http://www.youtube.com/watch?v=3gEnTq3uiOY&feature=digest

martes, mayo 18, 2010

Hacer el disable con un boton en JQuery

Para implementar la funcionalidad de disponible y no disponible en JQuery debes hacer lo siguiente:


Para hacerlo disable:

$('#' + buttonId).attr("disabled", "disabled");


Para quitarlo

$('#' + actionButtonId).removeAttr("disabled");


Eso funciona así, pues para que el botón sea disable, tienes que agregar un atributo de la siguiente manera

input disable="disable" type="button"

y para ponerlo de nuevo, solo sería eliminar el atributo.

Un saludo,
J

lunes, mayo 17, 2010

Interesante articulo acerca de la taxonomia de un URL

Aquí se los dejo, full recomendado para la gente que trabaja en Web:

http://www.skorks.com/2010/05/what-every-developer-should-know-about-urls/

sábado, mayo 08, 2010

Ipad me sirve o no (opinión personal)




He estado leyendo acerca de las ventajas y desventajas de un Ipad, por ejemplo con un notebook o dispositivos de "bajo" costo!

He leído en una revista inclusive, 46 razones para no comprar el aparato de Apple y me parece que el 80% son razonable e inclusive porque no, verdaderas!

Algunos de mis amigos no les gusta el hecho que no tenga puertos usb, o que la conexión a 3G se bajo un plan Apple (que en CR, ni existe); además del hecho que es un sistema monoproceso en el siglo XXI, es decir que solo puedes correr una aplicación al mismo tiempo, etc!

El hecho es que en funcionalidad, precio/características, etc; la mayoría de las cosas que le atacan al Ipad son ciertas, pero la verdad es que cuando empiezas a usar uno de estos, te das cuenta que Mac, con un par de cambios a ideas actuales, lanza una herramienta que puede volverse esencial en tu ilife!

No estamos hablando de un computador, ni la mejor experiencia de navegación; estamos hablando de un complemento portátil, sencillisimo de manejar (uno de sus puntos claves) y bonito ;)

Si vas a comprar un Ipad, para tirar tu notebook o tu computadora, estarás en un terrible error; su objetivo es muy diferente y sus posibilidad y beneficios no son los mismo que los de un notebook o computador.

En particular, no me gusta las limitaciones impuestas por Apple para correr aplicaciones, entre ellas Flash, es como si compraras un carro y te restringieran a utilizar solo en tu barrio o en los barrios autorizados por la marca, pero en fin!

Incluso he pensado en un Ipad como alternativa para una persona mayor, por ejemplo una Madre, si deseas que tu mama de el salto a la Internet, leer noticias, chatear contigo, checkar email, etc! me parece que el Ipad es las respuesta.

De cualquier manera, Google ya ha anunciado sus productos de competencia, por lo que habrá que estar atentos!

Filtrar la respuestra de un callback con JQuery

En algunas ocasiones necesitamos filtrar todas las respuestas de los callbacks de JQuery, ya se para agregar, eliminar o modificar la trama de respuesta, o bien inspeccionarla para hacer algo!

Por ejemplo, aquí un caso para determinar si la trama retornada es la pagina de login, muy útil cuando usamos por ejemplo, spring security y la session esta vecina y nos retorna la pagina de login:


$.ajaxSetup({
dataFilter: function(data) {

if (isLoginPage (data)) {
// If it is login page, so is session timeout!
location.href = '/j_spring_security_logout';
// ...
}
return data;
}
});


Este código sera utilizado por todos los callback que tengas o que vayas a hacer ;)

martes, abril 27, 2010

freaklances

Deseandole un feliz día a todos mis amigos diseñadores, aquí el primer capitulo de freaklances, muy buena serie española:

http://www.youtube.com/user/FreaklancesLaSerie ahi mismo puede encontrar el resto de los capitulos

domingo, abril 25, 2010

Leyendo Stripes

Hola, recientemente mande a comprar a http://oreilly.com/ 3 libros utilizando el descuento del grupo de java de CR.

Mande a comprar uno de Jboss, uno de Android y uno de Stripes.

Este ultimo, Stripes .... and Java Web Development is Fun Again! lo compre pues siempre me ha llamado la atención este framework Web y la pequeña "fama" que le rodea en cuanto a un framework simple y liviano.

Hasta el momento voy por el capitulo 4 y espero escribir un articulo, además de una exposición del mismo para la Java JUG CR. Lo que les puedo adelantar hasta el momento, es que Stripes tiene muy buena pinta y el libro es sencillo de leer y bastante entretenido.

Además, el autor siempre hace honor a la fama de framework KISS, que no reinventa la rueda si no se vale de las relaciones con frameworks de terceros para hacer ciertos trabajos, e inclusive expone brevemente algunas alternativas muy interesantes.

Un saludo,
J

jueves, abril 22, 2010

Godsmack acustico - Shannon Larkin solo

Mae demasiado rock start ese mop:



Amazing!!!!

miércoles, abril 21, 2010

Los abusos y deficiencias de Amnet/Internet

Tengo ya al menos dos años utilizando el servicio de Internet Cable modem de Amnet, pago la tarifa de 3mb/256 kb.

Al respecto tengo dos quejas puntuales;

La primera se base en el siguiente razonamiento, si Amnet solicita en su pagina que denuncien las personas que roban cable, lo cual dicho sea de paso me parece correcto; en contraposición me parece un abuso, publicidad engañosa y además un abuso en el servicio, que me facturen y me cobren un servicio de 3mb/256 kb, cuando lo que obtengo es 3 kb (10 veces menos), cuando los astros se alinean navego a poco mas de un mega y ya ni en la madrugada tengo mis 3 mb; esto perdón, pero me tiene indignado y me parece un robo.

Quiero hacer las investigaciones para poner la queja en la defensoría de los habitantes, pues esto me parece un abuso, ya que si Amnet no tiene la capacidad de vender los benditos 3mb, entonces que ni siquiera ofrezca en su pagina el susodicho servicio, es un robo! y no veo porque tenemos que ver normal, esta pobreza de servicios.

El otro punto del cual me quiero quejar, es el hecho que facturen en dolares, pero me cobren en colones, lo peor del mundo con tipos de cambios altísimos, me parece un abuso y por mas que después intenten estar haciendo reembolsos, me sigue pareciendo un abuso!

No entiendo, porque razón, si facturan en dolares, no pueden cobrar en dolares, definitivamente con ese tipo cambiarlo fantasma, tienen un segundo negocio.

Si alguien sabe, como hacer la queja de forma formal, se lo agradecería, la verdad estoy cansado del servicio.

un saludo,
J

jueves, abril 15, 2010

19 de Mayo, presentando indexación y recuperación de datos con Apache Lucene, parte del grupo de exposiciones del crjug



Solo para comentarles, que como fecha tentativa; el 19 de Mayo del 2010, en el auditorio de la U latina, estaré dando una presentación de:

Indexación y recuperación de datos con Apache Lucene.

La idea detrás de esta exposición es mostrar a Apache Lucene como una solución a utilizar, en lugar de una base de datos, para consultar catálogos.

Aunque mi experiencia con Apache Lucene nos es la de un experto (no conozco todo el API ni la toda teoría de RI), la idea es tener un primer acercamiento al framework y que los asistentes tenga una herramientas mas, aunque sea a nivel básico.

El temario tentativo es el siguiente:

Introducción y objetivos de la presentación
- Motivo de la presentación
- Breve mención acerca del sistema del Padrón electoral y la comunidad de software libre de la UCR
- Breve introducción a la arquitectura del sistema
- Por que Lucene y no una base de datos relacional.

Introducción a Lucene
- Que es Lucene
- Como generar un índice
- Como leer un índice
- Como hacer consultar
- Algunos proyectos asociados, Nutch, Solr, etc.

Presentación de la aplicaron del padrón electoral
- Ejemplo de como generar un índice (Opencsv y Lucene).
- Ejemplo de como leer el índice (Lucene)
- Ejemplo de como hacer una interface con Swing

Conclusiones y preguntas.


Como se puede notar dentro del temario, parte de la exposición sera, una aplicación desarrollada en la comunidad de software libre de la UCR, para el marco de las elecciones nacionales: aquí mas detalles

La exposición se realiza en el marco de la exposición del grupo de usuarios de Java de CR, y es una contribución mas, de las que otros compañeros ya han realizado.

Ahí estaré informando, acerca de nuevos updates.

martes, abril 06, 2010

Hoy inicia V por Warner


Hola para todos los que recordamos la serie V,

Bueno, pues un remake, inicia hoy a las 8 CR Time por canal Warner; 44 en Amnet!

Para los que andan algo perdidos, se trata de aquella seria donde la tierra es invadida por reptiles humanoides, con apariencia humana, que les encantaba comer ratones.

Me acuerdo de que su principal actor, llevaba el nombre de Donovan.

Bueno, pues si ya le cayo la peseta, sintonicé todos los martes, a las 8, Warner, a ver que tal!

Cookies en JavaScript

Me encontré este excelente artículos de cookies en Javascript; explica muy bien cada atributo:


http://www.quirksmode.org/js/cookies.html


sábado, abril 03, 2010

LOS FABULOSOS CADILLACS - Surfer calavera (Vibe TV, Los Ángeles) 29.04.1998

LOS FABULOSOS CADILLACS - Surfer calavera (Vibe TV, Los Ángeles) 29.04.1998

martes, marzo 30, 2010

Estudiando el corto circuito

Estudiando el corto circuito

El presente articulo, muestra los detalles de como se funciona el corto circuito en instrucciones "and" y "or".

Para iniciar, recurramos un poco a un pedazo de código:



package com.ticoblogger.jsanca.cortocircuito;

public class CortoCircuito {

private boolean testCondition1 = true;
private boolean testCondition2 = true;

public CortoCircuito(boolean testCondition1,
boolean testCondition2) {
super();
this.testCondition1 = testCondition1;
this.testCondition2 = testCondition2;
}

public boolean testCondition1() {

System.out.println("Test condition 1");
return this.testCondition1;
}

public boolean testCondition2() {

System.out.println("Test condition 2");
return this.testCondition2;
}

public static void main(String[] args) {

System.out.println("Corto circuito");
testOr(new CortoCircuito (true, true));
System.out.println("Sin corto circuito");
testSimpleOr(new CortoCircuito (true, true));

System.out.println("\nCorto circuito 2");
testAnd(new CortoCircuito (false, true));
System.out.println("Sin corto circuito 2");
testSimpleAnd(new CortoCircuito (false, true));

System.out.println("\nCorto circuito 3");
testAnd(new CortoCircuito (false, false));
System.out.println("Sin corto circuito 3");
testSimpleAnd(new CortoCircuito (false, false));
}

public static void testAnd (CortoCircuito cortoCircuito) {

if (cortoCircuito.testCondition1() && cortoCircuito.testCondition2()) {

System.out.println("**** *****");
}
}

public static void testSimpleAnd (CortoCircuito cortoCircuito) {

if (cortoCircuito.testCondition1() & cortoCircuito.testCondition2()) {

System.out.println("---- * ----");
}
}


public static void testOr (CortoCircuito cortoCircuito) {

if (cortoCircuito.testCondition1() || cortoCircuito.testCondition2()) {

System.out.println("**** *****");
}
}

public static void testSimpleOr (CortoCircuito cortoCircuito) {

if (cortoCircuito.testCondition1() | cortoCircuito.testCondition2()) {

System.out.println("---- * ----");
}
}
}




Si ejecutas el código, conseguiras la siguiente salida:

Corto circuito
Test condition 1
**** *****
Sin corto circuito
Test condition 1
Test condition 2
---- * ----

Corto circuito 2
Test condition 1
Sin corto circuito 2
Test condition 1
Test condition 2

Corto circuito 3
Test condition 1
Sin corto circuito 3
Test condition 1
Test condition 2

Ahora bien, si analizamos el código podremos entender como funciona el corto circuito.

Los métodos testXXX tienen condiciones que utilizan corto circuito, en contra posición los métodos testSimpleXXX, simplemente hacen la operación lógica (AND o OR).

Así podemos concluir que, en el caso del corto circuito, si la operación OR, encuentra alguna condición verdadera, dejará de evaluar las siguientes.

En el caso del AND, en lugar de buscar un true, busca el primer false. Al encontrarlo, deduce por la tabla de verdad, que la condición es false y deja de evaluar las demás.

Así pues, si ocupa, necesariamente, que todas las condiciones sean evaluadas, por ejemplo; si necesitamos saber, si un objeto cumple todas las condiciones y en caso que no, mostrar errores, etc. Algo así:

if (this.validarTarjeta(Tarjeta tarjeta, Errores errores) & this.validarEmisor(Tarjeta tarjeta, Errores errores) & this.validarFondos(Tarjeta tarjeta, Errores errores)) { ....

Un saludo,
J

viernes, marzo 19, 2010

Introducción a Hilos con Java

El presente articulo, espera ser una pequeña introducción al manejo de hilos en Java, donde al final el lector puede disparar y manipular al menos de forma básica programas multitarea. Como pequeña introducción, podemos decir que los computadores de escritorio actuales, así como los servidores, poseen gran capacidad para la ejecución concurrente/multitarea, es decir, podemos aprovechar el procesador para ejecutar mas de una tarea al mismo tiempo e inclusive en "background", utilizando demonios.

Java, como un lenguaje de programación moderno, nos ofrece en la versión 6, un manejo muy amplio de hilos, proporcionando no solo la posibilidad de disparar tareas (hilos) o demonios, también podemos crear, bloqueos, semáforos, monitores, sincronización, etc.

Así pues, iniciamos este articulo, presentando la creación de un simple hilo:

La forma mas simple, pero no mas correcta de hacer un hilo, es simplemente extender de la clase: Thread; veamos un ejemplo:




//---------------------------------------
package cr.ticoblogger.jsanca.thread;


public class CurrentThread extends Thread {


}
//---------------------------------------


Esta es la definición básica de un hilo, este puede ser disparado de una forma muy simple de la siguiente manera:


//---------------------------------------
CurrentThread currentThread = new CurrentThread();
currentThread.start();
//---------------------------------------


Esto da como resultado, la ejecución de un hilo, aunque algo tonto, pues solo nace y muere seguidamente. Ahora bien si deseamos agregar lógica al hilo, debemos sobre escribir, el método: run, veamos:






//---------------------------------------

package cr.ticoblogger.jsanca.thread;

public class CurrentThread extends Thread {

@Override
public void run() {

System.out.println("Ejecutando un hilo nuevo");
}

public static void main(String[] args) {

CurrentThread currentThread = new CurrentThread();
currentThread.start();
}
}

//---------------------------------------





Con este simple código, ya estamos ejecutando alguna tarea en nuestro hilo. En nuestro simple caso, simplemente imprimimos un mensaje en la consola, pero también podemos ejecutar código mas complejo, como checkar una base de datos, monitorear otros hilos, abrir archivo paralelamente, etc. Una acotación muy importante, en el método run, ejecutamos nuestra lógica para el hilo, pero es con start que le indicamos al sistema operativo que dispare nuestro hilos. Esto es muy importante, pues si llamamos directamente a run, simplemente ejecutaremos la lógica, pero de forma tradicional, como si llamáramos a cualquier otra clase, es decir secuencial en lugar de paralelo. Ahora, agreguemos algo mas de código a nuestro Thread, para abordar otros métodos interesantes:




//---------------------------------------
package cr.ticoblogger.jsanca.thread;

import java.util.Date;

public class CurrentThread extends Thread {

public void hacerAlgoDormir() {

Date date = new Date();
System.out.println("Iniciando el hilo");

try {

Thread.sleep(2000, 10);
} catch (InterruptedException e) {
e.printStackTrace();
}

System.out.println("Duracion total: " + (new Date().getTime() - date.getTime())
/ 1000 + " s");
}

public static void main(String[] args) throws InterruptedException {

CurrentThread currentThread = new CurrentThread();
currentThread.start();

System.out.println("Termino el main");
}

@Override
public void run() {

this.hacerAlgoDormir();
}

}
//---------------------------------------



Analicemos este ejemplo paso a paso.

Primero declaramos nuestra clase thread, seguidamente lo disparamos como un hilo y a continuación imprimimos un mensaje, indicando que el hilo actual (Main), ha terminado.
Asi pues, este nuevo hilo disparado, inicia ejecutando run, que a su vez invoca a hacerAlgoDormir;

Primero declaramos un objeto Date, que tendrá la fecha y el instante actual e imprimimos iniciando el hilo.

Segundo, encontramos una sentencia try/catch, con la invocación al método, sleep:
El método sleep, básicamente duerme por una cantidad de tiempo determinada nuestro hilo, el tiempo es dado en milisegundo y nano segundo, en nuestro caso son 2000 milisegundos y
10 nanosegundos, o lo que es lo mismo, 2 segundo y 10 nano segundos. Como dije, esto detiene (pausa), el hilo en un intervalo determinado de tiempo y después continua su ejecución.
Por ultimo, observar que estamos capturando la excepción InterruptedException, esto se debe a que puede que nuestro hilo sera interrumpido por otro hilo o también que nuestro sistema
operativo, detenga o interrumpa nuestro hilo. Dependiendo del sistema operativo, a veces debemos detener la ejecución del hilo por un momento para dar paso a otro hilo, de lo contrario, el pipeline de hilos, nos interrumpirá, pues nos identifica con un hilo que esta consumiendo demasiados recursos, pues ello, es bueno controlar esta excepción.

En versiones anteriores, este método es accedido invocando a Thread.currentThread().sleep().

Por ultimo, se realiza un calculo de la duración del hilo, a continuación el resultado:

Termino el main
Iniciando el hilo
Duración total: 2 s


Notara que nuestro hilo main termina antes que el hilo hijo su ejecución (aunque este permanece vivo esperando que el hilo termine), pero el código es ejecutado paralelamente.

Que pasaría si tenemos 10 hilos o tareas y no queremos seguir el flujo, hasta que todos estos hilos terminen su ejecución paralela, bueno para ello podemos utilizar el método: join.

Este método, permite que el hilo padre, que dispara los hilos, detenga su ejecución, hasta que el hilo hijo termine la suya, veamos el ejemplo modificado:




//---------------------------------------
package cr.ticoblogger.jsanca.thread;

import java.util.Date;

public class CurrentThread extends Thread {

public void hacerAlgoDormir() {

Date date = new Date();
System.out.println("Iniciando el hilo");

try {

Thread.sleep(2000, 10);
} catch (InterruptedException e) {
e.printStackTrace();
}

System.out.println("Duracion total: " + (new Date().getTime() - date.getTime())
/ 1000 + " s");
}

public static void main(String[] args) throws InterruptedException {

CurrentThread currentThread = new CurrentThread();
currentThread.start();
currentThread.join();
System.out.println("Termino el main");
}

@Override
public void run() {

this.hacerAlgoDormir();
}

}

//---------------------------------------




Si vemos la salida, notaremos que la ejecución se torna algo mas secuencial, pero tome en cuenta que el hilo current thread es ejecutado en paralelo, es lo mismo que el caso anterior,
sencillamente, el hilo principal, esta esperando a que este termine para seguir ejecutandose, mediante el uso del método join.

Un ejemplo, mas complejo:

Como ejercicio final, vamos a ejecutar un ejemplo mas complejo, el siguiente código básicamente define un wrapper para un FIleWriter y un hilo que puede bajar una pagina web valiéndose
de la librería java.net.

Veamos el ejemplo y posteriormente su explicación:




//---------------------------------------
package cr.ticoblogger.jsanca.thread;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class FileResultWriter {

private FileWriter fileWriter = null;

public FileResultWriter(File file) throws IOException {

fileWriter = new FileWriter (file);
}

public void writeOut (String string) {

try {
fileWriter.write(string);
} catch (IOException e) {
e.printStackTrace();
}
}

public void close () {

try {
this.fileWriter.flush();
this.fileWriter.close();
} catch (IOException e) {
e.printStackTrace();
}

}

}
//---------------------------------------

//---------------------------------------
package cr.ticoblogger.jsanca.thread;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.Arrays;

public class RunnableThread implements Runnable {

FileResultWriter fileResultWriter = null;

public RunnableThread(String urlToDownload,
FileResultWriter fileResultWriter) {
super();
this.urlToDownload = urlToDownload;
this.fileResultWriter = fileResultWriter;
}



private String urlToDownload = null;

public void run() {

URL url = null;
URLConnection connection = null;
InputStream inputStream = null;
byte[] buffer = new byte[126];
int byteDownload = 0;
StringBuilder builder = new StringBuilder();
java.util.Date initialDate = new java.util.Date();
int bytes = 0;


try {

url = new URL(this.urlToDownload);
connection = url.openConnection();

connection.connect();
inputStream = connection.getInputStream();
while ((bytes = inputStream.read(buffer)) > 0) {

byteDownload += bytes;
builder.append(new String(buffer));
Arrays.fill(buffer, (byte) 0);
}

} catch (MalformedURLException e) {

e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {

if (null != inputStream) {

this.fileResultWriter
.writeOut("\n"
+ "--------------------------------------------------------------"
+ "\n");
this.fileResultWriter.writeOut(Thread.currentThread().getName()
+ "\n");
this.fileResultWriter.writeOut(url + " = " + "\n");
this.fileResultWriter.writeOut(builder + "\n");
System.out.println("Termino: " + this.urlToDownload);
System.out.println("Bytes download: " + (byteDownload)
+ " bytes");
System.out.println("En: "
+ (new java.util.Date().getTime() - initialDate
.getTime()) / 1000 + " s");

try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

} // run.

public static void main(String[] args) throws InterruptedException,
IOException {

Thread thread = new Thread(new Runnable() {

public void run() {

System.out.println("Ejecutando un hilo dummy para indicar que el sistema inicia");
}

});

thread.start();

FileResultWriter fileResultWriter = new FileResultWriter(new File(
"./result.txt"));

Thread[] threads = new Thread[] {
new Thread(new RunnableThread("http://www.google.com",
fileResultWriter), "google"),
new Thread(new RunnableThread("http://www.google.com",
fileResultWriter), "google"),

new Thread(new RunnableThread(
"file:/Users/jonathansanchez/test.txt",
fileResultWriter), "test"),
new Thread(new RunnableThread("http://www.yahoo.com",
fileResultWriter), "yahoo"),
new Thread(new RunnableThread("http://www.hotmail.com",
fileResultWriter), "hotmail"),
new Thread(new RunnableThread("http://www.crjug.com",
fileResultWriter), "crjug"),
new Thread(new RunnableThread("http://jsanca.ticoblogger.com",
fileResultWriter), "google"),
new Thread(new RunnableThread("http://www.javahispano.org",
fileResultWriter), "javahispano"), };

for (Thread thread2 : threads) {

thread2.start();
}

System.out.println("bajando los urls");
for (Thread thread3 : threads) {

thread3.join();
}

fileResultWriter.close();
System.out.println("Todo termino.......");
}
}

//---------------------------------------





Como se indico anteriormente, la primera clase es un simple wrapper de un FileWriter, no lo abordaremos aquí.

Ahora vemos la clase: RunnableThread

Lo primero que debe notar, es que esta clase no extiende de Thread, si no que en su lugar, implementa Runnable; este enfoque en mi humilde criterio es el mas correcto, por
varios motivos, el primero de ellos, es que, al ser Java un lenguaje en el cual no existe la herencia multiple, heredar directamente de Thread limita nuestro diseño, el segundo problema
es que puede que la cohesión de la clase no sea la mejor, pues puede que un DAO por ejemplo, sea un Thread, lo cual puede que a nivel lógico no tenga mucho sentido, pero si a nivel técnico, en contraste, si extendemos de Runnable, ya no somos una clase thread, pero mediante la programación por contrato, simplemente manejamos la ejecución paralela mediante un aspecto mas de la clase. Así pues, implementamos el método run, para correr nuestro código concurrent; al final el hilo se reduce a pasar el objeto Runnable como constructor al Thread, lo que se le llama un target thread.

Dijo esto analicemos brevemente el ejemplo:
Lo primero que vemos, es un simple hilo anónimo, que indica que vamos a iniciar la ejecución del sistema, lo iniciamos y proseguimos.

Después, declaramos un objeto que nos permitirá almacenar los resultados y le pasamos un nombre de archivo.

Después declaramos un vector de hilos (una variante seria declarar un ThreadGroup, se los dejo de tarea :)

Como vemos a nuestros hilos, les podemos pasar el objeto runnable, al que se le pasa vía constructor el link que deseamos bajar, la clase para escribir y un nombre para el hilo.
Seguidamente, implementamos un foreach, y lanzamos uno a uno los hilos, los cuales inician su ejecución paralelamente.

Hacemos el mismo foreach, pero esperando que uno a uno de los hilos, terminen la ejecución.
Cerramos el archivo y imprimimos que termino la ejecución del sistema.

Vamos al hilo;

Inicialmente declaramos e inicializamos todas las variables que vamos a utilizar para bajar la pagina.

Seguidamente creamos un objeto URL y abrimos la conexion al server, nos conectamos y obtenemos el flujo de entrada (input).

Por ultimo, vamos leyendo mediante la técnica de bufereado el contenido de la pagina, en segmentos de 126 bytes.

Nótese, el uso de esta linea:

Arrays.fill(buffer, (byte) 0);

Esta, se utiliza para limpiar el buffer, pues puede que en la ultima leída, nos consuma todo el buffer y quede basura, otra técnica es tomar la cantidad de bytes
copiados e indicarle al StringBuilder que solo tome cierta cantidad de bytes del vector.

Por ultimo, se imprimen algunas métricas de la ejecución del hilo, si ejecutas este programas debes, crear un archivo llamado:

file:/Users/jonathansanchez/test.txt

O bien cambiar esa linea para leer un archivo de forma local, en tu computadora.

Por ultimo el resultado quedara en la carpeta raíz del programa, llamado result.txt

Un saludo,
J

miércoles, marzo 17, 2010

El futuro de los productos de Apple (Humor)

Hola,

Un poco de humor geek, para esta maNana:


El futuro de los productos de MAC,

Un saludo,

lunes, marzo 15, 2010

Articulo acerca Yahoo event

Articulo en ingles, acerca del uso del YAHOO.util.Event.

http://www.dustindiaz.com/yahoo-event-utility/

Un saludo,
J

jueves, marzo 11, 2010

Diferencia entre location.href y location.reload()

Hace poco tuve un problema relacionado con los reflesh, entonces quiero dejar lo aprendido en un post.

Cuando usted utiliza en JavaScript,

location.href = location.href

Es como si colocaras la direccion directamente en el browser (no actualizar) es decir, haces un GET REQUEST METHOD

Si invocas a

location.refresh()

Es como si utilizaras el boton actualizar, lo que permite que se vuelva a enviar el body de un formulario, es decir, hacemos un POST.

Un saludo,
J

martes, febrero 23, 2010

Por decir lo que pienso

Foto sabina sentado

Por decir lo que pienso, sin pensar lo que digo, mas de un beso me dieron y mas de un bofeton...

lunes, febrero 08, 2010

Yo tenia una patria

Yo tenía una Patria, la tenía
y esa Patria fue, ya no la tengo.
Era una patria pura, de abolengo,

semilla de un ayer que sostenía.

En el paisaje limpia se mezcla
al claror de su cielo. Aún retengo
el murmullo, del viento, el paso luengo
del labriego sencillo. Pero un día

me cambiaron la Patria: la inmolaron;
le pusieron progreso donde no era:
trazos de cicatriz de vena abierta.

Pero apesar de todo le dejaron
tradiciones de luz en su bandera
y un mañana
esperándola en la puerta.


--
Francisco Zuñiga

viernes, febrero 05, 2010

Fix problema de seguridad en FF MAC OS

Hola,

Ya hace algun tiempo, Firefox en MAC me mostraba un problema al arrancar, se caia cuando entraba a una pagina https o cuando busca algo en la pagina (command + F)

Con este link, solucione mi problema:

http://support.mozilla.com/en-US/kb/Could+not+initialize+the+browser+security+component

Básicamente, existe un archivo en el profile de FireFox que tiene que estar de lectura y escritura, llamado cert8.db. Si ya esta de escritura y el FF sigue dando problemas, entonces borralo y reinicia FF, al menos a mi me funko bien.

Un saludo,
J

Santo Fraude

Hola gente,

Para los que aun no han escuchado del documental: http://santofraude.blogspot.com/, les recomiendo lo vean.

El mismo expone el fraude electoral, que se enfoca no en un fraude de cuenta de votos, si no un fraude técnico guiado por campanas de miedo y manipulación, en prometiendo, chantajeando y amenazando a mucho obreros.

Se pone en claro, las contradicciones del gobierno y también, la violación de las leyes por parte del gobierno, al no respetar la neutralidad en las decisiones de la gente.

También se pone en evidencia, la posición que tomo la iglesia.

Un saludo,
J

jueves, enero 14, 2010

Haiti, como ayudar eficazmente a nuestros hermanos

Hola, 

quiero comentarle acerca del sitio:http://doctorswithoutborders.org/

Este sitio se trata de un voluntariado de doctores y enfermeras, que se encuentran recaudando dinero para Haiti, entre otras causas. Si desean hacer una donación, por favor utilicen este medio, pues ellos garantizan que un 85% del dinero que envías ira a las persona, instituciones como la benemérita cruz roja, desafortunadamente gasta hasta un 80% en labores administrativas, según fuentes extra oficiales, pues tienen que pagar salarios y demás. 

Así que si desean ayudar utilicen este medio para hacerlo eficazmente y no tienen ni que salir de la casa.

Un saludo,
J

martes, enero 05, 2010

Tributo a Sandro



Me uno al tributo a Sandro, que promulga el blog hermano argentino, los inconseguibles del rock.

Ahí pueden encontrar, el link del tributo rockero, al gran Gitano Argentino, Sandro.

Este disco, es especialmente bueno, junto con el tributo al príncipe de la canción; Jose jose y al único rey de la canción ranchera; Jose Alfredo, es uno de mis tributos chineados; con solo el arranque de la dura banda Divididos, cantando "tengo" con tal fuerza, es un despliegue de poder esa canción, después viene "yo te amo" un clásico de todo los tiempos, en la voz de Vicentico,  le acompaña una tonada de corte mas melancólico y oscuro! (ventoso diría yo).

Rosa, rosa y los caballeros de la quema, es una de las canciones que mas se apega al formato original :)

Seguido viene una de mis preferidas, una skasito que tira a candombe; una muchacha y una guitarra, para poder cantar nos sonata,  Bersuit (una de mis preferidas del disco, ademas tiene un sabor riquísimo a milonga).

A77aque se amarra los pantalones con su ya clásico, Dame fuego.

Después viene el canto, de un grande para otro grande, el Leon, pero de casta Gieco interpreta; Si yo fuera Carpintero, una hermosa canción que expresa todo el cariño!

Aunque no tengo el placer de haber escuchado demasiado a Erica Garcia, su versión de Quiero llenarme de ti, bastante estridente, pero con un claro matiz a Sandro, resulta una flor en el hojal!!!

Trigaaaaaalllllll!!!!!
Así es el grito viseral de los Visitantes! en esta buenisima adaptación rock!
Los metales, le ponen un matiz excelente, al igual que lo hizo con Attaque 77.

Los aterciopeludos se mandan sabroso, a sufrir sus "penas", la introducción con órgano y todo, da paso a su melodía psicodélica que les ha caracterizado en los últimos ano. Haciendo una nota, al pie; que pena y que pena, que dejaran la senda punk, ska desde la pipa de la paz :(

Atmósfera pesada, se abre paso; la primera vez que escuche esta canción, mi mente trajo a primera plana las melodías de los grandiosos 3 de chiles; muy buena interpretación, me encanta!

A ver, analicemos los tributos de Molotov; 

Tributo a los tigres del norte: Malo
Tributo a Jose y Jose, se pasaron de Payasos.
y este otro tributo no se escapa, la verdad, o quieren sonar muy soft o muy funk o muy mal! logrando casi siempre una interpretación, que a nivel personal no me gusta, mejor chinguen a su madre! es una pena, sin duda podrían hacer algo mucho mejor los aztecas! Mala nota para "Mi amigo el puma"

Así, con Javier y los imposibles; pues no es mala, pero no me gusta demasiado!

Y haciendo honor, al titulo.: Bel Mondo termina con una penumbra de adaptación, muy electrodark, me gusta maso.

A no ser por las 3 ultimas canciones, seria un super hiper buen disco! 

Un saludo,
J


Una muchacha y una guitarra!

Metas del blog para este 2010

Me parece un buen ejercicio, plantearse unas metas para el 2010. Así que aquí van:

Terminar el curso de Java Básico.
Terminar el curso de Groovy (este le falta poco, la verdad).
Hacer mas post, con la banda sonora de mi vida.
Volver a postear semanalmente la frase celebre.
Postear al menos una vez por semana, fuera de la frase celebre :)

Con mas de un ano a cuestas, uno se da por enterado que tener un blog, es fantástico pero también requiere una inversión de tiempo considerable y demanda la mejora en varias habilidades, como investigación, documentación, redacción, etc.

En fin, les deseo un feliz y prospero ano y no dejen de visitar el blog, pues venimos con fuerzas renovadas y muchas ganas.

Comentarios solo para usuarios registrados

A raíz de los últimos ataques de spam, que ha sufrido el sitio, he decidido colocar como medida; que solo usuarios registrados puedan hacer comentarios, los mismos aun continúan sin ser moderados y el contenido de todo el blog sigue siendo publico.

Para hacer un comentario, basta con ser usuario de Google o tener un OpenId

Gracias,
J

lunes, enero 04, 2010

Interesantes escenas de cine

La siguiente escena, es catalogada como la lucha mas larga, que se haya filmado:



Esta otra tiene mención especial, pues es quizás la mejor escena de efectos especiales, sin tener un solo computador de por medio: