martes, 13 de noviembre de 2012

Como desbloquear netbooks del Gobierno Argentino

Copio hoy un texto del autor Sebastian Bassi publicado originalmente en su perfil de Facebook (https://www.facebook.com/sebastian.bassi/posts/337682969663677)

Como saben al gobierno argentino les gusta censurar la información que no les conviene, asi que aprovechen y difundan antes de que lo censuren por completo.

Texto original:
Censurame esta.

Desbloquear Netbook EXO X352 - Las del Gobierno.

Bueno, este post está hecho, para educar, para dar a los usuarios de estas Netbooks, control sobre sus equipos, todos sabemos que las mismas vienen programadas de tal forma que se bloqueen en caso de ser denunciadas como perdidas, robadas, o en caso de que el alumno no lleve la Netbook al colegio durante determinado períod
o de tiempo, este es el caso particular que afecto a un amigo mío, que sin mi ayuda, se hubiera quedado con la Netbook de pisapapeles durante todas las vacaciones, hasta que pudiera llevarla al colegio en Marzo para que se la re-activaran.

DESCARGO
* No me hago responsable de ningún daño que ocasionen a sus equipos por meter mano sin saber lo que están haciendo.

* Si los cabezas de las villas entran a robar más Netbooks ahora que yo hago público este tutorial, me importa un bledo, la información no es buena ni mala, cada quien le da el uso que le parece, y si un zombie de paco se roba una Netbook, no piensa si le va a andar o si no le va andar, se conforma con que le den 50 mangos por el disco y la memoria.

* Este no infringe ninguna ley vigente, como tampoco viola el contrato entre el alumno y la escuela, si a la escuela no le parece que los alumnos re-configuren sus equipos, pueden perfectamente reclamárselos y volver a formatearlos con el software de base.

Bueno, ahora que me he cubierto las nalgas por cualquier posible crítica futura, vamos a lo que nos comPETE:

¿QUÉ VAMOS A NECESITAR?
1) Un destornillador Phillips, si tienen uno con punto imantada, hermoso! Uno como este sería lo ideal:

2) Una Lectora/Grabadora con conexión USB

3) Un CD de Windows XP (El que más les guste)

4) Una pinza como esta:

En ML se consiguen por $ 5, les dejo el link por si son muy vagos para buscar:

http://articulo.mercadolibre.com.ar/MLA-101495421-pinzas-para-maquinas-de-coser-overlock-textil-electronica-_JM

PASO A PASO
1) Quitamos la protección símil cuero, que está simplemente abrochada a la carcaza.

2) Mirando la parte trasera, vamos a notar 5 tornillos a la vista, 3 en una línea, y 2 en la otra, los sacamos y levantamos la tapa por la muesca que tiene arriba al centro, siempre considerando la batería como "Arriba".

3) Una vez abierta, vamos a ver un objeto rectangular color azul, eso es el disco rígido, vamos a sacarlo. ¿Cómo? Primero, vamos a desconectar el cable plano color dorado del Mother, para no estropearlo, simplemente levantamos el seguro plástico negro que lo sostiene, y ahí se va a poder deslizar el cable con facilidad. Luego colocamos las pinzas entre el disco rígido, y el lateral izquierdo del compartimento, y haciendo palanca de a poquito, sacamos el disco rígido.

4) Ahora vamos a "Puentear" la pila del Mother, para esto giramos la Netbook 90 grados hacia la derecha, ahora nos va a quedar la memoria en la posición superior izquierda como referencia. ¿Ven la licencia de Windows pegada? Bueno, en el hueco que quedó debajo de la misma, onda detrás de donde sacamos el cable del Disco Rígido, ahí abajo, está la pila, vamos a girar la Netbook 90 grados hacia delante, quedándonos los conectores laterales en la cara, en el siguiente orden, de izquierda a derecha: Power, Ethernet, USB, USB, Mic y Out. Ahora vamos a meter con cuidado la pinza en ese hueco, y vamos a separar la pila del encastre del Mother, con cuidado, pero sin miedo, que no van a romper nada, la idea no es separar la pila y sacar la pinza, la idea es dejar la pinza metida entre la pila y la base (Si, se que suena a locura, pero funciona)

5) Vamos a volver a conectar el Disco Rígido (Si, sin sacar la pinza), ya saben, levanta el seguro de plástico negro, meten el cable plano dorado, y bajan el seguro para trabar el cable, no hace falta que el disco quede totalmente empotrado, con que haga tope basta.

6) Ahora vamos a arrancar la Netbook, si hicimos todo bien, ya debería bootear con normalidad, o en su defecto, marcarnos en la parte superior izquierda de la pantalla, la palabra "GRUB" (Nota: si la tercera luz indicadora del tablero, viniendo desde la derecha, no se enciende, chicos, tienen mal conectado el disco XD). Si no arranca, simplemente vuelvan al ataque con la pinza y la pila hasta que salga (Nota: Recuerden volver la pila a su posición original antes de seguir con el próximo paso)

7) Bien, si todo salió bien, actualmente la Netbook ya fue "Desbloqueada", pero nosotros somos groxos, nosotros somos bien pero bien piratas, y la vamos a hacer completa. Apagamos la Netbook, conectamos la Lectora/Grabadora USB, encendemos la Netbook, presionamos F11, metemos el CD de Windows en la Lectora/Grabadora USB, le damos tiempo a que lo lea, y en el selector de Booteo, elegimos nuestra Lectora/Grabadora USB.

8) Bueno, ahora instalamos Windows como en cualquier otra PC. Igual, les comento, tengan cuidado, con el tema de los drivers, porque si meten el Driver del Módulo TPM, se les puede volver a bloquear, digo puede porque depende cual metan se comporta distinto, hay más de 1 Driver que va.

De todas formas no se hagan drama porque en la semana voy a subir un video explicativo y una imagen hecha con Norton Ghost de un Windows UE 2009.1, actualizado, con Serial de Oro y todos los Drivers cargados. Lo iba a subir ayer pero como buen bruto que soy rompí mi Lectora/Grabadora USB y recien el Lunes o Martes voy a poder ver de conseguir otra.

Aclaro que también comenté esto en 3DG y unos cuantos Cyber-K me tiraron bosta a lo pavo, ahora dicen que estoy dilatando el asunto porque en realidad no hackee nada, el asunto es que se me rompió la Lectora y no estoy forrado en guita como para pedir una por teléfono en el instante en que se rompe la anterior.

miércoles, 12 de octubre de 2011

Django Session Middleware basado en Memcache

Para los que estén desarrollando aplicaciones con Django para Google App Engine ( GAE ), se habrán encontrado con el problema de las sesiones de Django, las cuales no son compatibles con GAE.


Si bien existen múltiples alternativas que van desde frameworks enteros dedicados a la integración de los middlewares de Django en GAE hasta simples handlers de sesión basados en el storage de Google, yo he encontrado varias razones para no usarlos, que pueden ser válidas o no, pero son mis razones: 


- Los frameworks hechos para una mejor integración entre Django y GAE, o son muy inmaduros o tienen demasiada funcionalidad que no me interesan. Por otro lado, prefiero hacer las cosas yo mismo y aprender un poco más. 


- Las sesiones basadas en storage suelen no escalar muy bien. 


- En el billing del GAE, el storage es más caro que el memcache.


Con estas simples razones en mente, encontré una solución a mi dilema: MemSession


MemSession es un proyecto hosteado en GitHub ( https://github.com/leonelquinteros/memsession ) y se trata de un muy pequeño y simple middleware para Django que sirve de handler para sesiones y que utiliza Memcache como sistema de almacenamiento de las mismas. 


El setup es muy sencillo (hay instrucciones in inglés en el archivo README del proyecto) y consta de 2 simples pasos: 


1) Clonar o bajar el módulo python ( session.py ) directamente de GitHub y alojarlo dentro del PATH del proyecto. 


2) Agregar el módulo a la lista de middleware del proyecto Django en cuestión. 


Una vez hecho esto, el middleware se encargará de inicializar automáticamente una sesión única por cada usuario de nuestra aplicación, y pondrá a disposición el objeto memSession como una propiedad de todos los objetos request de la aplicación.


El objeto memSession tiene 3 métodos básicos que proporcionan la funcionalidad de sesión que necesitamos:


- memSession.read( key )
- memSession.write( key, value)
- memSession.delete( key )


Creo que tanto los métodos como los parámetros de los mismos son bastante auto-explicativos.


Para resumir, me parece una librería extremadamente útil para la simplicidad que tiene y creo que puede escalar bastante bien haciendo uso de Memcache, aunque no lo he probado.


Y por último, el link del proyecto en GitHub: https://github.com/leonelquinteros/memsession



martes, 22 de marzo de 2011

PHP bug ?

<?php
$price = 125.99;
$dec = ($price - intval($price)) * 100;
$dec = (int) $dec;

echo $dec; // WTF?!

jueves, 18 de noviembre de 2010

martes, 5 de octubre de 2010

Campos LONGTEXT de MySQL y las Schema Migrations de CakePHP

Ultimamente ando un poco vago para escribir en este Blog, pero hoy me encontré con un caso/problema/solución que me parece que vale la pena compartir con uds.

Estaba trabajando con las migraciones de esquemas de CakePHP y me encontré con que el shell "schema" no distingue los tipos de columna LONGTEXT de MySQL, omitiendo las variantes de este tipo de columna y unificandolos a todos como 'text'.

He desarrollado una solución, más o menos elegante, para que los comandos "create" y "update" del schema shell reconozcan este tipo de dato. Todavía no encuentro una forma "no-intrusiva" de hacerlo para el comando "generate".

Básicamente, se trata de hacer un nuevo Data Source de CakePHP, pero en vez de extender la clase base, extender del DboMysql y solo implementar el array de tipos de datos del motor.

Para ello, como explica el manual, creo un nuevo archivo en app/models/datasources/dbo_custom_mysql.php con el siguiente contenido:

<?php
require_once(ROOT . '/cake/libs/model/datasources/dbo/dbo_mysql.php');

class DboCustomMysql extends DboMysql {
/**
* MySQL column definition
*
* @var array
*/
var $columns = array(
'primary_key' => array('name' => 'NOT NULL AUTO_INCREMENT'),
'string' => array('name' => 'varchar', 'limit' => '255'),
'text' => array('name' => 'text'),
'longtext' => array('name' => 'longtext'),
'integer' => array('name' => 'int', 'limit' => '11', 'formatter' => 'intval'),
'float' => array('name' => 'float', 'formatter' => 'floatval'),
'datetime' => array('name' => 'datetime', 'format' => 'Y-m-d H:i:s', 'formatter' => 'date'),
'timestamp' => array('name' => 'timestamp', 'format' => 'Y-m-d H:i:s', 'formatter' => 'date'),
'time' => array('name' => 'time', 'format' => 'H:i:s', 'formatter' => 'date'),
'date' => array('name' => 'date', 'format' => 'Y-m-d', 'formatter' => 'date'),
'binary' => array('name' => 'blob'),
'boolean' => array('name' => 'tinyint', 'limit' => '1')
);

}

Como ven, lo único que hago es extender el Datasource original de MySQL de CakePHP y agregarle un nuevo tipo de columna. Nada más. Luego, en su archivo app/config/database.php sólo deben indicar que su driver es 'custom_mysql' para hacer referencia a nuestro datasource. Y listo.

Esperemos que la gente de CakePHP ponga más esmero en resolver estas cositas que deberían estar listas desde varias versiones anteriores.

lunes, 26 de julio de 2010

Quick tip: _moz-rs-heading

Bueno, hoy me encontré con algo nuevo que vale la pena destacar.
Estoy empezando a transformar los sitios que desarrollo a HTML5. Sin mucha parafernaria, solo para ir testeando los casos de uso y acá me encontré uno peculiar.

Usando Firefox, me encuentro con un H2 que tiene un enlace en el DOM, el cual no está definido en el código.

El enlace, al inspeccionarlo con Firebug, se presenta similar al siguiente:
<a _moz-rs-heading="" href="">

Resultó ser culpa de un enlace mal cerrado anteriormente. Y parece ser que Firefox reestructura el DOM al encontrar errores como este en HTML5 y ha cerrado el enlace mal cerrado anteriormente al encontrar un punto en el que el contenido del enlace era inválido y lo ha continuado luego, abriendo esta etiqueta dentro de mi H2.

En fin, parece extraño, pero no se si juzgarlo como malo. En todo caso, es un comportamiento que la gente de Mozilla ha programado para este tipo de errores humanos en el código. Lo cual deja un DOM válido, como para que el layout se rompa lo menos posible, pero eso sí, si no tenemos en cuenta lo anterior, quizas sea un poco confuso al momento de encontrarlo... ahora ya saben!