<?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>Twoixted again &#187; prog</title>
	<atom:link href="http://www.perezruiz.com/tag/prog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.perezruiz.com</link>
	<description>Let's get twoixted again...</description>
	<lastBuildDate>Sun, 05 Sep 2010 00:17:16 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Problemas con los microformatos</title>
		<link>http://www.perezruiz.com/2009/08/12/problemas-con-los-microformatos/</link>
		<comments>http://www.perezruiz.com/2009/08/12/problemas-con-los-microformatos/#comments</comments>
		<pubDate>Wed, 12 Aug 2009 01:10:48 +0000</pubDate>
		<dc:creator>Twoixter</dc:creator>
				<category><![CDATA[HTML]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[prog]]></category>

		<guid isPermaLink="false">http://www.perezruiz.com/?p=156</guid>
		<description><![CDATA[Leyendo recientemente un artículo de A List Apart sobre HTML 5 y sus nuevas capacidades semánticas, me encontré con el caso de la BBC donde decidió eliminar los microformatos de calendarios (hCalendar) de sus páginas de listado de programación. Y es curioso y alarmante el por qué. El microformato hCalendar incrusta fechas y eventos basados [...]]]></description>
			<content:encoded><![CDATA[<p>Leyendo recientemente un <a href="http://www.alistapart.com/articles/semanticsinhtml5">artículo de <strong>A List Apart</strong> sobre HTML 5</a> y sus nuevas capacidades semánticas, me encontré con el caso de la BBC donde decidió <a href="http://www.bbc.co.uk/blogs/radiolabs/2008/06/removing_microformats_from_bbc.shtml">eliminar los microformatos</a> de calendarios (hCalendar) de sus páginas de listado de programación. Y es curioso y alarmante el por qué.
<span id="more-156"></span></p>

<p>El microformato hCalendar incrusta fechas y eventos basados en iCalendar. La BBC usaba además el patrón de diseño sobre el tag ABBR, para incluir información relevante para parsear automáticamente alrededor de información para humanos. Por ejemplo:</p>

<pre><code>&lt;p&gt;Mi cumpleaños es el &lt;abbr class="dtstart" title="20090814"&gt;14 de Agosto&lt;/abbr&gt;&lt;/p&gt;
</code></pre>

<p>Lo anterior es un ejemplo de microformato hCalendar incrustado en un ABBR tal como usaba la BBC.</p>

<h2>¿Por qué es malo esto y por eso dejó de usarlo la BBC?</h2>

<p>Pues básicamente, y sorprendentemente, por cuestiones de usabilidad.</p>

<p>Resulta que los microformatos, al usar el atributo &#8220;title&#8221; para almacenar los metadatos, expone visiblemente los mismos al usuario como efecto secundario. El atributo &#8220;title&#8221; en algunos elementos es visible al pasar el ratón por encima en forma de &#8220;tooltip&#8221;. Por ejemplo en los enlaces <code>&lt;a title="Título visible"&gt;</code>, etc. Además, resulta que los programas que leen la pantalla para personas discapacitadas como ciegos, etc, LEEN el contenido del tag title, con lo cual una persona que use un lector de pantalla a voz y pase por el ejemplo anterior diría &#8220;Mi cumpleaños es el veinte millones noventa mil ochocientos catorce catorce de agosto&#8221;.</p>

<p>El artículo de A List Apart es especialmente interesante porque cuestiona en cierta forma a HTML 5. Usa el caso de la BBC para exponer sus argumentos, que son los siguientes:</p>

<h2>Semántica estricta en HTML 5</h2>

<p>HTML 5 marca un hito en los estandares de la red, entre otros por añadir una semántica más estricta en los elementos. Aparecen tags del tipo <code>section</code>, <code>nav</code>, etc, que se pueden usar en lugar de <code>div</code> para añadir semántica al contenido. El artículo cuestiona dos aspectos con gran convicción:</p>

<ul>
<li>La compatibilidad con navegadores antiguos.</li>
<li>La futura expansión semántica del lenguaje.</li>
</ul>

<p>Es decir, se cuestiona el antes y el después de HTML 5. El problema con los navegadores antiguos es grave, aunque se limita a los navegadores de Microsoft éstos representan un amplio porcentaje de los clientes existentes.</p>

<p>Por ejemplo, Internet Explorer (en cualquier versión) no soporta los estilos sobre los nuevos elementos. Por ejemplo:</p>

<pre><code>&lt;style type="text/css"&gt;
    section { color: red; }
&lt;/style&gt;
&lt;section&gt;
    &lt;h1&gt;Esto es la sección principal.&lt;/h1&gt;
&lt;/section&gt;
</code></pre>

<p>La cabecera anterior no saldrá en rojo en Internet Explorer, ya que no aplica los estilos a los elementos que no conoce. Ya hay una solución en JavaScript para esto, como no, pero evidentemente es un gran problema ¿cómo puede un estandard moderno introducir nuevos &#8220;hacks&#8221;? ¿No tenemos bastante con los hacks existentes para CSS en Explorer?</p>

<p>El otro punto de interés es la futura ampliación de la semántica. El autor se basa en que los elementos existentes no son suficientes para dar intención semántica en general, y el lenguaje no permite ampliar dichos elementos. Por ejemplo, HTML 5 introduce elementos como <code>&lt;section&gt;</code>, <code>&lt;header&gt;</code>, <code>&lt;aside&gt;</code>, <code>&lt;figure&gt;</code>, que amplían las posibilidades semánticas, pero el artículo se cuestiona con razón que quizá son pocos elementos y la amplitud que abarca esta apertura semántica es insuficiente.</p>

<p>Como ejemplo, el mismo autor plantea una posibilidad que sería ampliar la semántica del lenguaje en lugar de mediante los tags, por los atributos de éstos. Por ejemplo, mediante <code>&lt;ul navigation="main"&gt;</code> o algo por el estilo.</p>

<p>Os recomiento <a href="http://microformatique.com/?p=83">otros posts del mismo autor</a> para saber más.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.perezruiz.com/2009/08/12/problemas-con-los-microformatos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Edición de código en Mac</title>
		<link>http://www.perezruiz.com/2008/11/22/edicion-de-codigo-en-mac/</link>
		<comments>http://www.perezruiz.com/2008/11/22/edicion-de-codigo-en-mac/#comments</comments>
		<pubDate>Sat, 22 Nov 2008 00:45:05 +0000</pubDate>
		<dc:creator>Twoixter</dc:creator>
				<category><![CDATA[OSX]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[prog]]></category>

		<guid isPermaLink="false">http://www.perezruiz.com/?p=75</guid>
		<description><![CDATA[Odio la edición de código, y texto en general, en Mac. Si eres un usuario de ordenadores Mac no te preocupes, no estoy criticando el sistema. Esta petición es muy seria. Lo que pasa es lo siguiente: la forma de actuar de las teclas de edición como &#8220;Página Arriba&#8221; / &#8220;Página Abajo&#8221;, y sobre todo [...]]]></description>
			<content:encoded><![CDATA[<p>Odio la edición de código, y texto en general, en Mac.</p>

<p>Si eres un usuario de ordenadores Mac no te preocupes, no estoy criticando el sistema. Esta petición es muy seria. Lo que pasa es lo siguiente: la forma de actuar de las teclas de edición como &#8220;Página Arriba&#8221; / &#8220;Página Abajo&#8221;, y sobre todo las teclas &#8220;Inicio&#8221; / &#8220;Fin&#8221; es completamente diferente.</p>

<p>Vereis, llevo más de 20 años usando un teclado de PC. Desde el comienzo de los tiempos, la tecla &#8220;Home&#8221; siempre ha llevado el cursor al principio de la línea, al igual que la tecla &#8220;End&#8221; ha llevado el cursor al final de la línea. El proceso es muy sencillo, y funciona de maravilla. No se a quién se le ocurrió que pulsando &#8220;Home&#8221; se tenga que ir al principio del DOCUMENTO, no de la línea actual ni siquiera de la página. Ahora mismo estoy editando este post en el WordPress y me veo a mi mismo una y otra vez usando el ratón para volver la página a donde estaba porque pulso mecánicamente &#8220;Home&#8221; queriendo volver al principio de la línea.</p>

<p>Lo que me gustaría, y desde aquí pido humildemente a algún usuario de Mac una solución, es que hubiera alguna opción, algo que pudiera cambiar para hacer que el comportamiento de las teclas de edición funcionase como en PC, pero para todo el sistema. Osea, no valen soluciones temporales para un programa como por ejemplo: &#8220;En TextMate entra en tal sitio y configura las teclas&#8221;. No. Tiene que ser &#8220;System Wide&#8221;, para todos los programas.</p>

<p><strong>Editado</strong>: Bueno, después de leer esta entrada meses después, tengo que deciros que uso habitualmente casi el 100% del tiempo un ordenador Mac. Desde el trabajo hasta casa (me compré un MacBook Pro). La edición de texto en mac la he solucionado con un programa que se llama &#8220;Key Fixer&#8221;, o algo parecido. Si teneis interés, dejadme un comentario en el blog y publico la dirección donde podeis conseguirlo. (Es que si no, no me dejais ningún comentario, que sois unos perezosos) <img src='http://www.perezruiz.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.perezruiz.com/2008/11/22/edicion-de-codigo-en-mac/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>A vueltas con ObjectiveC</title>
		<link>http://www.perezruiz.com/2008/10/30/a-vueltas-con-objectivec/</link>
		<comments>http://www.perezruiz.com/2008/10/30/a-vueltas-con-objectivec/#comments</comments>
		<pubDate>Wed, 29 Oct 2008 22:56:36 +0000</pubDate>
		<dc:creator>Twoixter</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[ObjectiveC]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[objc]]></category>
		<category><![CDATA[prog]]></category>

		<guid isPermaLink="false">http://www.perezruiz.com/?p=72</guid>
		<description><![CDATA[Sigo dándole vueltas al ObjectiveC, tengo que dejar atrás todos estos años de C++ y obligarme a pensar en ObjC para pillarle la esencia, la metodología para usar eficientemente este lenguaje. Estaba dándole vueltas hoy a una técnica de optimización que se usa mucho en C++ llamada COW (Copy-on-write), o como la llama QT &#8220;Implicitly [...]]]></description>
			<content:encoded><![CDATA[<p>Sigo dándole vueltas al ObjectiveC, tengo que dejar atrás todos estos años de C++ y obligarme a pensar en ObjC para pillarle la esencia, la metodología para usar eficientemente este lenguaje.</p>

<p>Estaba dándole vueltas hoy a una técnica de optimización que se usa mucho en C++ llamada COW (<a href="http://en.wikipedia.org/wiki/Copy-on-write">Copy-on-write</a>), o como la llama QT &#8220;<a href="http://doc.trolltech.com/4.4/shared.html">Implicitly Shared Classes</a>&#8220;. La esencia de esta técnica es que basándose en que una asignación de un objeto complejo ocupa tanto recursos de memoria como CPU, utiliza en lo posible copias compartidas (shared) en memoria y sólo se duplica la memoria del objeto cuando una instancia en concreto va a cambiar (va a escribirse en ella). Esta técnica no es propiedad exclusiva de C++, se usa tanto en memoria virtual de los sistemas operativos como en implementaciones de sistemas de ficheros (Ej. Ext3). En C++ los ejemplos clásicos son la clase &#8220;string&#8221; de la STL o los objetos de Qt. Se puede implementar fácilmente un objeto COW con un <a href="http://en.wikipedia.org/wiki/Smart_pointer">smart pointer</a>, como la clase &#8220;auto_ptr&#8221; de la STL.</p>

<p>Toda esta discusión viene porque un smart pointer, como un &#8220;auto_ptr&#8221; es la forma que tiene C++ de atar, de encapsular el uso de la memoria para que, por una parte, no hayan errores con los punteros (memory leak) y por otra llevar un conteo de referencias para liberar la memoria cuando sea necesario (cuando ningún objeto &#8220;apunta&#8221; a un auto_ptr, éste libera la memoria automáticamente). Básicamente es un garbage collection, mejor bajo mi punto de vista. Con un auto_ptr sabes exactamente cuando se va a liberar la memoria: cuando el objeto pierde todas las referencias, ni antes ni después. Con un garbage collection como creo que usa C# y si no estoy equivocado también ObjectiveC, no tienes control sobre <em>cuando </em>se libera esa memoria. Usemos un ejemplo diferente, supongamos que el objeto que instanciamos usando un auto_ptr no es memoria, sino un recurso como un handle de fichero o un semáforo: a través de los constructores y destructores tenemos perfectamente controlado este recurso. Lo que quiero decir, y si algún &#8220;gurú&#8221; de ObjectiveC me lee por algún casual, es que me es extraño confiar en el mecanismo de [[obj alloc] init]  /  [obj dealloc]  para la construcción y destrucción de objetos.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.perezruiz.com/2008/10/30/a-vueltas-con-objectivec/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Diferencias en uniones INNER JOIN en MySQL</title>
		<link>http://www.perezruiz.com/2008/10/23/diferencias-en-uniones-inner-join-en-mysql/</link>
		<comments>http://www.perezruiz.com/2008/10/23/diferencias-en-uniones-inner-join-en-mysql/#comments</comments>
		<pubDate>Thu, 23 Oct 2008 21:07:57 +0000</pubDate>
		<dc:creator>Twoixter</dc:creator>
				<category><![CDATA[SQL]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[prog]]></category>

		<guid isPermaLink="false">http://www.perezruiz.com/?p=65</guid>
		<description><![CDATA[Cuidado con utilizar y mezclar las cláusulas INNER JOIN / LEFT JOIN en MySQL con una lista de tablas en el FROM. Por ejemplo, un tipico SELECT: 1 2 3 4 SELECT * FROM tabla1 t1, tabla2 t2 LEFT JOIN tabla3 t3 ON t3.id = t1.id WHERE t1.id = t2.id Funcionaba bien hasta la versión [...]]]></description>
			<content:encoded><![CDATA[<p>Cuidado con utilizar y mezclar las cláusulas INNER JOIN / LEFT JOIN en MySQL con una lista de tablas en el FROM. Por ejemplo, un tipico SELECT:</p>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span>
    <span style="color: #993333; font-weight: bold;">FROM</span> tabla1 t1<span style="color: #66cc66;">,</span> tabla2 t2
    <span style="color: #993333; font-weight: bold;">LEFT</span> <span style="color: #993333; font-weight: bold;">JOIN</span> tabla3 t3 <span style="color: #993333; font-weight: bold;">ON</span> t3<span style="color: #66cc66;">.</span>id <span style="color: #66cc66;">=</span> t1<span style="color: #66cc66;">.</span>id
    <span style="color: #993333; font-weight: bold;">WHERE</span> t1<span style="color: #66cc66;">.</span>id <span style="color: #66cc66;">=</span> t2<span style="color: #66cc66;">.</span>id</pre></td></tr></table></div>


<p>Funcionaba bien hasta la versión 5.0.12 de MySQL. A partir de la versión 5.0.12, ha cambiado la precedencia de los operadores &#8220;coma&#8221; (,) y JOIN, de tal forma que se produce un error &#8220;Unknown column &#8216;t1.id&#8217; in &#8216;on clause&#8217;&#8221;. Esto rompe de manera definitiva algunos programas, osCommerce por ejemplo.</p>

<p>La solución es poner paréntesis para forzar la precedencia de los operadores &#8220;coma&#8221; y JOIN, o también cambiar la coma por un INNER JOIN, de tal forma que el anterior query quedaría de la siguiente forma:</p>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span>
    <span style="color: #993333; font-weight: bold;">FROM</span> tabla1 t1
    <span style="color: #993333; font-weight: bold;">INNER</span> <span style="color: #993333; font-weight: bold;">JOIN</span> tabla2 t2 <span style="color: #993333; font-weight: bold;">ON</span> t2<span style="color: #66cc66;">.</span>id <span style="color: #66cc66;">=</span> t1<span style="color: #66cc66;">.</span>id
    <span style="color: #993333; font-weight: bold;">LEFT</span> <span style="color: #993333; font-weight: bold;">JOIN</span> tabla3 t3 <span style="color: #993333; font-weight: bold;">ON</span> t3<span style="color: #66cc66;">.</span>id <span style="color: #66cc66;">=</span> t1<span style="color: #66cc66;">.</span>id</pre></td></tr></table></div>


<p>O también:</p>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span>
    <span style="color: #993333; font-weight: bold;">FROM</span> <span style="color: #66cc66;">&#40;</span>tabla1 t1<span style="color: #66cc66;">,</span> tabla2 t2<span style="color: #66cc66;">&#41;</span>
    <span style="color: #993333; font-weight: bold;">LEFT</span> <span style="color: #993333; font-weight: bold;">JOIN</span> tabla3 t3 <span style="color: #993333; font-weight: bold;">ON</span> t3<span style="color: #66cc66;">.</span>id <span style="color: #66cc66;">=</span> t1<span style="color: #66cc66;">.</span>id
    <span style="color: #993333; font-weight: bold;">WHERE</span> t1<span style="color: #66cc66;">.</span>id <span style="color: #66cc66;">=</span> t2<span style="color: #66cc66;">.</span>id</pre></td></tr></table></div>


<p>Personalmente prefiero la primera, considero que es mucho más correcto ya que todas las uniones de las tablas se hacen directamente en cláusulas ON dejando el WHERE libre para las restricciones de los datos, no las uniones.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.perezruiz.com/2008/10/23/diferencias-en-uniones-inner-join-en-mysql/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>El efecto onda de choque (Mach 1)</title>
		<link>http://www.perezruiz.com/2008/10/22/el-efecto-onda-de-choque-mach-1/</link>
		<comments>http://www.perezruiz.com/2008/10/22/el-efecto-onda-de-choque-mach-1/#comments</comments>
		<pubDate>Wed, 22 Oct 2008 20:02:50 +0000</pubDate>
		<dc:creator>Twoixter</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Varios]]></category>
		<category><![CDATA[prog]]></category>

		<guid isPermaLink="false">http://www.perezruiz.com/?p=63</guid>
		<description><![CDATA[Hay un curioso efecto que se produce en un proyecto de programación. Quizá está estipulado de alguna forma pero como no he sido muy bueno nunca en ingeniería del software no lo conozco. Me refiero a lo que he dado en llamar &#8220;Efecto onda de choque, o Mach 1&#8243;. Generalmente en todo proyecto de software [...]]]></description>
			<content:encoded><![CDATA[<p>Hay un curioso efecto que se produce en un proyecto de programación. Quizá está estipulado de alguna forma pero como no he sido muy bueno nunca en ingeniería del software no lo conozco. Me refiero a lo que he dado en llamar &#8220;Efecto onda de choque, o Mach 1&#8243;.</p>

<p>Generalmente en todo proyecto de software hay un momento en que se produce una onda de choque, antes o después, y además no importa el tamaño de éste.</p>

<p>El efecto onda de choque es lo siguiente: Siempre hay pequeños bugs, fallos o mejoras que vistos individualmente no contribuyen mucho al fallo del sistema. Son los típicos &#8220;ya lo haré&#8221; o &#8220;déjalo que ahora funciona así&#8221;. Lo más tipico son los &#8220;TODO:&#8221; en el código, algo que dejas para después. También puede ser algo que en determinado momento funcionaba bien pero llega un momento en que frena el desarrollo (sin llegar a pararlo, esto es importante).</p>

<p>En fin, imagínate todas estas cosas como &#8220;ondas&#8221; de sonido. Al igual que un avión supersónico que va generando estas ondas, a medida que acelera estas ondas cada vez están más cerca hasta que se produce la onda de choque: todas las ondas se van juntando hasta que la diferencia de presión hace que se produzca la <a href="http://es.wikipedia.org/wiki/Explosi%C3%B3n_s%C3%B3nica">explosión sónica</a>.</p>

<p>Es decir, llega un momento en la vida útil de un proyecto de software en el que se produce esta explosión sónica y todos los pequeños bugs arrastrados hacen que no merezca la pena seguir con el desarrollo como se venía haciendo y merece más la pena empezar de nuevo, quizá con otro análisis y aprovechando el know-how del proyecto rehacerlo paar eliminar todas estas ondas.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.perezruiz.com/2008/10/22/el-efecto-onda-de-choque-mach-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Inicializando objetos en Cocoa</title>
		<link>http://www.perezruiz.com/2008/10/20/inicializando-objetos-en-cocoa/</link>
		<comments>http://www.perezruiz.com/2008/10/20/inicializando-objetos-en-cocoa/#comments</comments>
		<pubDate>Mon, 20 Oct 2008 19:58:16 +0000</pubDate>
		<dc:creator>Twoixter</dc:creator>
				<category><![CDATA[ObjectiveC]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[objc]]></category>
		<category><![CDATA[prog]]></category>

		<guid isPermaLink="false">http://www.perezruiz.com/?p=54</guid>
		<description><![CDATA[A vueltas con mi aprendizaje en ObjectiveC y la programación en Cocoa para iPhone, vuelvo a la carga con los &#8220;inicializadores&#8221;. Qué extraño me suena esto con respecto a C++. En C++ todo es más &#8220;estático&#8221; en el sentido de que el mecanismo de construcción y destrucción forma parte del lenguaje: sabes exactamente cuando y [...]]]></description>
			<content:encoded><![CDATA[<p>A vueltas con mi aprendizaje en ObjectiveC y la programación en Cocoa para iPhone, vuelvo a la carga con los &#8220;inicializadores&#8221;. Qué extraño me suena esto con respecto a C++.</p>

<p>En C++ todo es más &#8220;estático&#8221; en el sentido de que el mecanismo de construcción y destrucción forma parte del lenguaje: sabes exactamente cuando y como se llamarán a los constructores y destructores (inicializadores en terminología ObjectiveC). El puntero &#8220;this&#8221; existe siempre y es omnipresente, pero eso no parece ser el caso con ObjectiveC, en el que &#8220;self&#8221; es más manejable y voluble.</p>

<p>Por ejemplo, hay <a href="http://www.cocoabuilder.com/archive/message/cocoa/2008/2/11/198591">discusiones</a> sobre cual es la mejor manera de inicializar un objeto, y por lo que puedo leer, tiene mucho más que ver que uses una librería (Foundation) u otra, como por ejemplo que los descendientes de NSManagedObject tengan siempre que asignar &#8220;self&#8221; mediante la llamada a [super init]. Esto también está relacionado con que se pueden instanciar clases, no sólo objetos con lo que se lía aún más la cosa&#8230;</p>

<p>Ya veremos si termino comprendiendo todo esto o tiro por la ventana todo lo relacionado con ObjectiveC&#8230; Keep in touch.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.perezruiz.com/2008/10/20/inicializando-objetos-en-cocoa/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iPhone y la programación con ObjectiveC</title>
		<link>http://www.perezruiz.com/2008/10/14/iphone-y-la-programacion-con-objectivec/</link>
		<comments>http://www.perezruiz.com/2008/10/14/iphone-y-la-programacion-con-objectivec/#comments</comments>
		<pubDate>Tue, 14 Oct 2008 21:15:01 +0000</pubDate>
		<dc:creator>Twoixter</dc:creator>
				<category><![CDATA[ObjectiveC]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[objc]]></category>
		<category><![CDATA[prog]]></category>

		<guid isPermaLink="false">http://www.perezruiz.com/?p=47</guid>
		<description><![CDATA[Hacía muchos años que no veía ObjectiveC. Cuando digo muchos, digo muuuchos. No me equivocaría si dijera que aún estaba en venta el NeXT&#8230; Ahora he vuelto a verlo por el iPhone. La verdad es que es la primera vez que me acerco en serio a la programación para OSX. No me acordaba desde mis [...]]]></description>
			<content:encoded><![CDATA[<p>Hacía muchos años que no veía ObjectiveC. Cuando digo muchos, digo muuuchos. <img src='http://www.perezruiz.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  No me equivocaría si dijera que aún estaba en venta el NeXT&#8230;</p>

<p>Ahora he vuelto a verlo por el iPhone. La verdad es que es la primera vez que me acerco en serio a la programación para OSX. No me acordaba desde mis tiempos de universidad, y de eso ha llovido un poco. Lo más que me acuerdo es que era en C y con un Classic&#8230; cuando era actual, jajaja.</p>

<p>Odio la programación en ObjectiveC. Puedo comprender las razones de Apple por elegir un lenguaje así en su época, pero no para mantenerlo. Es cierto que usar C/C++ para programación de entornos de usuario hay <a href="http://msdn.microsoft.com/es-es/library/d06h2x6e(VS.80).aspx">malos ejemplos</a>, aunque se <a href="http://www.codegear.com/products/cppbuilder">puede hacer bien</a>, o <a href="http://trolltech.com/">hacer muy bien</a>. También podía haber hecho su propio lenguaje, o ampliar uno ya existente. Ya puestos, por qué no usar directamente SmallTalk.</p>

<p>Dejemoslo claro, esto es una opinión personal. Si alguien lee esto que es defensor a ultranza de ObjectiveC le daré la razón. Simplemente quiero decir que no se piense que es una opinión de &#8220;Newbe&#8221;, llevo programando en entornos de usuario desde que me compré el número 1 del MSJ (Microsoft System Journal).</p>

<p>De hecho, lo malo no es el entorno de desarrollo, el Xcode lo considero fenomenal, un entorno de desarrollo que ya quisiera en Windows. No. Lo malo es con el lenguaje.</p>

<p>En cuanto a la sintaxis es lo de menos, al final te acostumbras aunque duramente por tantos años llamando a las funciones.con().parentesis(). Lo malo de la sintaxis de ObjectiveC es justamente lo lioso de leer y de entender para los no iniciados. Te [puedes [perder facilmente:@"en la" [maraña init]]]</p>

<p>Para mi lo peor es que es un lenguaje orientado a objetos sobre uno que no lo es, como C. Aunque en ObjectiveC++ se pueden mezclar clases de C++ con ObjectiveC, esto no arregla el problema. Esta diferencia de conceptos ha llevado a un lenguaje que no tiene constructores y destructores, no tiene sobrecarga de operadores ni polimorfismo, entre otras cosas.</p>

<p>Ahora que hay más movimiento en la programación ObjectiveC por el iPhone, se oyen voces de programadores contra el sistema, y se necesitan posts <a href="http://www.mikeash.com/?page=pyblog/the-how-and-why-of-cocoa-initializers.html">como este</a> simplemente para decir cómo se tiene que construir un puto objeto en cocoa! Simplemente esto no me parece serio, y voy a dar una razón que creo de peso: no es de recibo que un lenguaje orientado a objetos, por mucho recolector de basura que tenga, sea tan propenso a equivocaciones.</p>

<p>El ejemplo de los constructores. En ObjectiveC no hay constructores ni destructores. Punto. Los objetos se inicializan si el programador se acuerda de hacerlo. Todo esto sin contar que toda la jerarquía de objetos que estás construyendo depende de que tu llames a [objeto init]. Me suena a tremendo WTF!. Si hablamos de destructores, la cosa se complica. Es el programador el que tiene que llamar a &#8220;dealloc&#8221; para destruir un objeto. No, espera, ¿o mejor llamar a &#8220;release&#8221;? Mmhh&#8230; Depende. Es a estas cosas a las que me refiero, el lenguaje no permite una construcción robusta de librerías. No basta con poner en negrita en rojo con fondo fosforito en la documentación: &#8220;Llama al puto release cuando quieras liberarme&#8221;, es la clase la que debería asegurarse de liberar sus recursos.</p>

<p>Me recuerdo ahora un post que leí en un blog, no recuerdo el nombre si no lo pondría, que venía a decir algo así con respecto a los destructores:</p>

<p style="padding-left: 30px;">&#8220;En ObjectiveC no hace falta destruir un objeto, normalmente es más sencillo y mejor que el sistema operativo libere la memoria cuando sale del programa, excepto si el objeto tiene recursos ocupados como ficheros abiertos.&#8221;.</p>

<p>En resumiendo venía a decir algo así. Para mi mente tan <a href="http://www.research.att.com/~bs/C++.html">Stroustruptiana</a>, simplemente no cabe en la cabeza que algún programador (quizás yo mismo) me deje recursos sin liberar. Llamalo memoria, en tal caso viene la basura y me la recoje, pero llámalo fichero abierto, llámalo socket conectado o peor aún, llámalo semáforo activo y verás el problema.</p>

<p>Este es uno de los posts que iré poniendo conforme vaya descubriendo ObjectiveC, quizá los siguientes sean más compasivos, pero mientras tanto, y si vas a escribir un comentario negativo, resuelve esta cuestión:</p>

<p>¿Cual es la forma más correcta de inicializar un objeto?</p>

<p><strong>Forma número 1:</strong></p>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>init <span style="color: #002200;">&#123;</span>
    <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">&#40;</span>self <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>super init<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
        <span style="color: #11740a; font-style: italic;">// inicializar el objeto.</span>
    <span style="color: #002200;">&#125;</span>
    <span style="color: #a61390;">return</span> self;
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>


<p><strong>Forma número 2:</strong></p>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>init <span style="color: #002200;">&#123;</span>
    <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">!</span><span style="color: #002200;">&#91;</span>self init<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span> <span style="color: #a61390;">return</span> <span style="color: #a61390;">nil</span>;
&nbsp;
    <span style="color: #11740a; font-style: italic;">// Inicializar el objeto</span>
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.perezruiz.com/2008/10/14/iphone-y-la-programacion-con-objectivec/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>From C++ to ObjectiveC</title>
		<link>http://www.perezruiz.com/2008/10/10/from-c-to-objectivec/</link>
		<comments>http://www.perezruiz.com/2008/10/10/from-c-to-objectivec/#comments</comments>
		<pubDate>Fri, 10 Oct 2008 17:54:37 +0000</pubDate>
		<dc:creator>Twoixter</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[ObjectiveC]]></category>
		<category><![CDATA[prog]]></category>

		<guid isPermaLink="false">http://www.perezruiz.com/?p=34</guid>
		<description><![CDATA[Hoy estoy que me salgo, dos posts en el mismo día. A este ritmo si que cumplo la promesa de un post al día. (No, si un día publico dos posts no quiere decir que pueda dejar un día sin postear). Os dejo un fichero PDF súmamente interesante si estás iniciándote en la programación del [...]]]></description>
			<content:encoded><![CDATA[<p>Hoy estoy que me salgo, dos posts en el mismo día. <img src='http://www.perezruiz.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  A este ritmo si que cumplo la promesa de un post al día. (No, si un día publico dos posts no quiere decir que pueda dejar un día sin postear).</p>

<p>Os dejo un fichero PDF súmamente interesante si estás iniciándote en la programación del iPhone, o en la programación en OSX en general, mediante ObjectiveC. Si es la primera vez que programas en ObjectiveC sin referencias de C/C++ igual te sirve la documentación de Apple, pero si como yo eres un die hard de C++, estarás más perdido que un pulpo en un garaje (&#8220;¿!!Donde están los putos constructores!!?&#8221;).</p>

<p><strong>Descarga</strong>: <a href="http://www.perezruiz.com/wp-content/uploads/2008/10/cpp-objc-en.pdf">From C++ to Objective-C</a> (706Kb más o menos).</p>

<p>Supongo que también lo dejaré en una futura sección de descargas, si algún día me pongo. (Que haga un post al día no supone que tenga que estar programando el WordPress)&#8230;</p>

<p>Se me olvidaba&#8230; Los créditos están en el PDF.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.perezruiz.com/2008/10/10/from-c-to-objectivec/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

