divendres, 26 de setembre del 2014

Basic Git workflow





Open the Terminal, and create a directory named test wherever you  want, here we create the test directory on /tmp:


$cd /temp

/tmp $ mkdir test

/tmp $ cd test
/tmp/test$

Now we will create two files:

/tmp/test $ touch one.txt two.txt
/tmp/test $ ls
  one .txt two.txt

Right now we just have  a directory with two files.
Now we want to put our directory under version control. In order to do that we will write:

/tmp/test $ git init

Initialized empty Git repository in /private/tmp/test/.git/

What happened? Well, Git has just created a database of commits and a staging area, both void. Before the command git init we had just a directory, now we have three things: a directory, a staging area, and a database of commits.

Now let's put the two files on the staging area:

/tmp/test $ git add .

The staging area is just a virtual area when snapshots of changes are placed (using git add) before they are commited.
Now we can commit (take a snapshot or photo of the staging area):

/tmp/test $ git commit -m "First commit"

Ok, so now we have a first commit on our version control. We can see a list of commits with git log:

/tmp/test $ git log --oneline
4d6cf82 First commit

We have our commits saved on the local database.  But, what if we want to save on a public repository like GitHub?
That's easy. Go to github.com and create  a public repository: 




Once created, we go back to terminal and type:

/tmp/test $ git remote add origin https://giria@github.com/giria/test.git

That is, "add a remote repository called origin with that url"
Once added the remote repository, we can just push our local files to the servers of GitHub;

/tmp/test $ git push origin master
Counting objects: 3, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 210 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://giria@github.com/giria/test.git
 * [new branch]      master -> master

And now our files, with all story of commits are stored on GitHub.

divendres, 19 de setembre del 2014

How to install XCode 6 GM (or any other XCode version) without deleting prior version

This is an English translation of  Diego Freniche original article




Theory

An OSX App is not more than a folder (a bundle) containing executable files and resources. We can see it on Finder right clicking an app file and selecting "Show package contents". It is even more evident from the Terminal:



$ cd /Applications/ 
$ ls -d Xcode*

drwxr-xr-x@ 3 dfreniche admin 102B 10 sep 09:47 Xcode.app/ 
drwxr-xr-x  3 root wheel 102B 16 abr 10:30 Xcode5.app/ 
drwxr-xr-x@ 3 dfreniche admin 102B 2 jul 02:52 Xcode6-Beta3.app/ 
drwxr-xr-x@ 3 dfreniche admin 102B 1 ago 23:17 Xcode6-Beta5.app/ 
drwxr-xr-x@ 3 dfreniche admin 102B 16 ago 00:35 Xcode6-Beta6.app/ 
drwxr-xr-x@ 3 dfreniche admin 102B 28 ago 09:01 Xcode6-Beta7.app/

we can see all versions of XCode installed. They are just UNIX directories.

On practice

During the beta stage, the XCode dmg file we download contains a directory named for example XCode6-beta6. This name is different than XCode so there is no conflict.

When the GoldMaster and ultimate version arrive, Apple releases a DMG  with an app named XCode. It is XCode 6 but it has same name that the previous XCode 5 that you have already installed in your machine. If you copy it will replace XCode 5.


Xcode5 before copying Xcode6 GM

But there is an easy solution: before copying the file to the Applications folder, rename Xcode (probably you  will need to introduce your administrator password) and set up your preferred name (it is up to you, I have one named Ye olde XCode 4.3).


Installing  Xcode 6 after renaming Xcode 5


Easy. Is it not?

dimarts, 2 de setembre del 2014

Setting up two-step verification on Apple ID





In order to protect your iCloud media it is advisable to set up two-step verification on Apple ID. You are just some steps away of protecting your data:
 
  1. Go to My Apple ID.
  2. Select Manage your Apple ID and sign in.
  3. Select Password and Security.
  4. Under Two-Step Verification, select Get Started and follow the onscreen instructions

dilluns, 21 de juliol del 2014

Hacking iTunes ( II) : Descargar la app Paper aunque no vivamos en USA







Damos las gracias  John Michael Bond de TUAW por este truco !

  1. En primer lugar vamos a la AppStore
  2. Vamos a Apple ID (Store-ViewAccount)
  3. Entramos normalmente con nuestro password.
  4. Una vez hemos entrado, vamos a settings, encontramos country, y finalmente "change country or region" y cambiamos el país a "United States".
  5. Pulsamos "none" cuando nos pide por información de pago.
  6. Buscamos Paper, lo descargamos, y finalmente cambiamos el país otra vez al original.
OK ! Ya tenemos Paper, al menos hasta que Facebook implemente un bloqueo de región.

dilluns, 30 de juny del 2014

Parse en 10 minutos



Parse en 10 minutos




Hoy vamos a ver como utilizar Parse. Con Parse podemos crear facilmente un backend para nuestra app. ¿Que significa esto? Lo vemos con un ejemplo, imaginad que estamos construyendo una app de fotografias, tipo Instagram donde los usuarios suben sus fotografias al servidor. Necesitaremos almacenar las fotos en un servidor al que puedan acceder todos los usuarios de nuestra app. Pero construir un servidor no es precisamente tarea facil, por lo que servicios como Parse, que nos permiten obtener esta funcionalidad,  son extremadamente populares entre los desarroladores de apps. Es normal refererirse a este tipo de servicios como mobile BaaS, es decir mobile Back end as a Service.  Tan popular es Parse, que Facebook compró Parse el pasado mes abril.


Podemos ver los planes de precios de Parse en la siguiente pantalla.


Screenshot 2014-06-28 17.28.03.png


Los planes de precios para los usuarios incluyen un plan gratuito para aplicaciones que no sobrepasen las 30 peticiones por segundo ni mas de 20Gb de datos almacenados. A medida que pedimos mas prestaciones el precio va subiendo, asi para 200 peticiones/segundo el precio mensual es de 1700 dolares. Esta es una de las quejas recurrentes de los usuarios: el precio del servicio aumenta mucho al aumentar nuestra demanda de prestaciones. En todo caso si nuestra aplicación tiene éxito, pagar la factura de Parse será el último de nuestros problemas ☺


Construyendo nuestro backend


Los pasos que necesitamos para guardar las imagenes de nuestro dispositivo al servidor Parse son los siguientes:


1. Creación de cuenta de usuario  en ww.parse.com.
2. Importación de librerias
3. Escribir código cliente para subir la imagen al servidor de Parse


Vamos pues a ver como implementamos cada uno de los pasos anteriores.


En primer lugar, nos damos de alta en la cuenta gratuita y sin necesidad de proporcionar datos bancarios, la plataforma nos proporciona una serie de claves.


parse-truncated-app-keys.jpg


Utilizaremos estas claves mas tarde en nuestra app.


Ahora necesitamos bajarnos el framework de Parse para incorporarlo a nuestro proyecto. Para ello marcamos:




en nuestro navegador y nos bajamos un fichero que contiene las librerias de la última versión de Parse. Una vez bajada, la descomprimimos y arrastramos el directorio Parse.framework al menu navegación de nuestro  proyecto Xcode, con lo que añadimos el framework a nuestro proyecto.
Ademas del framework de Parse que ya hemos incorporado necesitamos las siguientes librerias de sistema:


  • AudioToolbox.framework
  • CFNetwork.framework
  • CoreGraphics.framework
  • CoreLocation.framework
  • libz.1.1.3.dylib
  • MobileCoreServices.framework
  • QuartzCore.framework
  • Security.framework StoreKit.framework
  • SystemConfiguration.framework
Para incorporarlas al proyecto, señalamos el proyecto ParseTutorial y en la pestaña General añadimos al proyecto, una a una, las librerias mencionadas anteriormente.
Lo vemos en la siguiente imagen:


Screenshot 2014-06-29 13.15.22.png




Ahora necesitamos  indicar a nuestra aplicación la clave que nos ha proporcionado Parse al darnos de alta. Para ello en el fichero AppDelegate.m, escribiremos:







         

donde los valores ApplicationId y clienteKey son las claves que aparecen en el apartado Keys del menu Settings de parse.com.  A continuación escribiremos el siguiente código, donde inicializaremos la libreria de Parse:



Si todo va bien, el proyecto compilará con 0 errores.
Para probar Parse utilizaremos InterfaceBuilder para crear una pantalla en la que el usuario elegirá una photo de su Camera Roll y la subirá a Parse:




Screenshot 2014-06-29 17.29.57.png


En la subclase de UIViewController que asignaremos a la pantalla anterior añadiremos la línea:




En la acción correspondiente al boton upload escribiremos:







Notar que el método saveInBackgroundWithBlock: es un método asincrono que se ejecutará en background. Esto es importante, ya que todas las tareas de naturaleza asíncrona (como las llamadas a red) NO DEBEN realizarse en el hilo principal. De lo contrario tendriamos un interface gráfico que se bloquearia hasta que la peticion a Parse finalizara. !Y un interface gráfico bloqueado es lo último que queremos en nuestra aplicacion!


Ejecutamos la aplicación, elegiremos una foto de nuestra libreria y pulsaremos el boton Upload. Con esta acción nuestro foto se almacena en los servidores de Parse. Si ahora vamos a www.parse.com, en la pestaña DataBrowser comprobamos que se ha creado una entrada con el objeto que hemos subido desde nuestro dispositivo:




Screenshot 2014-06-29 15.18.33.png




Notar que el objeto PhotoObject se ha guardado en el servidor sin necesidad de darlo previamente de alta, como ocurria en versiones anteriores de Parse.


Así de facil es utilizar los servicios de Parse para subir nuestros objetos al servidor. Podeis acceder al proyecto en  GitHub . En proximos tutoriales y partiendo de lo visto en este tutorial veremos caracteristicas avanzadas de Parse como notificaciones.








Joan Barrull

Trabajo en www.ironhack.com como profesor asistente. Mi primer contacto con la programación fué con Smalltalk, un lenguaje dinámico y orientado a objetos que influyó en todos los lenguajes de programación posteriores. Objective-C, y su entorno de desarrollo XCode me recuerdan la sensación que tuve al descubrir Smalltalk, la sensación de poder programar cualquier cosa.

diumenge, 29 de juny del 2014

Hacking iTunes (I): Crear un Apple ID sin proporcionar datos bancarios







Imagina que te acabas de comprar un iPadAir. Si lo sé, soñar es gratis !


Para instalar apps, tanto gratis como de pago, Apple te pide un Apple ID. De momento no quieres utilizar tu Apple ID, ya que está asociado a una cuenta bancaria. ¿Como puedes crear una segunda cuenta Apple ID que no esté asociada a una cuenta bancaria? El procedimiento es el siguiente:

1) Entramos en iTunes
2) En el lateral izquierdo de la pantalla de iTunes clickamos en iTunes Store.
3) En la parte izquierda de la pantalla pulsamos sobre TopFreeApps





4) Seleccionamos una aplicación gratuita y la compramos




5) Aparece una ventana para introducir el AppleID





6) Pulsamos el boton Create Apple ID
7) Damos conformidad a los terminos del contrato
8) En la pantalla de alta rellenamos los datos personales




9) En la pantalla de medios de pago elegimos None e introducimos una dirección postal






Y ya tenemos nuestro AppleID no asociado a una cuenta bancaria. Si más adelante queremos asociarlo a una cuenta, por ejemplo porque queremos comprar una aplicación de pago, lo podemos hacer entrando en nuestro perfil de usuario.






dijous, 15 de maig del 2014

Concurso de apps InnovaApps+




El banco BBVA en colaboración con Google acaba de lanzar el concurso InnovaApps  (http://www.bbvaopen4u.com/innovaapps/es) 

Si alguien tiene una aplicación terminada puede presentarla al concurso. La única condición es que se utilizen API's públicas de Google (por ejemplo el API Google Places).

Es una iniciativa conjunta de BBVA y Google, cuyo objetivo es el fomento del espíritu innovador en las soluciones de productividad accesibles para todas las empresas, especialmente la comunidad de pymes y startups.

Las aplicaciones que se desarrollen y presenten a InnovaApps+ deben estar bajo licencia Open Source (basado en el modelo de licencia Apache, versión 2.0). 

divendres, 2 de maig del 2014

Objective-C strings




As you know a common way to create strings is using the literal @"Some String" syntax, for instance:

Why is the reason of the @ sign in front of "Porsche"?
Objective-C is like two worlds in one. You can write, even in the same program, Objective-C and C code. 
In C language you can write a String literal this way:
char *amessage = "This is a string literal."; 
For this reason when you write a NSString literal you have to put the @ sign before the string. It's the way to say to the compiler that it is a NSString and not a C language string.
  
Of course, when writing iOS programs it is better to use NSStrings. C-language strings don't have support for Unicode, so you can't use accents or other punctuations signs.

dijous, 1 de maig del 2014

When it is advisable to use NSDecimalNumber instead of double?


Yesterday, a friend shared with me a problem using double. He was writing a Calculator app,  and he run into this incorrect result:
123456789123456.78 * 1 = 123456789123456.8


Here is why.
NSExpression uses internally the C-based primitive double. Your example can be written as:
double a = 123456789123456.78;
double b = 1.0;
NSLog (@"Result  %@ ", [NSNumber numberWithDouble: a*b]); // 123456789123456.8 
Why the result is 123456789123456.8 instead of 123456789123456.78? The primitive type double uses the IEEE-754 double precision format (http://en.wikipedia.org/wiki/Double-precision_floating-point_format), also known as Bynary64 because uses 64 bits to store the number. Storing a decimal number in a binary format has a number of disadvantages. There is a inherent rounding error that depends of the magnitude of the number.
Between 2 ^52=4,503,599,627,370,496 and 2^53=9,007,199,254,740,992 the representable numbers are exactly the integers. So:
double a = 4503599627370496.6;
double b = 1.0;
NSLog (@"Result  %@ ", [NSNumber numberWithDouble: a*b]); //4503599627370497 
Between 2^53 =9007199254740993to 2^54, everything is multiplied by 2, so the representable numbers are the even ones. So:
double a = 9007199254740993;
double b = 1.0;
NSLog (@"Result  %@ ", [NSNumber numberWithDouble: a*b]); //9007199254740992 
Conversely, for the previous range from 2^51 to 2^52, the spacing is 0.5, etc.
In your case, the number 123456789123456 is in the interval 2^46 - 2^47 and the rounding error is 1 / 64 = 0.015625.
With 64 bits you can work only with a maximum of 15-17 decimal digits, and you'll get rounding errors in all the range.
The solution? You can use NSDecimalNumber that uses decimal arithmetic( Java has BigDecimal )
NSDecimalNumber *decimaNumber = [NSDecimalNumber decimalNumberWithString:  @"4503599627370496.11"];
NSDecimalNumber *decimaNumber2 = [NSDecimalNumber decimalNumberWithString:  @"1"];
NSLog(@"    %@",[decimaNumber decimalNumberByMultiplyingBy:decimaNumber2]);  //4503599627370496.11