Translate

martes, 28 de febrero de 2012

Fauna sobre ruedas



Hace unas semanas hice un artículo en el que describía la fauna propia de cada piscina, ahí hablaba del "infiltrao", "el toca piés", etc, etc,... . En esta ocasión y dado que me muevo en un mundo a caballo entre piscinas, bicicletas y corredores le toca el turno al segundo de los pilares de este deporte, mas concretamente la bicicleta.

Quizás la fauna de la bicicleta no sea tan extensa como la de la pisicina, pero si que posee algún que otro ejemplar digno de catalogación, vamos con ello.

El "veterano", este era amigo del que inventó la bici. Lleva toda su vida en lo alto de la bici, y suelen ser los tíos mas listos del grupo, conocen a todo el mundo, saben de todo, etc, etc, y son de los que te hacen comentarios del tipo...."...illo, ¿donde vas con ese manillar? ¿es que vas a hacer "triarlon"?...¿y donde nadas?..¿en la acequia?...."...(esto es verídico, ¿eh?)

El "lider", este es fácilmente reconocible. Es el que cuando sales en tu grupo dispone, manda, ... o por lo menos él se cree que lo hace.. al principio hace gracia, pero al final te llega a tocar las narices...

El "pegatinas", también es fácilmente reconocible... también se le llama "ciclista anuncio", ya que suele llevar más publicidad que los pros...

El "tapao", este te das cuenta de quién es cuando te suelta un palo subiendo una cuesta y piensas ¿adonde va el matao este?... sales a por él....y .... revientas, porque el tío está como una moto y anda más que tú.

El "calambres"... venga ya,... no me digas que en tu grupo no hay alguien al que le dan continuamente calambres...

El "Full equip"... también es fácilmente reconocible... nada mas que mires todo lo que lleva y te darás cuenta, suele llevar bici tope de gama, componentes a la última, a ser posible Campagnolo, o algún grupo nuevo de nombre impronunciable, ruedas ultra mega chachi aerodinámicas, casco súper mega total, etc, etc..

lunes, 27 de febrero de 2012

Custom Sheets


En un post anterior veíamos como mostrar mensajes de alert mediante la clase NSAlert. (http://ugeblog.blogspot.com/2012/02/xcode-mensajes-de-aviso.html).
En estos mensajes de alerta podemos mostrar alguna advertencia y pedir confirmación mediante botones, pero en determinados casos podemos querer usar el panel para pedir algún dato adicional al usuario de manera que no se pueda acceder al resto de la aplicación mientras el panel esté desplegado (comportamiento modal). Para ello contamos con el uso de los customs sheets.

In a post before we could see how to show alert messages using the class NSAlert. (http://ugeblog.blogspot.com/2012/02/xcode-mensajes-de-aviso.html).
With those messages we could show any kind of alert requesting a user confirmation using diferentes buttons, but in some cases we need something more like a simple confirmation, for example we could need the user enter some kind of data forbiding the access to the rest of the application until the user complete entering the data required (modal behaviour). For this purpose we have the Custom Sheets.

El ejemplo que vamos a hacer será muy simple y constará de dos ventanas, una principal con un botón que al pulsarlo nos muestra un panel asociado a esta ventana. Este segundo panel se ocultará mediante un botón.

The example application we are going to made is very simple. It wil have two windows, one main window with one button which opens another secondary window.   This secondary Windows opens from the first one so we can´t do anything in the application without clossing the last window opened.



En los ejemplos de Apple e incluso en la documentación de cómo manejar Custom Sheets se nos dice que para ello implementemos el panel en su propio fichero .nib y que llamemos a su creación desde el código, pero…¿porque complicarnos la vida pudiéndolo hacer simple?. La idea que proponen es crear un fichero .nib (o .xib) para cada ventana, crear un controlador para cada ventana, realizar las correspondientes declaraciones de cada clase de manera que cada una conozca a la otra y una vez así hacer la llamada al panel desde la ventana principal. Un poco liante… yo prefiero hacerlo fácil, y para ello lo mejor es definir el panel dentro del fichero nib de la propia ventana que necesita mostrar el panel.

In the Apple example and also in the documentation which explain the uses of customs sheets, we could see they uses an independent .nib file for define the second panel, but… why not made it easy?, in my opinion is more easy and clear to implementate the second panel in the same .nib file the main window has. The other way is to create a .nib file for each window/panel, and of course his own class controller. Also you would need to declare each class inside the other, on the way any window could “see” the others windows it must use. To much complicated, too many files, declarations, and so on,…a prefer to simplify it.

Comenzaremos creando por lo tanto un aplicación con una única ventana de entrada que llamaremos Main Window.  A esta ventana le añadiremos un botón que posteriormente nos servirá para mostrar el panel.

El siguiente paso es crear el panel, y para ello en el Object Library buscaremos un objeto del tipo panel o del tipo HUD Window y lo arrastramos sobre el fichero .xib que posee la ventana. Igualmente le ponemos un botón que luego servirá para ocultar el panel,. Por ultimo y para evitar que se muestre el panel al iniciar desmarcaremos la casilla Visible at Launch. Debería quedar de la siguiente manera:

We will start creating a new Project with one main window, with one button used to opening the panel. Also we must créate the panel, and for this, we need to search into the Object Library for a Panel, o for a HUD Window, drag inside the nib file near the main window. Also we need another button inside the panel to close it. Is important to unmark the Visible At Launch option of the panel to avoid the panel to be shown at the startup of the application.



Una vez creadas la ventana principal y el panel crearemos unOutlet del panel y dos action, uno desde cada botón llamados mostratPanel y cerrarPanel. Tanto el Outlet del panel como los Action se crearan en el fichero AppDelegate de la ventana principal, donde encontraremos un Outlet a la ventana principal. El fichero AppDelegate.h debería quedar algo así:

Once we have created both the window and the panel, we must créate one Outlet for the panel and to Actions, one for the button in the main window, and another for the button in the panel. This Outlet and Actions must be created into the AppDelegate.h file wich control the main Window. This AppDelegate.h file must appears as follows:



Finalmente implementaremos el código que sirve para mostrar y cerrar el panel en el fichero Appdelegate.m, el cual debería quedar de la siguiente manera:

Finally we must type the code to show and to closet the panel. Both methods must be implementated into the AppDelegate.m file inside the Actions we defined previously. It must appears as follows:



Y eso es todo, seguimos aprendiendo …
And this is it,…. keep going in the XCode/Cocoa learning…


domingo, 26 de febrero de 2012

Nike LunarEclipse+

Nueva adquisición para renovar el parque de vehículos pedestres. Vuelvo a repetir con las Nike Lunar Eclipse+, en esta ocasión en color blanco por exigencias del guión dado que las he comprado en un Nike Store, después de una larga búsqueda ya que es un modelo obsoleto y solo quedaban de este color.

Recently i have adquired a new pair of Nike Lunar Eclipse+. This is the second time i bought this model, but for this occasion i had to buy a white colored pair because it is an obsolete model and it was very difficult to find it. Finally i found a few pairs of this model in a Nike Store but they only have it in this color.




Con respecto a este modelo decir que son geniales, son el compromiso entre unas zapatillas amortiguadas para entrenar y unas voladoras para competir. Yo las he usado en ambos casos. Decir que el modelo antiguo las he usado en una maratón de un Ironman, en los 30km del desafío Doñana por la playa, en la media maratón de Granada, y finalmente en los 10.000 del gran premio de Fondo de Diputación. Por supuesto las he usado en entrenos también. 

For me and my running style it´s a great model, and one of the best Nike i have tried. They are a compromise between a training shoe and a a racing shoe. I have used in both cases. I used my anterior Lunar Eclipse+ to running the marathon of an ironman, a 30km distance race over the sand of a Spanish beach, in a Half Marathon, and finally in a 10km distance race. Of course i have used during some of my long distance trainings too.


Son muy cómodas para larga distancia ofrecen suficiente amortiguación y sobretodo estabilidad, y a pesar de ser Nike no resbalan mucho en mojado como si ocurre con otros modelos de la marca. Solo remarcar un inconveniente, retienen demasiada agua cuando se mojan sobre todo cuando te hechas agua por encima en los avituallamientos.

They are great  for long distance runnig, offering enough cushioning and stability, even despite to be a Nike model they do not slip so much when you are running over a wet surface, especially over wet tarmac. One contra is the fact that they retain to much water when they get wet, specially when you throw some water over you in a Feed Station.


Con respecto a la durabilidad en cuanto a amortiguación y al dibujo de la suela decir que si bien se han  comprimido algo, no se ha perdido mucha capacidad de amortiguación. Con respecto a la suela el desgaste ha sido normal, nada que destacar.

Comparing my old and new Lunar Eclipse you can see a little wear in the outsole mainly caused by my running style, also you can see a slightly compression of the midsole, but nothing relevant for the cushion the shoe continues offering.






martes, 21 de febrero de 2012

vPro: Configuración


Vamos a ver en este post como configurar un equipo para poder acceder a el de manera remota usando vPro de Intel.

Realmente el uso que vamos a hacer es similar al que se haría con cualquier visor de VNC,  pero con una importante salvedad, y es que en este caso el servidor de VNC estará implementado en el hardware, lo cual nos permite acceder a la máquina remota sin necesidad de haber cargado el sistema operativo. ¿Qué significa esto?, pues básicamente el poder levantar, apagar, entrar en la BIOS, y seguir todo el proceso de encendido de la máquina hasta la carga completa del sistema operativo.

Esto es por lo tanto una importante herramienta para servicios técnicos que tienen la necesidad de mantener equipos dispersos geográficamente, ya que permite evaluar la avería sin necesidad de viajar, pudiendo en muchos casos llegar incluso  a la resolución de la incidencia, con el consiguiente ahorro de costes y tiempos, tanto para el usuario como para el servicio.

Básicamente es una especie de ILO pero implementada en el procesador en vez de en la tarjeta de red. En este caso la tecnología que usamos se llama Intel AMT (Intel Active Management Technology), mientras que la pequeña BIOS que usaremos para configurarla se llama Intel ME BIOS Extension (Intel Management Engine BIOS Extension)

Los requerimientos para poder hacer uso de esta tecnología son:
  • ·      El equipo a gestionar remotamente debe estar basado en la plataforma Intel VPro y en especial cualquiera de los microprocesadores i3 e i5.
  • ·      Que el equipo sea accesible por red. No es necesario que esté encendido pero si que la tarjeta de red esté conectada al igual que la toma de fuerza de la fuente.
  • ·      Disponer en el equipo que se usará para controlar de la última versión del Intel Manageability Developer Tool Kit, que es un software gratuito que se puede descargar desde la web de Intel. Dentro de este encontraremos el Intel Management Command Tool.
  • ·      Disponer de alguna herramienta tipo VNC viewer para controlar el equipo. Se puede usar la versión free, pero para evitar molestos avisos de RealVNC, es preferible usar la versión de pago viewer plus.


Para configurar el entorno de pruebas usaremos una red local donde conectaremos tanto el equipo remoto como el de gestión. En nuestro caso usaremos DHCP por simplificar, pero si quieres usar IP fija no hay problema. Un pequeño detalle. Si usas DHCP la IP del sistema y de la Intel ME serán la misma, así que para saber que IP se le ha asignado al Intel ME, basta con entrar en sistema y hacer un IPConfig.

Los pasos serían:
            Equipo Remoto:
·      Entrar en la BIOS y habilitar Intel AMT
·      Entrar en Intel ME mediante Ctrl-P y configurar según el uso que vamos a darle.
·      Configurar WinRM para habilitar la opción de KVM y así poder gestionar el sistema operativo. Usaremos para ello KVM Remote Control Configuration Tool.

Equipo de gestión:
·      Instalar VNC viewer.
·      Instalar el Manageability Developer Tool Kit
·      Configurar Management Command Tool para acceder a los equipos remotos.

Y listo, de esa manera podremos acceder al equipo remoto. Vamos a entrar en detalle en cada uno de los pasos:

Comenzamos configurando el equipo al que accederemos de manera remota. Para ello primero entramos en la BIOS y habilitamos el AMT. Los equipos que vamos a usar como cliente y como gestión serán ámbos el mismo modelo, HP Compaq 8200 Elite SFF.




Una vez activado el AMT, guardamos cambios y reiniciamos. Esta vez durante el reinicio pulsaremos CTRL+P para entrar en la BIOS de Intel ME.






Lo primero que nos pide es la contraseña de entrada, que por defecto es admin, una vez introducida nos pide la nueva contraseña, que debe cumplir los criterios de cómo mínimo 8 caracteres, al menos un nº, un letra minúscula, otra mayúscula y un carácter especial.

Una vez dentro escogeremos la opción Intel(R) AMT Configuration. Dentro de este la primera opción es activar el acceso de red, pulsamos sobre Activate Network Access, y pulsamos Y.

Lo siguiente es activar las configuraciones de SOL/IDER/KMV, para ello entramos en el menú SOL/IBER/KVM, y vamos comprobando uno por uno que están en modo enabled. Finalmente pulsamos sobre Previous Menu.

A continuación fijaremos los datos de red, para ello cogemos la opción Network Setup,  y dentro de este primero entramos en Intel(R) ME Network Name Settings. Entramos a su vez en Host Name y fijamos el nombre del Host. Es conveniente que sea el mismo nombre del equipo en el Sistema Operativo.

Una vez fijado el nombre pulsamos enter y salimos hacia atrás pulsando sobre Previous Menu dos veces seguidas.

Volvemos a estar en el menú Intel(R) ME Network Settings. Si quisiéramos trabajar con IP fija podemos establecer sus valores en submenú TCP/IP Settings, si lo dejamos como está se usará DHCP. Si queremos IP fija desactivamos DHCP y aparecerán los campos para meter la IP, Máscara, etc...

Finalmente salimos y dejamos reiniciar el equipo para entrar en el sistema operativo, en nuestro caso Windows 7. Una vez dentro del sistema operativo sería conveniente descargarse de la web del fabricante, en este caso HP, el software de gestión para Intel AMT. En nuestro caso en la web de HP podremos encontrar para nuestro equipo el software Intel AMT LMS SOL for AMT 7.xx. Los descargamos e instalamos.

Igualmente necesitaremos el KVM Remote Control Configuration Tool, que podemos descargarlo del siguiente enlace: http://communities.intel.com/docs/DOC-4795 
Una vez descargado descomprimimos, y tendremos una carpeta llamada 1053v4, que copiaremos en el raíz del disco duro renombrándola a kvm.

El siguiente paso es la configuración de WinRM, pero antes de entrar a configurar el WinRM necesitamos garantizar los permisos necesarios. Para ello entramos en el registro de Windows mediante gpedit.msc en la línea de comandos. Se abrirá el editor de directivas de grupo local, y una vez allí iremos a:

  • Configuración del equipo
  • Plantillas Administrativas
  • Componentes de Windows
  • Administración Remota de Windows (WinRM)

Se mostrarán dos elementos:
            Cliente WinRM
            Servicio WinRM

Para cada uno de los dos elementos habilitaremos:

  • Permitir autenticación básica.
  • Permitir tráfico sin cifrar.







Cerramos el editor y procedemos a configurar WinRM entrando en la línea de comandos pero ejecutándola en modo administrador. En este punto hacer notar que WinRM ya viene instalado por defecto en Windows 7. Si usas un sistema anterior y no lo lleva tendrás que instalarlo descargándolo de la página de microsoft
Vamos a la carpeta en cuestión c:\kvm y ejecutamos kvm.hta y se abrirá la herramienta para configuración del KVM.






Lo primero es habilitar WinRM (Windows Remote Management), para ello hacemos click en la primera opción.
Después configuramos el cliente con la IP que usará, la contraseña de administrador que pusimos en la BIOS del Intel ME, y por último establecemos una nueva contraseña para el acceso del KVM. Pulsamos Enable. Si se ha producido un error se nos indica en la parte final de la ventana que hemos abierto.
Con esto ya tenemos el cliente listo para poder acceder a el, vamos ahora con el equipo que vamos a usar para gestión.

Encendemos el equipo y entramos en el sistema operativo. Es requisitio previo el tener instalado algún tipo de visor tipo Real VNC. Se puede usar VNC Viewer free, no es necesario instalar el servidor, pero si sería recomendable usar la versión viewer plus, para evitar molestos mensajes en la pantalla.

Descargamos la última versión del Intel Manageability Developer Tool Kit, que podemos obtener del siguiente enlace:


Una vez descargado lanzamos la instalación que nos instalará entre otros el Manageability Commander Tool. Ejecutamos en modo Administrador esta herramienta, y se mostrará en pantalla esto:






Lo primero es localizar el equipo o los equipos que estén en la red. En nuestro caso la IP de nuestro equipo es 192.168.8.60, así que ponemos un rango a buscar que comprenda dicha IP. Una vez localizado el equipo lo seleccionamos y pulsamos sobre Add Computer.








Se añade el equipo a la estructura de árbol de la izquierda. Seleccionamos el equipo y pulsamos en el botón Connect.








En ese momento tenemos el control de la máquina remota, y podemos acceder a ella a través de la pestaña remote Control, donde encontramos dos herramientas, una de ellas Take Control nos permite acceder a la BIOS, apagar, encender, etc…





La segunda herramienta KVM Viewer Standard Port permite controlar el escritorio, la BIOS, etc…
Pulsando sobre esta se nos pide la contraseña FCB que fijamos al configurar WinRm en el cliente remoto.





Una vez se establece la conexión y para que el usuario nos permita el acceso al  su equipo, en la pantalla del cliente se mostrará un numero que tendremos que pedir al usuario e introducir en nuestro equipo.





Una vez introducido el número ya podremos controlar el equipo.





Podremos reiniciar el equipo sin perder conexión, pudiendo entrar en la bios si se quisiera.








domingo, 19 de febrero de 2012

Ironman UK: Primer macro ciclo terminado / First stage of training plan finished

Primer ciclo para Bolton terminado. Once semanas de carga inicial , durante el cual las cifras conseguidas han sido las siguientes:

Just finished the first stage of the Bolton´s training plan. This are the numbers i have achieved during this initial stage:


En comparación con la preparación inicial para el Ironman de Niza el año pasado salen unas 24h más, pero con un plan menos estricto que el año pasado, mucho más flexible.

Comparing whit last year training plan for the Nice Ironman i have made about 24 hours more, but with a more flexible plan for this year.

martes, 14 de febrero de 2012

vPro: Gestión Remota / Remote Management

Recién terminada la prueba de gestión remota de equipos mediante vPro, pongo un pequeño vídeo donde ver el potencial de esta herramienta. 
Aunque básicamente pueda parecer un simple VNC viewer, nada más lejos de la realidad, ya que el control remoto sigue incluso con el equipo reiniciando, pudiendo entrar incluso en la BIOS del equipo, apagarlo, encenderlo, trabajar sobre el sistema operativo de la máquina remota, arrancar el equipo remoto con una live en el equipo usado para gestionar, etc, etc...
En la próxima entrada pondré la explicación de que necesitamos y como configurarlo.

Just finished to configure a remote management trail environment with vPro, i  post a video where you can see the big potential this tool has.
Apparently it seems to be like a simple VNC viewer, but it´s a little more than this, because you can remote control the other computer even when the operative system is not running. For example you can manage the remote computer during the initial startup, or get into the BIOS, work over the remote computer OS, boot the remote computer with a live OS inside the computer used to manage the remote one, and so on...
In the next entry i will post a how-to configure and the materials you need to.

Linux Basics


1.- Instalar Servidor SSH:

sudo apt-get install openssh-server

sudo gedit /etc/ssh/sshd_config  <--- Editar fichero por si queremos modificar la configuración.

sudo restart ssh

Verificar y detectar problemas con el servicio SSH:

dpkg -l | grep ssh <--- Ver versión instalada en sistema
ps aux | grep sshd <-- Comprobar que el demonio está corriendo en el sistema
sudo iptables -L <-- Asegurarse que el Firewall no está bloqueando el puerto 22
sudo netstat -nap | grep :22 <-- Asegurarse que el puerto 22 está escuchando el servicio SSH
sudo route -n <-- Comprobar la puerta de enlace (gateway) por el que el PC sale a internet



Comandos básicos SSH (o shell básica):
ssh usuario@IP  Ej: ssh a@192.168.0.1 <-- Loguearnos en un terminal remoto por ssh
#sudo shutdown -h now <-- Apaga el PC invocando un Halt
#sudo shutdown -p now <-- Envía la orden Poweroff al PC
#sudo shutdown -r now <-- Reinicia el PC anulando cualquier tarea en ejecución

2.- Instalar Wine
sudo add-apt-repository ppa:ubuntu-wine/ppa
sudo apt-get update
sudo apt-get install wine (opcional --fix-missing)

3.- Instalar Gestor Grub (Grub Customizer)
sudo add-apt-repository ppa:danielrichter2007/grub-customizer
sudo apt-get update
sudo apt-get install grub-customizer
4.- Ejecutar comandos como root sin que se solicite ningún password
sudo visudo
a (usuario) ALL=NOPASSWD:ALL  <-- Una vez guardado el fichero, se puede llamar a root sin que se solicite passwd (Ojito con esto!)
5.- Ocultar barra Gnome (Ubuntu 11.04)
sudo chmod -x /usr/bin/gnome-panel && killall gnome-panel  <-- Quitamos que sea ejecutable y reinciamos (quitamos) la barra del panel Gnome
sudo chmod +x /usr/bin/gnome-panel && /usr/bin/gnome-panel <-- Permisos Ejecución y reiniciamos la barra de Gnome
Al quitar la barra se queda permanentemente quitada, hasta que se ejecuta el botón (script) 'poner.sh' y entonces habría que volver a quitarla.

6.- Instalar VLC:
sudo apt-get install vlc  <-- Con este comando se instalan las librerias y dependencias (MP4,MP3,MOV, DIVX ...)



7.- Instalar wakeonlan
sudo apt-get install wakeonlan
Comando básico wakeonlan: wakeonlan MAC  Ej:  #wakeonlan 02:35:B0:A4:E7:77  (a veces hace falta especificar el puerto: #wakeonlan -p 7 MAC)

8.- Añadir aplicaciones (o Comandos) al Inicio
Sistema --> Preferencias --> Aplicaciones al Inicio 
Ej: /usr/bin/wine /home/a/Escritorio/carnaval.exe  <-- Invocar que Wine reproduzca flash al arrancar el PC

domingo, 12 de febrero de 2012

Problema al instalar Delphi7 en Windows 7 o Vista / Problems with Delphi 7 over windows 7 or Vista




Una vez instalado y al ejecutar por primera vez se muestra el siguiente fallo:

Unable to rename 'C:\Program Files\Borland\Delphi7\Bin\Delphi32.$$$' to 'C:\Program Files\Borland\Delphi7\Bin\Delphi32.dro

El problema viene dado por los permisos de la carpeta y del usuario. Para resolverlo iremos a la carpeta C:/Archivos de programa(x86) /Borland  , seleccionamos propiedades y desmarcaremos la opción Sólo Lectura que se encontrará activada.
Después iremos a la pestaña seguridad, y daremos control total para el usuario con el que normalmente entremos en el sistema operativo.


Once you have installed Delphi 7 over your Windows 7 or Vista OS and when you started for the first time, it fails showing the following failure message:

Unable to rename 'C:\Program Files\Borland\Delphi7\Bin\Delphi32.$$$' to 'C:\Program Files\Borland\Delphi7\Bin\Delphi32.dro

 The problem is caused by the folder and user permissions. To fix it we must go to the folder C:/Program Files(x86)/Borland, choose properties, and unmark the option Read Only. 
Also we must go to the label Security, and gave total control for the user we used to log into the system.


viernes, 10 de febrero de 2012

XCode: Más Ventanas / More Windows


Con este ejemplo vamos a ver la forma en que trabajar con varias ventanas en nuestra aplicación usando un xib/nib para cada ventana. Para ello tendremos una ventana inicial que incluirá un botón que abrirá una segunda ventana.

Whit this example we are going to see the way to work with different windows in our application, using one xib/nib for each window. The example application would have a main window with one button. This button will open a second window.

Creamos un proyecto que llamaremos “twoWindows”. En la ventana principalal añadiremos un botón que llamaremos “Abrir Segunda Ventana”.
De este botón crearemos un Action arrastrando con ctrl pulsado desde el botón mencionado hasta el fichero AppDelegate.h, llamando a dicha Action “mostrarSegunda”, después implementaremos el código necesario para esta Action.
Una vez creado el proyecto tendremos creada una primera ventana que se almacena en un archivo tipo xib llamado MainMenu.xib. iIgualmente incorporará una clase llamada AppDelegate.

First we must create a new project called "twoWindows". In the main window we must add one button with the title "Abrir Segunda Ventana".
From this button we will make an action control dragging to the AppDelegate.h file. The name for this action would be "mostrarSegunda". Later we will implement the code for this action.
Once we have created the project we will have a a first window associated to a xib file called MainMenu.xib. Also we have an asociated class called AppDelegate. 



Vamos a crear ahora la segunda ventana, para ello primero crearemos el fichero xib donde se define la ventana. En la barra lateral izquierda (Navigator), seleccionamos el Project Navigator y a su vez hacemos click sobre la carpeta del proyecto. Después hacemos click con el derecho y del menú que sale seleccionamos la opción New File.

Now we are going to make the second window. First we need a xib file where the window is defined, so in the left side bar (Navigator) we must choose the Project Navigator and click over the project folder. Then we must make a right click and choose New File in the menu that appears.



En la ventana que se abre escogeremos MacOS / User Interface y Window, y pulsaremos sobre Next, pondremos como nombre “SecondWindow” y por último pulsaremos sobre Create

In this window we must choose MacOS / User Interface and Window, Next and set the name for the new window as "secondWindow". Finally we click over Create.



Se crea entonces la segunda ventana. Crearemos ahora una clase que nos permita controlar dicha ventana. Para ello volvemos al Navigator y dentro de este al Project Navigator, volvemos a hacer botón derecho sobre la carpeta del proyecto y escogemos de nuevo New File.
Una vez en este menú escogemos la opción MacOS / Cocoa /Objective-C Class y pulsamos sobre Next.



Nos aparecerá otra ventana donde además de poner el nombre, “SecondWindowController”, escogeremos la clase a la que pertenece, en este caso NSWindowController



Pulsamos sobre Next, y sobre créate y se creará la clase, quedando el proyecto de la siguiente manera:



El siguiente paso será unir la nueva ventana con su controlador creado. Para ello en el Project Navigator hacemos click sobre SecondWindow.Xib y una vez se muestre este en el Interface Builder, haremos click sobre el File´s Owner, el cubo transparente. En la barra lateral (Utilities) escojeremos el identity Inspector (tercer botón por la izqda.), y donde pone Class, borraremos la que hay por defecto y escribiremos el nombre de la nueva clase que hemos creado: SecondWindowController.



Por último desde el File´s Owner y con ctrl pulsado arrastraremos hasta el window, y crearemos un outlet sobre window tal y como se muestra a continuación:

Drag files


Declaramos la nueva clase creada para la segunda ventana en el fichero AppDelegate.h que controla la primera. Añadimos esto:



El siguiente paso será añadir la declaración de SecondViewController.h en el fichero AppDelegate.m, así como escribir el código asociado al botón que abrirá la ventana.



Y listo, de esta manera se abre la segunda ventana desde la primera.


domingo, 5 de febrero de 2012

XCode: Mensajes de aviso / Alert Messages

El manejo de mensajes de aviso se puede hacer a través de los objetos NSAlert, los cuales nos permiten crear mensajes de avisos con diferentes botones y que a su vez estos botones puedan realizar una acción determinada.
En el ejemplo de hoy vamos a hacer un botón que cierre nuestra aplicación. Una vez pulsado el botón se mostrará un mensaje solicitando la confirmación de cerrar o no la aplicación.

This time we are going to see how to display alert messages in our application. For this purpose we have the class NSAlert. With this class we could create alert messages using buttons, message text, icons as we need.
The example application we are going to create shows a button in the centre of the windows, once this button is pressed a message appear asking you if you really want to close the application.




Crearemos un proyecto vacío (ponle el nombre que te de la gana, es lo de menos). No hace falta Core Data ni nada mas, será un ejemplo muy simple.
Colocaremos un botón en el centro de la ventana principal y le pondremos de título "Cerrar". Después crearemos un Action asociado a este botón sobre el fichero AppDelegate.h. Puedes llamar a esa Action como "cerrarAplicacion"


Start creating an empty project, (you can name as you want, it does´t matter). Also we do not need Core Data, or anything more, it´s going to be a very simple application.
Once you have created the empty application go to your main window and place a button in the center of it. Then create an Action from this bottom to the AppDelegate.h. "cerrarAplicacion" could by the name for the action. 

La implementación de dicho botón consistirá primero en crear un objeto del tipo NSAlert, después lo configuraremos con los diferentes botones, y textos que necesitemos mostrar. Y por último haremos una llamada a mostrar el mensaje de alerta creado, indicando sobre que ventana mostrado, y a que método llamar cuando se pulse alguno de los botones.
El método se llamará "alertDidEnd", y en el implementaremos lo que necesitamos que se haga al pulsar el botón correspondiente. En nuestro caso será cerrar el programa, lo que se hará simplemente usando la función exit(0).

The implementation for this action will consist first on create an NSAlert object, and then populate this object with a pair of buttons, "Si, sierra" and "No en ningún caso", the texts wich explain the alert, and also the type of alert. Finally we show the alert, setting from which window appears (_window), the behavior of the alert, in this case, modal behavior, and the selector called when the user press one of the buttons in the alert message.
This selector calls a method called "alertDidEnd". It´s implements the action to close the application in  case the user press the first button defined. Using exit(0) you can close the application.




viernes, 3 de febrero de 2012

XCode: Cocoa Bindings


Bindings es una tecnología en Cocoa que nos permite sincronizar objetos. Es una herramienta que facilita la comunicación entre objetos y supone una adaptación de la metdología MVC (Model-View-Controller). Básicamente permite realizar una conexión entre el atributo de un Object view (un objeto usado para mostrar valores), y un objeto usado para almacenar ese valor.
Por ejemplo, supongamos un campo Edit y una variable temperatura. Podremos hacer un binding entre ellos de manera que si cambio el valor de la variable se cambiará automáticamente el contenido del campo Edit, y viceversa.

Vamos a realizar un ejemplo donde tendremos un slider horizontal sincronizado con un campo de edición, de manera que si muevo el slider, se actualizará el edit, y si escribo un valor en este último se actualizará la posición del slider.

Creamos un proyecto que llamaremos binding.



Iremos a la ventana y colocaremos dos componentes, un NSEdit y un NSSlider como se muestra en la imagen siguiente:



La forma de realizar esto usando el tradicional MVC sería usando outlets y action, esto es, para cada componente creamos un outlet que los referencie, y después un action que se asigne a ambos componentes.
Dicho action detecta cual de los dos componentes es el sender, para primero leer el valor del componente y después actualizar dicho valor en el otro componente.


Esto supone tener que escribir algo de código, que para un ejemplo simple como este no supone mayor problema, pero si necesitásemos conectar objetos más complicados como tablas de datos que necesitan actualizar a su vez otras tablas, o componentes la cosa se complica. Para eso emplearemos la tecnología Binding.

Lo primero sería crear una clase que defina al objeto que mantendrá el valor. Crearemos la clase “Valor”.





Dentro de esta implementaremos un objeto que simplemente tendrá un atributo que se llamará “miValor” de tipo double.

Una vez creado vamos al Interface Builder y añadiremos un NSObject que vincularemos a esta clase recién creada.





Añadimos ahora un Object Controller que vincularemos al objeto de la clase creado anteriormente, y además añadiremos un Key que referencie al atributo miValor de la clase Valor.




Por último nos queda por establecer los bindings entre el atributo miValor de la clase Valor y los dos componentes, de manera que se mantengan sincronizados, es decir, que cambiado uno de ellos afecte automáticamente  al otro.

Para ello seleccionamos el primer componente, la barra y vamos al binding inspector. Expandimos la opción Value y la configuramos como se muestra:




Repetimos la misma acción para configurar el binding del campo edit.




Y ejecutamos el programa. En este punto cualquier cambio en cada uno de los componentes afecta al otro, es decir si muevo la barra se mostrará el valor en el campo edit, y si en este pongo un número entre 0 y 100 la barra se colocará en esa posición.

Esta es la forma en la que el uso de Bindings nos permite reducir la cantidad de código a escribir, facilitándonos la programación.