Geek & Roll » Cesar

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.

Everlasting Flame y Bold 2 (OS 5)

Cesar February 26th, 2010 aplicaciones, tips, utilidades Haz un comentario

Everlasting Flame icon

Muchos usuarios han reportado problemas al utilizar Everlasting Flame con la BlackBerry Bold 2. Más particularmente, con el OS 5. Dicho problema no se presentaba en versiones anteriores a la 1.3.

El problema ha sido resuelto en la siguiente versión (2.0) sin embargo no se encuentra lista para consumo masivo. Por lo mismo, he subido de nuevo la versión 1.2 ligeramente modificada. Esta versión ha sido probada en la Bold 2, pero debería funcionar en cualquier dispositivo con OS 5.

Pueden descargar la versión 1.2 en el sitio oficial de Everlasting Flame. En la sección de descarga se encuentra la versión 1.2 para dispositivos anteriores.

Sus comentarios son bienvenidos.

Sonora al Software Libre y la desinformación

Cesar February 21st, 2010 FLOSS, blogs, linux, opinion, windows 10 comentarios

Por medio de Google Buzz me enteré de una noticia que me sorprendió de manera muy positiva: Sonora se pasa al Software Libre para sus sistemas de información. El Buzz en cuestión es de mi amigo y colega Roberto Ramirez, y linkea a un blog de Martin Llamas.

Cuando leí el post por primera vez, pensé que era una broma. Al leerlo por segunda ocasión y checar otros posts del mismo blog, me di cuenta de que no, no era una broma. Este señor esta convencido de que el cambio al software libre es una pérdida de dinero, ya que todo lo que se ha pagado hasta ahora en licencias se va a tirar a la basura, como si el pago de licencias fuera sólo una vez en la vida y ya.

El autor cita varios problemas con este cambio, veamos:

  • Se van a tirar millones de pesos a la basura, porque las licencias que ya pagamos ya no nos van a servir. Bajo esta lógica, entonces pagar renta tiene mucho sentido y nunca deberíamos de cambiarnos a nuestra propia casa, ya que estaríamos tirando a la basura millones de pesos pagados en renta.
  • Cuando pierda el PAN el siguiente sexenio, se van a volver a comprar las licencias y por lo tanto es pura gastadera de dinero. Haciendo a un lado toda la cuestión de ver el futuro, me sorprendería que los sistemas informáticos se cambiaran otra vez a sistemas privativos sin una buena razón. Si la razón es para apuntar el dedo y decir “es que los del otro partido…” eso dice mucho de la calidad de la gente que entrará al nuevo gobierno.
  • El software libre no es seguro, porque sólo se encuentra instalado en el 1% de las computadoras del mundo. Como si el software mágicamente se hiciera más seguro por cada instalación nueva. Por citar algunos ejemplos, el plugin de flash se encuentra instalado en la gran mayoría de las computadoras de escritorio del mundo, y es bien conocido que su historial de seguridad es por demás malo. Un contraejemplo es el servidor HTTP Apache, el cual es el servidor HTTP más usado en el mundo y es software libre, ciertamente más del 1% de los servidores HTTP lo tienen instalado. La seguridad llega por buen diseño, revisiones continuas y parches a tiempo, no por la base instalada.
  • Después lanza una serie de ejemplos en donde han salido a la luz errores en programas libres, en donde los parches han tardado bastante en llegar. El autor no proporciona ninguna liga, y dice que su fuente es “difícil de encontrar” pero no dudo que esos errores hayan existido. Lo que no se dice en el post es que en los sistemas de Microsoft que tanto pregona, hace poco se parchó un error en el sistema operativo Windows que tenía 17 años de vida. ¿O que? ¿No sabía? ¿Cuando viene de Microsoft es justificado?

Y bueno, después el autor habla de interoperabilidad, como si tener todos tus datos en un sistema privativo fuera la mejor idea. Hay en el post una sarta de opiniones desinformadas que sinceramente da tristeza que alguien quiera hacer un punto a favor del software privativo en el gobierno, siendo tan ignorante de la alternativa.

Señor Martin Llamas, si no sabe mejor limítese a decir “Chiquitibum a la bin bon ban, Microsoft! Microsoft! RA RA RA!!!!”

Rentar películas es molesto y obsoleto

La única razón por la que rento películas es por los BluRay. No que sea imposible descargarlos, pero el PS3 no soporta archivos MKV, y mi laptop no es lo suficientemente poderosa como para reproducirlos por medio de streaming. Así que la única manera que tengo para ver películas en HD en el PS3 son los BluRay.

Probablemente los lectores de este blog coincidan con que la idea de rentar una película, es decir ir al lugar, ver si tienen una copia disponible (o ver las portadas para elegir una), pagar y regresar a tu casa, sólo para unos días después tener que regresar al establecimiento a devolverla a tiempo o de lo contrario ser penalizados con recargos… la idea es un poco obsoleta, poco práctica, algo que debería ser del pasado.

Sin embargo lo sigo haciendo, por las razones antes mencionadas. Y es extremadamente idiota que cada vez que voy a rentar al mismo establecimiento me hacen las mismas preguntas: ¿Cuál es su teléfono? ¿Desea obtener la promoción de socio distinguido?

De las dos preguntas, la que más me molesta es la primera. En teoría es para prevenir que otra persona rente con tu misma credencial, pero entonces ¿para qué piden credencial, si no basta como método válido de identificación? Además de la credencial, me piden una identificación oficial y mi teléfono. Ni en el cajero me piden tanta cosa para sacar dinero. Además no aceptan otro teléfono que no sea fijo, así que la gente como yo que no tiene teléfono fijo en su casa tiene que dar el teléfono de un conocido.

Si van a ofrecer un servicio que está destinado a compartir la fortuna de la venta de CDs, ya de jodido deberían de hacerlo un poco más amigable. Yo se que cambiar al modelo digital de la noche a la mañana no va a suceder, pero en el inter podrían:

  • Tener kioskos donde consultar el catálogo de películas. Que te indique si la tienen en existencia, en que parte de la tienda está, si hay copias disponibles, etc.
  • El mismo kiosko lo podrían integrar con servicios de la Web para recomendación de películas. Y por favor no cometan la estupidez de utilizarlo para recomendar los estrenos, es suficiente con los carteles de afuera, las 2 millones de copias en los estantes de estrenos y los folletos en caja. No quiero ver comerciales, quiero una recomendación sincera.
  • Y el mismo servicio del kiosko, pero desde los smartphones más populares sería aún mejor.
  • Ofrecer modelos alternativos de suscripción. ¿Un Netflix local?

No me queda duda que en el futuro cercano, la renta de películas pasará a ser digital en su mayoría, quedando algunos nichos como los pequeños videoclubs a la “Be Kind Rewind“. En México nos queda el reto de los costos de las telecomunicaciones, para hacerlas más accesibles a la población, a su vez haciendo económicamente viable esto de los servicios de video digital.

Mientras todo esto sucede, seguiré bajando películas por medio de bittorrent, viéndolas en el PS3 y rentando BluRay… hasta que el hack de Geohot permita soporte para MKV, entonces sí al demonio con Blockbuster.

Controles custom en BlackBerry

Cesar February 12th, 2010 gadgets, programacion Haz un comentario

Crear un control custom para una aplicación de BlackBerry es muy similar a crearlo para una aplicación Java con Swing. La arquitectura del toolkit de Swing es una de las cosas que más me gustan de Java, haciendo muy claro el cómo reemplazar algo por una implementación propia.

En este caso, mi requerimiento era tener una gran “palomita” o checkmark cuando cierta variable era verdadera, y una gran cruz o tache cuando la misma variable era falsa. En otras palabras, un checkbox pero con otra interfaz, más bonita (aunque bonita es una variable que depende del observador, y como eso no lo puedo controlar…)

Como muchas cosas en Java, todo comienza extendiendo una clase, en este caso la clase CheckboxField

public class CustomCheckBox extends CheckboxField

Este checkbox, contrario al checkbox normal, no va a tener un texto asociado, solo la parte gráfica. Así que sobreescribimos el constructor:

public CustomCheckBox(){
	super();
}

public CustomCheckBox(boolean check){
	super("",check);
}

Similar a Swing, hay que sobreescribir el método paint para ahí pintar lo que nosotros queremos. Cuando el checkbox esta check dibujamos la palomita, y cuando esta uncheck, dibujamos la cruz:

public void paint(Graphics g){
	if(getChecked()){
		drawCheck(g);
	}else{
		drawCross(g);
	}
}

Esos dos métodos drawCheck y drawCross son los responsables de pintar el control. El método getChecked heredado de CheckboxField nos dice si el control esta checked o unchecked.

Primero veamos drawCheck

private void drawCheck(Graphics g){
	int left = getBorderLeft();
	int top = getBorderTop();

	int x0 = left, x1 = x0, x2 = x1+20, x3 = x2+50, x4 = x3,
		x5 = x4-50, x6 = x5-20;
	int y0 = top, y1 = y0+30, y2 = y1+15, y3 = y2-45,
		y4 = y3+25, y5 = y4+45, y6 = y5-15;

	g.setColor(0x5B9058);
	g.setBackgroundColor(isFocus() ? 0xEEEEEE : 0xFFFFFF);
	drawBackground(g);
	g.setDrawingStyle(Graphics.DRAWSTYLE_AAPOLYGONS, true);

	int[] xPts = {x1, x2, x3, x4, x5, x6};
	int[] yPts = {y1, y2, y3, y4, y5, y6};
	g.drawFilledPath(xPts, yPts, null, null);

	g.setDrawingStyle(Graphics.DRAWSTYLE_AAPOLYGONS, false);
}

De antemano perdonen ustedes el uso de números mágicos. Lo interesante es el método drawFilledPath, que toma dos arreglos con coordenadas XY y dibuja, como su nombre lo indica, un polígono. Es algo como dibujar con Logo, uno de mis primeros lenguajes de programación muy similar a Lisp. Primero preparamos las coordenadas, después verificamos si nuestro control tiene el foco para dibujarle un fondo distintivo.

El otro método, drawCross, es muy parecido solo que las coordenadas cambian para formar una cruz:

private void drawCross(Graphics g){
	int left = 0;
	int top = 10;

	int x0 = left, x1=x0, x2=x1+25, x3=x2+10, x4=x3+10, x5=x4+25,
		x6=x4+5, x7=x5, x8=x4, x9=x3, x10=x2, x11=x1, x12=x2-5;
	int y0 = top, y1=y0,y2=y1, y3=y2+15, y4=y2, y5=y4, y6=y5+25,
		y7=y6+25, y8=y7, y9=y8-15, y10=y8, y11=y10, y12=y6;

	g.setColor(0xB54E41);
	g.setBackgroundColor(isFocus() ? 0xEEEEEE : 0xFFFFFF);
	drawBackground(g);
	g.setDrawingStyle(Graphics.DRAWSTYLE_AAPOLYGONS, true);

	int[] xPts = {x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12};
	int[] yPts = {y1,y2,y3,y4,y5,y6,y7,y8,y9,y10,y11,y12};
	g.drawFilledPath(xPts, yPts, null, null);

	g.setDrawingStyle(Graphics.DRAWSTYLE_AAPOLYGONS, false);
}

Y finalmente la clase completa

public class CustomCheckBox extends CheckboxField{
	public CustomCheckBox(){
		super();
	}

	public CustomCheckBox(boolean check){
		super("",check);
	}

	public void paint(Graphics g){
		if(getChecked()){
			drawCheck(g);
		}else{
			drawCross(g);
		}
	}

	protected void drawFocus(Graphics g, boolean focus){
		//do nothing
	}

	protected void onFocus(int direction){
		super.onFocus(direction);
		invalidate();
	}

	protected void onUnfocus(){
		super.onUnfocus();
		invalidate();
	}

	protected void layout(int width, int height){
		width = 71;
		height = 71;
		setExtent(width, height);
	}

	private void drawCheck(Graphics g){
		int left = getBorderLeft();
		int top = getBorderTop();

		int x0 = left, x1 = x0, x2 = x1+20, x3 = x2+50, x4 = x3,
			x5 = x4-50, x6 = x5-20;
		int y0 = top, y1 = y0+30, y2 = y1+15, y3 = y2-45,
			y4 = y3+25, y5 = y4+45, y6 = y5-15;

		g.setColor(0x5B9058);
		g.setBackgroundColor(isFocus() ? 0xEEEEEE : 0xFFFFFF);
		drawBackground(g);
		g.setDrawingStyle(Graphics.DRAWSTYLE_AAPOLYGONS, true);

		int[] xPts = {x1, x2, x3, x4, x5, x6};
		int[] yPts = {y1, y2, y3, y4, y5, y6};
		g.drawFilledPath(xPts, yPts, null, null);

		g.setDrawingStyle(Graphics.DRAWSTYLE_AAPOLYGONS, false);
	}

	private void drawCross(Graphics g){
		int left = 0;
		int top = 10;

		int x0 = left, x1=x0, x2=x1+25, x3=x2+10, x4=x3+10, x5=x4+25,
			x6=x4+5, x7=x5, x8=x4, x9=x3, x10=x2, x11=x1, x12=x2-5;
		int y0 = top, y1=y0,y2=y1, y3=y2+15, y4=y2, y5=y4, y6=y5+25,
			y7=y6+25, y8=y7, y9=y8-15, y10=y8, y11=y10, y12=y6;

		g.setColor(0xB54E41);
		g.setBackgroundColor(isFocus() ? 0xEEEEEE : 0xFFFFFF);
		drawBackground(g);
		g.setDrawingStyle(Graphics.DRAWSTYLE_AAPOLYGONS, true);

		int[] xPts = {x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12};
		int[] yPts = {y1,y2,y3,y4,y5,y6,y7,y8,y9,y10,y11,y12};
		g.drawFilledPath(xPts, yPts, null, null);

		g.setDrawingStyle(Graphics.DRAWSTYLE_AAPOLYGONS, false);
	}

	private void drawBackground(Graphics g){
		g.clear();
	}

	public boolean isFocusable(){
		return true;
	}
}

El resultado:
customcheckbox

Look ma! custom controls with no images!

Opiniones de los G&R’ers sobre Google Buzz

Cesar February 10th, 2010 Google, aplicaciones, geekandroll, opinion, web2.0 5 comentarios

El tema caliente de la semana es Google Buzz. Para muchos un quierosertwitter, para otros Twitter como debió ser desde el inicio. ¿Pero que opinan los Geek&Rollers del tema? Veamos:

Axel

No lo he checado porque me enmulé porque no hay en google apps for your domain, pero lo checo y te envío la opinión.

Rafyta

O sea que como no pego el wave a ver si con esta onda se arma?

Boynas

Cuantas veces hemos discutido en twitter y hemos sentido que es molesto para los que siguen nuestro timeline (respeto a los demas en contra de la funcionalidad).
La integracion a otros servicios tanto de fotografias, videos y contenido en general, se me hace menos forzada que la de twitter. Tiene mas features nativos.

Lo mas importante es que es mainstream. No necesito enseñar a un amigo a usarlo, es simple y amigable. A mi me interesa seguir a todo mundo no solo a geeks o a media freaks pesudo-periodistas, que son los que se meten a twitter. Esa es la unica razon por la que tengo FB!
Creo que Buzz es como twitter made right, tiene las threaded comments de FB sin las molestas apps; Sin embargo es ordenado no necesitas brincar de timeline en timeline para seguir una conversacion en la que comento una persona que no conoces.

Buzz esta tapando ese gap. Es lo que debio haber hecho twitter con su red de usuarios hace mucho tiempo.. Es perfectamente un twitter killer. (no mames, hasta rima)

César

Tiene más sentido que Twitter, para mi. Gmail siempre esta abierto en mi navegador. Ahora nomas falta que todos dejen de usar Hotmail y se pasen a Gmail, cosa que no se por qué no ha sucedido todavía. Ah, y que le arreglen eso de que se autorefresca el sitio pero te sigue marcando items no leídos. Y una opción para que cuando leo algo en Buzz, no me aparezca como no leído en la bandeja de entrada de Gmail.

Lo mejor de todo es que, en mi opinión, los clientes exclusivos van a perder relevancia, haciendo mucho más relevantes cosas como lo que está haciendo Ubuntu con su Me Menu y Gwibber. Si todo sale bien, vamos a estar un paso adelante. Eso si, su uso desde el Web siempre va a ser una mejor experiencia, como Google nos tiene acostumbrados.

¿De acuerdo? ¿Desacuerdo? Usen la caja de comentarios. Nos vemos en Buzz.

Desarrollo de software en un mundo post-agil

Cesar February 9th, 2010 opinion, programacion, tips 1 comentario

Del artículo:

Un proceso es un instrumento de autoridad. Un proceso es una proclamación de qué hacer, cómo debemos de hacerlo y en qué orden. Un proceso es conservador, jerárquico y formal. Un proceso mantiene el status quo. Es la administración imponiendo orden y control desde arriba. Si los procesos fueran un partido político, sería de derecha.

Es fácil ser seducido por las bondades de la metodología ágil. Promesas de equipos auto suficientes, entregas frecuentes y listas para producción, Yippi-kay-ay. Demasiado proceso y en vez de avanzar nos quedamos llenando reportes y formas; muy poco proceso y todo se vuelve un manojo de actividad descontrolada y poco empuje (y entrega).

El artículo discute la etiqueta “ágil” que tanto se usa en administración de proyectos de software hoy en día. Por ahí leí que “scrum” (intercambiado por ágil en esta ocasión) no es una bala de plata para tener proyectos exitosos. Existen factores como la experiencia y motivación del equipo, así como también la naturaleza del proyecto, por lo que una aproximación orientada a personas tiene más sentido que orientado a procesos, y viceversa.

Lean el artículo fuente (en Inglés), y los invito a dejar sus comentarios sobre el tema, experiencias personales, etc.

Estamos de vuelta!

Cesar February 3rd, 2010 geekandroll 2 comentarios

Debido a que ocurrió un overflow cuando intentamos pagar el dominio, GoDaddy no permitió el acceso a este blog por medio de nuestro dominio. Los detalles no los se, solo que el BigInt que utilizan para guardar la cantidad del pago no alcanzó, y por tanto el overflow, causando todo tipo de problemas.

Gracias por su paciencia. Estamos de vuelta, keep on Geek&Rolling!

Cuidado con cambiar de BlackBerry en Telcel

Hace poco decidí cambiar de modelo de BlackBerry, de la viejita 8110 a la un poquito más moderna 8520. Al ir a Telcel me dijeron que con mi plan era imposible cambiar al equipo que yo quería, aún cuando quisiera pagar el costo total del mismo.

Como en Telcel me la hicieron difícil, compré el equipo aparte y le cambié el chip. Hasta ahí todo bien, sin embargo al llegar la factura veo que me cobran la conexión de datos, aún cuando mi plan incluye datos ilimitados. En la factura me cobran el plan (con datos ilimitados incluidos) más los datos consumidos. Obviamente algo andaba mal. Después de dos visitas al centro de “atención” al cliente – que de atención no tiene nada – no me pudieron resolver mi problema. Las dos personas que me atendieron coincidían en que “que raro!?!?” y levantaron un reporte.

Gracias a que tengo a una persona conocida que trabaja en el corporativo, después de unos cuantos SMS’s el problema quedó aclarado y resuelto. Bueno, resuelto a medias porque voy a tener que pagar el cargo excesivo.

El problema, y lo que nunca me pudieron explicar en el centro de pseudo-atención, fue que al cambiar de equipo si tienes un plan de datos ilimitados, esto no se te respeta. En ningún lugar te lo indican, tampoco te lo advierten en Telcel. Y lo que es peor, nunca me lo superion resolver. Tuve que usar “palancas” del corporativo para que me resolvieran, ya que los asesores del centro de atención se limitaron a rascarse la cabeza. Nunca me preguntaron ¿No cambió su equipo señor?

Así que si tienen una BlackBerry y deciden cambiar de equipo, antes de meter su chip en el equipo nuevo, vayan a su centro de atención y pidan que les hagan el cambio para evitar cargos excesivos. Esta información la deberían de proporcionar de primera mano en Telcel, pero como siempre con prácticas poco éticas para sacar hasta el último centavo.

No iba a proporcionar información, pero por el coraje que me hicieron pasar les muestro una captura de pantalla de lo que será Everlasting Flame 2.0. Descárguenlo y eviten pagarle más de la cuenta a Telcel.

ELF2

El PS3 ha sido hackeado

Cesar January 22nd, 2010 cracking 2 comentarios

Finalmente lo inevitable sucedió. George Hotz ha superado las barreras impuestas por el hypervisor del PS3, teniendo acceso total a la memoria del sistema y al CPU. Este es el anuncio oficial:

I have read/write access to the entire system memory, and HV level access to the processor. In other words, I have hacked the PS3.

Lo que sigue es esperar a la implementación de un exploit y ver cómo se desarrolla la comunidad del homebrew alrededor de esta consola.

Tiempo total de hackeo: 5 semanas. Can’t wait.

Posts anteriores