msgbartop
Desarrollador Web, Android y iOS
msgbarbottom

¿Por qué pierdes el tiempo programando en tu tiempo libre?

Si, he dicho “perder el tiempo“. Exactamente eso es lo que te harán creer los que no lo hacen. Te harán parecer idiota por no dedicar tu tiempo libre a cosas más productivas como ver series, leer libros o cualquier otra cosa que ellos prefieran hacer.

Creo que si eres un apasionado de la programación, en tu tiempo libre te apetecerá probar nuevos lenguajes, escuchar charlas de algún evento al que no pudiste asistir, desarrollar un proyecto personal, etc.

Ojo! No quiere decir que no veas series, no vayas al cine o no leas libros. No somos bichos raros sin vida social, por mucho que quieran hacértelo parecer. Una cosa no quita la otra. De hecho, serás más selectivo con lo que ves y realmente verás lo que de verdad te gusta.

Programadores que aprenden “sobre la marcha” en su trabajo generarán proyectos de baja calidad y, muy posiblemente, con errores. No les pidas que hagan algo que se sale de su ámbito, no querrán aprender, solo seguir con lo que están haciendo. Te puedes encontrar con que tengas que deletrear “vim” a una persona con varios años de experiencia programando o explicar que es “git”. Hay otras que programan con un framework en particular por que es el que utilizan en su trabajo y no han probado más, ni siquiera saben por que lo utilizan, lo utilizan y punto.

Piensa que es lo que quieres estar haciendo dentro de 5 años. Estoy muy seguro de que si no aprendes por tu cuenta estarás haciendo lo mismo que ahora. Y 5 años en este mundillo es mucho tiempo y puede que todo sea muy distinto. Incluso que ya no hagan falta perfiles como el tuyo.

Lo ilustro con una imagen de @betinorama

1601448_448639595239362_1263236312_n

Hace poco un amigo me preguntó que es lo que tenía que hacer para avanzar en su profesión, que en su empresa se sentía estancado haciendo siempre lo mismo. Le recomendé que mirara alguna empresa donde le gustaría trabajar y viese sus ofertas de empleo. Que mirase el tipo de perfil que buscan y aprendiese para llegar a ser de ese perfil. En un tiempo quizás esté preparado para ir a hacer una entrevista (o entrar en otra empresa que pidan un perfil similar). Eso implica malgastar tu tiempo en aprender, en formarte.

Otro caso: por segundas navidades consecutivas me he encontrado con un conocido que me decía que su pareja (programadora java) estaba en paro. La primera vez le dije que la suerte que tenemos es que es relativamente sencillo “reciclarnos”, que aprendiese algo nuevo que le llamara la atención (Android, iOS, web, etc.) y buscara un trabajo diferente y relacionado con lo que estaba aprendiendo. Estas últimas navidades estaba exactamente en la misma situación. Eso sí, seguía siendo programadora java. Supongo que prefirió no perder el tiempo en aprender algo nuevo.

Programadores entusiastas de su profesión formarán un equipo apasionado por su trabajo, lo que sin duda generará un resultado de calidad y un ambiente excelente. Se acabó lo de desear que llegue la hora de salir o el fin de semana por que estás agobiado o te aburre lo que haces.

Querrás que sea lunes.

No solo para seguir programando si no para compartir tu tiempo con personas apasionadas por su trabajo, hablar de lo nuevo que has leído el fin de semana, probar nuevas tecnologías, aprender un nuevo lenguaje recomendado por algún compañero, comentar el último capítulo de la serie que todos veis, etc.

No en todas las empresas se puede hacer lo del último párrafo, pero las personas entusiastas por su trabajo suelen encontrar empresas donde seguir creciendo y donde se les permite seguir aprendiendo.

Y si tu trabajo ya es así, significa que ya has perdido tu tiempo en aprender y ahora donde aprendes mucho más es en tu trabajo diario. Aprovéchalo.

Etiquetas: ,

Loguear un usuario manualmente en Symfony2

Es posible que queramos loguear automaticamente a un usuario en Symfony2 sin que haga falta que introduzca su email y contraseña. El caso típico es cuando un usuario se acaba de registrar en nuestra web y queremos loguearle en el sistema sin que tenga que volver a introducir sus datos.

En versiones anteriores a Symfony 2.3, este código funcionaba correctamente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// security.yml
providers:
    main:
        entity: { class: Application\Bundle\DefaultBundle\Entity\User, property: username }
 
firewalls:  
    secured_area:
        pattern:    ^/
        form_login:
            check_path: /login_check
            login_path: /login
        logout:
            path:   /logout
            target: /
        anonymous: ~

Y en nuestro código teníamos lo siguiente:

1
2
3
4
$user = $em->getRepository('ApplicationDefaultBundle:User')->findOneBy(array('id' => 117));
$provider_name = "main";
$token = new UsernamePasswordToken($user, null, $provider_name, $user->getRoles());
$this->get('security.context')->setToken($token);

A partir de Symfony 2.3, esto ha cambiado un poco. En el código anterior vemos que a la clase UsernamePasswordToken le pasamos el nombre del provider como tercer parámetro.

En Symfony2 >= 2.3 tenemos que pasar el nombre del firewall y en el security.yml, especificar que provider utiliza ese firewall.

Lo vemos a continuación:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// security.yml
providers:
    main:
        entity: { class: Application\Bundle\DefaultBundle\Entity\User, property: username }
 
firewalls:  
    secured_area:
        pattern:    ^/
        provider: main # añadimos el nombre del provider a utilizar
        form_login:
            check_path: /login_check
            login_path: /login
        logout:
            path:   /logout
            target: /
        anonymous: ~

Y el código lo modificaremos de la siguiente forma:

1
2
3
4
$user = $em->getRepository('ApplicationDefaultBundle:User')->findOneBy(array('id' => 117));
$firewall_name = "secured_area"; // Ahora utilizamos el nombre del firewall
$token = new UsernamePasswordToken($user, null, $firewall_name, $user->getRoles());
$this->get('security.context')->setToken($token);

Espero que os sirva de ayuda :)

Etiquetas: , , , ,

Videojuego “Encuentra las parejas” para iOS y presentación de NazcaLabs

Llevo un tiempo leyendo y aprendiendo mucho sobre programación de videojuegos. Cuando empecé, quise hacer un juego sencillo para empezar a practicar cuanto antes y así surgió la idea de hacer un juego tipo “memory”: “Encuentra las parejas para iPhone“.

Captura de pantalla de Simulador iOS 17.11.2013 18.44.59

Es mi primer juego publicado y espero que no sea el último. No me ha llevado demasiado tiempo terminarlo pero cuanto más profundizaba en el desarrollo de videojuegos, más ganas tenía de hacer otras cosas en lugar de este juego más “sencillo”. El juego está tanto en inglés como en castellano, se activará automaticamente uno u otro según el idioma que tengamos configurado en el iPhone.

Lo he desarrollado con el framework cocos2d, del que hice un curso de la mano de agonzalez_net. Es un framework para desarrollo de videojuegos para iOS, open source y gratuito. Si lo tuviese que empezar ahora seguramente optaría por cocos2d-x, que es la versión multiplataforma del framework programado en c++. Con cocos2d-x tengo como objetivo programar un juego multijugador, del que hice un vídeo de mis primeras pruebas.

Si te descargas el juego, verás que en la pantalla de splash aparece el nombre de NazcaLabs. La idea que tengo a partir de ahora es publicar todos mis nuevos proyectos bajo esta marca y, quizás, algún día la pueda convertir en mi propia agencia/estudio/marca.

Dentro de poco actualizaré la web para enseñar los proyectos que vaya realizando, así como un blog sobre desarrollo web, móvil y videojuegos. Os podéis suscribir a las actualizaciones desde la portada de NazcaLabs.

nazcalabs-logo

Aún no me he dedicado a darle difusión, lo haré en cuanto tenga el blog y empiece a publicar artículos. Si me queréis seguir en las redes sociales, lo podéis hacer en estos enlaces:

Twitter: https://twitter.com/nazcalabs
Facebook: https://www.facebook.com/nazcalabs
Google+: https://plus.google.com/+Nazcalabs
Github: https://github.com/nazcalabs

Gracias! :)

Etiquetas: , , , ,

Obtener coordenadas GPS a partir de una dirección con PHP

Con esta sencilla función en PHP podremos obtener las coordenadas GPS a partir de una dirección.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
 
function getCoordinates($address){
    $address = urlencode($address);
    $url = "http://maps.google.com/maps/api/geocode/json?sensor=false&address=" . $address;
    $response = file_get_contents($url);
    $json = json_decode($response,true);
 
    $lat = $json['results'][0]['geometry']['location']['lat'];
    $lng = $json['results'][0]['geometry']['location']['lng'];
 
    return array($lat, $lng);
}
 
 
$coords = getCoordinates("Passeig de Gracia, Barcelona, Barcelona");
print_r($coords);
 
 
/*
Resultado:
 
Array
(
    [0] => 41.3936254
    [1] => 2.1634189
)
*/

Etiquetas: , , , , ,

Intraemprendedores o emprendedores por cuenta ajena

Después de leer en el blog de Marc Vidal el post con título “Emprender por cuenta ajena” quería explicar lo que yo pienso sobre el tema de “intraemprendedores“.

Como a otros muchos programadores, se me suelen ocurrir ideas de posibles proyectos. Algunos son simples tonterías, otros podrían llegar a tener notoriedad y otros, en mi opinión, podrían llegar a tener éxito si son bien ejecutados.

Yo era de los que pensaba: “Como voy a decir a mi empresa esta idea que he tenido, si la puedo hacer yo en mi tiempo libre”. Nada más lejos de la realidad. A no ser que sea un proyecto bastante sencillo o quieras crear un MVP, el resultado final no suele ser el que tenías en la cabeza.

Y no solo eso, tardarás más en ejecutar la idea siendo tu solo, tu propio diseño no se podrá comparar al que haría un diseñador “de verdad”, no serás capaz de darle la difusión que merece, etc. Por no hablar de que varias cabezas piensan mejor que una sola por lo que, al compartir tu idea entre más personas, seguro que surgen nuevas funcionalidades que no habías pensado en un primer momento.

Teniendo en tu propia empresa diseñadores, programadores, community manager, comerciales, etc. sin duda que el resultado final será mejor que el que conseguirías tu solo.

Para que tu idea se acabe realizando en tu empresa, hay que tener en cuenta varias cosas.

- La primera es que a tu empresa le parezca que tu idea es suficientemente buena como para invertir dinero/tiempo en ella. Será muy importante que a la idea se la puede obtener rendimiento económico.

- Tu papel en el proyecto. Aquí depende del tipo de persona que seas: quizás quieras ser el jefe del proyecto y te quieras encargar de su planificación. Puede que prefieras que la parte de “gestión” la lleve otra persona y tu simplemente la quieras programar, etc.

- Si se acaba desarrollando y tiene éxito, que clase de recompensa obtendrás. Dicen que los programadores somos un poco narcisistas y solamente con ver nuestro nombre en los créditos nos conformaríamos… No se como serás tu, pero yo propondría que te diesen un porcentaje de los beneficios.

- Quizás debas hacer un esfuerzo extra y dedicar más horas. Aunque la empresa haya decidido desarrollarlo (completamente o en parte), puede que tengas que trabajar un poco más en tus ratos libres. No debería ser problema, el proyecto es tu idea y estarás motivado para hacerlo. Pero ojo, una cosa es un esfuerzo extra y otra muy diferente es no dedicar nada de tiempo en la empresa y todo en tu tiempo libre.

Esta claro que esto depende mucho del tipo de empresa en la que estés. En una empresa grande no es que no les guste la idea, si no que seguramente no tengas ni la posibilidad de comunicárselo. En una empresa más pequeña es más que posible que al menos te escuchen.

Yo suelo compartir mis ideas con mi empresa. Algunas se harán y otras no, pero por intentarlo que no quede. Tu empresa seguramente en lo primero que piense será en como monetizarlo. Si es la mejor idea del mundo pero es muy difícil que se puedan obtener beneficios de ella, es un mal negocio para ti y para tu empresa.

Si deciden no hacerla, siempre podrías intentarlo tu solo o incluso montar tu propia startup donde desarrollar tus propias ideas.

Suelo pensar que las ideas que se nos ocurren nos vienen por que tenemos ganas de hacer algo que realmente nos guste y nos motive. Una empresa está obligada a ganar dinero y se suelen aceptar proyectos soporíferos o bastante aburridos. Normalmente estos proyectos se compensan con otros más “divertidos” (o por tener buen sueldo, sin llegar a estancarte solamente por tener buena nómina) o, quien sabe, con tu propia idea de proyecto que han decidido desarrollar.

Etiquetas: , ,

Después de probar Blackberry, Android y iPhone, me quedo con este último

Llevaba (y llevo) con Android desde que me hice con un HTC Magic con Android 1.6. Nunca me he considerado un fanboy de Android pero si es verdad que era mi sistema móvil favorito y no lo cambiaba por ningún otro (aún siendo consciente de sus limitaciones).

He estado programando aplicaciones tanto para Android, Blackberry y iPhone. Decidí utilizar cada uno de esos móviles mientras estuviese desarrollando cada aplicación para “obligarme” a probar cada sistema operativo.

No tengo ningún móvil con Windows Phone, por lo que no he podido comparar este sistema operativo.

La Blackberry es un Dev Alpha C, el equivalente al Q10, con el sistema operativo Blackberry 10.
El iPhone es un iPhone 4 con iOS 6.1.
El Android es un Galaxy Nexus con Android 4.3.

Antes de empezar, tengo que decir que este análisis es según mi uso del teléfono y no es un análisis en profundidad de cada dispositivo. Tampoco hago mucho incapié en las aplicaciones excepto en Blackberry, que si que eché en falta algunas más. Tanto en Android como en iPhone podemos encontrar casi las mismas aplicaciones y si no existen alternativas para casi todos los casos.

En lo que me baso para este análisis básico como usuario normal es: fluidez, moverte entre aplicaciones, utilizar el navegador gps, carga/duración de la batería, etc.

Lo peor de la Blackberry:

  • Al ser un Dev Alpha (solo para desarrolladores) y, aunque el hardware es el mismo que en una Q10, la batería era “algo peor” y casi nunca me duraba hasta la noche sin apagarse :( Supongo que en la Q10 esto estará solucionado aunque en los foros que leo parece que existe el mismo problema. Este motivo fue determinante para dejar de utilizarla como móvil habitual.
  • Me consta que cada vez hay más aplicaciones/juegos pero cuando yo la he estado probando he echado en falta algunas más.

Lo mejor de la Blackberry:

  • Es el teléfono más fluido que he probado con diferencia. Cambiar entre aplicaciones es rapidísimo y sin esperas. Mi prueba de fuego es cambiar entre aplicaciones utilizando el navegador gps. Ni iPhone ni Android son tan rápidos en pasar del navegador gps a cualquier otra aplicación.
  • El Dev Alpha C cuenta con teclado físico. Ya hacía años que no utilizaba un teclado físico en el móvil y la verdad es que, una vez te has vuelto a acostumbrar, es muy rápido (tanto escribir como la infinidad de “shortcuts” que tiene).

Vayamos con lo mejor de Android:

  • La barra de notificaciones está a años luz de cualquier otro. Es lo que más hecho de menos tanto en Blackberry como en iPhone.
  • Moverte entre aplicaciones en segundo plano (o cerrarlas) es mucho más intuitivo y fácil.
  • La sincronización con la cuenta de Google. En iPhone y Blackberry es un “jaleo” sincronizar contactos, calendario, etc.

Y lo peor de Android:

  • Girar el móvil. Aunque se puede evitar, Android interpreta esta acción como un “reinicio” de la actividad actual. Esto hace que muchas veces al girar el móvil haya exclamado: “¡mierda!”. Depende de como esté programada la aplicación puedes incluso perder lo que estabas haciendo.
  • Puede estar toda la mañana cargando la batería por USB. Demasiado tiempo.
  • Otro problema con la carga de la batería es cuando lo tenemos conectado al mechero del coche. Si estás utilizando el navegador gps, la batería se descarga casi a la vez de lo que se carga (a veces incluso se descarga más rápido de lo que es capaz de cargar). Lo que hace que en viajes largos, por ejemplo Barcelona-Bilbao, hace que casi siempre llegue con la batería en rojo o se me apague el móvil.
  • La prueba de fuego del navegador gps: Es “insufible” cambiar a otra aplicación y luego volver al navegador gps: es lento, se queda la pantalla en negro, se ha perdido la señal gps, etc.

Y por último, vamos con lo mejor del iPhone.

  • Girar la pantalla es rápido. Muy rápido.
  • Se carga por USB en poco tiempo, entre 1 y 2 horas.
  • Conectado al mechero del coche, la batería se carga completamente utilizando el navegador gps y no se va descargando.
  • La prueba de fuego de cambiar entre aplicaciones utilizando el navegador gps es casi tan fluida como en Blackberry (aunque creo en Blackberry es mucho más rápido).

Lo peor del iPhone:

  • La barra de notificaciones no es útil (al menos no la saco tanto rendimiento como en Android). Realmente echo de menos ver de un vistazo las notificaciones pendientes.
  • Lo de pulsar dos veces el botón para acceder a las aplicaciones en segundo plano no es tan intuitivo como en Blackberry o Android.
  • Sincronizar con tus datos de Google. Admito que utilizo Google para casi todo: email, calendario, drive, picassa, etc. Para algunas hay aplicación específica pero para sincronizar información como contactos y calendario hay que seguir una serie de pasos (nada claros) para conseguirlo.

Y finalmente he decidido quedarme con el iPhone. En ningún momento he hecho referencia a la “calidad” de las aplicaciones, el número de apps de pago, la “libertad” de Android, el “rechazo por que sí” a Blackberry, etc.

Las ventajas que encuentro en mi día a día son mayores que en cualquiera de los otros dos dispositivos.

Etiquetas: , , , ,

Funciones virtuales en C++

En la programación orientada a objetos nos encontramos con el concepto de polimorfismo. No es otra cosa que la capacidad para que diferentes clases derivadas de una misma superclase, utilicen una misma función de forma diferente.

El polimorfismo en C++ se implementa con la ayuda de la funciones virtuales.

Nada mejor que ilustrarlo con un ejemplo.

Tenemos dos clases:

1
2
3
4
5
6
7
8
9
10
11
class Animal
{
    public:
        void eat() { std::cout << "Estoy comiendo comida genérica"; }
}
 
class Cat : public Animal
{
    public:
        void eat() { std::cout << "Estoy comiendo comida de gato"; }
}

En la función main tenemos:

1
2
3
4
5
Animal *animal = new Animal;
Cat *cat = new Cat;
 
animal->eat(); // Imprime: "Estoy comiendo comida genérica"
cat->eat();    // Imprime: "Estoy comiendo comida de gato"

Perfecto, en este caso no necesitamos funciones virtuales y todo funciona como esperamos.

Pero si por cualquier motivo necesitamos llamar a la función eat() desde una función intermedia:

1
2
// Podemos poner esta función al principio de nuestro archivo main.cpp
void oneFunction(Animal *animal) { animal->eat(); }

Modificamos nuestra función main:

1
2
3
4
5
Animal *animal = new Animal;
Cat *cat = new Cat;
 
oneFunction(animal) // Imprime: "Estoy comiendo comida genérica"
oneFunction(cat)    // Imprime: "Estoy comiendo comida genérica"

Como podemos comprobar, en este caso siempre se llama a la función eat() de la superclase y no a la de la clase hija (Cat).

La solución es convertir la función eat() en una función virtual:

1
2
3
4
5
class Animal
{
    public:
        virtual void eat() { std::cout << "Estoy comiendo comida genérica"; }
}

En el main:

1
2
oneFunction(animal) // Imprime: "Estoy comiendo comida genérica"
oneFunction(cat)    // Imprime: "Estoy comiendo comida de gato"

Aunque no es necesario, a mi me gusta indicar que una función es virtual también en la clase hija. Así, si nos encontramos con una clase de otro programador que hereda de una superclase, sabremos de un solo vistazo cuales son las funciones sobreescritas (override).

Por tanto, nuestra clase Cat quedaría así:

1
2
3
4
5
class Cat : public Animal
{
    public:
        virtual void eat() { std::cout << "Estoy comiendo comida de gato"; }
}

Etiquetas: , , ,

Bases de datos SQLite en iOS: Librería FMDB

Muchas aplicaciones para iOS necesitan guardar datos según vamos haciendo uso de ella o ya cuentan con una base de datos inicial a la que se irán haciendo consultas. Existen varias formas de guardar información en iOS: CoreData, NSUserDefaults, bases de datos SQLite, etc. Si utilizamos bases de datos SQLite, consultar, insertar, actualizar o borrar datos se puede convertir en una tarea bastante engorrosa, “arcaica” y propensa a errores.

Para hacer consultas a SQLite desde iOS, contamos con un framework open source llamado FMDB que podemos encontrar con Github. FMDB no es más que un “ayudante” para hacernos la vida más fácil a la hora de tratar con bases de datos SQLite en aplicaciones para iPhone o iPad.

Estos son los pasos que necesitamos hacer para integrar el framework FMDB en nuestro proyecto:

1. Descargar el código fuente de FMDB desde Github.

2. Añadir los siguientes ficheros al proyecto:
- FMDatabase.h
- FMDatabase.m
- FMDatabasePool.h
- FMDatabasePool.m
- FMResultSet.h
- FMResultSet.m

3. Añadimos el framwork “libsqlite3.0.dylib” al proyecto. Para hacer esto, accedemos a los “target settings”, hacemos click en “Summary” y en la sección “Linked Frameworks and Libraries” pulsamos en el botón “+” para añadir un nuevo framework al proyecto. Buscamos “libsqlite3.0.dylib” y aceptamos.

4. En el controlador donde queramos hacer consultas a la base de datos SQLite, deberemos importar estas dos cabeceras:
#import “sqlite3.h”
#import “FMDatabase.h”

5. Y listo, ya podemos empezar ;)
 

Crear una nueva tabla

1
2
3
4
5
6
7
8
NSArray *docPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDir = [docPaths objectAtIndex:0];
NSString *dbPath = [documentsDir stringByAppendingPathComponent:@"mibasededatos.sqlite"];
 
FMDatabase *database = [FMDatabase databaseWithPath:dbPath];
[database open];
[database executeUpdate:@"CREATE TABLE usuarios (id INTEGER PRIMARY KEY DEFAULT NULL, nombre TEXT DEFAULT NULL, apellido TEXT DEFAULT NULL, edad INTEGER DEFAULT NULL)"];
[database close];

En las líneas 1-6 indicamos la ruta de nuestro fichero de base de datos (“mibasededatos.sqlite” en este ejemplo) y la abrimos para poder trabajar con ella.

La base de datos es creada y guardada en directorio Documents. En iOS solo puedes crear, actualizar, borrar o insertar datos en una base de datos que se encuentre en la carpeta Documents. Si solo quieres consultar datos (y no modificarlos), puedes crear la base de datos en cualquier lugar del proyecto. Si la aplicación cuenta con una base de datos ya existente, la tienes que copiar al directorio Documents.

Para trabajar con bases de datos SQLite desde nuestro Mac, recomiendo la aplicación SQLite Database Browser (gracias a @sloy5101 por la recomendación).

Es muy importante que no nos olvidemos de cerrar la conexión a la base de datos como podemos ver en la línea 8.
 

Realizar consultas a la base de datos

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
NSArray *docPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDir = [docPaths objectAtIndex:0];
NSString *dbPath = [documentsDir stringByAppendingPathComponent:@"mibasededatos.sqlite"];
 
FMDatabase *database = [FMDatabase databaseWithPath:dbPath];
[database open];
FMResultSet *results = [database executeQuery:@"SELECT * FROM usuarios"];
// Podemos utilizar variables en las consultas
// FMResultSet *results = [database executeQuery:@"SELECT * FROM usuarios WHERE name = ?", @"Jon"];
while([results next]) {
    NSLog(@"Id: %d", [results intForColumn:@"id"]);
    NSLog(@"Nombre: %@", [results stringForColumn:@"nombre"]);
    NSLog(@"Apellido: %@", [results stringForColumn:@"apellido"]);
    NSLog(@"Edad: %d", [results intForColumn:@"edad"]);
}
[database close];

FMDB nos ofrece diferentes métodos para obtener el tipo de dato correcto y evitar posibles errores:

- intForColumn:
- longForColumn:
- longLongIntForColumn:
- boolForColumn:
- doubleForColumn:
- stringForColumn:
- dateForColumn:
- dataForColumn:
- dataNoCopyForColumn:
- UTF8StringForColumnIndex:
- objectForColumn:
 

Insertar datos en una tabla

1
2
3
4
5
6
7
8
NSArray *docPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDir = [docPaths objectAtIndex:0];
NSString *dbPath = [documentsDir   stringByAppendingPathComponent:@"mibasededatos.sqlite"];
 
FMDatabase *database = [FMDatabase databaseWithPath:dbPath];
[database open];
[database executeUpdate:@"INSERT INTO usuarios (id, nombre, apellido, edad) VALUES (?, ?, ?, ?)", [NSNumber numberWithInt:1], @"Jon", @"Segador", [NSNumber numberWithInt:29], nil];
[database close];

Lo único a tener en cuenta para insertar datos en una tabla con el método executeUpdate: (en realidad, para cualquier método que acepte parámetros), es que deben ser objetos.
 

Actualizar datos

1
2
3
4
5
6
7
8
NSArray *docPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDir = [docPaths objectAtIndex:0];
NSString *dbPath = [documentsDir   stringByAppendingPathComponent:@"mibasededatos.sqlite"];
 
FMDatabase *database = [FMDatabase databaseWithPath:dbPath];
[database open];
[database executeUpdate:@"UPDATE usuarios SET nombre = ? WHERE id = ?", @"Luis", [NSNumber numberWithInt:1], nil];
[database close];

 

Borrar registros de la base de datos

1
2
3
4
5
6
7
8
NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDir = [documentPaths objectAtIndex:0];
NSString *dbPath = [documentsDir   stringByAppendingPathComponent:@"mibasededatos.sqlite"];
 
FMDatabase *database = [FMDatabase databaseWithPath:dbPath];
[database open];
[database executeUpdate:@"DELETE FROM usuarios WHERE id = ?", [NSNumber numberWithInt:1], nil];
[database close];

Etiquetas: , , , , , , , ,

8 consejos para realizar proyectos como freelance mientras trabajas por cuenta ajena

Como programador, es posible que en algún momento te hayas planteado buscar proyectos (o se han puesto en contacto contigo) para programarlos en tu tiempo libre y sacarte un pequeño sobresueldo, coger experiencia en el trato con clientes, etc. Hay varios puntos importantes que creo que “obviamos” cuando queremos dar este paso y que son muy importantes si no queremos fracasar estrepitosamente.

Habrá bastantes más puntos que añadir a esta lista (no dudes en dejar tu opinión en los comentarios), pero estos son algunos de los más importantes bajo mi punto de vista y por mi experiencia personal:

1) Si no has participado en el análisis del proyecto, exige un documento de funcionalidad o especificación donde se explique con detalle como debe funcionar. Tener una visión muy general del proyecto hará que tengas dudas o desarrolles alguna funcionalidad que no se corresponde con lo que la otra parte tenía en mente. Si has participado, doy por hecho que tienes una visión más específica de lo que hay que hacer. Aún así, escribe ese documento para tenerlo todo claro.

2) Si solo vas a programar y no diseñar/maquetar, debes pedir el diseño cuanto antes por diferentes motivos: si ya tienes el diseño, es más rápido empezar a situar cada sección en el lugar adecuado, algo sin diseño es “feo” de enseñar, etc. Un cambio de diseño a mitad de proyecto puede echar por tierra lo que has hecho hasta ahora (especialmente sensible en el caso de apps móviles).

3) Estable tu precio/hora o precio por proyecto (recomendado para proyectos largos) y se inflexible en este aspecto. No rebajes el precio pensando que si no no te aceptarán el presupuesto. Cobres más o cobres menos, te exigirán los plazos, funcionalidades, etc. y trabajarás las mismas horas o más.

4) Cualquier cambio en la los requisitos o en el documento de funcionalidad, lo deberás cobrar aparte o pactar dejarlo para una segunda fase. Esos cambios a mitad de desarrollo pueden “matar” tu motivación en el proyecto, aumentarán las horas de programación, tu estrés para llegar a la fecha de entrega (por que eso si que no variará aunque se produzcan cambios en mitad del proyecto), etc. Piensa en el punto anterior e imagina que has rebajado el precio para que aceptaran el presupuesto.

5) Exige cobrar un porcentaje al empezar el desarrollo y el resto al entregarlo. Imagina que no te llegan a pagar o deciden pagarte menos de lo que acordasteis.

6) Establece un día a la semana para enseñar lo que has programado hasta ese momento y exige feedback. Es importante que vayas mostrando tu trabajo y que la otra parte de el visto bueno. Asegúrate de que lo prueban de verdad (registros en la base de datos, logs, etc.) y no que solo le hayan echado un vistazo “por encima”.

7) Sé consciente de las horas que vas a trabajar. No hagas la estimación pensando que harás más horas al día para poder llegar antes a la fecha de entrega y que así te acepten el presupuesto. Si trabajas por cuenta ajena solo tendrás las tardes/noches para realizar el trabajo. Piensa que no podrás dedicar todo ese tiempo “libre” al proyecto ya que siempre hay imprevistos: ir a hacer la compra, sales tarde de la oficina, vienen unos amigos, quieres ir al gimnasio, etc. Recuerda que al día siguiente tienes que madrugar para ir a trabajar de nuevo (el trabajo que realmente te da de comer) y debes ir descansado.

8) Relacionado con el punto anterior y que merece un apartado separado: No descuides a tu familia (mujer, novia, amigos, etc.) por querer dedicar más horas al proyecto. Piensa por un momento: Has estimado que vas a trabajar más horas al día para poder dar una fecha de entrega más cercana, rebajaste tu precio/hora para que te aceptaran el presupuesto, estás cansado ya que no duermes las horas necesarias, discutes con tu mujer por que te estás pasando todo el mes en el ordenador, día estresante en la oficina por que ha habido problemas en uno de los proyectos, etc. Resultado: Desmotivación total y absoluta.

Como puedes ver, he utilizado mucho la palabra “exige“. Si, tu también debes exigir cosas ya que la otra parte te exigirá a ti constantemente, dejándote prácticamente toda la responsabilidad y, por tanto, toda la culpa si se retrasa la fecha de entrega o si hay cosas que no están bien (aunque sea algo que la otra parte no lo había pensado en detalle o que una vez programado no lo ha probado lo suficiente).

Cada cliente es un mundo. No pienses que porque conozcas personalmente (o por Twitter, Linkedin, etc.) al cliente, debes fiarte y obviar alguno de los puntos anteriores. También depende del proyecto y, si es corto, puedes sacrificarte una o dos semanas y meterle horas, aunque no lo recomiendo si supera ese tiempo.

Si te sientes identificado o piensas que falta algún punto importante, hazlo en los comentarios! ;)

Etiquetas: , , , , , , ,

Programación iOS: Detectar resolución del iPhone5 desde nuestra aplicación

El iPhone 5 introdujo una nueva resolución que mantener a la hora de desarrollar nuestras aplicaciones para iOS. La resolución del iPhone 5 es de 640×1136 px en 4″ de pantalla, lo que hace que sea más alargada que en los dispositivos anteriores.

Es posible que queramos detectar si la aplicación se está utilizando desde un iPhone 5 y cambiar el comportamiento de algún elemento.

Hay varias formas de hacerlo, esta es una de ellas:

1
#define IS_IPHONE5 (([[UIScreen mainScreen] bounds].size.height-568) ? NO : YES)

Hemos definido una constante que nos servirá para detectar la resolución del iPhone. En nuestro código solo tendremos que utilizar un bloque if y actuar en consecuencia.

1
2
3
4
5
6
7
8
if (IS_IPHONE5)
{
    // La app se está ejecutando en un iPhone 5
}
else
{
    // No es un iPhone 5
}

Etiquetas: , , , , , , ,