Geek & Roll » Cesar

Instalar WUSB54GC en Ubuntu Lucid 10.04

El WUSB54GC de Linksys es un dongle WiFi USB. Lo compré pensando en que lo podría usar en Ubuntu sin mayor complicación, pero no fue así. El driver necesario se incluye así que no hay necesidad de descargar nada, sin embargo se necesita configuración adicional.

Lo primero es asegurarnos que el hotspot al que nos queremos conectar usa WEP o WPA. Al inicio intenté conectarme a un hotspot con WPA2 y nunca logré conectarme. Cambiar la configuración a WPA arregló el problema.

Lo siguiente es editar el archivo blacklist.conf

sudo gedit /etc/modprobe.d/blacklist.conf

Agregar la siguiente línea al final:

blacklist rt2800usb

Y listo, al conectar el dongle el sistema debe reconocer las redes inalámbricas disponibles y conectarse sin problemas.

El CPU del Nintendo Entertainment System

Soy un geek de la emulación desde que supe se podía emular el SNES en mi modesta Pentium 2. Desde entonces he utilizado varios emuladores y hasta programado un simulador por mi cuenta (para el microcontrolador 68HC11 de Motorola).

Lo que me lleva a este post: el NES. El NES es interesante ya que es el sistema más emulado que hay, aún así crear un emulador del NES no es tarea fácil. Además las computadoras (y otros gadgets) de hoy tienen lo suficiente para emularlo sin penalización en la velocidad. También, su CPU (MOS 6502 ligeramente modificado) de 8 bits fue el CPU elegido para la mítica Commodore 64, el Atari 2600, Terminator y Bender. Leer el resto de este post.

Sony no quiere tu dinero

Cesar May 29th, 2010 Uncategorized 6 comentarios

Indiscutiblemente, parte importante del atractivo de la actual generación de consolas de videojuegos es el elemento online. No solo el multijugador online, pero también el contenido descargable y las “micro” transacciones para contenido extra, videos, renta de películas, o la compra de juegos clásicos. Nintendo tiene su canal Shop, Microsoft tiene su Marketplace y Sony la PlayStation Network.

Para mi, que rara vez juego multiplayer online, el valor está en poder comprar juegos clásicos, y la ocasional expansión. En el caso de Nintendo no podría ser más sencillo: aceptan tarjetas de crédito de todo el mundo. Es cuestión de meter los datos de tu tarjeta (si eres primerizo) y listo, a comprar Wii points.

En la PSN es una verdadera molestia. La PSN está seccionada en regiones, y la región Japonesa por ejemplo, puede tener distinto contenido que la Estadounidense, o la Europea. Supongo que es el mismo caso para las tiendas competidoras. Sin embargo en la PSN no aceptan tarjetas de crédito de México (y muchas otras partes del mundo).

Anteriormente la solución era:

  1. Sacar una cuenta en entropay.com
  2. Crear una tarjeta virtual
  3. Transferirle fondos a tu tarjeta virtual, desde tu tarjeta de crédito real (con una cuota)
  4. Asociar tu nueva tarjeta virtual a tu cuenta de PSN
  5. Agregarle fondos a tu wallet desde tu tarjeta virtual
  6. Comprar

Que ya era algo engorrosa, pero te acostumbras. Dejando por un lado el hecho de que cualquier cosa comprada en la PSN te sale más cara debido al cobro de entropay. Pero cual fuera mi sorpresa cuando me doy cuenta que de un tiempo para acá, Sony decidió que entropay no era válido para hacer transacciones en la PSN.

Sin la opción de entropay, la única solución es usar tarjetas prepagadas. Sony las vende desde su sitio www.sonystyle.com.mx. Las tarjetas prepagadas también se rigen por la región, por lo tanto si tu cuenta está registrada en México, solo puedes usar tarjetas para la región Mexicana. No solo eso, sino que no he visto una sola tienda se distribuyan dichas tarjetas aquí en Hermosillo, Sonora.

Tratando de hacer lo correcto, entré al sitio de Sony a querer comprar una tarjeta prepagada. La experiencia fue algo como lo siguiente:

  1. Entré al sitio SonyStyle.com.mx, el cual es increíblemente lento
  2. Después de varios intentos, por fin llegué a la parte donde ofrecen las tarjetas prepagadas de $50 ($717.18 pesos) y $20 dlls ($286.47 pesos).
  3. Para comprar algo necesitas registrarte (obvio). Intenté con mi actual cuenta de PSN, pero no funcionó.
  4. Al querer sacar una cuenta nueva, no me lo permite porque mi correo ya está en uso en algún otro sitio de Sony, pero no me dice cual.
  5. Seleccioné la opción de recuperar mi contraseña porque mi correo ya está en uso. Aún no me llega ese correo.

En este momento me rendí. Por suerte, mi cuenta está registrada con una dirección en USA (aunque es fácil sacar otra cuenta para la región que gustes) así que decidí probar suerte en eBay. No solo el sitio es mucho más rápido y amigable de usar, sino que también:

  • Acepta otros métodos de pago, como PayPal.
  • Hay tarjetas de múltiples regiones, de todas las denominaciones existentes.
  • Ten envían el código de la tarjeta en minutos. En el sitio de SonyStyle te dicen que se puede tardar hasta 48 horas.
  • Tienen protección para el comprador, por si algo sale mal.

Eso si, el costo generalmente es un poco más alto en eBay, pero por un margen muy pequeño. Ya convertido en moneda nacional, la diferencia era de $20 pesos. Además el “servicio al cliente” fue excelente, aunque claro depende del vendedor. En mi caso se la compre a talentlight, altamente recomendado. A solo minutos de la compra, ya tenía en mi correo el código. Llegué a mi casa y lo activé sin contratiempos.

Seguramente hay una razón para que Sony no acepte tarjetas de crédito Mexicanas, pero la combinación de factores:

  • Sony no acepta tarjetas de crédito Mexicanas
  • El sitio oficial para comprar las tarjetas de prepago es inutil
  • Las tarjetas no se consiguen fácilmente en tiendas

hace parecer como si a Sony no le interesara tu dinero.

¿Alguien con experiencias similares en la PSN?

Lloren niños lloren: se venden mas Androids que iPhones

Los fanboys de Apple (mactards como les llama el Sr. Boynacoras) son una raza extraña. Cuando las macs eran PPC, los procesadores x86 eran lentos y para naquitos, después las macs se pasaron a intel y ahora son la 8va maravilla. Cuando las macs se vendían poco es porque eran para la élite, y ahora que cualquier hijo de vecino tiene una mac, iPhone, iPod o iPad se enorgullecen del éxito en ventas.

Y ahora que se venden más androids que iPhones… ¡¡¡lloren niños lloren!!!

  1. Excusa mactard #1: Esa comparación no vale porque solo hay un iPhone y hay muchos dispositivos android. Eso no tiene nada que ver, el artículo específicamente habla sobre mayor venta de smartphones android contra smartphones iPhone. El hecho de que existan varios modelos distintos de smartphones que pueden ejecutar android no tiene nada que ver. Una comparación injusta sería comparar la venta de cualquier dispositivo que corre android vs solamente el iPhone, pero no es el caso. Además, en el pasado se han comparado las ventas de iPhone vs dispositivos BlackBerry y ahí nadie se quejó de la existencia de muchos modelos de BlackBerry.
  2. Excusa mactard #2: Es que el iPhone no se vende porque se están esperando al modelo nuevo. La realidad es que, en android, salen modelos nuevos más seguido y esa misma razón ha sido señalada como una debilidad en la comunidad android. ¿Ahora resulta que es una debilidad en el mundo iPhone también?
  3. Excusa mactard #3: Pero el iPhone es más bonito. Hmmm… si.

El hecho es que, en este momento se están vendiendo más smartphones androids que iPhones, y eso es muy bueno para el consumidor. Eso fomenta la competencia y el avance de esas dos plataformas, además de sus competidores como BlackBerry e inclusive WebOS que se rumora verá la luz controlando una tablet.

Arreglar el parpadeo de la pantalla en Ubuntu 10.04 Lucid Lynx

Ahora que Ubuntu 10.04 LTS ha salido para su consumo masivo, no tardan en aparecer los posts tipo Las 10 cosas que debes hacer después de instalar Ubuntu Lucid Lynx.

Para mi, lo primero no fue instalar Gnome-Do, o los codecs propietarios. Lo primero fue arreglar el flickering de la pantalla, un molesto bug en el que la pantalla parece saltar de un lado a otro. Es difícil describirlo con palabras así que aquí tienen un video.

Aparentemente, el bug tiene que ver con el ancho de banda del CPU y la memoria. El problema es con tarjetas ATI móviles, las cuales comparten el RAM con la computadora. Aún más crítico es que con la salida de fglrx para tarjetas antiguas, todos los usuarios de ATI que se ven forzados a usar drivers radeon o radeonhd experimentarán el mismo problema.

La solución (al menos en mi caso) fue añadir un comando al kernel:

radeon.new_pll=0

Para añadir dicho comando, editamos el archivo /etc/default/grub

sudo gedit /etc/default/grub

Y en la siguiente línea:

GRUB_CMDLINE_LINUX=”"

Ponemos el comando:

GRUB_CMDLINE_LINUX=”radeon.new_pll=0″

Y finalmente ejecutamos el comando para que grub2 tome los cambios (gracias Infragilis!):

sudo update-grub2

Reiniciamos y listo, no mas flicker. Ahora sí, vayan a instalar los codecs y Gnome-Do.

Megared tarda mucho en entrar a una página

Cesar April 22nd, 2010 internet, tips 6 comentarios

De antemano una disculpa por el título, mis SEO-Skills no son muy buenos.

Si tienes el servicio de Internet que proporciona Megared (Megacable), y tu conexión tarda entre 5 y 10 segundos en “entrar” a una página, continúa leyendo. Yo como tú, tenía el mismo problema. Todo comenzó con mi esposa quejándose de que la granjita era más rápida con cualquier conexión WiFi que con la conexión cableada de nuestra casa. Mi lógica me decía que no era posible, pero después de navegar un poco con la conexión cableada de Megared confirmó las quejas de mi esposa.

El problema es que los servidores DNS de Megared son demasiado lentos, y a veces ni siquiera funcionan. Por suerte tenemos OpenDNS, que es una empresa a la que se le ocurrió la excelente idea de proporcionar un servicio tan básico para el buen funcionamiento de Internet como lo es DNS, y mejorarlo. Además proporcionan una versión gratuita.

OpenDNS is the world’s leading provider of Internet navigation and security. Make your network safer, faster, smarter and more reliable without the cost and complexity of traditional security services.

Si el marketing speak ya te convenció, hay que usarlo entonces. Configurarlo en Ubuntu es sencillo, pueden ir al sitio de OpenDNS para ver cómo se hace desde la interfaz gráfica. La configuración para otros sistemas operativos, ruteadores o inclusive consolas de videojuegos, pueden ir directamente al sitio de OpenDNS.

Sin embargo, si te gusta el terminal-fu, aquí está cómo hacerlo:

sudo cp /etc/resolv.conf /etc/resolv.conf.auto
sudo gedit /etc/dhcp3/dhclient.conf

Búsquen la línea que dice prepend domain-name-servers (estará comentada, o sea con # al inicio) y sustitúyanlo por:

prepend domain-name-servers 208.67.222.222,208.67.220.220;

Después pueden reiniciar la conexión (si es eth0):

sudo ifdown eth0 && sudo ifup eth0

O si quieren estar seguritos seguritos, reinicien. Y ya con eso, van a www.opendns.com/welcome/ y les debe dar la bienvenida.

Ahora si, a disfrutar de la velocidad de su conexión. Las páginas cargan mucho más rápido gracias a que el DNS resuelve más rápido. Lo mismo para las descargas.

Hi-Def Blues

En días pasados me sucedió el equivalente de una tragedia griega para geeks: al encender mi HDTV, esta desplegaba una línea vertical de pixeles fijos en un color rojo brillante. Si hay algo que mis días de usuario Windows me enseñaron es que una reiniciada puede arreglar muchas cosas, así que lo intenté y la línea ahí seguía. En todos los canales, y todas las entradas de video.

Por fortuna se encontraba dentro de garantía. El primer paso fue visitar el sitio de aquos.com.mx (mi HDTV es una Sharp Aquos 52E77U), en donde te tienes que registrar con todos los datos de tu producto. Una vez registrado te dicen toda clase de cosas bonitas por ser cliente Aquos, que eres preferente, que estas bien guapo y fuerte y con mucha personalidad.

Pero todo termina ahí. La forma de contacto en el apartado de soporte no sirve. Terminas de describir tu problema con lujo de detalles, y cuando das click en “Enviar”, te redirige a un sitio en blanco, y es imposible saber si tu mensaje fue enviado o no. Después hablé al 01-800 que viene en el sitio, en donde me pidieron que describiera mi problema y que en máximo 48 horas se pondrían en contacto conmigo para concretar una cita para que una persona de soporte viniera a mi domicilio a revisar el problema. Sigo esperando.

El servicio a clientes de Sharp es deficiente. Tengan en cuenta eso al comprar su próxima TV. El producto en sí tiene muy buenas características a un precio competitivo, sin embargo mi experiencia con la calidad del mismo ha sido malo. Esta es la segunda vez que me sucede lo mismo; una Sharp Aquos se le descompone la imagen al poco tiempo de comprarla. La primera vez fue cambio físico con la tienda. La segunda fue la que describo en este post, y cabe mencionar que soy extremadamente cuidadoso con todos los aparatos que tengo.

Sin embargo, una de las razones por las que decidí escribir este post fue para recomendar el servicio que provee Wong’s Electronics del Noroeste en Hermosillo, que es un establecimiento autorizado para la reparación de equipo de diferentes marcas, entre ellas Sharp. Encontré la referencia a Wong’s Electronics en el sitio de aquos, y al llamarlos cumplieron con todo lo prometido. Inclusive llamaron para aclararme que llegarían un poco tarde a mi domicilio, para llevarse la TV. Si alguna vez necesitaste de servicio técnico a tu domicilio, me darás la razón cuando digo que es sorprendente que no solo cumplan con la fecha y hora, sino que te llamen para avisarte que llegarán un poco tarde.

El servicio que he obtenido de Wong’s Electronics ha sido excelente, y los recomiendo ampliamente. Puedes encontrarlos en:

Calle 12 de Octubre No. 116 Esq. Quintana Roo, Colonia San Benito, Hermosillo, Sonora. C.P. 83100

Como conectarse a la PSN sin el firmware 3.21

Cesar April 5th, 2010 hacks, internet, tips 7 comentarios

PS3

UPDATE: Geohot ha liberado un video en donde se muestra su custom firmware que permite actualizar a 3.21 manteniendo OtherOS. El firmware se instala como cualquier otro, es un archivo PUP modificado y no hay que abrir el PS3 ni nada por el estilo para instalarlo.

El firmware 3.21 para el PS3 vino, y nos quitó la opción de OtherOS. Claro, podemos elegir no instalarlo con el ligero efecto secundario de no podernos conectar a la PSN, ni bajar demos, o jugar en linea, ni descargar The Tester. Those bastards…

¿Que hacemos?

Podemos configurar un proxy, de tal manera que el PS3 se conecte a nuestra PC, y sea nuestra PC la que haga de PSN y así poder descargar contenido. Pero hay una manera mucho más sencilla.

Ve a las opciones de conexión de tu PS3, y configura tu conexión para una IP fija. En DNS pon lo siguiente:

67.202.81.137

Esa es la mágia. Prueba tu conexión y verás que se conecta a la PSN, puedes jugar, descargar, todo. Analizando la IP mágica, tiene un Web Server habilitado que dice de manera muy elocuente:

NOW DANCE FUCKER DANCE, MAN HE NEVER HAD A CHANCE

Srsly, gtfo.

Un momento… ¿Es seguro?

Esa IP es un DNS resolver, que redirecciona cualquier petición hecha a *.ps3.update.playstation.net a un web server local, que a su vez te envía un archivo updatelist.txt modificado que le dice a tu PS3 que está actualizado, no es necesario un upgrade, y por lo tanto se conecta a la PSN.

Sinceramente no se si es posible interceptar las credenciales enviadas, si es que se envían en texto plano, y por lo tanto comprometer la seguridad de tu cuenta de PSN.

Si la IP se muere, posteo el método del proxy.

Fuente: http://www.ps3-hacks.com/tag/ps3-proxy/

Cuando Hibernate cascade te juega bromas

Cesar March 23rd, 2010 programacion 4 comentarios

Ah, Hibernate. ¿Que podemos decir? Te atrae con promesas de cerrar la brecha entre lo relacional y el mundo de los objetos, pero luego te deja a que trates de entender por qué demonios no funciona como tu lo esperas. En cierto modo es como C++ que evita que te dispares en el pie, pero cuando lo haces te vuelas la pierna completa.

De lo que quiero hablar en este post es de las operaciones en cascada. Hibernate te permite configurar operaciones en cascada, de tal manera que si así tu lo deseas, cuando creas un objeto que a su vez tiene relación con otro objeto, ambos pueden ser guardados con una sola operación. Por ejemplo:

public class Member(){
    private ExpertiseArea expertiseArea;
}

En este caso, Member tiene una relación uno a uno con ExpertiseArea, y sería deseable que al guardar Member también se guardara ExpertiseArea. Para lograrlo, le decimos a Hibernate cuando debe realizar las operaciones en cascada:

<one-to-one name="expertiseArea"
    class="ExpertiseArea"
    cascade="persist,save-update" />

Con lo anterior le decimos a Hibernate “Cuando ejecutes las operaciones de crear (persist) y de actualizar (save-update) en Member, también hazlo para ExpertiseArea”.

Creamos una prueba para verificar que lo anterior funciona como debería:

	@Test
	public void testMemberRetrieval(){
		Member m = buildMember();
		md.makePersistent(m);
		md.flush();

		Member retrievedMember = md.findById(m.getId(), false);
		assertNotNull("Entity should not be null",retrievedMember);
		Member retrievedMember = md.findById(m.getId(), true);
		assertNotNull("Entity should not be null",retrievedMember);
		assertNotNull("ExpertiseArea should be persistent",
                    retrievedMember.getExpertiseArea());
	}

	private Member buildMember(){
		ExpertiseArea ea = new ExpertiseArea("Singer");
		Member m = new Member("Britney Spears", ea, "Queen of Pop");
		return m;
	}

¿Qué estamos haciendo aquí? Creamos un nuevo Member, le asignamos un ExpertiseArea, y lo guardamos todo en una sola instrucción makePersistent. Como tenemos configuradas las operaciones en cascada, esperamos que se guarden en la base de datos tanto la instancia de Member, como la de ExpertiseArea. Efectivamente, la prueba pasa y podemos revisar en los logs lo que Hibernate hace tras bambalinas:

Hibernate: insert into Member (VERSION, name, tagLine, id) values (?, ?, ?, ?)
Hibernate: insert into ExpertiseArea (VERSION, name, id) values (?, ?, ?)

Pass

No esperaba menos. Leer el resto de este post.

Formas dinámicas con GWT

Cesar March 8th, 2010 javascript, programacion Haz un comentario

Mi relación con GWT es una de amor – odio. Por un lado, tenemos a un toolkit que me permite utilizar mis conocimientos de Java para crear aplicaciones Web dinámicas, aplicando mejores prácticas en la arquitectura del código del cliente, mejorando el tiempo de respuesta gracias al uso de técnicas como agrupar imágenes para usarlas en el cliente con una sola descarga y código segmentado.

Por el otro lado, algunas tareas se vuelven más complicadas. Estoy convencido que las herramientas como GWT son el futuro, más no me queda claro si la actual implementación sea adecuada para toda la programación del lado del cliente. Además la curva de aprendizaje es más inclinada de lo que debería de ser; existen muchos gotchas todavía que hacen que el programador tenga que estar consciente de que esto es Web y no una aplicación regular.

En esta ocasión el requerimiento era el siguiente: tengo una aplicación que hace uso extensivo de formas para captura de datos. Necesito una manera de declarar dichas formas y que la aplicación automáticamente las ordene en diferentes tabs cuando estas crezcan demasiado. Las formas generadas deben poder ser insertadas en cualquier sitio, además de poder aplicarles estilos con CSS.

Como dije anteriormente, lo que me gusta de GWT es que puedo generar la solución a mis requerimientos de la misma manera en la que estoy acostumbrado a hacerlo. En este caso, creo una clase DynaForm que representa mi forma dinámica:

/*Represents the client side DynaForm*/
public class DynaForm {
	private String formSource;
	private ArrayList<String> panelTitles;
	private ArrayList<HTML> panels;
	private Node root;

	public DynaForm(String formSource){
		setFormSource(formSource);
	}

Ahora viene algo interesante. El método setFormSource(). Es aquí donde vamos a parsear el código de la forma para extraer los valores que nos interesan, y descomponerla en sus partes para después volverla a construir pero con las propiedades que nos interesan, en este caso los tabs.

public void setFormSource(String formSource){
	try{
		Document d = XMLParser.parse(formSource);
		root = d.getFirstChild();
		XMLParser.removeWhitespace(root);
		setPanels(root, formSource);
	}catch(Exception e){
		System.out.println(e.getMessage());
		e.printStackTrace();
	}

	this.formSource = formSource;
}

Como vemos, parseamos la fuente y de esa manera nos aseguramos que es código válido. Aquí podríamos aplicar otras reglas, como por ejemplo eliminar cualquier tag o propiedad maliciosa como una llamada a JavaScript. El método setPanels() es el que se encarga de construir los páneles necesarios.

/*
 * This method creates an array of HTML panels. Both panels and panelTitles must
 * contain the same number of elements. In case a <span> element doesn't provide
 * a 'name' attribute, it is replaced by an empty string.
 *
 * The number of HTML panels created is = # of <span> elements. All elements inside <form>
 * without a <span> are ignored.
 * */
private void setPanels(Node root, String formSource){
	panelTitles = new ArrayList<String>();
	panels = new ArrayList<HTML>();
	NamedNodeMap attribs;

	NodeList allElements = root.getChildNodes();

	/*
	 * Start looping all elements, and create new HTML panels as needed
	 * */
	for(int i=0; i<allElements.getLength(); i++){
		Node n = allElements.item(i);
		//if it's a span, create a new empty HTML panel and set its name.
		if(n.getNodeName().equals("span")){
			//Set the panel title entry
			attribs = n.getAttributes();
			panelTitles.add(getAttribValue(attribs, "name"));
			panels.add(new HTML());
		}else{
			try{
				//get the last panel
				HTML panel = panels.get(panels.size()-1);
				//add the node source to the panel HTML
				panel.setHTML(panel.getHTML() + n.toString());
			}catch(Exception e){
				System.out.println(e.getMessage());
			}
		}
	}
}

El método setPanels() toma todos los elementos de la forma y los analiza de la siguiente manera: Si es un elemento span, quiere decir que es el inicio de un nuevo tab. Toma la propiedad name del span y lo convierte en el título de la nueva tab. Si el elemento no es un span, entonces lo agrega a la lista de elementos que forman el tab actual.

Después, en el punto de entrada de la aplicación:

TabPanel tabPanel = new TabPanel();
dynaForm = new DynaForm(formSource);

//All each HTML panel to the tabPanel
for(int i=0; i<dynaForm.getPanels().size(); i++){
	quirksTabPanel.add(dynaForm.getPanels().get(i), dynaForm.getPanelTitles().get(i));
}

RootPanel.get("dynaForm").add(tabPanel);

Utilizando el siguiente código HTML como fuente de la forma:

<form method='POST' action='contactengine.php' name='contact'>
	<span name='Datos' />
	<label for='Nombre'>Nombre:</label>
    	<input type='text' name='Nombre' id='Nombre' />"

    	<label for='Correo'>Correo:</label>
    	<input type='text' name='Correo' id='Correo' />

	<label for='Mensaje'>Mensaje:</label>
	<textarea name='Mensaje' rows='20' cols='20' id='Mensaje'></textarea>

	<span name='Enviar' />
	<input type='submit' name='submit' value='Enviar' class='submit-button' />
</form>

El resultado es:
DynaForm

Claro que se deben usar estilos para hacer que la forma se vea más presentable. También creo que se puede lograr exactamente el mismo resultado utilizando una combinación de jQuery, selectores CSS y jQuery UI.

Posts anteriores Posts recientes