domingo, 5 de mayo de 2013

Expandir almacenamiento interno del Huawei Evolucion2 CM980

Como ampliar el tamaño
del almacenamiento interno del Huawei Evolución 2 CM980
 

****** Nota: 09/05/2015 *******
La versión del Mount2SD fue modificada por su desarrollador, por lo cual presuntamente ya no funciona igual.
Por tal motivo, el procedimiento aquí descrito podría no funcionar.
No tengo manera de verificar el procedimiento por no disponer del teléfono Evolución 2.
************************************************* 


En la República Bolivariana de Venezuela tenemos a disposición el teléfono de gama media marca Huawei modelo Evolución 2 CM980, de la mano de Movilnet. Este equipo es uno de los modelos más populares por sus características y especificaciones a tan bajo precio.

El detalle negativo que particularmente he tenido con el equipo es el espacio de almacenamiento interno (160 Mb). Seguramente al igual que a mi, a otros usuarios les pasa igual. Investigando en el ciberespacio he encontrado la solución a este problema. Y no es cambiar de teléfono! :D para nada! Fíjate en la Imagen 1 el tamaño de las aplicaciones instaladas y el espacio disponible de almacenamiento interno!



Imagen 1. Información de almacenamiento interno del teléfono.


Primero aclaro que los métodos que a continuación recopilé, a mi me funcionaron sin problema alguno, pero como es costumbre advertir en este tema, todo corre bajo su responsabilidad, solo garantizo y doy fé que en mi teléfono funciona a la perfección. La imagen 2 lo comprueba...

Imagen 2. Distribución de espacio en el directorio de almacenamiento interno /data
  


Bien, comencemos por los requisitos:

1.     Un computador de escritorio o portátil.
2.     Cable USB del teléfono o lector de tarjeta MicroSD.
3.     Tarjeta MicroSD de máximo 32GB, originalmente incluye una tarjeta de 2GB
4.     La batería del teléfono 100% cargada.
5.     Instalar en el computador alguna herramienta de particionado de discos.
6.     Tiempo libre y cero estrés ;)

El procedimiento consta de 5 etapas:

  1. Respaldar todos los datos, aplicaciones y archivos.
  2. Particionar la tarjeta MicroSD.
  3. Rootear el teléfono.
  4. Instalar y configurar la aplicación Mounts2SD.
  5. Restaurar los datos, aplicaciones y archivos respaldados.

NOTA del día 01-05-2014:
Los pasos 1, 2 y 4 se explican con más detalle en:


Primero, Respaldar datos y aplicaciones

Utiliza cualquier aplicación en Android que te permita realizar backup de tus datos y aplicaciones. Yo utilicé MyBackup.
Importante: no recomiendo utilizar AllBackup solo porque al rootear el teléfono no se tendrá disponible la aplicación, a menos que respalden el instalador de la misma.


Segundo, Particionar la tarjeta MicroSD.

Se debe crear tres particiones en la tarjeta MicroSD, recomiendo la primaria para datos en formato FAT32 con un tamaño del 70% de la capacidad de la tarjeta, la segunda partición con formato ext3 con un tamaño del 23% de la tarjeta y la tercera con formato SWAP LINUX, con un tamaño o del 2% restante o un maximo de 512MB. Para ello puedes utilizar en tu computador linux la herramienta GParted o en Windows la herramienta MiniTool Partition Wizard. En el artículo Cómo mover apps a la sd card en un dispositivo android se encuentra una explicación detallada del particionado de la tarjeta.  


Tercero, rootear el teléfono.

Se requiere configurar desde cero tu teléfono, formatearlo completamente, aún si ya tienes rooteado el mismo. Para rootear el teléfono CM980, yo instalé la Rom GamerEvolución 1.0 (descargue la rom aquí)y me funciona de maravillas (ver imagen 3), incluso, funciona mucho mejor que su última versión 1.2. Si tienes otra rom que te brinde los privilegios root, usala que también funcionará. Lo importante es rootear el teléfono y configurar el Mount2SD, antes de instalar tus aplicaciones favoritas.
Imagen 3. Información del teléfono


Aquí se encuentra toda la información para su instalación incluyendo la descarga. Sigue las instrucciones hasta que culmina la instalación con el inicio del teléfono por primera vez. No configures Link2SD, ya que esa herramienta no se utilizará. Al llegar a ese punto, pasa a la siguiente etapa, cuarto.

Cuarto, Instalar y configurar la aplicación Mounts2SD.

Una vez culminado el proceso de rooteo del teléfono, instala la aplicación Mounts2SD desde el Play Store. Al culminar la instalación, ingresa a la configuración del script (ver imagen 4).

Imagen 4. Opción de configuración de Mounts2SD.


Selecciona solo las opciones que se aprecian marcadas con una tilde en color verde en la imagen 5.






 Imagen 5. Opciones que deben seleccionarse en Mounts2SD.


Una vez seleccionadas las opciones, reinicien el teléfono. Si todo ha salido bien has el momento, luego de culminado el proceso de reinicio, ingresen a la aplicación Mounts2SD y verifican que todo esta funcionando correctamente. Ello se verifica simplemente observando la pantalla principal de Mounts2SD que aparece los circulo rellenos en verde. A continuación en la imagen 6 se aprecia como quedó en mi teléfono:


 Imagen 6. Información de correcto funcionamiento de Mounts2SD.

Llegado a este punto, puedes comenzar a instalar y configurar tu teléfono al gusto.

ACTUALIZACIÓN - 10/11/2013

Recientemente, el 01-11-2013, Mount2SD ha actualizado su versión, en la cual la configuración es mucho más sencilla que la anterior. Simplemente se deben tildar en las opciones de configuración todas las opciones excepto la última, Enabled debug Mode.
En la imágen7 puedes apreciar los nombres de las opciones y fijarte que se encuentran seleccionadas.








Imagen 7. Nuevas opciones configuración Mount2SD

Yo adicionalmente eliminé el Launcher Holo e instalé Hi Launcher. En la imagen 8 puedes ver como quedó la interfase del teléfono.


Imagen 8. Vista de pantalla principal del Hi Launcher.


Espero que te animes a rootear tu teléfono y disfrutes de tener el poder total de configuración de tu excelente Huawei Evolución 2 CM980.

Viva el conocimiento libre!

  
Comparte en comentarios tu experiencia con la 
ampliación de la memoria del teléfono.

miércoles, 17 de abril de 2013

Creación de constraint Unique Key con valores específicos que se puedan repetir en PostgreSQL. Constraint personalizado.


Si usted necesita crear una validación en la base de datos postgres que verifique los valores de una columna sean únicos excepto uno o más valores, a continuación se presenta como hacerlo mediante función trigger con su respectivo ejemplo.

Caso ejemplo

Se tiene una tabla que almacena los datos de los equipos informáticos llamados activos, los cuales se identifican mediante un serial asignado por el fabricante. La tabla se crea con la siguiente estructura en el esquema activo:

CREATE TABLE activo.activo
(
   co_activo numeric(9,0),
   tx_serial character varying(30) NOT NULL DEFAULT 'S/S',
   tx_descripcion character varying(300) NOT NULL
);

Obsérvese que la columna tx_serial tiene como valor por defecto la cadena 'S/S' la cual representa Sin Serial.

Considerando que los activos para el usuario serán identificados por el serial y no por el código de identificación asignado por la base de datos (co_activo), y que existen activos que de fábrica no tienen serial, se requiere permitir que el único valor que se permite repetir en la columna es 'S/S'. Cualquier otro valor diferente al indicado, se tomará como el valor serial que identifica unívocamente el activo. Justamente es allí donde se presenta el problema, dado que, si creamos una clave de chequeo único (unique key) se asegura que ningún valor se repita, pero no se podrán identificar aquellos activos que no poseen serial con el valor S/S. Por ende, se procede a crear la clave única con excepción utilizando una función con disparador (function trigger).

Creación de la función

Para crear la función se deben considerar los siguientes aspectos:
1.           Primero se debe crear la función y luego el disparador.
2.           La función devolverá un valor de tipo trigger.
3.           La función será llamada para eventos Insert/Update.
4.           Siempre será devuelto el registro NEW que contiene los valores que se desean insertar o actualizar en al fila.

A continuación el código de la función encontrarSerial:

CREATE OR REPLACE FUNCTION activo.encontrarSerial()
  RETURNS "trigger" AS
$BODY$
DECLARE
        registro activo.activo%ROWTYPE;
BEGIN
        IF (TG_OP = 'INSERT') THEN
                SELECT * INTO registro FROM activo.activo A
                WHERE A.tx_serial <>'S/S' and A.tx_serial = NEW.tx_serial LIMIT 1;
                IF FOUND THEN
                 RAISE EXCEPTION 'El serial % ya se encuentra registrado. Intente con otro valor.',NEW.tx_serial;
                END IF;
        END IF;
        IF (TG_OP = 'UPDATE') THEN
                SELECT * INTO registro FROM activo.activo A
                WHERE A.tx_serial <>'S/S' and A.tx_serial = NEW.tx_serial and A.co_activo<>NEW.co_activo LIMIT 1;
                IF FOUND THEN
                 RAISE EXCEPTION 'El serial % ya se encuentra registrado. Intente con otro valor.',NEW.tx_serial;
                END IF;
        END IF;
RETURN NEW;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE STRICT;

Explicación:
                     Se declara una variable llamada 'registro' para almacenar la fila encontrada. El tipo de dato de la variable se debe indicar que es del mismo tipo de la fila contrada. Ejm: registro activo.activo%ROWTYPE;
                     Se verifica el tipo de operación capturada por el disparador (trigger) para ejecutar la consulta correspondiente. Ejm: IF (TG_OP = 'INSERT') THEN
                     Se realiza la consulta Select a la tabla activo almacenando el valor encontrado en la variable registro. Ejm: SELECT * INTO registro FROM activo.activo A
                     En la clausula Where de la consulta se busca un valor existente diferente al 'S/S' e igual al nuevo serial. Ejm: WHERE A.tx_serial <>'S/S' and A.tx_serial = NEW.tx_serial LIMIT 1;
                     Se verifica la existencia de registro encontrado. Ejem: IF FOUND THEN
                     Si el valor es encontrado, se dispara un error de excepción y se detiene la operación del insert. Ejm: RAISE EXCEPTION 'El serial % ya se encuentra registrado. Intente con otro valor.',NEW.tx_serial;
                     Si la operación es UPDATE solo cambiará la condición del WHERE agregando que el código de identificación no sea el mismo. Ejm: WHERE A.tx_serial <>'S/S' and A.tx_serial = NEW.tx_serial and A.co_activo<>NEW.co_activo LIMIT 1;
                     Finalmente se retorna el registro NEW para garantizar que el registro devuelto siempre contenga valores. Si se utiliza como valor de retorno la variable registro, se presentaran problemas de ejecución cuando la consulta no encuentra valor repetido y la variable contendrá NULL.

Una vez creada la función encontrarSerial, se procede a crear el disparador:

CREATE TRIGGER triggerEncontrarSerial
  BEFORE INSERT OR UPDATE
  ON activo.activo
  FOR EACH ROW
  EXECUTE PROCEDURE activo.encontrarSerial();

Obsérvese que el disparador se crea para capturar los eventos Insert o Update para cada fila afectada y antes de ejecutar la operación se realizarán las instrucciones indicadas en la función encontrarSerial() especificada en el esquema activo.

Con esta función y disparador se tendrá la seguridad que los valores de la columna no se repetirán excepto el valor indicado 'S/S'.

Conclusión:

Con la creación de la función que retorne trigger la cual contendrá el diseño de la consulta SELECT con las condiciones ajustadas a su necesidad, porque puede agregar tantas excepciones de valores repetidos como los requiera las reglas de negocio de su base de datos y la creación del disparador en la tabla para que se ejecuta la revisión previa a la inserción o modificación del valor de una fila de la tabla activo.