<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Sumolari.com &#187; Mac OS X</title>
	<atom:link href="http://sumolari.com/category/mac-os-x/feed/" rel="self" type="application/rss+xml" />
	<link>http://sumolari.com</link>
	<description>Proyectos de un amante de la informática</description>
	<lastBuildDate>Tue, 08 May 2012 16:01:12 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Guardar objetos en archivos con Objective-C</title>
		<link>http://sumolari.com/guardar-objetos-en-archivos-con-objective-c/</link>
		<comments>http://sumolari.com/guardar-objetos-en-archivos-con-objective-c/#comments</comments>
		<pubDate>Wed, 07 Sep 2011 06:50:02 +0000</pubDate>
		<dc:creator>Sumolari</dc:creator>
				<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[Introducción a Objective-C]]></category>
		<category><![CDATA[xcode]]></category>

		<guid isPermaLink="false">http://sumolari.com/?p=5633</guid>
		<description><![CDATA[Ayer Carmen Parra preguntaba en un comentario cómo se pueden guardar los datos introducidos por el usuario en un archivo. Como el proceso es demasiado largo como para publicarlo en un comentario, he decidido escribir este pequeño tutorial. NSArray, NSDictionary, NSString, NSNumber, NSData y otros Hay dos métodos sencillos para almacenar un objeto en un [...]]]></description>
			<content:encoded><![CDATA[<p>Ayer <a href="http://sumolari.com/introduccion-a-objective-c-el-paradigma-de-la-poo/comment-page-1/#comment-42784">Carmen Parra</a> preguntaba en un comentario cómo se pueden guardar los datos introducidos por el usuario en un archivo. Como el proceso es demasiado largo como para publicarlo en un comentario, he decidido escribir este pequeño tutorial.</p>
<h3>NSArray, NSDictionary, NSString, NSNumber, NSData y otros</h3>
<p><a href="http://sumolari.com/wp-content/uploads/2011/09/Captura-de-pantalla-2011-09-07-a-las-07.21.15.png" rel="lightbox-5633"><img class="alignright size-medium wp-image-5634 rightimage" title="Resultado del código de ejemplo" src="http://sumolari.com/wp-content/uploads/2011/09/Captura-de-pantalla-2011-09-07-a-las-07.21.15-300x115.png" alt="Resultado del código de ejemplo" width="300" height="115" /></a>Hay dos métodos sencillos para almacenar un objeto en un archivo y poder recuperarlo cuando nos convenga. El primero no se puede aplicar a cualquier objeto, sino a objetos de algunas clases de <a href="http://sumolari.com/category/objective-c/">Objective-C </a>que responden a dos métodos llamados <em>writeToFile:atomically:</em> y <em>writeToURL:atomically:</em>. El uso de estos métodos es muy sencillo, basta con llamarlos en el momento en el que queramos que el objeto se guarde en un archivo.</p>
<p>A continuación teneís un ejemplo comentado. Básicamente creamos una matriz, le añadimos algo de contenido, la imprimimos, la guardamos en un archivo y nos deshacemos de ella. A continuación creamos otra matriz que lea el contenido del archivo y comprobamos que tiene el mismo contenido que la anterior. El resultado que obtendréis será similar al de la imagen de la derecha.</p>
<pre class="prettyprint linenums">
NSMutableArray *array = [[NSMutableArray alloc] init]; // Creamos una matriz
	[array addObject:@&quot;¡Hola&quot;]; // Añadimos un objeto
	[array addObject:@&quot;mundo!&quot;]; // Añadimos otro objeto
	NSLog(@&quot;Matriz original: %@&quot;, array); // Imprimimos la matriz original
	[array writeToFile:@&quot;filename&quot; atomically:YES]; // Escribimos en el archivo filename el contenido de la matriz
	[array release]; // Liberamos memoria
	NSMutableArray *arrayFromFile = [[NSMutableArray alloc] initWithContentsOfFile:@&quot;filename&quot;]; // Esta matriz tiene el mismo contenido que tenía la matriz anterior
	NSLog(@&quot;%@&quot;, arrayFromFile); // Imprimimos la matriz recuperada del archivo
	[arrayFromFile release]; // Liberamos memoria
</pre>
<p>Del mismo modo que se puede guardar en un archivo un objeto de la clase <em>NSArray</em>, también se puede usar con objetos <em>NSDictionary</em>, <em>NSString</em>, <em>NSData</em> y <em>NSNumber</em>, entre otros. Sin embargo no se puede usar con objetos de una clase creada por nosotros (en la mayoría de los casos).</p>
<h3>Clases creadas por nosotros</h3>
<p>Para guardar en un archivo un objeto de una clase creada por nosotros, tendremos que hacer que el objeto sigua el protocolo <em>NSCoding</em>. Tras esto, mediante las clases <em>NSKeyedArchiver</em> y <em>NSKeyedUnarchiver</em> podremos guardar en un archivo y leer de un archivo nuestro objeto. Este protocolo tiene dos métodos necesarios: <em>initWithCoder:</em> y <em>encodeWithCoder:</em>.</p>
<p>Vamos a suponer que hemos creado la clase <em>Empleado</em>, que tiene la siguiente interfaz:</p>
<pre class="prettyprint linenums">
@interface Empleado : NSObject
@property (nonatomic, retain)	NSString	*nombre, *apellidos;
@property						NSUInteger	edad;
@property						BOOL		esEmpleadoDelMes;
@end
</pre>
<p>Para poder almacenar este objeto en un archivo tendremos primero que hacer que siga el protocolo <em>NSCoding</em>. Modficaremos la interfaz y la dejaremos así:</p>
<pre class="prettyprint linenums">
#define kNombre				@&quot;Nombre&quot;
#define kApellidos			@&quot;Apellidos&quot;
#define kEdad				@&quot;Edad&quot;
#define kEsEmpleadoDelMes	@&quot;esEmpleadoDelMes&quot;
@interface Empleado : NSObject
@property (nonatomic, retain)	NSString	*nombre, *apellidos;
@property						NSUInteger	edad;
@property						BOOL		esEmpleadoDelMes;
@end
</pre>
<p>Básicamente hay dos cambios: hemos indicado que la clase sigue el protocolo <em>NSCoding</em> y hemos definido una serie de constantes que usaremos más adelante y que entenderéis en seguida su utilidad.</p>
<p>Ahora pasamos a la implementación. Esta es la implementación original de la clase <em>Empleado</em>, antes de seguir el protocolo <em>NSCoding</em>:</p>
<pre class="prettyprint linenums">
@implementation Empleado
@synthesize nombre, apellidos;
@synthesize edad;
@synthesize esEmpleadoDelMes;
- (void)dealloc
{
	[nombre release];
	[apellidos release];
	[super dealloc];
}
@end
</pre>
<p>Ahora vamos a añadir los dos métodos que necesitamos para seguir el protocolo <em>NSCoding</em>. Estos métodos nos permiten archivar nuestro objeto. El método <em>encodeWithCoder:</em> tiene por parámetro un objeto de la clase <em>NSCoder</em>. En este objeto archivaremos las propiedades del nuestro, asignándole a una serie de claves las propiedades del objeto.</p>
<p>Por ejemplo, si queremos hacer que la propiedad <em>nombre</em> se archive en la clave <em>clave</em>, el método tendría el siguiente aspecto:</p>
<pre class="prettyprint linenums">
- (void)encodeWithCoder:(NSCoder *)coder {
    [coder encodeObject:self.nombre forKey:@&quot;clave&quot;];
}
</pre>
<p>No todas las propiedades se archivan de la misma forma. Los objeto se archivan a través del método <em>encodeObject:forKey:</em>, los números enteros se archivan con <em>encodeInteger:forKey:</em> y los valores booleanos con <em>encodeBool:forKey:</em>. Las claves son muy importantes, ya que el método <em>initWithCoder:</em> va a desarchivar el objeto usando las mismas claves para acceder a las propiedades, por eso hemos definido una serie de constantes que serán las claves que usaremos para archivar y desarchivar las propiedades.</p>
<p><strong>Nota:</strong> Tenéis una lista de todos los métodos para archivar objetos, así como una explicación del proceso de archivar y desarchivar objetos en <a href="http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Archiving/Articles/codingobjects.html#//apple_ref/doc/uid/20000948-BCIHBJDE">la documentación de Apple</a> (en inglés).</p>
<p>Nuestro método <em>encodeWithCoder:</em> quedará así:</p>
<pre class="prettyprint linenums">
- (void)encodeWithCoder:(NSCoder *)coder {
    [coder encodeObject:self.nombre forKey:kNombre];
	[coder encodeObject:self.apellidos forKey:kApellidos];
	[coder encodeInteger:self.edad forKey:kEdad];
	[coder encodeBool:self.esEmpleadoDelMes forKey:kEsEmpleadoDelMes];
}
</pre>
<p>El método <em>initWithCoder:</em> es muy similar al anterior, sólo que su funcionamiento es el contrario: a partir de un objeto archivado se obtienen las propiedades y se crea un objeto de la clase <em>Empleado</em> (en este caso) con las propiedades que tenía el objeto al archivarse. En este caso enviaremos el mensaje <em>decodeObjectForKey:@&#8221;clave&#8221;</em> a <em>coder</em> y asignaremos el valor devuelto a la propiedad de nuestro objeto. De nuevo, se usan métodos diferentes para decodificar número enteros, valores booleanos y otros tipos de variables. Nuestro método <em>initWithCoder: </em>quedará así:</p>
<pre class="prettyprint linenums">
- (id)initWithCoder:(NSCoder *)coder {
    if ((self = [super init])) {
		self.nombre = [coder decodeObjectForKey:kNombre];
		self.apellidos = [coder decodeObjectForKey:kApellidos];
		self.edad = [coder decodeIntForKey:kEdad];
		self.esEmpleadoDelMes = [coder decodeBoolForKey:kEsEmpleadoDelMes];
	}
    return self;
}
</pre>
<p><a href="http://sumolari.com/wp-content/uploads/2011/09/Captura-de-pantalla-2011-09-07-a-las-08.43.05.png" rel="lightbox-5633"><img class="alignleft size-medium wp-image-5641 leftimage" title="Resultado del ejemplo" src="http://sumolari.com/wp-content/uploads/2011/09/Captura-de-pantalla-2011-09-07-a-las-08.43.05-300x19.png" alt="Resultado del ejemplo" width="300" height="19" /></a>Ahora pasemos a crear un objeto <em>Empleado</em>, a guardarlo en un archivo y a comprobar que funciona correctamente. Primero incluímos la interfaz de la clase <em>Empleado </em>en el archivo en el que vamos a crear el objeto, en mi caso, y al tratarse de una &#8220;<em>Command Line Tool</em>&#8220;, lo incluiré en el archivo <em>main.m</em>. El siguiente código comentado crea un objeto de la clase <em>Empleado</em>, le asigna algunos valores sus propiedades, lo archiva y después crea un nuevo objeto con el contenido del archivo en el que se ha guardado antes el objeto:</p>
<pre class="prettyprint linenums">
Empleado *trabajador = [[Empleado alloc] init]; // Creamos el objeto
	trabajador.nombre = @&quot;Juan&quot;; // Le damos un nombre
	trabajador.apellidos = @&quot;García López&quot;; // Unos apellidos
	trabajador.edad = 26; // Una edad
	trabajador.esEmpleadoDelMes = YES; // Y lo hacemos empleado del mes
	NSLog(@&quot;%@ %@ tiene %lu años&quot;, trabajador.nombre, trabajador.apellidos, trabajador.edad); // Imprimimos sus datos
	[NSKeyedArchiver archiveRootObject:trabajador toFile:@&quot;empleado&quot;]; // Lo guardamos en el archivo empleado
	[trabajador release]; // Liberamos memoria
	Empleado *trabajadorRecuperado = [NSKeyedUnarchiver unarchiveObjectWithFile:@&quot;empleado&quot;]; // Creamos un objeto a partir del archivo empleado
	NSLog(@&quot;%@ %@ tiene %lu años&quot;, trabajadorRecuperado.nombre, trabajadorRecuperado.apellidos, trabajadorRecuperado.edad); // Imprimimos sus datos
</pre>
<p>Así se puede guardar un objeto de cualquier clase en un archivo, de forma que puede ser recuperado en cualquier momento. Los objetos más complejos pueden necesitar métodos más complejos a la hora de archivarlos. Del mismo modo no se tienen por qué archivar todas las propiedades si no se quiere.</p>
<p>Por último <a href="http://cl.ly/140k2I3L2b1U1N0E0Z1H">dejo a vuestra disposición los archivos del proyecto que he creado mientras escribía el tutorial</a>, por si os atascáis y necesitáis un empujoncito.</p>
]]></content:encoded>
			<wfw:commentRss>http://sumolari.com/guardar-objetos-en-archivos-con-objective-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Borra archivos de un pendrive en Mac OS X sin vaciar la papelara</title>
		<link>http://sumolari.com/borra-archivos-de-un-pendrive-en-mac-os-x-sin-vaciar-la-papelara/</link>
		<comments>http://sumolari.com/borra-archivos-de-un-pendrive-en-mac-os-x-sin-vaciar-la-papelara/#comments</comments>
		<pubDate>Sat, 20 Aug 2011 10:26:09 +0000</pubDate>
		<dc:creator>Sumolari</dc:creator>
				<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[automator]]></category>
		<category><![CDATA[trucos]]></category>

		<guid isPermaLink="false">http://sumolari.com/?p=5423</guid>
		<description><![CDATA[Editado: En la primera versión de esta pequeña aplicación había un error que provocaba que en unidades con nombres que incluyesen espacios o caracteres especiales no se borrasen los archivos de forma definitiva. Se ha resuelto y he actualizado el artículo añadiendo el enlace para descargar la última versión en lugar de la que tenía [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Editado:</strong> En la primera versión de esta pequeña aplicación había un error que provocaba que en unidades con nombres que incluyesen espacios o caracteres especiales no se borrasen los archivos de forma definitiva. Se ha resuelto y he actualizado el artículo añadiendo el enlace para descargar la última versión en lugar de la que tenía el error. ¡Gracias a Jorosa por el aviso!</p>
<div id="attachment_5430" class="wp-caption alignleft" style="width: 240px"><a href="http://sumolari.com/wp-content/uploads/2011/08/Captura-de-pantalla-2011-08-20-a-las-12.00.20.png" rel="lightbox-5423"><img class="size-thumbnail wp-image-5430 " title="Archivos &quot;borrados&quot; del pendrive" src="http://sumolari.com/wp-content/uploads/2011/08/Captura-de-pantalla-2011-08-20-a-las-12.00.20-230x130.png" alt="Archivos &quot;borrados&quot; del pendrive" width="230" height="130" /></a><p class="wp-caption-text">Hay cerca de 800MB de archivos &quot;borrados&quot; en este pendrive</p></div>
<p>Hay veces que uno se sorprende al ver ciertos comportamientos de <a href="http://sumolari.com/category/mac-os-x/">Mac OS X</a>. Uno de los que menos me gustan es la forma de borrar archivos de un dispositivo extraíble (por ejemplo, un pendrive). En lugar de borrar el archivo, como sería de esperar, o moverlo a la papelera del Mac, lo almacena en una carpeta oculta dentro del propio pendrive que usa a modo de papelera. Si nos fijamos en la papelera de nuestro Mac, veremos que los archivos que hemos borrado del pendrive aparecen en ella, aunque no estén almacenados en el Mac.</p>
<p>El problema radica en que además de no borrar realmente los archivos y dejarlos en el pendrive (ocupando parte de su preciada capacidad), no hay forma de borrar los archivos individualmente de la papelera. Si usamos la combinación <em>Función</em> + <em>Retroceso</em> lo que hacemos es devolver el archivo eliminado a su carpeta de origen en lugar de borrarlo. Estamos pues obligados a vaciar la papelera y borrar definitivamente otros archivos que tal vez no queramos perder todavía.</p>
<p>Así que, algo mosqueado porque esto no haya cambiado ni en Snow Leopard ni en Lion (ni tiene pinta de que vaya a cambiar), he creado una simple aplicación en Automator para &#8220;<em>limpiar</em>&#8221; los pendrives de archivos supuestamente eliminados.</p>
<h3>Cómo funciona</h3>
<div id="attachment_5433" class="wp-caption alignright" style="width: 240px"><a href="http://sumolari.com/wp-content/uploads/2011/08/Captura-de-pantalla-2011-08-20-a-las-12.08.27.png" rel="lightbox-5423"><img class="size-thumbnail wp-image-5433" title="La carpeta .Trashes al descubierto" src="http://sumolari.com/wp-content/uploads/2011/08/Captura-de-pantalla-2011-08-20-a-las-12.08.27-230x130.png" alt="La carpeta .Trashes al descubierto" width="230" height="130" /></a><p class="wp-caption-text">Esto lo aclara todo</p></div>
<p>Antes de dar los enlaces para descargar la aplicación, veamos cómo funciona. Como ya he dicho, Mac OS X mueve los archivos &#8220;<em>borrados</em>&#8221; a una carpeta oculta que funciona a modo de papelera. Esta carpeta se llama <em>.Trashes</em> (como de costumbre en OS X, al llevar un punto al principio del nombre, la carpeta es oculta). Si borramos la carpeta<em> .Trashes</em>, borramos todos los archivos que queríamos eliminar pero, ¿cómo la borramos sin pasar por la papelera de nuevo?</p>
<p>Aquí es donde entra en juego el potencial de un sistema basado en Unix. Gracias al comando <strong>rm</strong> (<strong>r</strong>emo<strong>v</strong>e) podemos eliminar archivos o carpetas sin necesidad de pasar por la papelera. Combinando esto con un par de parámetros, concretamente <strong>-R</strong> (borrar de forma recursiva) <strong>-f</strong> (sin pedir confirmación) y <strong>-d</strong> (directorios y archivos) conseguimos vaciar el pendrive de archivos que queríamos borrar.</p>
<p>Obviamente tener que escribir todo esto en la terminal cada vez que queremos limpiar un pendrive de archivos &#8220;<em>borrados</em>&#8221; no es muy cómodo. Para hacer más cómoda la tarea recurriremos a <em>Automator</em>, ese pobre incomprendido que si bien es capaz de hacer maravillas, la mayoría de los usuarios desconoce incluso su existencia.</p>
<p><a href="http://sumolari.com/wp-content/uploads/2011/08/Captura-de-pantalla-2011-08-20-a-las-11.43.22.png" rel="lightbox-5423"><img class="size-thumbnail wp-image-5435 alignleft leftimage" style="border: none;" title="Creamos una nueva aplicación en Automator" src="http://sumolari.com/wp-content/uploads/2011/08/Captura-de-pantalla-2011-08-20-a-las-11.43.22-230x130.png" alt="Creamos una nueva aplicación en Automator" width="230" height="130" /></a><a href="http://sumolari.com/wp-content/uploads/2011/08/Captura-de-pantalla-2011-08-20-a-las-11.53.38.png" rel="lightbox-5423"><img class="alignright size-medium wp-image-5436" title="El flujo resultante" src="http://sumolari.com/wp-content/uploads/2011/08/Captura-de-pantalla-2011-08-20-a-las-11.53.38-300x176.png" alt="El flujo resultante" width="300" height="176" /></a>Para crear la aplicación abrimos <em>Automator </em>y elegimos crear una aplicación. A continuación arrastramos las acciones para formar el flujo que podéis ver en la imagen de la derecha. Básicamente el flujo es el siguiente:</p>
<ol>
<li>Solicitamos una carpeta. El usuario deberá seleccionar un dispositivo extraíble.</li>
<li>Establecemos el valor de una variable con la ruta de la carpeta seleccionada.</li>
<li>Leemos el valor de esta variable y se lo pasamos a un script Shell como parámetro (este paso y el anterior supongo que se pueden omitir y usar el resultado del paso 1 como argumentos para el paso 4, pero por pereza no lo he comprobado &#8211; si alguien se anima que lo comente en los comentarios).</li>
<li>En el script <em>Shell</em> usamos el comando <strong>cd</strong> (<strong>c</strong>hange <strong>d</strong>ir) para ir a la ruta del pendrive.</li>
<li>A continuación, en el mismo <em>Shell</em> y cambiada la ruta a la que nos interesa, borramos la carpeta <em>.Trashes</em> con los parámetros que he expuesto antes.</li>
</ol>
<h3>Descarga</h3>
<p>Seguidos los pasos y entendido el funcionamiento, <a href="http://sumolari.com/?dl_id=7">aquí tenéis a vuestra disposición la aplicación</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://sumolari.com/borra-archivos-de-un-pendrive-en-mac-os-x-sin-vaciar-la-papelara/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Introducción a Objective-C: El paradigma de la POO</title>
		<link>http://sumolari.com/introduccion-a-objective-c-el-paradigma-de-la-poo/</link>
		<comments>http://sumolari.com/introduccion-a-objective-c-el-paradigma-de-la-poo/#comments</comments>
		<pubDate>Fri, 07 Jan 2011 08:02:24 +0000</pubDate>
		<dc:creator>Sumolari</dc:creator>
				<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[Introducción a Objective-C]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iPod Touch]]></category>
		<category><![CDATA[POO]]></category>
		<category><![CDATA[xcode]]></category>

		<guid isPermaLink="false">http://sumolari.com/?p=4655</guid>
		<description><![CDATA[Siguiendo con los tutoriales de Objective-C, voy a explicar el paradigma de la Programación Orientada a Objetos. En la POO de Objective-C hay 5 conceptos clave: Objeto: Los objetos son el pilar fundamental en la POO. Los objetos contienen variables, responden a métodos, tienen una dirección de memoria en la que están almacenados, pertenecen a [...]]]></description>
			<content:encoded><![CDATA[<p>Siguiendo con los tutoriales de <a href="../category/objective-c/">Objective-C</a>, voy a explicar el paradigma de la <a href="http://sumolari.com/tag/poo/">Programación Orientada a Objetos</a>. En la POO de <a href="../category/objective-c/">Objective-C</a> hay 5 conceptos clave:</p>
<ul>
<li><strong>Objeto:</strong> Los objetos son el pilar fundamental en la POO. Los objetos contienen variables, responden a métodos, tienen una dirección de memoria en la que están almacenados, pertenecen a una clase y pueden implementar protocolos.</li>
<li><strong>Clases: </strong>Un objeto pertecen a una clase, y sólo a una. Por el contrario varios objetos pueden pertenecer a la misma clase. En otros lenguajes de programación los objetos pueden heredar de varias clases, pero en <a href="../category/objective-c/">Objective-C</a> no. Cuando un objeto pertecene a una clase, el objeto contiene todas las variables de la clase, y responde a todos los métodos de instancia a los que responde la clase (veremos qué es esto más adelante). A su vez, una clase puede heredar de otra clase (de hecho lo más común es que las clases que creemos hereden de <em>NSObject</em>, al menos a nuestro nivel), cuando esto sucede, la nueva clase responde a todos los métodos a los que respondía la clase &#8220;padre&#8221; y los objetos de esta clase también tienen las variables de instancia de la clase &#8220;padre&#8221;.</li>
<li><strong>Variables de instancia:</strong> Los objetos, a pesar de ser por sí mismos variables, pueden contener a otras variables, que pueden ser variables simples como las de C (por ejemplo, números enteros o de coma flotantes) u objetos de cualquier clase. Las variables de instancia son diferentes en cada objeto, por lo que si tenemos dos objetos de la clase <em>rueda</em> y accedemos a la variable <em>presiónDeLaRueda</em>, cada uno devolverá un valor diferente de presión.</li>
<li><strong>Métodos de instancia:</strong> Los métodos de instancia son las funciones que puede ejecutar el objeto de una clase determinada. Cada clase define unos métodos de instancia diferente. Por ejemplo, la clase coche podría tener un método que fuese <em>encenderMotor</em>, al que se accedería desde un objeto determinado.</li>
<li><strong>Métodos de clase:</strong> Los métodos de clase son funciones a las que sólo se puede acceder desde la propia clase. Un método de clase típico es <em>alloc</em>, al que sólo se puede acceder desde una case, nunca desde un objeto.</li>
</ul>
<p>Puede que no os hayan quedado claros del todo los conceptos con esta introducción, los explicaré mejor un poco más adelante.</p>
<div id="attachment_4666" class="wp-caption alignleft" style="width: 240px"><a href="http://sumolari.com/wp-content/uploads/2011/01/NuevaClase.png" rel="lightbox-4655"><img class="size-thumbnail wp-image-4666" title="Creando una nueva clase" src="http://sumolari.com/wp-content/uploads/2011/01/NuevaClase-230x130.png" alt="Creando una nueva clase" width="230" height="130" /></a><p class="wp-caption-text">Creando una nueva clase</p></div>
<div id="attachment_4667" class="wp-caption alignright" style="width: 240px"><a href="http://sumolari.com/wp-content/uploads/2011/01/NuevaClasePaso2.png" rel="lightbox-4655"><img class="size-thumbnail wp-image-4667" title="Creando una nueva clase - Paso 2" src="http://sumolari.com/wp-content/uploads/2011/01/NuevaClasePaso2-230x130.png" alt="Creando una nueva clase - Paso 2" width="230" height="130" /></a><p class="wp-caption-text">Creando una nueva clase - Paso 2</p></div>
<p>En <a href="../category/objective-c/">Objective-C</a> las clases se definen mediante dos archivos: <em>NOMBRECLASE.h</em> y <em>NOMBRECLASE.m</em>. Los archivos .h contienen la interfaz de la clase y los archivos .m su implementación. La interfaz de la clase es una especie de índice: indica todas las varibles de instancia de la clase y todos los métodos a los que responde. La implementación es donde se desarrolla el código de las funciones. No es necesario dividir las clases en dos archivos, pero es altamente recomendable para hacer más claro el código.</p>
<p>Para añadir un nuevo archivo a nuestro proyecto basta con ir al menú <em>File » New file&#8230;</em> o pulsar <em>Comando</em> + <em>N</em>. En la ventana que nos aparecerá seleccionaremos <em>Mac OS X » Cocoa Class » Objective-C Class (Subclass of NSObject)</em>. En  <em>File Name</em> introduciremos el nombre de nuestra nueva clase, en este caso <em>Coche</em>, acabado en .m. También marcaremos la casilla <em>Also create &#8220;Coche.h&#8221;</em>, para mantener más limpio el código.</p>
<p>En el archivo <em>Coche.h</em> encontraremos el siguiente código:</p>
<pre class="prettyprint linenums">
#import &lt;Cocoa/Cocoa.h&gt;
@interface Coche : NSObject {
}
@end
</pre>
<p>La primera línea ya la vimos en <a href="http://sumolari.com/?p=4633">la primera parte de los tutoriales</a>, e importa el Framework <a href="http://sumolari.com/tag/cocoa/">Cocoa</a>. En la siguiente línea comienza la interfaz de la clase. Veamos su sintaxis:</p>
<ul>
<li><strong>@interface</strong>: Inicia la interfaz</li>
<li><strong>Coche</strong>: El nombre de la clase que estamos definiendo</li>
<li><strong>: </strong>: Separado entre el nombre de la clase y la clase de la que hereda.</li>
<li><strong>NSObject</strong>: La clase de la que hereda nuestra clase.</li>
<li><strong>{</strong> : Abre el bloque donde se definen las variables de instancia.</li>
<li><strong>}</strong> : Cierra este bloque.</li>
<li><strong>@end</strong>: Indica el fin de la implementación.</li>
</ul>
<p>Como podéis ver, las clases pueden ser &#8220;hijas&#8221; de otras clases, y es algo realmente común. De hecho es muy conveniente que nuestras clases sean hijas de al menos <em>NSObject</em>. La clase <em>NSObject</em> es la clase básica e incluye las funciones esenciales de gestión de memoria (la veremos más tarde), entre otras cosas.</p>
<p>Si nuestra clase es hija de una clase que es hija de <em>NSObject</em>, esta nueva clase también tendrá acceso a los métodos de la clase <em>NSObject</em>.</p>
<p>Ahora bien, imaginemos que queremos que queremos que nuestra clase tenga alguna variable de instancia, como por ejemplo, el color del vehículo y el número de puertas. Definiremos dos variables: <em>color</em> y <em>numPuertas</em>. La primera, color, será un objeto de clase <em>NSString</em> (cadena de texto). La segunda, <em>numPuertas</em>, será una variable de tipo <em>NSUInteger</em> (a nuestro nivel, equivalente a un <em>unsigned</em> <em>int</em> de C, o en palabras llanas, un número entero sin signo).</p>
<pre class="prettyprint linenums">
#import &lt;Cocoa/Cocoa.h&gt;
@interface Coche : NSObject {
 NSString    *color;
 NSUInteger    numPuertas;
}
@end
</pre>
<p>Fijáos en la sintaxis para definir varibles de instancia:</p>
<pre class="prettyprint linenums">
NOMBRE_DE_LA_CLASE_DEL_OBJETO *NOMBRE_DEL_OBJETO;
NOMBRE_DEL_TIPO_DE_VARIABLE NOMBRE_DE_LA_VARIABLE;
</pre>
<p>Al defnir un objeto <strong>siempre</strong> antepondremos un asterisco (&#8220;*&#8221;) al nombre del objeto.</p>
<p>Y ahora, ¿cómo obtenemos el valor de estas variables? Pues bien, tendremos que crear un método de instancia para asignar este valor. Los métodos se definen entre el corchete de cierre (&#8220;}&#8221;) y el <em>@end</em>. Creemos dos métodos de instancia: <em>getColor</em> y <em>getNumPuertas</em>. Creemos otro más llamado <em>imprimirDetalles</em> que muestre en la consola los valores devueltos por <em>getColor</em> y <em>getNumPuertas</em>.</p>
<pre class="prettyprint linenums">
#import &lt;Cocoa/Cocoa.h&gt;
@interface Coche : NSObject {
 NSString    *color;
 NSUInteger    numPuertas;
}
- (NSString *)getColor;
- (NSUInteger)getNumPuertas;
- (void)imprimirDetalles;
@end
</pre>
<p>Fijáos de nuevo en la sintaxis:</p>
<pre class="prettyprint linenums">
- (CLASE_DEL_OBJETO_QUE_VAMOS_A_DEVOLVER *)NOMBRE_DE_LA_FUNCION;
- (TIPO_DE_LA_VARIABLE_QUE_SE_DEVOLVERA)NOMBRE_DE_LA_FUNCION;
- (VOID)NOMBRE_DE_LA_FUNCION_QUE_NO_DEVUELVE_NADA;
</pre>
<p>Como antes, cuando un método devuelve un objeto, se añade un asterisco al nombre de la clase del objeto que se devolverá. Cuando no es un objeto, no es necesario añadir el asterisco. Cuando una función no devuelve nada, se utiliza el valor <em>void</em> para indicárselo al compilador.</p>
<p>El guión (&#8220;-&#8221;) que precede a los métodos sirve para indicar que se trata de métodos de instancia. Si se tratase de métodos de clase (que veremos más adelante), estarían precedidos por un sigo +.</p>
<p>Pero aún nos faltan dos métodos para establecer el valor de las dos variables de instancias. Para ello definiremos dos métodos llamados <em>setColor</em> y <em>setNumPuertas</em> que acepten un parámetro que será el nuevo valor.</p>
<pre class="prettyprint linenums">
#import &lt;Cocoa/Cocoa.h&gt;
@interface Coche : NSObject {
 NSString    *color;
 NSUInteger    numPuertas;
}
- (NSString *)getColor;
- (NSUInteger)getNumPuertas;
- (void)imprimirDetalles;
- (void)setColor: (NSString *)nuevoColor;
- (void)setNumPuertas: (NSUInteger)nuevoNumPuertas;
@end
</pre>
<p>Analicemos la sintaxis de estas funciones. Como podéis ver, ninguna de las dos devuelve ningún valor, luego en el primer paréntesis escribiremos <em>void</em>. Los nombres están claros, pero al final de estos hay dos puntos (&#8220;:&#8221;). Esto indica que a continuación se encuentra un parámetro. Los parámetros tienen dos partes: la clase del objeto que es el parámetro o el tipo de la variable que es el parámetro y el nombre del mismo. La sintaxis es igual que la del tipo de valor que devuelve la función: El tipo de variable o la clase de objeto entre paréntesis (si es un objeto el parámetro se añade un asterisco) y a continuación el nombre del mismo. Las funciones pueden admitir varios parámetros, y pueden haber funciones con el mismo nombre pero diferentes parámetros. A continuación tenéis un ejemplo.</p>
<pre class="prettyprint linenums">
- (void)miFuncion;
- (void)miFuncionConUnParametro: (NSUInteger)miParametro;
- (NSString *)miFuncionConUnParametro: (NSUInteger)miParametro queAdemasDevuelveUnaCadenaDeTextoYRequiereOtroParametro: (NSUInteger)elSegundo;
</pre>
<p>Esto presenta un problema: ¿Cómo se llaman las funciones, si puede haber dos iguales hasta el primer parámetro? Pues bien, las funciones anteriores se llamarían así:</p>
<pre class="prettyprint linenums">
miFuncion
miFuncionConUnParametro:
miFuncionConUnParametro:queAdemasDevuelveUnaCadenaDeTextoYRequiereOtroParametro:
</pre>
<p>De este modo no son iguales los nombres a pesar de ser bastante parecidos (al menos en principio).</p>
<p>Con esto hemos creado la interfaz de nuestra clase: el índice de variables y métodos a los que responde. Sin embargo aún tenemos que escribir el código de estas funciones, así que vayamos al archivo <em>Coche.m</em> y comencemos a implementarlas. En el archivo .m veremos el siguiente código:</p>
<pre class="prettyprint linenums">
#import &quot;Coche.h&quot;
@implementation Coche
@end
</pre>
<p>Os suena, ¿verdad? Como en el caso anterior, vemos como se importa un archivo, en este caso la interfaz de nuestra clase. También vemos como se inicia la implementación con un código similar a la interfaz. Como podéis suponer, entre <em>@implementation Coche</em> y <em>@end</em> es donde escribiremos nuestras funciones.</p>
<p>Antes de implementar nuestras funciones, añadid el siguiente código después de <em>@implementation Coche</em>. Se trata de un método para la gestión de memoria que veremos en otro tutorial. Así de forma rápida, el método dealloc se llama cuando un objeto va a ser eliminado de la memoria. Los objetos tienen un contador interno que se aumenta con el método retain y se disminuye con el método release. Cuando el contador llega a 0, se llama automáticamente al método dealloc y se elimina el objeto de la memoria. De momento basta con que lo copiéis sin preguntar, ya lo explicaré más adelante.</p>
<pre class="prettyprint linenums">
- (void)dealloc
{
 [color release];
 [super dealloc];
}
</pre>
<p>Aprovechando este código os explicaré cómo se sobreescriben funciones ya existentes en la clase padre. Como he comentado, una clase que hereda de otra recibe las funciones de la clase padre, pero ¿qué sucede si queremos que en la clase hija la función heredada sea diferente? Pues nada, escribimos la nueva función como cualquier otra. La sintaxis es sencilla:</p>
<pre class="prettyprint linenums">
- (TIPO_DE_VALOR_QUE_SE_DEVUELVE)NOMBRE_DE_LA_FUNCION
{
// Código de la función
}
</pre>
<p>¿Qué ocurre si queremos que además de ejecutarse nuestro código se ejecute también el método (por si no os habéis dado cuenta, utilizo método y función para referirme a lo mismo, tal vez no es lo más correcto, pero estoy más acostumbrado a hablar de función y no de método, así que me sale sin pensar) de la clase padre que estamos sobreescribiendo? Pues añadimos<em> [super NOMBRE_DE_LA_FUNCION]; </em>en el lugar en el que queramos que se ejecute.</p>
<pre class="prettyprint linenums">
- (TIPO_DE_VALOR_QUE_SE_DEVUELVE)NOMBRE_DE_LA_FUNCION
 {
// Podemos ejecutar el método de la clase padre antes que nuestro código
[super NOMBRE_DE_LA_FUNCION];
// Código de la función
// O después
[super NOMBRE_DE_LA_FUNCION];
}
</pre>
<p>Veamos ahora cómo quedaría la implementación de nuestra clase tras añadir todos los métodos que hemos definido en la interfaz:</p>
<pre class="prettyprint linenums">
#import &quot;Coche.h&quot;
@implementation Coche
- (void)dealloc
{
 [color release];
 [super dealloc];
}
- (NSString *)getColor
{
}
- (NSUInteger)getNumPuertas
{
}
- (void)imprimirDetalles
{
}
- (void)setColor: (NSString *)colorNuevo
{
}
- (void)setNumPuertas: (NSUInteger)nuevoNumeroDePuertas
{
}
@end
</pre>
<p>Fijáos en que he cambiado el nombre de las variables de los argumentos de las dos últimas funciones. Las variables de los argumentos no tienen por qué tener el mismo nombre en la interfaz y en la implementación, pero tampoco pasa nada porque tengan el mismo nombre.</p>
<p>La función <em>getColor</em> y <em>getNumPuertas </em>tan sólo devuelven el valor de las variables correspondientes, así que añadiremos <em>return VARIABLE; </em>para que el método devuelva el valor de la variable. <em>return </em>no requiere asterisco si se devuelven objetos, se usa exactamente igual con objetos que con variables sencillas.</p>
<p>En la función <em>imprimirDetalles</em> utilizaremos la función <em>NSLog</em> para imprimir en la consola los valores de las variables. La función <em>NSLog</em> admite varios parámetros. El primero siempre es una cadena de texto (<em>@&#8221;"</em>), pero esta cadena admite combinaciones de caracteres específicas que indican que se deben reemplazar por otro valor. Así un <em>%d </em>se reemplazará por un número entero, un <em>%f</em> por un número decimal y un <em>%@</em> por otra cadena de texto (se puede usar tranquilamente un objeto también, lo veremos más adelante). Si usamos estas combinaciones, tras la cadena de caracteres, y separadas por comas (&#8220;,&#8221;) debemos introducir las variables o los objetos que reemplazarán las combinaciones. A continuación tenéis las tres funciones que hemos explicado:</p>
<pre class="prettyprint linenums">
- (NSString *)getColor
{
 return color;
}
- (NSUInteger)getNumPuertas
{
 return numPuertas;
}
- (void)imprimirDetalles
{
 NSLog(@&quot;Este coche es de color %@ y tiene %d puertas&quot;, [self getColor], [self getNumPuertas]);
}
</pre>
<p>Fijáos en la última función, concretamente en <em>[self getColor]</em> y <em>[self getNumPuertas]</em>. Esta es la sintaxis para enviar mensajes a los objetos. Enviar un mensaje a un objeto es, básicamente, pedirle a un objeto que ejecute el método con ese nombre. Así, cuando escribimos <em>[self funcion]</em> le pedimos al objeto <em>self</em> que ejecute el método <em>funcion</em>. El objeto <em>self</em> es un objeto especial y hace referencia al objeto actual, de modo que lo que hacemos en esta última función es pedirle al objeto de clase <em>Coche</em> que ejecuta el método <em>imprimirDetalles</em> que ejecute el método <em>getColor </em>y <em>getNumPuertas</em>.</p>
<p>Las funciones <em>setColor</em> y <em>setNumPuertas</em> son bastante sencillas. Simplemente asignaremos (mediante &#8220;=&#8221;) el valor que se pasa como parámetro (o argumento) a la variable correspondiente. Aquí los tenéis completos:</p>
<pre class="prettyprint linenums">
- (void)setColor: (NSString *)colorNuevo
{
 color = colorNuevo;
}
- (void)setNumPuertas: (NSUInteger)nuevoNumeroDePuertas
{
 numPuertas = nuevoNumeroDePuertas;
}
</pre>
<p>Y este es el aspecto final de la implementación de nuestra clase <em>Coche</em>:</p>
<pre class="prettyprint linenums">
#import &quot;Coche.h&quot;
@implementation Coche
- (void)dealloc
{
 [color release];
 [super dealloc];
}
- (NSString *)getColor
{
 return color;
}
- (NSUInteger)getNumPuertas
{
 return numPuertas;
}
- (void)imprimirDetalles
{
 NSLog(@&quot;Este coche es de color %@ y tiene %d puertas&quot;, [self getColor], [self getNumPuertas]);
}
- (void)setColor: (NSString *)colorNuevo
{
 color = colorNuevo;
}
- (void)setNumPuertas: (NSUInteger)nuevoNumeroDePuertas
{
 numPuertas = nuevoNumeroDePuertas;
}
@end
</pre>
<p>Ahora modificaremos nuestra aplicación para que cree un objeto de clase coche, establezca su color en azul y su número de puertas en 5 y que a continuación imprima en la consola la información sobre el mismo.</p>
<p>Vamos al archivo <em>NOMBREPROYECTO.m</em>, que debería tener el siguiente código:</p>
<pre class="prettyprint linenums">
#import &lt;Foundation/Foundation.h&gt;
int main (int argc, const char * argv[]) {
 NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
 // insert code here&#8230;
 NSLog(@&quot;Hello, World!&quot;);
 [pool drain];
 return 0;
}
</pre>
<p>E importamos el archivo <em>Coche.h</em> justo después de importarse Foundation:</p>
<pre class="prettyprint linenums">#import &quot;Coche.h&quot;</pre>
<p>A continuación añadimos, entre <em>NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; </em>y <em>[pool drain];</em>:</p>
<pre class="prettyprint linenums">
Coche *miCoche = [[Coche alloc] init];
 [miCoche setColor:@&quot;Azul&quot;];
 [miCoche setNumPuertas:5];
 [miCoche imprimirDetalles];
 [miCoche release];
</pre>
<p>Vayamos línea a línea:</p>
<pre class="prettyprint linenums">Coche *miCoche = [[Coche alloc] init];</pre>
<p>En esta línea creamos el objeto <em>miCoche</em>, de clase <em>Coche</em>. Fijáos como se le envía a  la clase <em>Coche</em> el mensaje <em>alloc</em> y al objeto resultante de ese mensaje se le envía el mensaje <em>init</em>. Los mensajes se pueden encadenar tanto como se quiera, aunque esto hace más complicado de leer el código, así que no es muy recomendable.</p>
<pre class="prettyprint linenums">
[miCoche setColor:@&quot;Azul&quot;];
[miCoche setNumPuertas:5];
</pre>
<p>En estas dos líneas se envía el método <em>setColor:</em> y <em>setNumPuertas:</em> al objeto <em>miCoche</em>, con el parámetro <em>@&#8221;Azul&#8221;</em> como nuevo color y <em>5</em> como número de puertas.</p>
<pre class="prettyprint linenums">
[miCoche imprimirDetalles];
</pre>
<p>En esta línea se le manda al objeto el mensaje <em>imprimirDetalles</em>, lo que hará que muestre por terminal los valores de las variables.</p>
<pre class="prettyprint linenums">
 [miCoche release];
</pre>
<p>Por último esta línea elimina el objeto. En realidad es algo más complejo, y lo explicaré más adelante en otro tutorial. De momento con saber que se elimina el objeto nos vale.</p>
<p>El código resultante de<em> MIPROYECTO.m</em> será:</p>
<pre class="prettyprint linenums">
#import &lt;Foundation/Foundation.h&gt;
#import &quot;Coche.h&quot;
int main (int argc, const char * argv[]) {
 NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
 // insert code here&#8230;
 NSLog(@&quot;Hello, World!&quot;);
 Coche *miCoche = [[Coche alloc] init];
 [miCoche setColor:@&quot;Azul&quot;];
 [miCoche setNumPuertas:5];
 [miCoche imprimirDetalles];
 [miCoche release];
 [pool drain];
 return 0;
}
</pre>
<p>Y si compilamos y ejecutamos la aplicación veremos el siguiente resultado:</p>
<p><a href="http://sumolari.com/wp-content/uploads/2011/01/Resultado.png" rel="lightbox-4655"><img class="aligncenter size-full wp-image-4668" title="Resultado de la segunda aplicación" src="http://sumolari.com/wp-content/uploads/2011/01/Resultado.png" alt="Resultado de la segunda aplicación" width="797" height="483" /></a></p>
<p>Esto no está mal, pero, ¿para qué llamar a dos métodos para establecer las variables y otro más para iniciar el objeto (<em>init</em>)? ¿No podríamos juntar esos tres métodos en uno? Sí, podemos. Vayamos al archivo <em>Coche.h</em> y añadamos el siguiente método:</p>
<pre class="prettyprint linenums">- (Coche *)initWithColor: (NSString *)nuevoColor andNumPuertas: (NSUInteger)nuevoNumPuertas;</pre>
<p>Quedando así la interfaz:</p>
<pre class="prettyprint linenums">
#import &lt;Cocoa/Cocoa.h&gt;
@interface Coche : NSObject {
 NSString    *color;
 NSUInteger    numPuertas;
}
- (Coche *)initWithColor: (NSString *)nuevoColor andNumPuertas: (NSUInteger)nuevoNumPuertas;
- (NSString *)getColor;
- (NSUInteger)getNumPuertas;
- (void)imprimirDetalles;
- (void)setColor: (NSString *)nuevoColor;
- (void)setNumPuertas: (NSUInteger)nuevoNumPuertas;
@end
</pre>
<p>En la implementación añadiremos lo siguiente:</p>
<pre class="prettyprint linenums">
- (Coche *)initWithColor: (NSString *)nuevoColor andNumPuertas: (NSUInteger)nuevoNumPuertas
{
 if (self = [super init])
 {
 [self setColor:nuevoColor];
 [self setNumPuertas:nuevoNumPuertas];
 }
 return self;
}
</pre>
<p>Analicemos este código. La primera línea de la función, <em>if (self = [super init])</em> sirve para comprobar que el objeto se ha creado correctamente. Es posible (aunque raro) que por algún motivo el objeto no pueda crearse correctamente (por ejemplo, por falta de memoria), así que en caso de que no se cree correctamente, no estableceremos el valor de ninguna variable (pues de otra manera haríamos fallar la aplicación). Dentro de la condición se envía los mensajes que ya conocemos al objeto y finalmente se devuelve el objeto <em>self</em>. Como podéis ver, esta función devuelve un objeto de clase <em>Coche</em>.</p>
<p>El código final de nuestra implementación será:</p>
<pre class="prettyprint linenums">
#import &quot;Coche.h&quot;
@implementation Coche
- (Coche *)initWithColor: (NSString *)nuevoColor andNumPuertas: (NSUInteger)nuevoNumPuertas
{
 if (self = [super init])
 {
 [self setColor:nuevoColor];
 [self setNumPuertas:nuevoNumPuertas];
 }
 return self;
}
- (void)dealloc
{
 [color release];
 [super dealloc];
}
- (NSString *)getColor
{
 return color;
}
- (NSUInteger)getNumPuertas
{
 return numPuertas;
}
- (void)imprimirDetalles
{
 NSLog(@&quot;Este coche es de color %@ y tiene %d puertas&quot;, [self getColor], [self getNumPuertas]);
}
- (void)setColor: (NSString *)colorNuevo
{
 color = colorNuevo;
}
- (void)setNumPuertas: (NSUInteger)nuevoNumeroDePuertas
{
 numPuertas = nuevoNumeroDePuertas;
}
@end
</pre>
<p>¿Cómo aplicamos estos cambios a nuestra aplicación? Vayamos al archivo <em>NOMBREPROYECTO.m</em> y reemplacemos el siguiente código:</p>
<pre class="prettyprint linenums">
Coche *miCoche = [[Coche alloc] init];
 [miCoche setColor:@&quot;Azul&quot;];
 [miCoche setNumPuertas:5];
</pre>
<p>Por este otro:</p>
<pre class="prettyprint linenums">Coche *miCoche = [[Coche alloc] initWithColor:@&quot;Azul&quot; andNumPuertas:5];</pre>
<p>Como veis, hemos convertido tres líneas de código en sólo una, y el resultado es idéntico.</p>
<p>Esto tan sólo es una breve introducción al paradigma de la programación orientada a objetos. Espero que os haya aclarado un poco los conceptos. En los próximos tutoriales iremos viendo más características de la POO en <a href="../category/objective-c/">Objective-C</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://sumolari.com/introduccion-a-objective-c-el-paradigma-de-la-poo/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Introducción a Objective-C: Nuestra primera aplicación</title>
		<link>http://sumolari.com/introduccion-a-objective-c-nuestra-primera-aplicacion/</link>
		<comments>http://sumolari.com/introduccion-a-objective-c-nuestra-primera-aplicacion/#comments</comments>
		<pubDate>Sat, 01 Jan 2011 18:46:06 +0000</pubDate>
		<dc:creator>Sumolari</dc:creator>
				<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[Introducción a Objective-C]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iPod Touch]]></category>
		<category><![CDATA[POO]]></category>
		<category><![CDATA[xcode]]></category>

		<guid isPermaLink="false">http://sumolari.com/?p=4633</guid>
		<description><![CDATA[¿Qué es Objective-C? ¿Qué es Cocoa? ¿Qué es la Programacion Orientada a Objetos (POO)? ¿Y la arquitectura de Modelo Vista Controlador (MVC)? Dar los primeros pasos en la programación para Mac OS X, iPhone y iPad puede ser algo complicado si no sabes dónde buscar la información (y aún más difícil si no sabes inglés, [...]]]></description>
			<content:encoded><![CDATA[<p>¿Qué es <a href="http://sumolari.com/category/objective-c/">Objective-C</a>? ¿Qué es <a href="http://sumolari.com/tag/cocoa/">Cocoa</a>? ¿Qué es la <a href="http://sumolari.com/tag/poo">Programacion Orientada a Objetos</a> (POO)? ¿Y la arquitectura de Modelo Vista Controlador (MVC)? Dar los primeros pasos en la programación para <a href="http://sumolari.com/category/mac-os-x/">Mac OS X</a>, <a href="http://sumolari.com/tag/iphone/">iPhone</a> y <a href="http://sumolari.com/tag/ipad">iPad</a> puede ser algo complicado si no sabes dónde buscar la información (y aún más difícil si no sabes inglés, imprescindible en el mundo de la informática). Hace año y medio, cuando yo comencé a aprender a programar para el <a href="../tag/iphone/">iPhone</a> (no tengáis prisa, sigo haciéndolo y me queda para mucho rato), el primer problema que tuve fue encontrar fuentes de información para dar los primeros pasos, así que he decido escribir esta serie de tutoriales para facilitar la tarea a aquellos que, como yo, quieran aprender a programar para el <a href="../tag/iphone/">iPhone</a> (extensible a <a href="../category/mac-os-x/">Mac OS X</a> y <a href="../tag/ipad">iPad</a>). Tampoco esperéis ser unos maestros de <a href="../category/objective-c/">Objective-C</a> después de haber leído esta serie de tutoriales (que iré publicando cuando vaya teniendo tiempo para redactarlos), pues mis conocimientos son fruto del autodidactismo y seguramente no utilice los términos adecuados ni profundice del todo en los conceptos que trate. Sin embargo espero que os sirva para dar el primer paso y poder continuar después con textos mejor redactados, más exactos y más profundos.<span id="more-4633"></span></p>
<p>En este serie de tutoriales voy a suponer que se tienen unos conocimientos básicos de programación, que se entiende el significado de términos como &#8220;código fuente&#8221;, &#8220;función&#8221; o &#8220;variable&#8221;. Cualquiera que haya programado antes en cualquier lenguaje de programación conocerá su significado. El único término nuevo que puede que no conozcan aquellos que sólo han programado en lenguajes interpretados (como <a href="http://sumolari.com/category/php">PHP</a>) es el de &#8220;compilar&#8221;. Para simplificar, podríamos decir que compilar un programa es traducir el código que nosotros escribimos en un código que la máquina pueda entender.</p>
<p>Ahora bien, queda diferenciar cuatro conceptos:</p>
<ul>
<li><strong>Objective-C: </strong>Es el lenguaje de programación que se suele usar en <a href="../category/mac-os-x/">Mac OS X</a>. Digo se suele usar porque también se pueden programar aplicaciones en C, C++, Objective-C++, etc.</li>
<li><strong>Cocoa:</strong> Es un Framework, un conjunto de funciones que facilitan la tarea al programador. Tareas como modificar una cadena de caracteres, descargar archivos de Internet, gestionar matrices o la memoria se hacen mucho más sencillas con este Framework. De hecho programar en <a href="../category/objective-c/">Objective-C</a> sin usar <a href="../tag/cocoa/">Cocoa</a> es algo poco usual y no lo veremos en este tutorial (yo, por ejemplo, no he programado nada en <a href="../category/objective-c/">Objective-C</a> sin tener vinculado <a href="../tag/cocoa/">Cocoa</a>). Cocoa Touch es la versión de <a href="../tag/cocoa/">Cocoa</a> para <a href="../tag/iphone/">iPhone</a>, <a href="http://sumolari.com/tag/ipod-touch/">iPod Touch</a> y <a href="../tag/ipad">iPad</a>.</li>
<li><strong>Programación Orientada a Objetos: </strong>Es un paradigma de programación del que hablaremos más adelante. <a href="../category/objective-c/">Objective-C</a> es un lenguaje de Programación Orientada a Objetos. En <a href="../category/objective-c/">Objective-C</a> prácticamente todo es un objeto, cosa que veremos más adelante.</li>
<li><strong>Modelo Vista y Controlador:</strong> Es una arquitectura en la que se separa la parte lógica de la aplicación de la interfaz y de los datos que se gestionan. Realmente no es imprescindible hacer uso de esta arquitectura, pero hacerlo es una buena idea, simplifica la tarea y hace las aplicación más fáciles de extender. En nuestros primeros pasos no haremos uso de esta arquitectura, pero a medida que vayamos avanzando iremos viendo en qué consiste y qué beneficios aporta.</li>
</ul>
<p><a href="http://sumolari.com/wp-content/uploads/2010/12/Captura-de-pantalla-2010-12-31-a-las-23.07.24.png" rel="lightbox-4633"><img class="alignnone size-large wp-image-4637" title="Menú de la aplicación de Xcode" src="http://sumolari.com/wp-content/uploads/2010/12/Captura-de-pantalla-2010-12-31-a-las-23.07.24-848x14.png" alt="Menú de la aplicación de Xcode" width="848" height="14" /></a></p>
<div id="attachment_4636" class="wp-caption alignright" style="width: 240px"><a href="http://sumolari.com/wp-content/uploads/2010/12/Captura-de-pantalla-2010-12-31-a-las-23.07.17.png" rel="lightbox-4633"><img class="size-thumbnail wp-image-4636" title="Menú Archivo" src="http://sumolari.com/wp-content/uploads/2010/12/Captura-de-pantalla-2010-12-31-a-las-23.07.17-230x130.png" alt="Menú Archivo" width="230" height="130" /></a><p class="wp-caption-text">Menú Archivo</p></div>
<div id="attachment_4634" class="wp-caption alignleft" style="width: 240px"><a href="http://sumolari.com/wp-content/uploads/2010/12/Captura-de-pantalla-2010-12-31-a-las-22.59.54.png" rel="lightbox-4633"><img class="size-thumbnail wp-image-4634" title="Plantillas del proyecto de Xcode" src="http://sumolari.com/wp-content/uploads/2010/12/Captura-de-pantalla-2010-12-31-a-las-22.59.54-230x130.png" alt="Plantillas del proyecto de Xcode" width="230" height="130" /></a><p class="wp-caption-text">Plantillas del proyecto de Xcode</p></div>
<p>Dicho esto, pasemos a presentar a los sospechosos habituales. Cuando programemos en <a href="../category/mac-os-x/">Mac OS X</a> trabajeros con <a href="../tag/xcode/">Xcode</a>, el Entorno de Desarrollo Integrado de Apple. <a href="http://sumolari.com/tag/xcode/">Xcode</a> viene en los discos de instalación de <a href="../category/mac-os-x/">Mac OS X</a>, y se puede descargar de forma gratuita (previo registro) <a href="http://developer.apple.com/technologies/xcode.html">desde la web de Apple</a>. Durante estos tutoriales usaremos como plantilla del proyecto la plantilla de aplicación para la línea de comandos, ya que así evitamos tener que preocuparnos de elementos más complejos como la interfaz gráfica de la aplicación. Crear un nuevo proyecto es sencillo: Basta con ir al menú <em>File » New project&#8230;</em> . Aparecerá una ventana en la que podremos seleccionar la plantilla para el proyecto que vamos a crear. En estos tutoriales elegiremos la plantilla <em>Mac OS X » Application » Command Line Tool</em>.</p>
<p><a href="http://sumolari.com/wp-content/uploads/2010/12/Captura-de-pantalla-2010-12-31-a-las-23.00.20.png" rel="lightbox-4633"><img class="size-thumbnail wp-image-4635 alignleft leftimage" title="Nuestro primer proyecto" src="http://sumolari.com/wp-content/uploads/2010/12/Captura-de-pantalla-2010-12-31-a-las-23.00.20-230x130.png" alt="Nuestro primer proyecto" width="121" height="68" /></a> Veremos una ventana como la que tenéis en la izquierda. En la parte izquierda de la ventana tenemos acceso a los archivos del proyecto. De los archivos que se pueden ver en la imagen, el que nos interesa ahora es NOMBREPROYECTO.m. Veréis un código como el siguiente:</p>
<pre class="prettyprint linenums">
#import &lt;Foundation/Foundation.h&gt;
int main (int argc, const char * argv[]) {
 NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
 // insert code here&#8230;
 NSLog(@&quot;Hello, World!&quot;);
 [pool drain];
 return 0;
}
</pre>Vayamos línea a línea. La primera línea importa el Framework <em>Foundation</em> en nuestra aplicación. El Framework <a href="../tag/cocoa/">Cocoa</a> está compuesto por dos Frameworks diferentes: <em>Foundation</em> y <em>Application Kit</em>. <em>Foundation</em> incluye las funciones que trabajan en la trastienda sin que el usuario lo vea, pero que al desarrollador le vienen fenomenal. Por su parte, <em>Application Kit</em> se encarga de la parte visual de la aplicación (como comprenderéis, esto es una versión resumida de lo que realmente hacen, así que tampoco lo toméis al pie de la letra). Si os fijáis en la sintaxis, podéis ver tres partes: La almohadilla (#), los signos menor y mayor que (<>) y el nombre del Framework.</p>
<p>La almohadilla introduce instrucciones para el preprocesador. Las que más comúnmente se usan con <em>#import</em> y <em>#define</em>. <em>#import</em> incluye otros archivos y Frameworks en el archivo actual. <em>#define </em>permite declarar constantes. Las constantes sirven para definir un valor que es fijo en toda la aplicación, pero que si nos interesa cambiar, podemos hacerlo modificando una sóla línea. Imaginad, por ejemplo, que queremos definir nuestra edad. Si sólo la ponemos en una línea no hay ningún problema, pero ¿y si la incluímos en 5, 10, 200 ó 5000 líneas? Es una faena tener que ir buscando cada lugar en el que hemos puesto ese valor. Con las constantes basta con poner la constante en lugar de nuestra edad, y definir el valor de la constante con el valor de nuestra edad. Cuando queramos modificar el valor de nuestra edad, sólo lo cambiaremos una vez, en lugar de tantas veces como uso se haga de ella.</p>
<p>A la hora de importar archivos, hay dos tipos de archivos que podemos importar: Frameworks del sistema y otros archivos de nuestro proyecto. Cuando importamos Frameworks del sistema, usamos los signos mayor e igual que (<>). Si importamos archivos de nuestro proyecto, usamos comillas (&#8220;).</p>
<p>La siguiente línea define la función main. La función main es la función principal de la aplicación, la única función que <strong>siempre</strong> se ejecuta. La estructura de la función es la misma estructura que C, sin embargo en <a href="../category/objective-c/">Objective-C</a> la mayoría de las funciones (métodos) se definen con una sintaxis diferente, así que no me voy a parar a explicarla.</p>
<p>Centrémonos en el siguiente bloque:</p>
<p><pre class="prettyprint linenums">
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
 // insert code here&#8230;
 NSLog(@&quot;Hello, World!&quot;);
 [pool drain];
 return 0;
</pre>En este bloque vemos unas cuantas líneas curiosas. Vayamos a la primera:</p>
<p><pre class="prettyprint linenums">
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
</pre>Esta es la sintaxis para crear un objeto en <a href="../category/objective-c/">Objective-C</a>. El primer <em>NSAutoreleasePool</em> es la clase del objeto que vamos a crear. El asterisco (&#8220;*&#8221;) indica que a continuación se presenta un objeto (lo veremos más adelante). <em>pool</em> es el nombre de la variable (objeto) que estamos creando. La segunda parte del código: <em>[[NSAutoreselasePool alloc] init]</em>, se trata de un mensaje enviado a una clase, que es a su vez el valor del objeto que estamos creando. Los mensajes se pueden enviar tanto a clases como a objetos, lo veremos más adelante, no os preocupéis.</p>
<p>A continuación vemos una línea que comienza con dos barras (//). Cuando una línea va introducida por dos barras, se trata de un comentario. Los comentarios se eliminan de la aplicación al compilarla: son sólo una ayuda al programador durante la programación, para saber qué hace cada cosa o para qué se usa una variable. Los comentarios también se pueden introducir con /* Comentario */.</p>
<p>[c]</p>
<p>// Con dos barras el comentario ocupa toda la línea</p>
<p>/* Con barra y asterisco es necesario terminar el comentario con asterisco barra, así que el comentario</p>
<p>aún no ha acabado en esta línea,</p>
<p>sino que acaba en esta otra */</p>
<p>[/c]</p>
<p>La siguiente línea es la llamada a una función.</p>
<pre class="prettyprint linenums">
NSLog(@&quot;Hello, World!&quot;);
</pre>
<p><a href="../category/objective-c/">Objective-C</a> es un superconjunto de C, con lo cual comparte algunas características con el anterior. Esta forma de llamar a la función es típica de C. Las funciones tienen dos partes: La primera (<em>NSLog</em> en este caso) es el nombre de la función. La segunda, que se encuentra entre paréntesis (&#8220;()&#8221;), son los argumentos de la función. En este caso, el argumento es: <em>@&#8221;Hello, World!&#8221;</em>. Cuando unas comillas están precedidas por un arroba (@), sabemos que se trata de una cadena de texto, un objeto de clase <em>NSString</em> (lo trataremos más adelante). Tras los paréntesis encontramos un punto y coma (;). Esto indica el final de una instrucción (todas las instrucciones en C y <a href="../category/objective-c/">Objective-C</a> van sucedidas por un punto y coma (;), a excepción de aquellas instrucciones que son argumentos de funciones (como el <em>@&#8221;Hello, World!&#8221;</em>)  o de mensajes (lo veremos más adelante).</p>
<p>La función <em>NSLog() </em>muestra el texto que se le envía como argumento en la terminal. Durante el desarrollo de la aplicaciones es una función muy útil, como veréis a medida que avancemos en los tutoriales, para saber el valor de una variable en cada momento o para recibir un aviso cuando se ejecuta un método.</p>
<pre class="prettyprint linenums">
[pool drain];
</pre>
<p>Esta línea le envía el mensaje <em>drain</em> al objeto <em>pool</em>, creado anteriormente. Veremos más adelante todo esto, en otro tutorial de esta serie. A continuación vemos:</p>
<pre class="prettyprint linenums">
return 0;
</pre>
<p>Esta línea le devuelve el valor 0 al Sistema Operativo. La función <em>main</em> tiene que devolver un valor que indica si la aplicación se ha ejecutado correctamente o si ha encontrado errores durante su ejecución. El valor 0 indica que todo ha ido bien.</p>
<div id="attachment_4643" class="wp-caption alignleft" style="width: 240px"><a href="http://sumolari.com/wp-content/uploads/2011/01/Captura-de-pantalla-2011-01-01-a-las-00.04.38.png" rel="lightbox-4633"><img class="size-thumbnail wp-image-4643" title="Nuestra primera aplicación ejecutándose" src="http://sumolari.com/wp-content/uploads/2011/01/Captura-de-pantalla-2011-01-01-a-las-00.04.38-230x130.png" alt="Nuestra primera aplicación ejecutándose" width="230" height="130" /></a><p class="wp-caption-text">Nuestra primera aplicación ejecutándose</p></div>
<p>Para probar la aplicación hay que pulsar el botón <em>Build and Run</em>, o pulsar <em>Comando</em> + <em>Enter</em>. La aplicación se compilará y se ejecutará. Como la aplicación no tiene interfaz, se ejecutará sin ver nosotros nada. Para poder ver el texto enviado por nuestra aplicación (<em>Hello, World!</em>), tenemos que mostrar la consola (Menú <em>Run » Console</em> o <em>Comando</em> + <em>Mayus</em> + <em>R</em>). Veremos algo como la imagen de la izquierda.</p>
<p>Y esto es todo por este primer tutorial. En los próximos comenzaré a tratar la Programación Orientada a Objetos en <a href="../category/objective-c/">Objective-C</a> e introduciré los conceptos de clase, objeto y método.</p>
]]></content:encoded>
			<wfw:commentRss>http://sumolari.com/introduccion-a-objective-c-nuestra-primera-aplicacion/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Añade las llaves en una nueva línea en Xcode</title>
		<link>http://sumolari.com/anade-las-llaves-en-una-nueva-linea-en-xcode/</link>
		<comments>http://sumolari.com/anade-las-llaves-en-una-nueva-linea-en-xcode/#comments</comments>
		<pubDate>Tue, 17 Aug 2010 11:57:03 +0000</pubDate>
		<dc:creator>Sumolari</dc:creator>
				<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[trucos]]></category>
		<category><![CDATA[xcode]]></category>

		<guid isPermaLink="false">http://sumolari.com/?p=4398</guid>
		<description><![CDATA[Cuando se lleva algún tiempo programando se acaban cogiendo manías y estilos a la hora de escribir el código, una de las más comunes es escribir las llaves ({ y }) en la línea siguiente, en lugar de en la línea en la que acaba la sentencia, manía que además suele considerarse como buena práctica. [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_4401" class="wp-caption alignleft" style="width: 310px"><a href="http://sumolari.com/wp-content/uploads/2010/08/xcode_antes_despues.png" rel="lightbox-4398"><img class="size-medium wp-image-4401" title="Xcode: Antes y después" src="http://sumolari.com/wp-content/uploads/2010/08/xcode_antes_despues-300x89.png" alt="Xcode: Antes y después" width="300" height="89" /></a><p class="wp-caption-text">Antes (izquierda) y después (derecha)</p></div>
<p>Cuando se lleva algún tiempo programando se acaban cogiendo manías y estilos a la hora de escribir el código, una de las más comunes es escribir las llaves ({ y }) en la línea siguiente, en lugar de en la línea en la que acaba la sentencia, manía que además suele considerarse como buena práctica.</p>
<pre class="prettyprint linenums">
// Con las llaves en la misma línea
- (void)funcionDePrueba {
     if (condicion) {
          [self otraFuncion];
     }
}
// Con las llaves en la línea siguiente
- (void)funcionDePrueba
{
     if (condicion)
     {
          [self otraFuncion];
     }
}
</pre>
<p>La cuestión es que ahora que estoy programando en Objective-C y utilizo Xcode, se me hace muy molesto que el autocompletado de código me añada las llaves en la misma línea que la sentencia, en lugar de la siguiente (cuando programo en PHP, el editor que uso no autocompleta el código). Sin embargo hay una forma sencilla de hacer que añada las llaves en la línea siguiente: tan sólo tenemos que escribir el siguiente código en la terminal y reiniciar Xcode.</p>
<pre class="prettyprint linenums">defaults write com.apple.Xcode XCCodeSenseFormattingOptions '{ &quot;BlockSeparator&quot; = &quot;\n&quot; ; }' </pre>
<p>Esto sólo afecta al autocompletado de código, no a las plantillas que vienen con Xcode.</p>
]]></content:encoded>
			<wfw:commentRss>http://sumolari.com/anade-las-llaves-en-una-nueva-linea-en-xcode/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dropbox, sincroniza carpetas entre tus equipos</title>
		<link>http://sumolari.com/dropbox-sincroniza-carpetas-entre-todos-tus-equipos/</link>
		<comments>http://sumolari.com/dropbox-sincroniza-carpetas-entre-todos-tus-equipos/#comments</comments>
		<pubDate>Wed, 11 Aug 2010 06:53:07 +0000</pubDate>
		<dc:creator>Sumolari</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[descargas]]></category>
		<category><![CDATA[dropbox]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://sumolari.com/?p=4377</guid>
		<description><![CDATA[Una de las cosas que se hacen molestas de tener varios equipos es que acabas diseminando los archivos que más usas entre ellos, de modo que en el sobremesa acabas teniendo archivos que no están en el portátil, y en el portátil acabas teniendo archivos que no están en el sobremesa. Para poder acceder a [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://sumolari.com/wp-content/uploads/2010/08/dropbox_logo_home.png" rel="lightbox-4377"><img class="alignleft size-full wp-image-4378 leftimage" title="Dropbox" src="http://sumolari.com/wp-content/uploads/2010/08/dropbox_logo_home.png" alt="Dropbox" width="290" height="75" /></a>Una de las cosas que se hacen molestas de tener varios equipos es que acabas diseminando los archivos que más usas entre ellos, de modo que en el sobremesa acabas teniendo archivos que no están en el portátil, y en el portátil acabas teniendo archivos que no están en el sobremesa. Para poder acceder a estos archivos acabas teniendo que crear una carpeta compartida en ambos equipos para ir actualizando los archivos que más sueles usar, utilizas un pendrive para trasportarlos, o acabas enviándote por emails los archivos cada vez que los modificas, sin embargo estas no son las opciones más cómodas.</p>
<p><a href="https://www.dropbox.com/referrals/NTM0NzIxMzQ5">Dropbox</a> es un gran alternativa para este problema. Se trata de una aplicación que crea una carpeta en nuestro equipo que se sincroniza con una carpeta en un servidor remoto. Cada vez que añadimos algo en nuestra carpeta, se añade en la carpeta del servidor remoto, de modo que podemos acceder a los archivos de dicha carpeta desde cualquier ordenador conectado a Internet, a través de la web de <a href="https://www.dropbox.com/referrals/NTM0NzIxMzQ5">Dropbox</a>. También podemos instalar la aplicación en todos nuestros equipos, y al modificar un archivo de la carpeta de <a href="https://www.dropbox.com/referrals/NTM0NzIxMzQ5">Dropbox</a> en un equipo, se modifica en todos los demás equipos que tengan la aplicación instalada, sin necesidad de estar todos encendidos a la vez, ya que se sincronizan con el servidor remoto.</p>
<p>La aplicación es gratuita y está disponible tanto para <a href="https://www.dropbox.com/downloading?os=win">Windows</a> como para <a href="https://www.dropbox.com/downloading?os=mac">Mac OS X</a> y <a href="https://www.dropbox.com/downloading?os=lnx">Linux</a>, además de móviles con <a href="https://www.dropbox.com/android">Android</a>, <a href="https://www.dropbox.com/iphoneapp">iPhone</a>, <a href="https://www.dropbox.com/ipad">iPad</a> y próximamente Blackberry.  Ofrece un espacio de 2GB de forma totalmente gratuita, aunque por 9.99$ al mes podemos ampliar este espacio a 50GB y por 19.99$ disponemos de 100GB. También podemos ampliar nuestro espacio disponible de forma gratuita invitando a nuestros amigos a <a href="https://www.dropbox.com/referrals/NTM0NzIxMzQ5">Dropbox</a> de modo que por cada amigo que se registre en <a href="https://www.dropbox.com/referrals/NTM0NzIxMzQ5">Dropbox</a> ampliaremos en 250MB la capacidad de nuestra cuenta, hasta llegar al límite de 8GB.</p>
]]></content:encoded>
			<wfw:commentRss>http://sumolari.com/dropbox-sincroniza-carpetas-entre-todos-tus-equipos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Convierte tus PDF en ePub</title>
		<link>http://sumolari.com/convierte-tus-pdf-en-epub/</link>
		<comments>http://sumolari.com/convierte-tus-pdf-en-epub/#comments</comments>
		<pubDate>Fri, 06 Aug 2010 15:33:12 +0000</pubDate>
		<dc:creator>Sumolari</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iPod Touch]]></category>
		<category><![CDATA[libros]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://sumolari.com/?p=4358</guid>
		<description><![CDATA[Parece que Apple está interesada en que sus dispositivos con iOS (iPhone, iPod y iPad) tengan acceso a iBooks, una aplicación que nos permite gestionar y leer libros. Desde la versión 1.1 podemos leer PDF desde la misma aplicación, sin embargo hay ciertas opciones que no podemos configurar al leer PDF y sí al leer [...]]]></description>
			<content:encoded><![CDATA[<p>Parece que <a href="http://sumolari.com/tag/apple/">Apple</a> está interesada en que sus dispositivos con <a href="http://sumolari.com/tag/iphone-os/">iOS</a> (<a href="http://apple.com/es/iphone/">iPhone</a>, <a href="http://www.apple.com/es/ipodtouch/">iPod</a> y <a href="http://apple.com/es/ipad/">iPad</a>) tengan acceso a <a href="http://itunes.apple.com/es/app/ibooks/id364709193?mt=8">iBooks</a>, una aplicación que nos permite gestionar y leer libros. Desde la versión 1.1 podemos leer PDF desde la misma aplicación, sin embargo hay ciertas opciones que no podemos configurar al leer PDF y sí al leer ePub, como el tamaño de la letra, lo que hace que leer, por ejemplo, el manual de usuario de iOS 4 sea realmente incómodo al tener que hacer zoom cada dos por tres.</p>
<p>Afortunadamente tenemos una alternativa: podemos convertir nuestros PDF en ePub. Hay muchas aplicaciones para hacer esto, tanto online como offline, pero en este artículo sólo me centraré en una aplicación. <a href="http://calibre-ebook.com/">Calibre</a> (así es como se llama la utilidad que nos permitirá convertir nuestros PDF en ePub) es totalmente gratutia y está disponible tanto para <a href="http://calibre-ebook.com/download_windows">Windows</a> como para <a href="http://calibre-ebook.com/download_linux">Linux</a> y <a href="http://calibre-ebook.com/download_osx">Mac OS X</a>.<span id="more-4358"></span></p>
<p><a href="http://sumolari.com/wp-content/uploads/2010/08/instalacion_paso1.png" rel="lightbox-4358"><img class="alignleft size-medium wp-image-4359" title="Instalación de Calibre - Paso 1" src="http://sumolari.com/wp-content/uploads/2010/08/instalacion_paso1-300x178.png" alt="Instalación de Calibre - Paso 1" width="300" height="178" /></a><a href="http://sumolari.com/wp-content/uploads/2010/08/instalacion_paso2.png" rel="lightbox-4358"><img class="alignright size-medium wp-image-4360" title="Instalación de Calibre - Paso 2" src="http://sumolari.com/wp-content/uploads/2010/08/instalacion_paso2-300x178.png" alt="Instalación de Calibre - Paso 2" width="300" height="178" /></a>Instalar <a href="http://calibre-ebook.com/">Calibre</a> es realmente fácil. El primer paso (imagen de la izquierda) nos dejará seleccionar el idioma de la aplicación y la carpeta en la que almacenaremos la colección de libros (no lo he comentado antes, pero <a href="http://calibre-ebook.com/">Calibre</a> permite gestionar toda nuestra biblioteca digital además de convertir nuestros archivos PDF en ePub &#8211; entre otros formatos). El siguiente paso (imagen de la derecha) consiste en seleccionar el lector de libros que usaremos, este tutorial está orientado al <a href="http://apple.com/es/iphone/">iPhone</a>, <a href="http://www.apple.com/es/ipodtouch/">iPod</a> y <a href="http://apple.com/es/ipad/">iPad</a>, así que seleccionaremos de la primera lista &#8220;<em>Apple</em>&#8221; y de la segunda &#8220;<em>iPad or iPhone/iTouch + Stanza</em>&#8220;.</p>
<p><a href="http://sumolari.com/wp-content/uploads/2010/08/instalacion_paso3.png" rel="lightbox-4358"><img class="alignleft size-medium wp-image-4361" title="Instalación de Calibre - Paso 3" src="http://sumolari.com/wp-content/uploads/2010/08/instalacion_paso3-300x178.png" alt="Instalación de Calibre - Paso 3" width="300" height="178" /></a><a href="http://sumolari.com/wp-content/uploads/2010/08/instalacion_paso4.png" rel="lightbox-4358"><img class="alignright size-medium wp-image-4362" title="Instalación de Calibre - Paso 4" src="http://sumolari.com/wp-content/uploads/2010/08/instalacion_paso4-300x178.png" alt="Instalación de Calibre - Paso 4" width="300" height="178" /></a>El tercer paso es opcional (imagen de la izquierda) y permite crear un servidor para almacenar información acerca de nuestra lectura si usamos la aplicación <a href="http://www.lexcycle.com/">Stanza</a>, pero el objectivo del tutorial es leer los libros con <a href="http://itunes.apple.com/es/app/ibooks/id364709193?mt=8">iBooks</a>, así que podemos dejar desmarcada esta opción. Con esto habremos terminado de configurar <a href="http://calibre-ebook.com/">Calibre</a> (imagen de la derecha).</p>
<p><a href="http://sumolari.com/wp-content/uploads/2010/08/esquema.png" rel="lightbox-4358"><img class="alignleft size-medium wp-image-4364" title="Convertir libros con Calibre" src="http://sumolari.com/wp-content/uploads/2010/08/esquema-300x215.png" alt="Convertir libros con Calibre" width="300" height="215" /></a><a href="http://sumolari.com/wp-content/uploads/2010/08/convertir_paso2.png" rel="lightbox-4358"><img class="alignright size-medium wp-image-4365" title="Convertir libros con Calibre - Paso 2" src="http://sumolari.com/wp-content/uploads/2010/08/convertir_paso2-300x211.png" alt="Convertir libros con Calibre - Paso 2" width="300" height="211" /></a>Convertir un documento PDF a ePub no es tampoco nada complicado. Lo primero que tenemos que hacer es añadir el documento en cuestión a <a href="http://calibre-ebook.com/">Calibre</a>, en Mac OS X basta con arrastrar el archivo a su icono en el dock, aunque también podemos añadirlo haciendo clic en la imagen del libro rojo (la primera imagen del menú superior). Cuando tengamos añadido el libro veremos algo similar a la imagen de la izquierda. A continuación tenemos que seleccionar el libro que queramos convertir y hacer clic en la imagen del libro marrón (la tercera del menú superior, en la imagen de la izquierda está indicada). Nos aparecerá una ventana con opciones para configurar el nuevo documento (imagen de la derecha), como seleccionar la portada, la tabla de contenidos, metadatos, formato del nuevo documento, etc. Las opciones que vienen por defecto nos valen (a no ser que queramos personalizar más el documento), así que le damos a &#8220;<em>Aceptar</em>&#8221; y continuamos.</p>
<p><a href="http://sumolari.com/wp-content/uploads/2010/08/convertir_paso3.png" rel="lightbox-4358"><img class="alignleft size-medium wp-image-4366" title="Esperando a que Calibre acabe la exportación" src="http://sumolari.com/wp-content/uploads/2010/08/convertir_paso3-300x270.png" alt="Esperando a que Calibre acabe la exportación" width="300" height="270" /></a><a href="http://sumolari.com/wp-content/uploads/2010/08/convertir_paso4.png" rel="lightbox-4358"><img class="alignright size-medium wp-image-4367" title="Resultado de la conversión con Calibre" src="http://sumolari.com/wp-content/uploads/2010/08/convertir_paso4-300x274.png" alt="Resultado de la conversión con Calibre" width="300" height="274" /></a>Ahora tendremos que esperar unos minutos (dependiendo del tamaño del archivo) hasta que esté listo el documento convertido (veréis una ventana como la de la imagen de la izquierda). Cuando acabe la exportación, veremos que en nuestra biblioteca de <a href="http://calibre-ebook.com/">Calibre</a> ahora hay dos archivos más: la portada del libro exportado y el libro en formato ePub. Ahora ya sólo nos queda importar el libro en iTunes (de nuevo en Mac OS X basta con arrastrar el archivo al icono de iTunes en el dock) y sincronizar nuestro <a href="http://apple.com/es/iphone/">iPhone</a>/<a href="http://www.apple.com/es/ipodtouch/">iPod</a>/<a href="http://apple.com/es/ipad/">iPad</a>.</p>
<p>Lamentablemente, el archivo que obtendremos no será idéntico al PDF, y puede que haya variaciones en el color y en la estructura en general. De hecho el documento que he convertido yo en el tutorial perdía los colores y la estructura del documento variaba ligeramente. A cambio ganaremos la posiblidad de poder aumentar el tamaño de la letra.</p>
]]></content:encoded>
			<wfw:commentRss>http://sumolari.com/convierte-tus-pdf-en-epub/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FileMerge, o cómo comparar archivos sin morir en el intento</title>
		<link>http://sumolari.com/filemerge-o-como-comparar-archivos-sin-morir-en-el-intento/</link>
		<comments>http://sumolari.com/filemerge-o-como-comparar-archivos-sin-morir-en-el-intento/#comments</comments>
		<pubDate>Sat, 19 Jun 2010 11:29:21 +0000</pubDate>
		<dc:creator>Sumolari</dc:creator>
				<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://sumolari.com/?p=4094</guid>
		<description><![CDATA[En muchas ocasiones necesitamos comprar dos archivos de texto para ver qué diferencias hay entre ellos, como por ejemplo si queremos ver las diferencias entre dos versiones de un script PHP. Vale, cuando son scripts de un par de centenares de líneas no hay problema, pero, ¿qué me decís si queréis comparar dos archivos de [...]]]></description>
			<content:encoded><![CDATA[<p>En muchas ocasiones necesitamos comprar dos archivos de texto para ver qué diferencias hay entre ellos, como por ejemplo si queremos ver las diferencias entre dos versiones de un script <a href="http://sumolari.com/category/php/">PHP</a>. Vale, cuando son scripts de un par de centenares de líneas no hay problema, pero, ¿qué me decís si queréis comparar dos archivos de varios miles (o decenas de miles) de líneas de código? Hacerlo &#8220;manualmente&#8221; no tiene sentido, y es aquí donde entra <a href="http://developer.apple.com/technologies/tools/features.html">FileMerge</a>.</p>
<div id="attachment_4096" class="wp-caption alignright" style="width: 240px"><a href="http://sumolari.com/wp-content/uploads/2010/06/Captura-de-pantalla-2010-06-19-a-las-13.09.46.png" rel="lightbox-4094"><img class="size-thumbnail wp-image-4096" title="Buscando FileMerge" src="http://sumolari.com/wp-content/uploads/2010/06/Captura-de-pantalla-2010-06-19-a-las-13.09.46-230x130.png" alt="Buscando FileMerge" width="230" height="130" /></a><p class="wp-caption-text">Buscando FileMerge</p></div>
<p><a href="http://developer.apple.com/technologies/tools/features.html">FileMerge</a> es una de las aplicaciones que vienen con el disco de instalación de <a href="../category/mac-os-x/">Mac OS X</a>, y se instala juntamente con <a href="http://developer.apple.com/technologies/tools/xcode.html">Xcode</a> y todo el entorno de desarrollo de <a href="http://sumolari.com/category/mac-os-x/">Mac OS X</a>, así que por defecto no la encontraréis instalado. Una vez tengáis instalado <a href="http://developer.apple.com/technologies/tools/xcode.html">Xcode</a> bastará con que busquéis con <a href="http://www.apple.com/es/macosx/what-is-macosx/spotlight.html">Spotlight</a> &#8220;FileMerge&#8221; y lo ejecutéis.</p>
<div id="attachment_4097" class="wp-caption alignleft" style="width: 240px"><a href="http://sumolari.com/wp-content/uploads/2010/06/Captura-de-pantalla-2010-06-19-a-las-13.10.12.png" rel="lightbox-4094"><img class="size-thumbnail wp-image-4097" title="Interfaz de FileMerge" src="http://sumolari.com/wp-content/uploads/2010/06/Captura-de-pantalla-2010-06-19-a-las-13.10.12-230x130.png" alt="Interfaz de FileMerge" width="230" height="130" /></a><p class="wp-caption-text">Interfaz de FileMerge</p></div>
<p>La interfaz es muy intuitiva: se arrastra un archivo al recuadro de la izquierda y otro al recuadro de la derecha y a continuación se hace clic en &#8220;Compare&#8221;. Esperamos unos segundos (dependiendo de los archivos) a FileMerge acabe de encontrar las diferencias y finalmente veremos una ventana dividida en dos partes. Cada parte tiene el contenido de un archivo y las diferencias aparecen marcadas en ambos lados. También nos ofrece un recuento de diferencias.</p>
<p><a href="http://sumolari.com/wp-content/uploads/2010/06/Captura-de-pantalla-2010-06-19-a-las-13.14.10.png" rel="lightbox-4094"><img class="alignnone size-large wp-image-4098" title="FileMerge" src="http://sumolari.com/wp-content/uploads/2010/06/Captura-de-pantalla-2010-06-19-a-las-13.14.10-848x658.png" alt="FileMerge" width="848" height="658" /></a></p>
<p>Es realmente útil para comparar dos versiones diferentes de un archivo y ver qué cambios se han realizado de forma más cómoda y rápida. Se acabó el tener que ir línea a línea buscando diferencias, con FileMerge el trabajo se hace mucho más sencillo.</p>
]]></content:encoded>
			<wfw:commentRss>http://sumolari.com/filemerge-o-como-comparar-archivos-sin-morir-en-el-intento/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iPhone 4 y iOS 4, las novedades de la Keynote del lunes</title>
		<link>http://sumolari.com/iphone-4-y-ios-4-las-novedades-de-la-keynote-del-lunes/</link>
		<comments>http://sumolari.com/iphone-4-y-ios-4-las-novedades-de-la-keynote-del-lunes/#comments</comments>
		<pubDate>Wed, 09 Jun 2010 19:05:48 +0000</pubDate>
		<dc:creator>Sumolari</dc:creator>
				<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[Navegadores]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[imágenes]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[movistar]]></category>
		<category><![CDATA[Orange]]></category>
		<category><![CDATA[safari]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[vídeos]]></category>
		<category><![CDATA[vodafone]]></category>

		<guid isPermaLink="false">http://sumolari.com/?p=4053</guid>
		<description><![CDATA[Antes de nada, disculpad el retraso. Quería haber publicado este artículo anteayer o ayer, pero al final se me fueron juntando cosas y no ha sido posible. Pero como dice el refrán, más vale tarde que nunca, así que vamos allá. En la keynote del lunes se presentó el nuevo iPhone 4, se dio un [...]]]></description>
			<content:encoded><![CDATA[<p>Antes de nada, disculpad el retraso. Quería haber publicado este artículo anteayer o ayer, pero al final se me fueron juntando cosas y no ha sido posible. Pero como dice el refrán, más vale tarde que nunca, así que vamos allá.</p>
<p>En la keynote del lunes se presentó el nuevo <a href="http://www.apple.com/iphone/">iPhone 4</a>, se dio un repaso al <a href="http://www.apple.com/iphone/softwareupdate/">iPhone OS 4</a>, <a href="http://sumolari.com/tag/iphone-os/">iOS4</a> a partir de ahora y se mostró por primera vez <a href="http://www.apple.com/iphone/features/imovie.html">iMovie para el iPhone</a>. Además durante la sesión de &#8220;<em>Safari, Internet adn Web State of the Union</em>&#8221; se presentó <a href="http://www.apple.com/safari/">Safari 5</a>, que ya está disponible para <a href="http://sumolari.com/category/mac-os-x/">Mac OS X</a> y <a href="http://sumolari.com/category/windows/">Windows</a>. Por último, algunas operadoras han confirmado que la exclusividad del <a href="http://sumolari.com/tag/iphone/">iPhone</a> se ha acabado en España. Pero veamos de una en una las novedades.</p>
<p><span id="more-4053"></span></p>
<h3>iPhone 4 y iOS4</h3>
<p><a href="http://sumolari.com/wp-content/uploads/2010/06/iphone4_1.jpg" rel="lightbox-4053"><img class="alignnone size-large wp-image-4057" title="iPhone 4 de color negro" src="http://sumolari.com/wp-content/uploads/2010/06/iphone4_1-848x538.jpg" alt="iPhone 4 de color negro" width="848" height="538" /></a></p>
<p>Comencemos por el nuevo <a href="http://www.apple.com/iphone/">iPhone 4</a>. En abril Gizmodo consiguió un prototipo del <a href="http://www.apple.com/iphone/">iPhone 4</a> que supuestamente había perdido un empleado de Apple en un bar de <em>Redwood</em>. Pues bien, el diseño del <a href="http://www.apple.com/iphone/">iPhone 4</a> es el mismo que el del prototipo: Gizmodo no mentía para nada.</p>
<div id="attachment_4056" class="wp-caption alignleft" style="width: 310px"><a href="http://sumolari.com/wp-content/uploads/2010/06/iphone4_3.jpg" rel="lightbox-4053"><img class="size-medium wp-image-4056" title="Los dos colores del iPhone 4" src="http://sumolari.com/wp-content/uploads/2010/06/iphone4_3-300x190.jpg" alt="Los dos colores del iPhone 4" width="300" height="190" /></a><p class="wp-caption-text">Los dos colores del iPhone 4</p></div>
<p>El <a href="http://www.apple.com/iphone/">iPhone 4</a> se venderá en <strong>dos colores </strong>diferentes: <strong>blanco</strong> y <strong>negro</strong>. La pantalla tiene una <strong>resolución de 960&#215;640</strong> con una <strong>densidad de 326 píxels por pulgada</strong> y un c<strong>ontraste 800:1</strong> (a todo esto Apple lo ha llamado <a href="http://www.apple.com/iphone/features/retina-display.html">Retina Display</a>). Se ha añadido una <strong>cámara frontal de 3mpx</strong> y un <strong>segundo micrófono </strong>para eliminar el ruido en las videollamadas (hablaré de ellas más adelante), mientras que <strong>la cámara trasera ha pasado de los 3mpx a 5mpx</strong>, ganando además <strong>flash LED</strong> y un <strong>sensor retroiluminado</strong>. A partir de ahora el <a href="http://sumolari.com/tag/iphone/">iPhone</a> <strong>podrá grabar vídeo en HD (720p)</strong> y editarlo con <a href="http://www.apple.com/iphone/features/imovie.html">iMovie</a> (del que también hablaré más adelante).</p>
<div id="attachment_4058" class="wp-caption alignright" style="width: 240px"><a href="http://sumolari.com/wp-content/uploads/2010/06/iphone4_6.jpg" rel="lightbox-4053"><img class="size-thumbnail wp-image-4058" title="Separación de las antenas" src="http://sumolari.com/wp-content/uploads/2010/06/iphone4_6-230x130.jpg" alt="iPhone 4" width="230" height="130" /></a><p class="wp-caption-text">iPhone 4</p></div>
<p>El cuanto a los componentes, el nuevo diseño tiene un razón de ser, y es que varios componentes internos han cambiado. Para comenzar la antena se encuentra ahora en el borde metálico del dispositivo. Realmente el borde se divide en dos trozos diferentes, cada uno para una antena dedicada a funciones diferentes. El <a href="http://www.apple.com/iphone/">iPhone 4</a> pasa a tener un <strong>procesador A4</strong> de <a href="http://sumolari.com/tag/apple/">Apple</a> (el mismo que el <a href="http://sumolari.com/tag/ipad/">iPad</a>) y una <strong>batería de mayor duración</strong>, aguantando 10 horas más de reproducción de audio, 1 hora más de conexión a Internet por Wi-Fi o 3G y 2 horas más de tiempo durante las conversaciones sobre redes 2G y 3G. La duración de la batería en reposo es aparentemente la misma que en el <a href="http://sumolari.com/tag/iphone/">iPhone</a> 3GS.</p>
<p>Se le ha añadido un <strong>giroscopio</strong>, dotando al <a href="http://www.apple.com/iphone/">iPhone 4</a> de un total de 9 ejes de movimientos de los que sacar datos para nuevas aplicaciones y juegos. Para algunos esta novedad no tendrá nada de especial, pero seguramente aparecerán de aquí a un par de meses algunas aplicaciones que hagan usos interesantes del giroscopio. Las tarjetas para el <a href="http://sumolari.com/tag/iphone/">iPhone</a> tendrán que ser <strong>MicroSim</strong> y se venderán <strong>modelos de 16GB y de 32GB</strong>.</p>
<table style="text-align: center;" width="100%">
<tbody>
<tr>
<td><a href="http://sumolari.com/wp-content/uploads/2010/06/iphone4_4.jpg" rel="lightbox-4053"><img class="alignnone size-thumbnail wp-image-4059" title="iPhone 4" src="http://sumolari.com/wp-content/uploads/2010/06/iphone4_4-230x130.jpg" alt="iPhone 4" width="230" height="130" /></a></td>
<td><a href="http://sumolari.com/wp-content/uploads/2010/06/iphone4_5.jpg" rel="lightbox-4053"><img class="alignnone size-thumbnail wp-image-4060" title="iPhone 4" src="http://sumolari.com/wp-content/uploads/2010/06/iphone4_5-230x130.jpg" alt="iPhone 4" width="230" height="130" /></a></td>
<td><a href="http://sumolari.com/wp-content/uploads/2010/06/iphone4_2.jpg" rel="lightbox-4053"><img class="alignnone size-thumbnail wp-image-4061" title="iPhone 4 de color blanco" src="http://sumolari.com/wp-content/uploads/2010/06/iphone4_2-230x130.jpg" alt="iPhone 4 de color blanco" width="230" height="130" /></a></td>
</tr>
</tbody>
</table>
<p>Estas son todas las novedades en lo que respecta al hardware del <a href="http://www.apple.com/iphone/">iPhone 4</a>: <strong>nuevo diseño</strong>, <strong>nuevo procesador</strong>, <strong>mejor cámara trasera </strong>y<strong> cámara frontal</strong>, <strong>dos micrófonos</strong> y<strong> mejor pantalla</strong>.</p>
<div id="attachment_4062" class="wp-caption alignleft" style="width: 240px"><a href="http://sumolari.com/wp-content/uploads/2010/06/iphone4_facetime.jpg" rel="lightbox-4053"><img class="size-thumbnail wp-image-4062" title="FaceTime" src="http://sumolari.com/wp-content/uploads/2010/06/iphone4_facetime-230x130.jpg" alt="FaceTime" width="230" height="130" /></a><p class="wp-caption-text">FaceTime</p></div>
<p>En lo que respecta al <a href="http://sumolari.com/tag/iphone-os/">iPhone OS 4</a>, hay dos novedades. La primera es que pasa a llamarse <a href="http://www.apple.com/iphone/softwareupdate/">iOS4</a>. La segunda, que se suma a <a href="http://sumolari.com/probando-la-beta-de-iphone-os-4/">las novedades que ya comenté en su día</a> es la videollamada. La idea no es nueva, y está bastante bien adaptada al <a href="http://sumolari.com/tag/iphone/">iPhone</a>, pero me ha decepcionado bastante al final. <a href="http://www.apple.com/iphone/features/facetime.html">FaceTime</a> (así se llama la videoconferencia del <a href="http://www.apple.com/iphone/">iPhone 4</a>) te permite establecer videoconferencia y enviar tanto el vídeo captado por la cámara frontal como el que capta la cámara trasera, de hecho se puede alternar durante la propia videollamada. También tiene un diseño bastante atractivo, pero le encuentro dos pegas.</p>
<p>La primera es que<strong> sólo funciona en el <a href="http://www.apple.com/iphone/">iPhone 4</a></strong>, es decir:<strong> videollamada de iPhone 4 a iPhone 4</strong> (<a href="http://www.apple.com/iphone/features/facetime.html">FaceTime</a> <strong>está abierto a cualquier compañía que quiera integrarlo en sus dispositivos</strong>, pero la decisión última es de estas compañías: si no quieren, con el <a href="http://www.apple.com/iphone/">iPhone 4</a> sólo podrás hacer videoconferencias con otros <a href="http://www.apple.com/iphone/">iPhone 4</a>. ¡Menos mal que si que puedes recibir llamadas de cualquier dispositivo, porque sino mal iríamos!).</p>
<p>La segunda pega es que sólo funciona bajo redes Wi-Fi, en teoría para no sobrecargar las redes 3G. Así que <strong>para hacer videoconferencia hay dos requisitos</strong>: <strong>que tu contacto tenga un <a href="http://www.apple.com/iphone/">iPhone 4</a></strong> y que <strong>ambos estéis bajo cobertura de una red Wi-Fi</strong> abierta o de la que conozcáis la contraseña.</p>
<div id="attachment_4063" class="wp-caption alignright" style="width: 240px"><a href="http://sumolari.com/wp-content/uploads/2010/06/imovie.png" rel="lightbox-4053"><img class="size-thumbnail wp-image-4063" title="iMovie para el iPhone" src="http://sumolari.com/wp-content/uploads/2010/06/imovie-230x130.png" alt="iMovie para el iPhone" width="230" height="130" /></a><p class="wp-caption-text">iMovie para el iPhone</p></div>
<p>Fuera de <a href="http://www.apple.com/iphone/features/facetime.html">FaceTime</a> la principal novedad en cuanto a software para el <a href="../tag/iphone/">iPhone</a> es la versión de <strong>iMovie para iOS 4</strong>. Básicamente se trata de una versión ligera del <a href="http://www.apple.com/es/ilife/imovie/index.html">iMovie</a> (un software sencillo de edición de vídeo) adaptada para el <a href="../tag/iphone/">iPhone</a>. Según comentan aquellos que lo han probado, es realmente rápido e intuitivo, y <strong>permite exportar nuestras creaciones en HD</strong>. <a href="http://www.apple.com/iphone/features/imovie.html">iMovie para el iPhone</a> <strong>se vende por separado a 4.99$ (véase 3.99€)</strong>. Sería mucho pedir que lo pusieran de serie en <a href="http://sumolari.com/tag/iphone-os/">iOS 4</a>&#8230;</p>
<p>Tan sólo me queda por comentar el tema de las operadoras. Hasta ahora el <a href="../tag/iphone/">iPhone</a> lo vendía únicamente <a href="http://sumolari.com/tag/movistar/">Movistar</a>. Pues bien, a partir de ahora ya no será así. <strong>En Estados Unidos parece que sigue la permanencia con AT&amp;T</strong>, pero <strong>en España tanto <a href="http://sumolari.com/tag/movistar/">Movistar</a> como <a href="http://sumolari.com/tag/orange/">Orange</a> como <a href="http://sumolari.com/tag/vodafone/">Vodafone</a> venderán el iPhone 4</strong>. Lo que no se sabe aún son las tarifas bajo las que lo venderán, pero al menos sabemos que no dependeremos de una única operadora.</p>
<p>Y esto es todo respecto al <a href="http://www.apple.com/iphone/">iPhone 4</a>: novedades en hardware, en diseño y en software (aunque muchas <a href="http://sumolari.com/probando-la-beta-de-iphone-os-4/">ya las conocíamos</a>). Son novedades muy interesantes, aunque pienso que aún le falta un gestor de archivos, dejar de limitar el bluetooth (para darle algún uso, como compartir archivos) y añadir flash (que aunque no me guste demasiado, es necesario en algunas ocasiones).</p>
<p>Os dejo a continuación dos vídeos del <a href="http://www.apple.com/iphone/">iPhone 4</a>.</p>
<div style="text-align: center;">
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="540" height="336" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://asset.slashgear.tv/sgplayer.swf" /><param name="name" value="SlashGearTV" /><param name="flashvars" value="config=http://asset.slashgear.tv/sgtv.php?vkey=1bc419542ce9fa43902d" /><param name="allowfullscreen" value="true" /><param name="quality" value="high" /><embed type="application/x-shockwave-flash" width="540" height="336" src="http://asset.slashgear.tv/sgplayer.swf" quality="high" flashvars="config=http://asset.slashgear.tv/sgtv.php?vkey=1bc419542ce9fa43902d" name="SlashGearTV" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="540" height="336" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://asset.slashgear.tv/sgplayer.swf" /><param name="name" value="SlashGearTV" /><param name="flashvars" value="config=http://asset.slashgear.tv/sgtv.php?vkey=f78948b91f03172341b7" /><param name="allowfullscreen" value="true" /><param name="quality" value="high" /><embed type="application/x-shockwave-flash" width="540" height="336" src="http://asset.slashgear.tv/sgplayer.swf" quality="high" flashvars="config=http://asset.slashgear.tv/sgtv.php?vkey=f78948b91f03172341b7" name="SlashGearTV" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
</div>
<h3>Safari 5</h3>
<div id="attachment_4070" class="wp-caption alignleft" style="width: 240px"><a href="http://sumolari.com/wp-content/uploads/2010/06/safari_reader.png" rel="lightbox-4053"><img class="size-thumbnail wp-image-4070" title="Safari Reader" src="http://sumolari.com/wp-content/uploads/2010/06/safari_reader-230x130.png" alt="Safari Reader" width="230" height="130" /></a><p class="wp-caption-text">Safari Reader</p></div>
<p>No se ha presentado durante la keynote, pero la quinta versión del navegador de <a href="http://sumolari.com/tag/apple/">Apple</a> incluye unas cuantas novedades muy interesantes, comenzando por las mejoras que han realizado en el motor de <a href="http://sumolari.com/category/javascript/">Javascript</a>, <strong>Nitro</strong>, que ahora es el <strong>doble de rápido que Firefox 3.6</strong> y un<strong> 3% más rápido que Chrome 5.0</strong> (aunque no se yo si notaremos esa pequeña diferencia).</p>
<p>Se ha añadido <a href="http://www.apple.com/safari/whats-new.html#reader">Safari Reader</a>, una función que elimina el contenido adicional de cualquier página, haciendo que nos centremos con más facilidad en el contenido propiamente dicho. Eso sí, esta función sólo está disponible en las páginas que se basan en texto (como por ejemplo, un artículo de <a href="http://sumolari.com">Sumolari.com</a>, no la página principal del blog). Para activarlo basta con pulsar el botón &#8220;Lector&#8221; que aparece a la derecha de la barra de direcciones cuando está disponible la función.</p>
<p>También <strong>se ha añadido como buscador Bing</strong>. Hay que tener en cuenta que <a href="http://sumolari.com/tag/safari/">Safari</a> no permite añadir nuestros propios motores de búsqueda, tan sólo nos deja escoger entre los que tiene por defecto, así que hasta ahora no podíamos seleccionar Bing como buscador.</p>
<div id="attachment_4072" class="wp-caption alignright" style="width: 240px"><a href="http://sumolari.com/wp-content/uploads/2010/06/Captura-de-pantalla-2010-06-09-a-las-20.59.39.png" rel="lightbox-4053"><img class="size-thumbnail wp-image-4072" title="Extensiones en Safari 5" src="http://sumolari.com/wp-content/uploads/2010/06/Captura-de-pantalla-2010-06-09-a-las-20.59.39-230x130.png" alt="Extensiones en Safari 5" width="230" height="130" /></a><p class="wp-caption-text">Extensiones en Safari 5</p></div>
<p>En cuanto a estándares, <a href="http://www.apple.com/safari/">Safari 5</a> soporta la reproducción de vídeos a pantalla completa, los subtítulos, la geolocalización, la validación de formularios y algunas etiquetas de <a href="http://sumolari.com/tag/html-5/">HTML 5</a> como <em>&lt;header&gt;</em>, <em>&lt;footer&gt;</em>, <em>&lt;nav&gt;</em>, <em>&lt;section&gt;</em>, <em>&lt;aside&gt;</em> o <em>&lt;article&gt;</em>. Sin embargo la novedad más interesante es el soporte de extensiones, basadas en <a href="../tag/html-5/">HTML 5</a>, <a href="http://sumolari.com/tag/css3/">CSS3</a> y <a href="http://sumolari.com/category/javascript/">Javascript</a>, lo que las hace un objetivo muy atractivo para los desarrolladores. Además para mayor estabilidad se ejecutarán de forma independiente.</p>
<p>Y estas son todas las novedades de <a href="http://www.apple.com/safari/">Safari 5</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://sumolari.com/iphone-4-y-ios-4-las-novedades-de-la-keynote-del-lunes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Imágenes del contenido en pestañas de Firefox 4</title>
		<link>http://sumolari.com/imagenes-del-contenido-en-pestanas-de-firefox-4/</link>
		<comments>http://sumolari.com/imagenes-del-contenido-en-pestanas-de-firefox-4/#comments</comments>
		<pubDate>Thu, 03 Jun 2010 17:28:14 +0000</pubDate>
		<dc:creator>Sumolari</dc:creator>
				<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[Navegadores]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[firefox 4]]></category>
		<category><![CDATA[imágenes]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://sumolari.com/?p=4020</guid>
		<description><![CDATA[Anteayer publicaron en Chromatic pixel unas cuantas capturas del nuevo contenido en pestañas de Firefox 4. La idea básicamente consiste en mostrar ciertos contenidos en pestañas en lugar de en nuevas ventanas, integrándolo todo en la ventana principal del propio navegador, de forma similar a la pestaña de descargas de Chrome. De momento se está [...]]]></description>
			<content:encoded><![CDATA[<p>Anteayer publicaron en <a href="http://blog.stephenhorlander.com/2010/06/01/in-content-ui-visual-unification/">Chromatic pixel</a> unas cuantas capturas del nuevo contenido en pestañas de <a href="http://sumolari.com/tag/firefox-4/">Firefox 4</a>. La idea básicamente consiste en mostrar ciertos contenidos en pestañas en lugar de en nuevas ventanas, integrándolo todo en la ventana principal del propio navegador, de forma similar a la pestaña de descargas de <a href="http://sumolari.com/tag/chrome/">Chrome</a>. De momento se está trabajando en mostrar el <strong>panel de preferencias</strong> y<strong> </strong>el<strong> gestor de AddOns</strong> en una pestaña. También se han rediseñado los mensajes de error y la página <em>about:config</em>.</p>
<p>Os dejo las imágenes a continuación.<span id="more-4020"></span></p>
<table style="text-align: center; height: 1092px;" width="737">
<tbody>
<tr>
<td><a href="http://sumolari.com/wp-content/uploads/2010/06/win7-session-restore.jpg.png" rel="lightbox-4020"><img class="alignnone size-thumbnail wp-image-4042" title="Preferencias de Firefox 4 en Windows" src="http://sumolari.com/wp-content/uploads/2010/06/win7-session-restore.jpg-230x130.png" alt="Preferencias de Firefox 4 en Windows" width="230" height="130" /></a></td>
<td><a href="http://sumolari.com/wp-content/uploads/2010/06/win7-preferences-network.jpg.png" rel="lightbox-4020"><img class="alignnone size-thumbnail wp-image-4041" title="Preferencias de Firefox 4 en Windows" src="http://sumolari.com/wp-content/uploads/2010/06/win7-preferences-network.jpg-230x130.png" alt="Preferencias de Firefox 4 en Windows" width="230" height="130" /></a></td>
<td><a href="http://sumolari.com/wp-content/uploads/2010/06/win7-preferences-exceptions.jpg.png" rel="lightbox-4020"><img class="alignnone size-thumbnail wp-image-4040" title="Preferencias de Firefox 4 en Windows" src="http://sumolari.com/wp-content/uploads/2010/06/win7-preferences-exceptions.jpg-230x130.png" alt="Preferencias de Firefox 4 en Windows" width="230" height="130" /></a></td>
</tr>
<tr>
<td><a href="http://sumolari.com/wp-content/uploads/2010/06/win7-preferences-base.jpg.png" rel="lightbox-4020"><img class="alignnone size-thumbnail wp-image-4039" title="Preferencias de Firefox 4 en Windows" src="http://sumolari.com/wp-content/uploads/2010/06/win7-preferences-base.jpg-230x130.png" alt="Preferencias de Firefox 4 en Windows" width="230" height="130" /></a></td>
<td><a href="http://sumolari.com/wp-content/uploads/2010/06/win7-phishing.jpg" rel="lightbox-4020"><img class="alignnone size-thumbnail wp-image-4038" title="Alerta de phishing de Firefox 4 en Windows" src="http://sumolari.com/wp-content/uploads/2010/06/win7-phishing-230x130.jpg" alt="Alerta de phishing de Firefox 4 en Windows" width="230" height="130" /></a></td>
<td><a href="http://sumolari.com/wp-content/uploads/2010/06/win7-neterror.jpg.png" rel="lightbox-4020"><img class="alignnone size-thumbnail wp-image-4037" title="Mensaje de error de red de Firefox 4 en Windows" src="http://sumolari.com/wp-content/uploads/2010/06/win7-neterror.jpg-230x130.png" alt="Mensaje de error de red de Firefox 4 en Windows" width="230" height="130" /></a></td>
</tr>
<tr>
<td><a href="http://sumolari.com/wp-content/uploads/2010/06/win7-extensions-view-list-small.jpg.png" rel="lightbox-4020"><img class="alignnone size-thumbnail wp-image-4036" title="Gestor de AddOns de Firefox 4 en Windows" src="http://sumolari.com/wp-content/uploads/2010/06/win7-extensions-view-list-small.jpg-230x130.png" alt="Gestor de AddOns de Firefox 4 en Windows" width="230" height="130" /></a></td>
<td><a href="http://sumolari.com/wp-content/uploads/2010/06/win7-extensions-view-list-large.jpg.png" rel="lightbox-4020"><img class="alignnone size-thumbnail wp-image-4035" title="Gestor de AddOns de Firefox 4 en Windows" src="http://sumolari.com/wp-content/uploads/2010/06/win7-extensions-view-list-large.jpg-230x130.png" alt="Gestor de AddOns de Firefox 4 en Windows" width="230" height="130" /></a></td>
<td><a href="http://sumolari.com/wp-content/uploads/2010/06/win7-extensions-view-grid.jpg.png" rel="lightbox-4020"><img class="alignnone size-thumbnail wp-image-4034" title="Gestor de AddOns de Firefox 4 en Windows" src="http://sumolari.com/wp-content/uploads/2010/06/win7-extensions-view-grid.jpg-230x130.png" alt="Gestor de AddOns de Firefox 4 en Windows" width="230" height="130" /></a></td>
</tr>
<tr>
<td><a href="http://sumolari.com/wp-content/uploads/2010/06/win7-extension-isolated.jpg.png" rel="lightbox-4020"><img class="alignnone size-thumbnail wp-image-4033" title="Gestor de AddOns de Firefox 4 en Windows" src="http://sumolari.com/wp-content/uploads/2010/06/win7-extension-isolated.jpg-230x130.png" alt="Gestor de AddOns de Firefox 4 en Windows" width="230" height="130" /></a></td>
<td><a href="http://sumolari.com/wp-content/uploads/2010/06/win7-about-config.jpg.png" rel="lightbox-4020"><img class="alignnone size-thumbnail wp-image-4032" title="About:config de Firefox 4 en Windows" src="http://sumolari.com/wp-content/uploads/2010/06/win7-about-config.jpg-230x130.png" alt="About:config de Firefox 4 en Windows" width="230" height="130" /></a></td>
<td><a href="http://sumolari.com/wp-content/uploads/2010/06/mac-session-restore.jpg" rel="lightbox-4020"><img class="alignnone size-thumbnail wp-image-4031" title="Restaurar sesión en Firefox 4 en Mac OS X" src="http://sumolari.com/wp-content/uploads/2010/06/mac-session-restore-230x130.jpg" alt="Restaurar sesión en Firefox 4 en Mac OS X" width="230" height="130" /></a></td>
</tr>
<tr>
<td><a href="http://sumolari.com/wp-content/uploads/2010/06/mac-preferences-network.jpg" rel="lightbox-4020"><img class="alignnone size-thumbnail wp-image-4030" title="Preferencias de Firefox 4 en Mac OS X" src="http://sumolari.com/wp-content/uploads/2010/06/mac-preferences-network-230x130.jpg" alt="Preferencias de Firefox 4 en Mac OS X" width="230" height="130" /></a></td>
<td><a href="http://sumolari.com/wp-content/uploads/2010/06/mac-preferences-exceptions.jpg" rel="lightbox-4020"><img class="alignnone size-thumbnail wp-image-4029" title="Preferencias de Firefox 4 en Mac OS X" src="http://sumolari.com/wp-content/uploads/2010/06/mac-preferences-exceptions-230x130.jpg" alt="Preferencias de Firefox 4 en Mac OS X" width="230" height="130" /></a></td>
<td><a href="http://sumolari.com/wp-content/uploads/2010/06/mac-preferences-base.jpg" rel="lightbox-4020"><img class="alignnone size-thumbnail wp-image-4028" title="Preferencias de  Firefox 4 en Mac OS X" src="http://sumolari.com/wp-content/uploads/2010/06/mac-preferences-base-230x130.jpg" alt="Preferencias de Firefox 4 en Mac OS X" width="230" height="130" /></a></td>
</tr>
<tr>
<td><a href="http://sumolari.com/wp-content/uploads/2010/06/mac-phishing.jpg" rel="lightbox-4020"><img class="alignnone size-thumbnail wp-image-4027" title="Alerta de phishing de Firefox 4 en Mac OS X" src="http://sumolari.com/wp-content/uploads/2010/06/mac-phishing-230x130.jpg" alt="Alerta de phishing de Firefox 4 en Mac OS X" width="230" height="130" /></a></td>
<td><a href="http://sumolari.com/wp-content/uploads/2010/06/win7-neterror.jpg.png" rel="lightbox-4020"><img class="alignnone size-thumbnail wp-image-4037" title="Mensaje de error de red de Firefox 4 en Windows" src="http://sumolari.com/wp-content/uploads/2010/06/win7-neterror.jpg-230x130.png" alt="Mensaje de error de red de Firefox 4 en Windows" width="230" height="130" /></a></td>
<td><a href="http://sumolari.com/wp-content/uploads/2010/06/mac-extensions-view-list-small.jpg" rel="lightbox-4020"><img class="alignnone size-thumbnail wp-image-4025" title="Gestor de AddOns de Firefox 4 en Mac OS X" src="http://sumolari.com/wp-content/uploads/2010/06/mac-extensions-view-list-small-230x130.jpg" alt="Gestor de AddOns de Firefox 4 en Mac OS X" width="230" height="130" /></a></td>
</tr>
<tr>
<td><a href="http://sumolari.com/wp-content/uploads/2010/06/mac-extensions-view-list-large.jpg" rel="lightbox-4020"><img class="alignnone size-thumbnail wp-image-4024" title="Gestor de AddOns de Firefox 4 en Mac OS X" src="http://sumolari.com/wp-content/uploads/2010/06/mac-extensions-view-list-large-230x130.jpg" alt="Gestor de AddOns de Firefox 4 en Mac OS X" width="230" height="130" /></a></td>
<td><a href="http://sumolari.com/wp-content/uploads/2010/06/mac-extensions-view-grid.jpg" rel="lightbox-4020"><img class="alignnone size-thumbnail wp-image-4023" title="Gestor de AddOns de Firefox 4 en Mac OS X" src="http://sumolari.com/wp-content/uploads/2010/06/mac-extensions-view-grid-230x130.jpg" alt="Gestor de AddOns de Firefox 4 en Mac OS X" width="230" height="130" /></a></td>
<td><a href="http://sumolari.com/wp-content/uploads/2010/06/mac-extension-isolated.jpg" rel="lightbox-4020"><img class="alignnone size-thumbnail wp-image-4022" title="Gestor de AddOns de Firefox 4 en Mac OS X" src="http://sumolari.com/wp-content/uploads/2010/06/mac-extension-isolated-230x130.jpg" alt="Gestor de AddOns de Firefox 4 en Mac OS X" width="230" height="130" /></a></td>
</tr>
<tr>
<td style="text-align: center;" colspan="3"><a href="http://sumolari.com/wp-content/uploads/2010/06/mac-about-config.jpg" rel="lightbox-4020"><img class="alignnone size-thumbnail wp-image-4021" title="About:config de Firefox 4 en Mac OS X" src="http://sumolari.com/wp-content/uploads/2010/06/mac-about-config-230x130.jpg" alt="About:config de Firefox 4 en Mac OS X" width="230" height="130" /></a></td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://sumolari.com/imagenes-del-contenido-en-pestanas-de-firefox-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

