martes, 25 de mayo de 2010

Modificar bases de datos en android

Casi todas las apliaciones android guardan información en bases de datos, el propio teléfono soporta nativamente SQLite3.

Las bases de datos se guardan en el directorio /data/data/nombre.paquete.programa/databases/
Para copiar una base de datos del teléfono al ordenador tan solo hay que hacer (tras tener el android SDK instalado).

adb pull /data/data/nombre.paquete.programa/databases/example_database.db .

Una vez en el ordenador se pueden hacer las comprobaciones que se necesiten con cualquier cliente sqlite3.

Para pasar de nuevo la base de datos modificada al móvil se puede hacer con el siguiente comando.

adb push example_database.db /data/data/nombre.paquete.programa/databases/

sábado, 22 de mayo de 2010

Functors en C++

Los functors se definen como 'objetos función'.
Son la evolución natural de los punteros a función de C, un ejemplo de la sintaxis para definir un functor es el siguiente.

#include <iostream>
#include <string>
#include <cmath>

using namespace std;

class PrinterFunctor{
private:
string msg;

public:
PrinterFunctor(string _msg){
msg = _msg;
}

void operator()(){
cout << msg << endl;
}
};


int main() {
PrinterFunctor pf("Printing from printer functor");
pf();

}

Para crear un functor simplemente hay que redefinir el operador (), tras eso podremos llamar al functor como si fuera una función más.

Con un functor podemos implementar una función 'resumible', es decir, una función que recuerde el estado anterior para producir el siguiente. Por ejemplo.

class PrimeGenerator{
private:
int currentPrime;

public:
PrimeGenerator(int _prime){
currentPrime = _prime;
}

bool isPrime(int n){
int root = (int) sqrt(n);

for(int i=2; i<root+1; i++){
if(n%i==0) return false;
}

return true;
}

int operator()(){
int n = currentPrime;

while(1){
n++;
if(isPrime(n)){
currentPrime = n;
return currentPrime;
}
}
}
};

Esta clase devolverá el siguiente número primo cada vez que la llamemos, si hacemos lo siguiente generará los 100 primeros números primos empezando por 5.

int main() {
PrimeGenerator primeGenerator(5);
for(int i=0; i<100; i++){
cout << primeGenerator() << endl;
}
}

domingo, 16 de mayo de 2010

Wingedbox


Este post es para anunciar la salida de un nuevo proyecto, wingedbox.

Es un proyecto lanzado por kikorb y por mí (javiyu). El concepto detrás de esta nueva web es compartir ficheros de una forma más ágil con tus amigos, no encontramos nada que encajara con nuestras necesidades así que decidimos hacerlo nosotros mismos.

Se le ha llamado "twitter de ficheros" de forma bastante acertada, ya que describe bastante bien la funcionalidad básica. Aún está en fase alpha pero realmente está teniendo muy buena acogida.

Pronto saldrá tanto el API público entre otras novedades, ya están disponible la visualización online de imágenes y fotos y el streaming de música.

Aún no tenemos buzón de sugerencias en la web, así que si tenéis algún tipo de duda o sugerencia podéis escribir un email tanto a kikorb como a mí.

sábado, 15 de mayo de 2010

Bloques with de python

En Java es muy común la combinación de bloques try catch finally para obtener/liberar recursos de forma segura.

En python hay otra forma más elegante de hacerlo.

class database_connection:
def __enter__(self):
print("Open database connection")
return 1
def __exit__(self, type, value, traceback):
print("Close database connection")

with database_connection() as db:
print(db)

Al definirnos una clase con los métodos __enter__ y __exit__ y ejecutarla en un bloque with se nos asegura que:

1) Al entrar al bloque se ha ejecutado el método __enter__.
2) Tanto si hay un error en el bloque with como si termina correctamente, los recursos serán liberados (llamada a la función __exit__).
3) Opcionalemente se puede devolver un valor para usarlo dentro del bloque (en este caso db), aunque no es obligatorio.

lunes, 3 de mayo de 2010

Web Storage, sessionStorage y localStorage en html 5

Con el nuevo estándar html 5 se ha introducido el concepto de web storage.

Mediante el objeto sessionStorage se puede guardar información relativa solo a la ventana actual, es decir, a diferencia de las cookies, aunque tengamos dos ventanas del navegador abiertas en una pagina del mismo dominio, la variable sessionStorage será única para cada ventana.
La sintaxis es muy sencilla, para guardar el email del usuario se puede hacer algo como lo siguiente.

sessionStorage.email='mail@sever.com'

Para recuperarlo después tan solo hay que ejecutar:

sessionStorage.email

Con el objeto localStorage se guarda información en local de forma permanente, entre ventanas del navegador, de forma global y por dominio. La sintaxis para utilizarlo es similar a la de sessionStorage.

sábado, 1 de mayo de 2010

Compilar a código ensamblador en formato intel con gcc

Aunque por defecto gcc produce código ensamblador con sintaxis AT&T al pasar la opción -S también es posible hacer que la salida sea con formato Intel.

Tan solo hay que ejecutar el siguiente comando.

gcc -S -masm=intel proc.c

Realizar las modificaciones que sean necesarias y después para hacer el enlazado.

gcc prog.s -o prog