viernes, 26 de abril de 2013

Si haces lo que siempre has hecho, nunca llegarás más allá de donde siempre has llegado

Saber es acordarse (Aristóteles)

No llores por haber perdido el Sol, pues las lágrimas no te dejarán ver las estrellas

Muchas veces me moria pensando que no iba verte. Pero moria la muerte cada vez que te veia. E.Galeano.

Si haces lo que siempre has hecho, nunca llegarás más allá de donde siempre has llegado

Pierde un minuto en tu vida y no tu vida en un minuto

Si quieres que tus sueños se cumplan... ¡Despierta!

Rectificar es de sabios equivocados

El que teme sufrir, sufre de temor (Proverbio chino)

Piensa en mí cuando estés triste, porque en la tristeza se piensa en lo que más se ha querido

Si trabajas para vivir, no te mates trabajando

El beso es un te quiero con un te echaré de menos...

No abras los labios si no estás seguro de que lo que vas a decir es más hermoso que el silencio (Proverbio árabe)

Las únicas personas normales son las que uno no conoce bien

Quién da consejos se arriesga a recibirlos

Si estas triste ríe, llorar es demasiado fácil

No por mucho filosofar te entiende más gente

Aprende a decir lo que sientes a la persona que te lo hizo sentir

Si te caes siete veces, levántate ocho

Quien hace puede equivocarse. Quien nada hace ya esta equivocado

Las cosas más importantes de la vida, no son cosas

Un amigo es alguien, con quien se puede no hacer nada y disfrutar de ello

La amistad divide las penas y multiplica las alegrías

Hay dos maneras de vivir feliz: siendo tonto o haciéndose el tonto

El amor es algo difícil de explicar, fácil de sentir e imposible de olvidar

La vida es así y hay que aprender a vivirla

Tal vez para el MUNDO no eres nada, pero para ALGUIEN quizás eres el mundo.

¿Por qué amamos a quien nos ignora e ignoramos a quien nos ama?

No intentes ser tu mismo, porque serás otro.

Si no quieres que nadie se entere, no lo hagas

El mundo es una ostra (Bienvenida Pérez)

No me arrepiento de las cosas que he hecho, sino de las que no hice

Visto lo visto, todo el mundo es listo

El amor no muere, sólo agoniza por el olvido

La vida es demasiado seria para tomarla en serio

La mente busca, el corazón encuentra

No podemos evitar las pasiones, pero si vencerlas

El autentico amigo es el que sabe todo sobre ti y sigue siendo tu amigo

El joven conoce las reglas, pero el viejo las excepciones

Todas hieren, la última mata

El que busca la verdad corre el riesgo de encontrarla.

Una conclusión es cuando te cansas de pensar.

Si no quieres que nadie se entere, no lo hagas.

La ignorancia es temporal, la estupidez es para siempre

Los amigos van y vienen, los enemigos se acumulan

Un pesimista es un optimista con experiencia...

Daría todo lo que sé por saber la mitad de lo que ignoro.

Recuerda siempre que eres único... Exactamente igual que todos los demás.

probando insignia de instagram


Instagram

miércoles, 24 de abril de 2013

Cuentas en Android Parte II


Antes de leer este post es convenietne haber leido el anterior Cuentas en Android Parte I

6. Implementacion del Account manager
6.1 Introduccion

La implementacion de un Account Manager es muy inusual ya que para verlo funcionar tienes que tener al menos 3 archivos.
  1. La activity que utiliza el account manager
  2. El Servicio que debe extender la clase AbstractAccountAuthenticator
  3. El Authenticator (XML, como se va ver la creacion de una cuenta)
  4. The preference file (XML, la configuracion de la cuenta) - Opcional
  5. Las clases que interactuan con el servicio - Opcional

6.2 La actividad principal
La actividad que utiliza account manager coje una instancia de la misma e invoca sus metodos. La mayoria estan explicados aqui.

6.2 El Servicio

El servicio es una de las mas importantes piezas para interactuar con el account manager. Esta es usada cuando el usuario puede crear una cuenta explicitamente, "sin usar una applicacion para eso", sino usando el proprio sistema operativo Android. Quiero decir, cuando el usuario hace click en Configuraciones->; Cuentas y Sincornizacion ->; Crear nueva cuenta (Settings ->; Account and Sync ->; Creates a new accounts), el sistema le monstrara la lista de cuentas que puede crear explicitamente. Si una applicacion puede crear una cuenta, es de esperar que el usuario la pueda crear sin esa aplicacion (de forma explicita).

Cuando el usuario hace click en algun elemento, el account manager vinculara un servicio, el cual debe retornar una implementacion de AbstractAccountAuthenticator. Ademas, el sistema ira invocar un metodo addAccount de tal servicio. Este metodo debe lanzar una actividad que permita el usuario introducir sus credenciales (nombre de usuario, contraseña, etc) y finalmente retornar la respuesta apropriada al account Manager. Aqui hay un buen ejemplo de su implementacion:

Este servicio sera declarado en el fichero AndroidManifest de una manera especial:

android:exported="true" android:process=":auth">



android:resource="@xml/authenticator" />

fuente

El codigo anterior asocia el servicio con el fichero xml que le denominamos authenticator. Este debe ser guardado en xml folder.

6.3 El Authenticator
El authenticator assigna una coleccion de parametros:
  • Account type: El tipo de cuenta. Esta debe ser la misma que cuando la cuenta es creada explicitamente. De lo contrario un error, aparentemente sin sentido saldra. 
  • Icons: Los iconos que apareceran en el account manager
  • Label: El texto de descripcion.
  • AccountPreferences: La localizacion del fichero XML el cual indica la configuracion (preference) que aparecera una vez la cuenta ha sido creada. 
  • etc.
He aqui un ejemplo del fichero xml:

android:accountType="fm.last.android.account"
android:icon="@drawable/icon"
android:smallIcon="@drawable/icon"
android:label="@string/app_name"
android:accountPreferences="@xml/account_preferences"/>
fuente

6.4 Preference file
El siguiente archivo preference es un archivo xml comun y corriente de preference
He aqui un ejemplo:


   

    android:key="account_settings"
                                    android:title="Account Settings"
                                    android:summary="Sync frequency, notifications, etc.">
        android:action="fm.last.android.activity.Preferences.ACCOUNT_SETUP"
                    android:targetPackage="fm.last.android"
                    android:targetClass="fm.last.android.activity.Preferences" />
    




fuente

6.5 El Service helper classes
El service helper classes son usados para ayudar un especifico metodo de la clase. Por ejemplo, el usuario puede desear crear una clase especifica que permita al usuario crear una cuenta, cuando el metodo addAccount del servicio sea llamado.

Para este especifico caso, hay una clase especifica llamada AccountAuthenticatorActivity la provee google que hace la autenticacion un poco mas facil. He aqui el codigo.

Lo que hace esta clase es permitir al usuario, asignar el resultado de la autenticacion, poniendo el nombre de usuario y el tipo de cuenta, cuando este termina lo devuelve al account manager. El uso de esta clase no es obligatorio. Se puede crear cualquier actividad como un AccountAuthenticatorActivity. Vease el ejemplo siguiente.

Cuentas en Android Parte I


Por padron, Android incorpora un Account manager, el cual es usado para guardar las credenciales de los usuarios y sincronizar los datos con el servidor (de ser necesario).

Account manager es un servicio centralizado por android (En vez de tener una cuenta por cada servicio que tienes, es mejor tener una sola que te de acceso a todos los servicios. Un ejemplo es Google, con las credenciales de google puedes acceder a Youtube, Gmail, Google+ usando las mismas credenciales, esa es la idea de servicio centralizado). Cuando se crea una cuenta, de tu empresa o de otra cualquier aplicacion puede cojer la lista de cuentas y con el usuario utilizar su auth tokens asociado.

Basicamente se tiene una lista de las cuentas, cada uno identificada por:

Account name: El nombre del usuario para login. Ejemplo: titusfx
Account type: El tipo de cuenta. Por ejemplo: com.google

Todas las cuentas deben ser unica. Esto es por, dado un dispositivo, no pueden haber dos cuentas con el mismo nombre y el mismo tipo de cuenta.

Por cada cuenta, hay un conjunto de datos relacionados:

Password: La contraseña de la cuenta. Esta puede ser vacio ("").
AuthTokens: La cadena usada por el servidor para identificar el usuario, en ves de usar la contraseña. Normalmente el auth token es temporal y expirara despues de un tiempo. Todos los auth tokens tienen un tipo llamado AuthTokenType. Esto es porque una cuenta puede usar varios servicios, y por cada servicio debe haber un auth token diferente. Por ejemplo, una cuenta de Google puede ser usada para Gmail y Youtube. El authTokenType de Gmail es "mail" y el the youtube es "youtube". Más informacion. 

UserDatas: Ademas se puede salvar informacion adicional con un par de cadena a estilo de diccionario ( par llave/valor ). Por si se quiere guardar informacion adicional que es utilizada por las applicaciones.

3. Permisos

Hay varios permisos que son requeridos para interactuar con el account manager:

android.permission.GET_ACCOUNTS 

Este permiso es utilizado para tener acceso a la lista de cuentas y chequear si una cuenta especifica  tiene una especifica caracteristica(feature). (Los features no seran debatidos en este post.) 

android.permission.USE_CREDENTIALS 

Este permiso es para utilizar e invalidar auth tokens. 

android.permission.AUTHENTICATE_ACCOUNTS 

Este permiso es utilizado para modificar la informacion relacionada con la cuenta, tal como la contraseña, los datos del usuario, los auth tokens, etc. Es usado para crear cuentas y acceder a la contraseña.
android.permission.MANAGE_ACCOUNTS 

Este permiso es utilizado para adicionar or eliminar cuentas. Este puede ser necesario cuando la aplicacion utiliza alguna caracteristica avanzada de la aplicacion como actualizar credenciales o editar propiedades.

4. Manejando informacion con account manager

4.1 Account manager

Una aplicacion no puede crear un nuevo account manager pero puede coger el existente pasando el context de la aplicacion.

AccountManager accountManager = AccountManager.get(Context);


4.2 Accounts (Cuentas)

4.2.1 Agregar una nueva cuenta

La manera mas facil de adicionar una cuenta es utilizando el metodo:

boolean addAccountExplicitly(Account account, String password, Bundle userdata) 

Note que la clase Account puede ser facilmente contruida con:

Account account = new Account(userName, accountType)

Ambos parametros son Cadenas, uno es el nombre del usuario y el otro el tipo de cuenta.

4.2.2 Acceder a una cuenta

Una aplicacion puede cojer informacion acerca de todas las cuentas del systema. Hay dos metodos principales:


Account[] getAccount() 


Account[] getAccountsByType(String type)


El primero devuelve todas las cuentas del account manager y la segunda, solamente devuelve las cuentas que encajan con un especifico tipo de cuenta.

Todas las cuentas tienen dos tipos:

name: Accesible usando account.name
type: Accesible usando account.type

Luego, una forma facil de acceder a una cuenta de tipo "com.jiahaoliuliu" que el nombre del usuario es "jiahaoliuliu":


Account[] accounts = accountManager.getAccountsByType("com.jiahaoliuliu");

Account myAccount = null;

for (Account account : accounts) 

{

    if (account.name.equalsIgnoreCase("jiahaoliuliu")) 

    {

        myAccount = account;
        break;

    }

}




4.2.3 Eliminar una cuenta
Las cuentas pueden ser eliminadas por:

AccountManagerFuture removeAccount(Account account, AccountManagerCallback callback, Handler handler)

Note que, por cada cuenta, puede existir una configuracion que la prevenga de ser eliminada. Lo que no garantiza que siempre se pueda eliminar la cuenta.

4.3 Contraseña

La contraseña es una informacion sencible no deberia ser guardada de la manera que es. uno de los grandes problemas de seguridad es guardar las contraseñas como texto plano sin ningun tipo de encriptacion. Verifique la seccion de seguridad en la segunda parte de este post.

4.3.1 Assignar la contraseña

Dado una cuenta, la contraseña puede ser asignada de dos maneras:

Cuando una cuenta es creada por la primera vez, usando el metodo:

boolean addAccountExplicitly (Account account, String password, Bundle userdata)

Después que la cuenta fue creada

void setPassword(Account account, String password)

4.3.2 Acceder a la contraseña

Se puede acceder la contraseña por el metodo:

String getPassword(Account)

4.3.3 Limpiar la contraseña

Hay un metodo especifico para limpiar el password.

void clearPassword(Account)

El metodo siguiente tiene el mismo efecto:

setPassword(Account, null)

4.4 Auth tokens

Como se ha explicado anteriormente, una cuenta puede tener un conjunto de auth tokens, cada uno para un servicio especifico que se identifica por authTokenType.


4.4.1 Asignar un auth token

Para asignar un auth token, se puede usar el siguiente modo:

void setAuthToken(Account account, String authTokenType, String authType) 

4.4.2 Acceder a un auth token

Hay varias maneras de acceder a los auth tokens. La manera mas facil es la siguiente:

AccountManagerFuture getAuthToken(Account account, String authTokenType, boolean notifyAuthFailure, AccountManagerCallback callback, Handler handler) 

Aqui hay un buen ejemplo de como usarlo

4.4.3 Invalidar un auth token

Normalmente los auth tokens tienen un tiempo de expiracion, es una buena practica invalidar un auth token una ves que esta ya no es valida. Para hacerlo se usa el siguiente metodo:

void invalidateAuthToken(String accountType, String authToken)

Note que para usarlo debe entrar el authToken completamente.


4.5 Informacion del usuario

Ademas la aplicacion puede introducir cualquier informacion extra relacionada con la cuenta pasando. Es un diccionario de llave/valor donde todos son cadenas.


4.5.1 Asignar la informacion del usuaio

Como la contraseña, la informacion del usuario pueden ser introducidas cuando la cuenta empieza a ser creada o despues de ser creada.

boolean addAccountExplicitly(Account account, String password, Bundle userData) 

despues de ser creada:

void setUserData(Account account, String key, String value)


4.5.2 Acceder a la informacion del usuario
Solo hay un metodo para acceder a la informacion del usuairo.

String getUserData(Account account, String key) 


4.6 Un account updated listener

El account manager ofrece la posibilidad de adicionar un account update listener para actuar cuando una cuenta es actualizada. El evento (listener) sera aplicado a la instancia actual del AccountManager.

void addOnAccountsUpdatedListener(OnAccountsUpdateListener listener, Handler handler, boolean updateImmediately) 


void removeOnAccountsUpdatedListener(OnAccountsUpdatedListener listener) 

Es importante notar que mientras una instancia de Account manager empieza ser escuchada, este no va ser recogida por el account manager, ni el context usado para devolverlo. Para evitar fuga de memoria, es importante eliminar el listener si este no esta siendo usado. Por ejemplo onDestroy().

5. Conclusion Parcial

El account manager es muy util para tener todas las cuentas centralizadas en un solo lugar, pero esto tiene sus inconvenientes.

jueves, 11 de abril de 2013

Android y SharePreferences


Para leer los datos basta con usar SharedPreferences:

import android.preference.PreferenceManager;
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);

prefs.getString("keystring","defvalue");// En el caso de que sea un String
prefs.getBoolean("keystring", true);// En el caso de que sea un bool


El segundo parametro de getBoolean y de getString es el valor por defecto, en caso de que no tenga valor o no exista.

A tomar en cuenta:
Varias app pueden proveer las preferencias del usuario desde su Configuracion (Preference Activity). Por esto android provee las Preferences.
Preferences son tipicamente un par de nombre calor. Pueden ser grabadas como "Share Preferences" atraves de varias actividades de una app (Actualmente no puede ser compartida entre procesos). O puede ser informacion especifica que una actividad necesita guardar.
  1. Shared Preferences: Pueden ser usadas por todos los componentes (actividades, servicios, etc) de una app.
  2. Activity handled preferences: Estas pueden ser solamente usadas por Activity y no puede ser usada por otro componente de la app.

Shared Preferences:
Se apoya en el metodo getSharedPreferences de la clase Context . La informacion es grabada en un fichero por defecto(1) o puede ser especificado el nombre del fichero(2).

(1) Manera Recomendada coje el archivo por defecto:

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);

(2) Coje la informacion especificando el nombre del archivo:

public static final String PREF_FILE_NAME = "PrefFile";
SharedPreferences preferences = getSharedPreferences(PREF_FILE_NAME, MODE_PRIVATE);

MODE_PRIVATE es el modo de operando por defecto de las preferences. Esto significa que el fichero creado sera accedido solamente por la app que lo creo. Los otros dos modos son  MODE_WORLD_READABLE y MODE_WORLD_WRITEABLE. En MODE_WORLD_READABLE otra aplicacion puede leer los datos pero no puede modificarlos. En este caso MODE_WORLD_WRITEABLE las otras app pueden modificarlo tambien.

Para Guardar valores en la configuracion tenemos que usar SharedPreference.Editor.

SharedPreferences.Editor editor = preferences.edit();
editor.putInt("storedInt", storedPreference); // entero a ser guardado
editor.commit();

Editor tambien tiene metodos como remove() y clear() para borrar los valores del archivo de configuracion.

Activity Preferences:

El shared preferences puede ser usado por otros componentes de la aplicacion. Pero si no se necesita compartir las preferences con otros componentes y se quiere que sea privado. Se trabaja congetPreferences() y getSharedPreferences() con el nombre de la clase de la activity 

Para cojer las preferenes seria:

SharedPreferences preferences = getPreferences(MODE_PRIVATE);
int storedPreference = preferences.getInt("storedInt", 0);
El codigo para guardar valores es el mismo que con shared preferences.
SharedPreferences preferences = getPreference(MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
editor.putInt("storedInt", storedPreference); // // entero a ser guardado
editor.commit();

CURIOSIDADES DE NUESTRO CUERPO

1. Si te pica la garganta, ráscate el oído:
Al presionar los nervios de la oreja, se genera un reflejo inmediato en la garganta que produce espasmos y alivia la molestia.

2.Para escuchar mejor usa solo un lado del oído:
Si estás en una discoteca y no oyes bien lo que te dicen, gira tu cabeza y usa sólo tu oí­do derecho, ya que éste distingue mejor las conversaciones, mientras el izquierdo identifica mejor las canciones que suenan bajo.

3. Para aguantar las ganas de ir al baño piensa en sexo:
Cuando no resistes las ganas de orinar y no tienes un baño cerca, piensa en
sexo. Eso entretiene a tu cerebro y el estrés disminuye.

4.Toser mientras te vacunan reduce el dolor:
Un grupo de científicos alemanes, descubrieron que si toses al momento que te inyectan, se aumenta la presión en el pecho y en la espina dorsal, lo que inhibe los conductores de dolor de la médula.

5. Si tienes la nariz tupida:
Presiona tu paladar y la parte superior de la nariz. Toca el paladar con la lengua fuertemente y con un dedo sujeta la nariz bajo el entrecejo. Esto permite que las secreciones se muevan y puedas respirar.

6.Cuando tengas acidez duerme sobre tu lado izquierdo:
Esto permite crear un ángulo entre el estómago y el esófago, para que los ácidos no puedan pasar a la garganta.

7.Cuando te duela una muela frota un hielo en tu mano:
Debes pasar el trozo de hielo por la zona en forma de "v" que se produce entre el dedo pulgar y el í­ndice por la parte contraria a la palma. Esto reduce en un 50% el dolor, ya que este sector está conectado a los receptores de dolor de la cara.

8. Cuando te quemes, presiona la herida con un dedo:
Luego de limpiarla zona afectada, haz presión con la mano en la quemadura, ya que esto permite volver a la temperatura inicial y evita la aparición de ampollas. (para pequeñas quemaduras)

9. Cuando estés ebrio:
Apoya la mano sobre una mesa o superficie estable. Si haces esto, tu cerebro recobrará la sensación de equilibrio y evitarás que todo gire a tu alrededor.

10.Al correr, respira cuando apoyes el pie izquierdo:
Esto evitará que sientas picor en el pecho, ya que si respiras cuando apoyas el pie derecho, causas presión en el hígado.

11.Si te sangra la nariz, haz presión con tu dedo:
Si te echas para atrás puedes ahogarte con tu sangre, así­ que lo mejor es apretar con tu dedo el lado de la nariz en que tienes la hemorragia.

12.Para controlar los latidos cardiacos cuando estés nervioso:
Pon el dedo pulgar en tu boca y sopla, esto ayudará a que tu corazón deje de latir tan rápido a partir de la respiración.

13.Para aliviar el dolor de cabeza cuando tomas agua muy helada:
Al beber algo muy congelado, el paladar se enfría y el cerebro lo interpreta. Por eso debes colocar tu lengua sobre el paladar para que vuelva a su temperatura normal.

14.Previene la falta de visión cuando estás frente al PC:
Cuando pones tu vista en un objeto cercano como un computador, la vista se cansa y falla. Para ello, cierra tus ojos, contrae el cuerpo y aguanta la respiración por un momento. Luego relaja todo. Santo remedio.

15. Despierta a tus manos y pies dormidos moviendo tu cabeza:
Cuando se te duerma un brazo o la mano, gira tu cabeza de un lado a otro y verás como la sensación pasa en menos de 1 minuto, ya que las extremidades superiores se duermen, por presión en el cuello. En tanto, si es una pierna o un pie, solo camina unos segundos.

16.Fácil método para aguantar la respiración bajo el agua:
Antes de sumergirte, haz muchas respiraciones rápidas y fuertes para lograr que el ácido de la sangre desaparezca, pues éste es el que causa la sensación de ahogo.

17. Memoriza los textos en la noche:
Cualquier cosa que leas antes de dormir, la recordarás con más facilidad..


fuente: https://www.facebook.com/photo.php?fbid=435377283210729&set=a.271448989603560.66555.269366793145113&type=1