Translate

martes, 31 de enero de 2012

Weapons upgrade

Nuevas armas para esta temporada: Rotor QRings 53/39 130BCD, a ver que tal se dan. En principio irán en la posición 3, que es la recomendada para el inicio.

New weapons for the season. A set of Rotor QRings 53/39 130BCD. The initial setting will be position 3 as the manual recommends for the first two weeks.  



De paso cambio de pedales, nuevos shimano ultegra para sustituir a los Time Speed que he venido usando  sin pena ni gloria (los pedales claro) en las dos últimas temporadas.

Also i have changed the pedals. This time i´m going to use the shimano ultegra pedals which are going to substitute the oldies time speed pedals i have been using for the last two seasons.

sábado, 28 de enero de 2012

Variables de entorno permanentes en XCode

En muchos programas se presenta la necesidad de tener que almacenar valores para determinadas variables de la aplicación que una vez cerrada la aplicación deben guardarse para que al reabrirla se vuelvan a cargar. Por ejemplo el directorio por defecto de trabajo, el nombre del último usuario usado, etc..

En XCode podemos usar las UserDefaults, que pertenecen a la calse NSUserDefaults. Esta clase posee métodos para almacenar y después cargar los datos almacenados.

El ejemplo de muestra consiste en una ventana que mantiene un contador del número de veces que hemos ejecutado la aplicación. Para ello usaremos una variable de tipo entero que almacenará dicho contador.



El código de la aplicación es muy simple, primero recuperamos el valor almacenado la última vez que se ejecutó la aplicación, lo incrementamos en uno, lo mostramos en el label correspondiente en la ventana,  asignamos el nuevo valor a la variable de entorno, y por último sincronizamos para que se guarde el dato.

En este ejemplo el código se ha insertado en la función previa a cargar la ventana: applicationDidFinishLaunching, que ejecuta este código previamente al proceso de mostrar la ventana inicial.





jueves, 26 de enero de 2012

Continuamos con la developer storm: Ruby on Rails

Hoy toca instalar RoR (Ruby on Rails) en el Mac, y concretamente en un Mac con Lion. No voy a explicar a aquí que es Ruby, ni Rails, ni nada de eso. Si quieres saber lo que es búscate la vida en internet que hay muchos sitios.


Lo que me interesa ahora, (sobre todo para posteriores consultas), es como llevar a cabo la instalación de RoR en Lyon.

Ingredientes:




  • Un Mac
  • Mac OS. Versión 10.7.X "uséase" Lyon.
  • XCode. Versión 4.2 o posterior
  • Ruby. Por defecto Lyon trae instalada la versión 1.8.7, mejor una más actualizada como la 1.9.3
  • Rails. Versión 3.1.0 o posterior.
  • Git. Versión 1.7.5.4 o posterior.
  • RVM, (Ruby Version Management), para gestionar las versiones de Ruby.
  • SQLite, (literalmente sequelait). Versión 3.6.12 o posterior.

Para comprobar versiones desde la línea de comandos pongo aquí como hacerlo para cada elemento:

Para XCode:      xcodebuild -version
Para git: git --version
Para Ruby: ruby -v
Para Rails: rails -v
Para SQLite3: sqlite3 -version

Para saber si RVM está instalado usaremos el comando:  type rvm | head-1

Para instalar RVM se hará con el comando:

bash < <( curl -s https://rvm.beginrescueend.com/install/rvm )

además agregamos la ruta de RVM a nuestro terminal:


echo '[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm" ' >> ~/.bash_profile



Para instalar Ruby: 
 
rvm install 1.9.3-p0 --with-gcc=clang
rvm use 1.9.3-p0

Actualizamos las gemas:

        gem update --system



Y ahora instalamos las gemas para SQLite3 y para Rails:
       gem install sqlite3
       gem install rails



Por último si queremos probar una aplicación crearemos una carpeta y mediante rails generaremos el entorno de nuestra carpeta. Si nuestra aplicación se llama Ejemplo haremos esto:

      cd
     mkdir www
     rails new ejemplo



Lanzamos el servidor:

     cd ejemplo
     rails server



En este punto nuestro servidor estará ya corriendo de manera que el terminal se quedará parado mostrando un mensaje de que el servidor está corriendo y que si queremos pararlo usemos ctrl+c.
Para probar que todo funciona vamos a un navegador y pondremos: 

      http://localhost:3000

Debería apetecer una imagen como la inicial de este porst. Ya lo tenemos, ahora podemos empezar a programar nuestra aplicación....





martes, 24 de enero de 2012

Manejo de ventanas en XCode

Hoy vamos a por una taréa algo más básica pero también importante, como es el manejo de ventanas y como pasar de unas a otras. Para ello vamos a hacer una aplicación muy simple donde tendremos una ventana inicial desde la que podremos abrir una segunda. A su vez dentro de esta segunda tendremos un botón que permite cerrarla.


Empezamos  creando una aplicación que nos generará un .xib con su ventana inicial, le pondremos de nombre DosVentanas.





Sobre la ventana creada en el proyecto situaremos un label y un botón y lo configuramos como se muestra en la imagen.






Buscamos en el Object library un objeto NSWindow. Aparecerán varios tipos de ventana, cogemos uno de ellos. Le añadimos un label y un botón como se muestra en la siguiente imagen:






En este punto si ejecutamos el programa aparecerá primero la segunda ventana, y si la cerramos (ojo, el botón cerrar todavía no funciona), entonces aparecerá la ventana principal. Para corregir esto tenemos que usar dos propiedades de las ventanas: (Pulsar sobre la barra de título de la ventana y mostrar el Attributes Inspector)
·      Release when Closed, libera el espacio ocupado por la ventana al cerrarla, ya no se podrá usar mas. Hay que desmarcar esta opción si vamos a usar más veces la ventana. En nuestro ejemplo hay que quitarlo en la segunda ventana, la principal ya lo tendrá quitado por defecto.
·      Visible at Launch, indica si es visible o no cuando se lanzen las ventanas. En nuestro ejemplo dejaremos solo esta opción activada para la ventana principal, es decir la que queremos que se vea al inicio.






Si ejecutamos ahora el projecto ya se mostrará primero la pantalla inicial, pero al no funcionar los botones no podremos hacer que se muestre la segunda pantalla. Para ello lo primero que vamos a hacer será crear un Outlet de la ventana segunda. Para ello seleccionamos la ventana segunda (click sobre la barra de título), y con el CTRL pulsado arrastramos hacia el AppDelegate.h, y creamos un Outlet que se llame por ejmplo WSegunda. De esta manera ya podemos referenciar la segunda ventana desde cualquier parte del código.






De  la misma manera crearemos dos Action, una para el botón Abrir Segunda, y otra para el botón Cerrar ventana.






Completamos el código para cada botón en el AppDelegate.m, que quedaría de la siguiente manera



Y listo, si probamos a ejecutar podremos cambiar entre una ventana y otra usando los botones.

viernes, 20 de enero de 2012

Bases de datos SQLite con XCode


A la hora de trabajar con bases de datos en XCode podemos barajar varias alternativas.

Una de ellas podría ser utilizar las librerías propias de almacenamiento que objective-c nos ofrece.

Otra segunda opción podría ser usar directamente un sistema relacional de bases de datos como SQLite. A diferencia de los sistemas de gestión de bases de datos cliente-servidor, el motor de SQLite no es un proceso independiente con el que el programa principal se comunica. En lugar de eso, la biblioteca SQLite se enlaza con el programa pasando a ser parte integral del mismo. El programa utiliza la funcionalidad de SQLite a través de llamadas simples a subrutinas y funciones. En esta segunda opción podemos trabajar directamente sobre SQLite desde el propio código.

Una tercera forma de trabajo, y quizás la más adecuada sería el uso de Core Data sobre el propio SQLite. En este caso Core Data actúa de intermediario sobre la base de datos. De esta forma podemos realizar consultas y variaciones sin afectar a los datos hasta que se haga el proceso real de grabado.

Para trabajar con Core Data en XCode necesitamos los siguientes componentes:
·  Persistent Object Store. El sitio físico donde se guardan los datos de manera permanente.
·   Managed Object Context. Básicamente es el esquema de nuestra base de datos. Contiene los objetos (Managed Objects) que usaremos, es decir las entidades que forman nuestro esquema.
·   Persistent Store Coordinator, hace de mediador entre los dos anteriores.

Así nuestra aplicación usa el Managed Object Context para manejar los datos, los cuales se definen en el Modelo de datos que incluye las entidades, con sus correspondientes atributos así como las relaciones entre entidades.





Los pasos a seguir serían los siguientes:

1º Abrimos XCode y creamos un nuevo proyecto, asegurándonos que hemos seleccionado la casilla “Use Core Data”.






2º Creamos el schema con las entidades, atributos y relaciones necesarias.






3º Generamos una clase por cada entidad creada. Para ello seleccionamos la entidad y en el menú Editor cogemos la opción Crear NSManagedObject subclass. Esto habrá que hacerlo para todas y cada una de las entidades creadas. Cada una de estas entidades serán un Managed Object, y todos juntos son el Managed Object Context.






4º Al seleccionar Use Core Data al crear la aplicación XCode escribe todo el código necesario para inicializar el Managed Object Context, el Persistent Store Coordinator, etc.. Este código se sitúa en el fichero AppDelegate.m

El Persistent Store Coordinator inicial que se crea por defecto es del tipo XML, y se almacena en la carpeta con el mismo nombre del proyecto dentro de la carpeta Librerías del usuario en concreto. Ahí se crea un fichero XML con el nombre del proyecto y con extensión “storedata”.

Como es un fichero oculto, para poder verlo abriremos un terminal y ejecutaremos:

defaults write com.apple.finder AppleShowAllFiles TRUE

Después para que los cambios sean efectivos reiniciamos el Finder desde el propio terminal ejecutando:

killall Finder

Para restituir las carpetas ocultas a su estado original basta con repetir lo anterior pero cambiando TRUE por FALSE

Una vez reiniciado el Finder vamos a la carpeta Librería de vuestro usuario, la cual se mostrará algo transparente para indicar que es oculta. Dentro de esta habrá una carpeta con el mismo nombre del proyecto, y a su vez dentro de esta se habrá creado un fichero conla base de datos.







Si queremos usar una base de datos en SQLite tendremos que buscar en el método: persistenStoreCoordinator y cambiar el tipo de fichero y el nombre de la base en cuestión. En nuestro caso sustituiremos NSXMLSStoreType por NSSQLiteStoreType y @”usersapp.storedata” por @”usuarios.sqlite”.





Igualmente si queremos ver el contenido de datos del fichero creado podemos abrirlo usando SQLite Manager de Firefox. Para instalarlo abriremos Firefox , iremos a complementos e instalaremos el complemento SQLite Manager. Una vez instalado para usarlo abrimos Firefox y en Herramientas cogemos la opción SQLite Manager.







5º Añadimos la parte necesaria de componentes para manejar la tabla de usuarios. Para ello vamos al proyecto. Seleccionamos MainMenu.Xib y hacemos click sobre la ventana para mostrarla.






Después del Object library selecionamos un Array Controller, un Table View y tres Button. Y los configuramos como se muestra en la imagen siguiente:






9º Configuramos el Array Cotroller. Para ello seleccionamos el objeto y en el Binding Inspectors configuramos lo siguiente:






Igualmente para el Array Controler en el Attribute Inspector configuramos lo siguiente:






10º Configuramos las acciones de los botones Añade y Borra. Para ello pulsando ctrl arrastramos el botón desde cada ratón al Array Controller y en el menú que se despliega seleccionamos la acción correspondiente para cada botón:





11º Igualmente configuramos el botón Graba, pero esta vez asignaremos la pulsación del botón al método sabe que hay en AppDelegate.m. Este método se encarga de registrar los cambios sobre el Persistent Store.






12º Nos queda por conectar los campos del objeto Table View a los campos de nuestra entidad. Para ello hacemos triple click sobre uno de los campos y en el Binding Inspector configuramos lo siguiente:



¡Y ya lo tenemos funcionando! Podremos introducir datos en la tabla con el botón añade y borrarlos con el botón borrar. Para salvar los datos al Persistent Store usaremos el botón graba.