Páginas

domingo, 8 de diciembre de 2013

Lyx: (package babel error) you don't have specified a language.

I had this issue last night after to upgrade my Ubuntu 13.04 to 13.10. This is was really annoying because I did not modify anything on Lyx so I had to take some time to what it happened. All you have to do is to install the language package from Synaptic Manager on your Ubuntu. In my case was spanish language package but you can download the entire language package (400 MB more less).

sábado, 25 de mayo de 2013

Calendar to String and String to Calendar (Android - java)

How many times did you think in convert a date, that it is on String type, to Calendar type? And Calendar to String?. I sure, at least, one in your developer lifes. I want to share a very easy way to do that, and this way is what i do. If you want to do the way Calendar to String:

Calendar fecha_calendar = Calendar.getInstance(); // or whatever date you set

CharSequence fecha_charsequence = fecha_DateFormat.format("yyyy-MM-dd", c); 

String fecha_string = fecha_charsequence.toString(); // Strings are CharSequence so this step is not necessary.

So simple, so fantastic!. You can see more information about DateFormat class (Android) here Let's see its inverse case.

Calendar fecha_calendar = Calendar.getInstance(); 

String fecha_string = "2013-5-24";

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 

try 
{
 Date fecha_date = sdf.parse(fecha_string);
 fecha_calendar.setTime(fecha_date);
    
} catch (ParseException e) {

 Log.v("printf", "ERROR!: can not parsing! ");
}

It is a longer way (a little bit) but it is still simple and easy. If you know another way simpler or different, let me know. Remember this: If you are using dates in your project, parse it before you use it. Always. Don't forget it by experience with working with databases( "2013-5-24" ¡NO!, "2013-12-3" ¡NO!, 2013-12-12 ¡YES!. tell me if you know why. ;) ).

viernes, 8 de febrero de 2013

Encryption / Decryption simple class on Android platform

I've been searching for a solution about encrypt/decryt string texts like it would be for example, the password. I had no idea how to do that buy after two days, I wrote my own encryption class, ready to use:
I use AES Algorithm, and unique key value for encryption for all uses.

public class Encriptacion 
{
 private static final String ALGORITMO = "AES";
        private static final byte[] valor_clave = "0000000000000000".getBytes(); 
 // key 16 bytes lenght (what you want and of course, valid characters)

 public static String encriptar (String texto_a_encriptar) throws Exception 
 {
  
  Key key = new SecretKeySpec(valor_clave, "AES");
  
  Cipher cipher = Cipher.getInstance("AES"); 
     cipher.init(Cipher.ENCRYPT_MODE, key );
     
  byte[] encrypted = cipher.doFinal(texto_a_encriptar.getBytes("UTF-8"));
  String texto_encriptado = Base64.encodeToString(encrypted, Base64.DEFAULT);//new String(encrypted, "UTF-8");

  return texto_encriptado;
  

 }
 
 public static String desencriptar(String texto_encriptado) throws Exception
 {
  
  Key key = new SecretKeySpec(valor_clave, ALGORITMO);
  
  Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.DECRYPT_MODE, key);
        
        byte[] decodificar_texto = Base64.decode(texto_encriptado.getBytes("UTF-8"), Base64.DEFAULT);
        byte[] desencriptado = cipher.doFinal(decodificar_texto);
  
  return new String(desencriptado, "UTF-8");
 }
}
I've been doing a test and it works fine. If anyone reads it and if you want to leave a suggestion or improve, feel free to leave a message.

lunes, 14 de enero de 2013

Sqlite: comparar fechas en un select

Os quiero enseñar como resolví un caso en particular con las bases de datos. Concretamente quería obtener tuplas resultado de hacer un Select donde en el where propusiera una comparación de fechas (<) Tenemos dos fechas: una fecha es de tipo de dato Calendar y la otra, que se encuentra en la base de datos, es de tipo Timestamp. No podemos comparar un Calendar y un Timestamp directamente, sino que tenemos que convertirlos en un tipo de dato común. El primero que se nos puede ocurrir sería convertir ambas a tipo de dato String. Aquí podemos verlo:
Calendar fecha_ejemplo = Calendar.getInstance();

String fecha_1 = fecha_ejemplo.get(Calendar.YEAR) + "-" + 
           (fecha_fac.get(Calendar.MONTH)+1) +  "-" +
                           fecha_fac.get(Calendar.DAY_OF_MONTH);

Cursor c = myDataBase.rawQuery("SELECT _id, " +
          "strftime('%Y-%m-%d', fecha_2) AS fecha_2 " +
          "FROM TablaEjemplo " +
          "WHERE  fecha2 < " + fecha_1,
          new String[0] );   
Aquí podemos ver que la fecha tipo Calendar le hemos dado el formato establecido en el estándar ISO_8601 por medio de la función get(CAMPO) de Calendar. Por otra parte, haciendo uso de la función strftime()  también es posible hacer la conversión a string en el formato que describe el estándar citado anteriormente. Pero me pregunté si habría otra manera de hacerlo que no fuera convirtiéndolos a un tipo común como String. Investigando vi que podía hacerlo de otra manera: pasando las fechas a milisegundos

Calendar fecha_cualquiera; // pongamos que está inicializada a lo que sea.

Calendar fecha_1_milisegundos = Calendar.getInstance();
fecha_1_milisegundos.setTimeInMillis(fecha_cualquiera.getTimeInMillis());


Cursor c = myDataBase.rawQuery("SELECT _id, " +
              "(strftime('%s', fecha_2) * 1000) AS fecha_2" +
         "FROM TablaEjemplo " +
         "WHERE fecha_modificacion > " + 
         fecha_fac_milis.getTimeInMillis(), new String[0] );
En esta ocasión podemos también pasar tanto Calendar como Timestamp a un formato común en milisegundos. ¿Qué pensáis? Saludos.

jueves, 3 de enero de 2013

Las gracias del Windows 8

El otro día, haciendo una vista general de mi ordenador portátil, decidí que ya era hora de hacerle un "borrón y cuenta nueva", que al fin de al cabo, el nuevo año acaba de comenzar. Entonces vi que mi Windows 7 iba demasiado lento (normal supongo... no es que tampoco lo utilizara mucho) y ,por otra parte, mi Linux Mint 13 (Maya) que me recomendaron probar estaba resultando demasiado problemático y no es que me gustara demasiado. Se acabó.


Con la salida del nuevo sistema operativo de Microsoft, el Windows 8 (que lo estoy probando haber que tal me va, y si va bien la cosa, probablemente me lo compre, está a un precio más que asequible) , y con un CD-R con etiqueta Ubuntu 12.04 LTS (distribución GNU/Linux) que me grabé ayer, me dispuse a hacer un cambio radical a mi ordenador.

Consejo: haced una copia de seguridad de vuestros datos que sean relevantes, por vuestro bien. Parece un consejo muy obvio, pero que esa copia de seguridad la pongáis en cualquier lugar menos dentro de vuestro disco duro, que es el que vais a toquetear. Yo utilicé SkyDrive de Microsoft pero buenamente también podría haber utilizado DropBox, los dos son gratuitos.

Una vez hecho esto, un amigo mío(que es to buena gente y me dejó el Windows 8 en la versión de prueba de 30 días) y yo nos disponemos a hacer la instalación de Windows 8. Aprovecho la particion que tengo de Windows 7 (NTFS) para instalar el sistema junto con otra partición que hacemos (también en NTFS) para datos en general. La instalación es todo un éxito, la cosa va bien y ahora sólo queda instalar el Ubuntu. Por supuesto también aprovechando las particiones que ya tenía hechas con el Mint. Pero.... ¡¡¡¡ sorpresa !!!!. En la instalación de Ubuntu, cuando estaba por el paso de seleccionar dónde quería instalarlo (Gparted) me decía "unallocated space", es decir, que no reconoce lo que hay ahí.... ¡¡ En la instalación de windows 8 me había toqueteado la tabla de particiones !!! ¿pero qué coño...?

Total, me puse a investigar un poco, haber como podía solucionar la papeleta y....

1. Re-escribí la tabla de particiones que analice con TestDisk. Haciendo esto supuestamente ya volvería todo a la normalidad.

2. Pues no! Ahora estás más puteado que antes! guay!. Gparted ahora no me reconocía absolutamente NADA. Todo el espacio del disco era "unallocated disc" por lo que me puse manos a la obra para ver qué había pasado (otra vez).

3. Despues de estar toda la mañana de ayer buscando una solución, encontre (como era de esperar) a alguien en el mundo (a varios) que le habían pasado algo como yo y... viendo el foro... vi que la partición extendida sobrepasaba el tamaño del disco... capacidad de todas las particiones > capacidad disco (????) ¿cómo ha pasado esto? Ni idea... pero ha tenido que ser el Windows 8 seguro. Total, que lo que hago es un redireccionado de la partición extendida para que no exceda el tamaño del disco. Lo he hecho con fdisk. He intentado poner el ultimo sector del disco a esta partición pero no me dejaba.. asi que he tenido que dejar 1 sector del disco inutilizado (unos 10 MiB - en fin... no hay beneficio sin sacrificio). Y todo arreglado.. ahora Gparted me reconoce las particiones y voy a instalar ubuntu desde ya...


Hoy por hoy, estoy muy satisfecho de lo que hice, esa sensación de hacer el trabajo bien hecho (o medio bien) y.. parece que tengo un ordenador totalmente diferente.

En fin, mi primera entrada al blog, haber si la próxima le añado fotitos o algo para que esté más mona.

Saludos.