<?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>ctarda.net &#187; software</title>
	<atom:link href="http://ctarda.net/software/feed/" rel="self" type="application/rss+xml" />
	<link>http://ctarda.net</link>
	<description>El primer blog sin punchy tagline</description>
	<lastBuildDate>Mon, 24 May 2010 08:38:59 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9-rare</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Flashback II</title>
		<link>http://ctarda.net/2010/05/10/flashback-ii/</link>
		<comments>http://ctarda.net/2010/05/10/flashback-ii/#comments</comments>
		<pubDate>Mon, 10 May 2010 02:49:51 +0000</pubDate>
		<dc:creator>ctarda</dc:creator>
				<category><![CDATA[bambooapps]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://ctarda.net/?p=303</guid>
		<description><![CDATA[El post anterior me ha llevado a darme cuenta que: 
1.- Yo programaba en C y Pascal cuando si no programabas en Java alguien mataba a un gatito recién nacido en Australia.
2.- Yo programaba en Javascript cuando no existía el AJAX, y lo que yo hacía se llamaba DHTML. Entonces, el JS no era un [...]]]></description>
			<content:encoded><![CDATA[<p>El post anterior me ha llevado a darme cuenta que: </p>
<p>1.- Yo programaba en C y Pascal cuando si no programabas en Java alguien mataba a un gatito recién nacido en Australia.<br />
2.- Yo programaba en Javascript cuando no existía el AJAX, y lo que yo hacía se llamaba DHTML. Entonces, el JS no era un &#8220;lenguaje de programación&#8221;, era un &#8220;lenguaje de script&#8221; y estaba un escalón por encima de escribir fórmulas en Excel. Y si hacías DHTML, alguien mataba un gatito recién nacido en Australia.<br />
3.- Yo programaba en ActionScript cuando todavía no existía el concepto de &#8220;flash developer&#8221;, y todo el mundo se pensaba que en realidad era un diseñador con ínfulas. Más gatitos muertos en Australia. Lo de las ínfulas ha sido siempre verdad.<br />
4.- Yo programaba en C++ cuando sobrecargar un operador hacía que alguien matara un gatito en Australia.<br />
5.- Ahora, programo en Objective-C, contribuyendo a la expansión del mal por el mundo. Gatito. Australia.<br />
6.- Durante todo ese tiempo, además, he sido maquero. Para más inri, teniendo que esconder mi verdadera identidad en un mundo lleno de bindos y unixes.<br />
7.- Firefox en Mac (como todas la aplicaciones desarrolladas con cualquier kit cross-platform) me parece más feo que matar a un gatito en Australia. En bindos, eso sí, donde no está fuera del tiesto, me gusta. Opera me produce desprendimientos de retina en cualquier plataforma.</p>
<p>Como decía un antiguo jefe: la primera vez es un accidente, la segunda es casualidad, la tercera es un patrón. </p>
<p>Me siento, oficialmente, como el tipo que se compró el último reproductor de vídeo Betamax.</p>
<p>Nota del autor. El post anterior podría resumirse en &#8220;en esto del desarrollo, como en tantas otras cosas, las modas vienen y van y siempre va a haber alguien que te diga que lo que haces está mal, y que por tu culpa alguien está matando un gatito en Australia&#8221;.</p>
]]></content:encoded>
			<wfw:commentRss>http://ctarda.net/2010/05/10/flashback-ii/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Flashback</title>
		<link>http://ctarda.net/2010/05/10/flashback/</link>
		<comments>http://ctarda.net/2010/05/10/flashback/#comments</comments>
		<pubDate>Mon, 10 May 2010 01:58:54 +0000</pubDate>
		<dc:creator>ctarda</dc:creator>
				<category><![CDATA[bambooapps]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://ctarda.net/?p=301</guid>
		<description><![CDATA[Es curioso ver cómo la saña anti-Apple de hoy, es la misma saña anti-Flash de hace 8-9 años y fue la misma saña anti-C de 10 años antes. Los argumentos son casi idénticos y el desconocimiento sobre el &#8220;enemigo&#8221; de muchos de los que lo critican es el mismo.
Con las honrosas excepciones de rigor, algunas [...]]]></description>
			<content:encoded><![CDATA[<p>Es curioso ver cómo la saña anti-Apple de hoy, es la misma saña anti-Flash de hace 8-9 años y fue la misma saña anti-C de 10 años antes. Los argumentos son casi idénticos y el desconocimiento sobre el &#8220;enemigo&#8221; de muchos de los que lo critican es el mismo.</p>
<p>Con las honrosas excepciones de rigor, algunas de las cuales leerán esto, la situación me recuerda, en muchos aspectos, al &#8220;o estás conmigo, o estás con los terroristas&#8221; que tan buenos resultados ha venido dando a la civilización occidental durante los últimos años. </p>
<p>Sinceramente, al igual que entonces, la &#8220;calidad&#8221; y &#8220;profundidad&#8221; de los argumentos de muchos hacen flaco favor a los que los emiten.</p>
]]></content:encoded>
			<wfw:commentRss>http://ctarda.net/2010/05/10/flashback/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>NSTableView y doble clicks</title>
		<link>http://ctarda.net/2010/04/14/nstableview-y-doble-clicks/</link>
		<comments>http://ctarda.net/2010/04/14/nstableview-y-doble-clicks/#comments</comments>
		<pubDate>Wed, 14 Apr 2010 07:53:09 +0000</pubDate>
		<dc:creator>ctarda</dc:creator>
				<category><![CDATA[bambooapps]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://ctarda.net/?p=288</guid>
		<description><![CDATA[Una rápida, pero que me ha traído cuatro días a mal traer. En teoría, capturar los doble clicks sobre un NSTableView es tan fácil como:
&#91; table setDoubleAction: @selector&#40;rowDoubleClicked:&#41; &#93;;
Si se formatea el selector como un Outlet estándar, no debería haber mayor problema, ¿cierto? No señor, aparentemente, en algunas máquinas, sin saber porqué, el selector en [...]]]></description>
			<content:encoded><![CDATA[<p>Una rápida, pero que me ha traído cuatro días a mal traer. En teoría, capturar los doble clicks sobre un NSTableView es tan fácil como:</p>
<div class="codecolorer-container objc default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:450px;"><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #002200;">&#91;</span> table setDoubleAction<span style="color: #002200;">:</span> <span style="color: #a61390;">@selector</span><span style="color: #002200;">&#40;</span>rowDoubleClicked<span style="color: #002200;">:</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#93;</span>;</div></div>
<p>Si se formatea el selector como un Outlet estándar, no debería haber mayor problema, ¿cierto? No señor, aparentemente, en algunas máquinas, sin saber porqué, el selector en cuestión sólo recibe el mensaje la segunda vez que se hace el doble click, y no la primera.</p>
<p>¿La solución?</p>
<div class="codecolorer-container objc default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:450px;"><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #002200;">&#91;</span> table setTarget<span style="color: #002200;">:</span> self <span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#91;</span> table setDoubleAction<span style="color: #002200;">:</span> <span style="color: #a61390;">@selector</span><span style="color: #002200;">&#40;</span>rowDoubleClicked<span style="color: #002200;">:</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#93;</span>;</div></div>
<p>Indicar al NSTableView, explícitamente, cuál es el target.</p>
]]></content:encoded>
			<wfw:commentRss>http://ctarda.net/2010/04/14/nstableview-y-doble-clicks/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cómo forzar la carga de datos de NSController</title>
		<link>http://ctarda.net/2010/04/11/como-forzar-la-carga-de-datos-de-nscontroller/</link>
		<comments>http://ctarda.net/2010/04/11/como-forzar-la-carga-de-datos-de-nscontroller/#comments</comments>
		<pubDate>Sun, 11 Apr 2010 05:05:55 +0000</pubDate>
		<dc:creator>ctarda</dc:creator>
				<category><![CDATA[bambooapps]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://ctarda.net/?p=277</guid>
		<description><![CDATA[Un problema recurrente a la hora de inicializar aplicaciones basadas en Core Data, es que las instancias de las subclases de NSController que se declaran en el nib (NSArrayController o NSTreeController, por ejemplo), no se alimentan de contenido de forma inmediata.
Supongamos un xib que contiene una instancia de NSArrayController, con el binding para el Managed [...]]]></description>
			<content:encoded><![CDATA[<p>Un problema recurrente a la hora de inicializar aplicaciones basadas en Core Data, es que las instancias de las subclases de NSController que se declaran en el nib (NSArrayController o NSTreeController, por ejemplo), no se alimentan de contenido de forma inmediata.</p>
<p>Supongamos un xib que contiene una instancia de NSArrayController, con el binding para el Managed Object Context correctamente asignado.</p>
<p>Imaginemos que al arrancar la aplicación, queremos obtener el número de elementos gestionados por ese array controller. Lo lógico sería hacer algo como esto (en el controlador de la aplicación, por ejemplo, y suponiendo la existencia de un outlet al arraycontroller):</p>
<div class="codecolorer-container objc default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:450px;"><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> awakeFromNib<br />
<span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #a61390;">int</span> count <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span> <span style="color: #002200;">&#91;</span> myController arrangedObjects <span style="color: #002200;">&#93;</span> count <span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#125;</span></div></div>
<p>Bien, pues eso va a devolver un cero como una casa de grande. ¿Por qué? Porque en el momento de completarse la carga del nib, no se ha completado la carga de las entidades gestionadas por el controlador.</p>
<p>Hay varias posibles soluciones. La primera, usar KVO, y observar el contenido del array controller, hasta recibir datos. La segunda, la recomendada en la documentación de Apple, forzar al controlador a cargar datos inmediatamente, haciendo un fetch con una request nula:</p>
<div class="codecolorer-container objc default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:450px;"><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> awakeFromNib<br />
<span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSError_Class/"><span style="color: #400080;">NSError</span></a> <span style="color: #002200;">*</span>error;<br />
&nbsp; &nbsp; <span style="color: #a61390;">BOOL</span> ok <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span> groupsController fetchWithRequest<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span> merge<span style="color: #002200;">:</span><span style="color: #a61390;">NO</span> error<span style="color: #002200;">:&amp;</span>error<span style="color: #002200;">&#93;</span>; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #a61390;">int</span> count;&nbsp; <br />
&nbsp; &nbsp; <span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span> ok <span style="color: #002200;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; count <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span> <span style="color: #002200;">&#91;</span> myController arrangedObjects <span style="color: #002200;">&#93;</span> count <span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#125;</span><br />
<span style="color: #002200;">&#125;</span></div></div>
<p>Para que conste. Porque el tema es útil, sobre todo cuando se pretende cargar un controlador, con datos, en un xib que se carga dinámicamente.</p>
]]></content:encoded>
			<wfw:commentRss>http://ctarda.net/2010/04/11/como-forzar-la-carga-de-datos-de-nscontroller/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Haciendo amigos, otra vez</title>
		<link>http://ctarda.net/2010/04/10/haciendo-amigos-otra-vez/</link>
		<comments>http://ctarda.net/2010/04/10/haciendo-amigos-otra-vez/#comments</comments>
		<pubDate>Sat, 10 Apr 2010 06:01:39 +0000</pubDate>
		<dc:creator>ctarda</dc:creator>
				<category><![CDATA[bambooapps]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://ctarda.net/?p=269</guid>
		<description><![CDATA[Aunque esta vez, no soy yo, sino un Platform Evangelist en Adobe. 
Me tomo la libertad de extraer una cita:
Any real developer would not in good conscience be able to support this
refiriéndose al portazo en las narices que Apple les ha pegado.
Enhorabuena, chaval, has conseguido hacerlo personal. Porque resulta que este developer (aparentemente no tan [...]]]></description>
			<content:encoded><![CDATA[<p>Aunque esta vez, no soy yo, sino un<a href="http://theflashblog.com/?p=1888"> Platform Evangelist en Adobe</a>. </p>
<p>Me tomo la libertad de extraer una cita:</p>
<blockquote><p>Any real developer would not in good conscience be able to support this</p></blockquote>
<p>refiriéndose al portazo en las narices que Apple les ha pegado.</p>
<p>Enhorabuena, chaval, has conseguido hacerlo personal. Porque resulta que este developer (aparentemente no tan &#8220;real&#8221; o con no tan buena intención) no comparte tu indignación. Más personal todavía, por todo lo que en su día este not-real-developer le entregó a la plataforma (algo que llevo ya unos cuantos años lamentando profundamente).</p>
<p>Increíble: Adobe, haciéndose la víctima de todo este asunto, intentando venderse como el paladín de las plataformas abiertas, y super-preocupados por los <strong>usuarios</strong> de iPhone. Lo que hay que ver&#8230;</p>
<p>Por cierto, yo sí que dejo los comentarios abiertos para los spam-bots de Adobe. Obviamente, nadie va a comentar, fundamentalmente porque nadie lee esto, pero eso me da una altura moral que te cagas. La que no me dan ni mi condición de not-real-developer ni mi turbia conciencia.</p>
]]></content:encoded>
			<wfw:commentRss>http://ctarda.net/2010/04/10/haciendo-amigos-otra-vez/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>La paletilla (II)</title>
		<link>http://ctarda.net/2010/01/28/la-paletilla-ii/</link>
		<comments>http://ctarda.net/2010/01/28/la-paletilla-ii/#comments</comments>
		<pubDate>Thu, 28 Jan 2010 05:07:47 +0000</pubDate>
		<dc:creator>ctarda</dc:creator>
				<category><![CDATA[bambooapps]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://ctarda.net/?p=227</guid>
		<description><![CDATA[Vamos ahora a mirar el cacharrín con el sombrero de desarrollador que pretende ganarse la vida vendiendo software, más que como usuario makero.
El desarrollo para iPhone tiene dos grandes problemas. En primer lugar, el propio éxito del aparato, favorito entre adolescentes y postadolescentes, ha, por un lado, tirado de los precios hacia abajo, y por [...]]]></description>
			<content:encoded><![CDATA[<p>Vamos ahora a mirar el cacharrín con el sombrero de desarrollador que pretende ganarse la vida vendiendo software, más que como usuario makero.</p>
<p>El desarrollo para iPhone tiene dos grandes problemas. En primer lugar, el propio éxito del aparato, favorito entre adolescentes y postadolescentes, ha, por un lado, tirado de los precios hacia abajo, y por otro, hecho de la App Store una lotería. Lo que lleva al segundo de los grandes problemas del desarrollo para iPhone: es muy complicado conseguir mantenerse a medio plazo.</p>
<p>Imagino que hoy habrá ya quien esté berreando a los cuatro vientos que el desarrollo para escritorio está muerto, y después del iPad más que muerto. Déjenme decirles que quien diga eso no tiene ni puñetera idea de lo que está hablando.</p>
<p>Hacer marketing, hacer que la gente sepa que tu aplicación de escritorio existe es muy complicado, cierto. Pero hacer lo mismo para una aplicación de iPhone es como jugar a la ruleta rusa. En escritorio, con paciencia, cuidando a los usuarios, lanzando actualizaciones de forma regular, e intentando no cagarla mucho, se puede ir, poco a poco, consiguiendo una cantidad de usuarios que pueden llegar a hacer un proyecto sostenible a largo plazo. La historia de siempre: vende algo construido lo mejor posible, sé honesto, y con el tiempo y paciencia las cosas irán saliendo bien.</p>
<p>En iPhone no es posible hacer eso. El mercado pega bandazos de moda en moda (las linternas, los pedos, los chistes, etc&#8230;), modas todas ellas efímeras y sin mucho fundamento detrás. Los que estaban al principio de la App Store pueden estar saliendo adelante perfectamente, pero para el resto, para el que sube la trigésima aplicación para pintar bigotes encima de la foto de la suegra, lo más probable es que todo termine en batacazo.</p>
<p>La otra opción es tirar por algo más &#8220;serio&#8221;. Llamemos serio a una aplicación datacéntrica, que resuelve algún tipo de problema concreto, no algo que sirva para vacilar a los amigos con lo que mola mi teléfono. Gestión de tareas, editor de audio, cosas en esa línea.</p>
<p>Bien, desarrollar algo más complejo lleva tiempo, y mucho. Y pese a que los frameworks sobre los que se trabaja son muy sólidos, hay que vencer una serie de limitaciones muy importantes, sobre todo la falta de espacio en pantalla. Lo que hace que lleve aún más tiempo desarrollar algo complejo.</p>
<p>Y ahí es donde está el problema. ¿A qué precio puedes vender una aplicación así? Hay algunos, los cuatro grandes nombres, que pueden apuntar a los 8 USD, pero lo cierto es que lanzar una aplicación a ese precio va a hacer que no la compre mucha gente, por lo que no va a estar en los tops, por lo que nadie va a saber que existe, por lo que no la va a comprar mucha gente. Resumiendo, me parece mucho más sencillo, pese a lo complicado que es, conseguir que tu tiempo de desarrollo se vea recompensado económicamente en escritorio que en iPhone.</p>
<p>Pero ahora llega el iPad. A priori, es menos cool que un iPhone, por lo que podría suponerse que sus usuarios van a estar más en el rango de los que quieren hacer tareas de computación ligeras cuando salen por ahí, que en el rango de los que quieren vacilar a sus amigos con el cacharro.</p>
<p>Por lo que, también a priori, el mercado debería ser más parecido al de escritorio que al de iPhone. Puede pensarse que primarán las necesidades de productividad, sobre las de &#8220;mira lo que tengo en mi paratín&#8221;. </p>
<p>Resumiendo. Nadie sabe, yo el primero, en lo que va a derivar todo esto. Pero lo que sí sé es que para mí al menos, ha llegado el momento de replantearme la viabilidad de un par de ideas que había dejado aparcadas. Tal vez, parece que a lo mejor lo mismo puede que, sea el momento de dedicar un mes a desarrollar un producto lo más sólido posible para iPad. O no, pero por lo menos lo voy a considerar, algo que no pensaba hacer en iPhone.</p>
]]></content:encoded>
			<wfw:commentRss>http://ctarda.net/2010/01/28/la-paletilla-ii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cadena de acontecimientos</title>
		<link>http://ctarda.net/2010/01/27/cadena-de-acontecimientos/</link>
		<comments>http://ctarda.net/2010/01/27/cadena-de-acontecimientos/#comments</comments>
		<pubDate>Tue, 26 Jan 2010 22:52:59 +0000</pubDate>
		<dc:creator>ctarda</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://ctarda.net/?p=215</guid>
		<description><![CDATA[Vamos a hacer una porra sobre cómo van a transcurrir los días de hoy y mañana, claro está, en relación con el tablet. 
Para los que hayan estado debajo de una piedra en los últimos años, el tablet es una cosa de lo que todo el mundo, menos Apple, lleva hablando meses, y que todo [...]]]></description>
			<content:encoded><![CDATA[<p>Vamos a hacer una porra sobre cómo van a transcurrir los días de hoy y mañana, claro está, en relación con el tablet. </p>
<p>Para los que hayan estado debajo de una piedra en los últimos años, el tablet es una cosa de lo que todo el mundo, menos Apple, lleva hablando meses, y que todo el mundo, menos Apple, ha dicho que se va a anunciar mañana.</p>
<p>Bien, pues vamos con la secuencia de acontecimientos. Como es una secuencia, el lector puede suponer que se va a producir, secuencialmente, en el orden descrito.</p>
<ol>
<li>Todos los makeros andamos hoy como pollos sin cabeza. Sin comer en todo el día, tomando café por litros, sin llegarnos la camisa al cuerpo.</li>
<li>Cadena de leaks (todos de mentira), con supuestas fotos/vídeos robados del aparatín en la factoría de Cantón.</li>
<li><a href="http://www.macrumors.com/2010/01/26/mcgraw-hill-ceo-confirms-apple-tablet-iphone-os-based-going-to-be-terrific/">Algún que otro leak</a> con visos de realidad.</li>
<li>Excitación máxima minutos antes del comienzo de la Stevenote.</li>
<li>Decepción máxima para unos, minutos después del final de la Stevenote, histeria incontrolable en otros.</li>
<li>El más decepcionado es ése que en su vida ha tocado un Mac, pero que lleva camisetas de Panic, que se siente estafado porque el cacharrín no le va a bajar a hacer la compra, o porque sólo sale en USA, o porque no lo van a sacar a la venta hasta dentro de tres meses*.</li>
<li>Analistas que no saben ni cambiar una bombilla, se lian la manta a la cabeza y lanzan previsiones sobre las astronómicas cifras de ventas.</li>
<li>Los que siempre protestan, protestan porque la batería del cacharro no es reemplazable. O porque no corre Firefox. O por las dos cosas. O por que no se puede usar un stylus. O porque se va a rallar la pantalla. O porque se les ha colado una señora en la cola del súper.</li>
<li>Algún analista, por aquello de marcar diferencias, se lanza a la piscina y predice el fracaso del aparatín. ¿No veis que no tiene batería reemplazable?</li>
<li>Se cae twitter.</li>
<li>Al mismo tiempo, los makeros nos hemos quedado sin adjetivos épicos, y empezamos a sentir el golpe del bajón de adrenalina.</li>
</ol>
<p>He dicho.</p>
<p>*Nota: Reality bite.</p>
]]></content:encoded>
			<wfw:commentRss>http://ctarda.net/2010/01/27/cadena-de-acontecimientos/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Dos punto cero. De Kagi a Fastspring.</title>
		<link>http://ctarda.net/2010/01/23/dos-punto-cero-de-kagi-a-fastspring/</link>
		<comments>http://ctarda.net/2010/01/23/dos-punto-cero-de-kagi-a-fastspring/#comments</comments>
		<pubDate>Sat, 23 Jan 2010 12:29:20 +0000</pubDate>
		<dc:creator>ctarda</dc:creator>
				<category><![CDATA[bambooapps]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://ctarda.net/?p=210</guid>
		<description><![CDATA[Hace ya casi una semana que di a luz al niño. 
El proceso de actualización en sí está siendo bastante tranquilo, al menos bastante más tranquilo de lo que me temía. Y es que, como todo programador / técnico de sistemas / persona de bien, creo firmemente que si algo no está roto, no hay [...]]]></description>
			<content:encoded><![CDATA[<p>Hace ya casi una semana que <a href="http://bambooapps.com/2010/01/18/and-here-it-is-keep-your-word-2-0-has-been-released/">di a luz al niño</a>. </p>
<p>El proceso de actualización en sí está siendo bastante tranquilo, al menos bastante más tranquilo de lo que me temía. Y es que, como todo programador / técnico de sistemas / persona de bien, creo firmemente que si algo no está roto, no hay necesidad de arreglarlo. O mejor aún, si algo funciona, lo mejor es ni acercarse a ello, no se vaya a enfadar.</p>
<p>Todo esto viene a que <a href="http://bambooapps.com/kyw">Keep Your Word 2</a> (fabuloso organizador de vocabulario y flashcards para Mac e iPhone, hagamos un poco de SEO), es una actualización de pago. Lo que tiene su importancia si tenemos en consideración los </p>
<p><strong>Antecedentes</strong></p>
<p>Hace ya año y medio, cuando lancé la primera versión pública de la aplicación, lo hice apoyándome en Kagi para procesar las ventas. La razón principal de usar Kagi, y no otros procesadores de cobros, fue que era lo más fácil de montar. Preparar una tienda con un producto es bastante rápido, y ellos mismos proporcionan la generación del número de serie, y el código necesario para comprobar los números de serie en la propia aplicación.</p>
<p>Para un primerizo en estas lides del shareware, era la solución más sencilla, que menos tiempo me quitaba de aquello en lo que realmente necesitaba invertir más tiempo: la aplicación en sí. Resumiendo, con Kagi podía tener cupones de descuento, generación de número de serie y comprobación en cliente en unas tres horas. </p>
<p>Sin embargo, desde el primer momento me quedó claro que el sistema tenía varios puntos débiles, el principal de todos ellos, la integración con el resto de mi web. La tienda podía llegar a integrarse visualmente con el resto de mi web, pero no sin dedicarle mucho tiempo y esfuerzo.</p>
<p>Al irse acercando el momento de empezar a pensar en lanzar el upgrade a la versión 2.0, se hizo evidente otro problema con Kagi: ¿cómo gestionar las actualizaciones? Lo normal es ofrecer la actualización a los que compraron una licencia para la versión 1.x a un precio reducido (en mi caso, con <a href="http://store.bambooapps.com/">un 40% de descuento</a>). </p>
<p>Hay que tener en cuenta que la tienda que ofrece Kagi no permite añadir ninguna lógica personalizada. El flujo está prefijado, y no es configurable: primero página de productos, después entrada de datos del comprador, terminando con página con confirmación del pedido y entrega del número de serie. No hay forma de hacer algo <a href="http://store.bambooapps.com/registrations/discountupgradekyw">como esto</a>, hacer al usuario introducir su número de serie actual (de la 1.x), comprobar su validez, y abrir una venta al precio con descuento. Tampoco era posible ofrecer la actualización gratis a los que hubieran comprado la 1.x en los últimos 90 días.</p>
<p>El soporte de Kagi me ofreció una solución un poco pintoresca: crear un descuento del 40%, y asignarle tantos cupones de descuento como usuarios hubiera de la 1.x, haciendo que cada uno de esos cupones fuera uno de los números de serie válidos. Así, al ofrecer el update, comunicar a los usuarios que tenían que introducir su número de serie actual como cupón de descuento para comprar el nuevo serial.</p>
<p>Obviamente, la solución, aunque técnicamente posible, rechina malamente: y es que nadie lee lo que sale en pantalla, y punto pelota. Así que me temía a) tener que explicar 300 veces que para comprar el serial nuevo hay que meter el viejo como cupón de descuento y b) tener que devolver el dinero a muchos que iban a hacer la compra del serial nuevo sin meter el viejo, y por tanto sin descuento. </p>
<p>Total, que se mire como se mire, la solución era más bien mala.</p>
<p>Si a eso le añadimos que Kagi no proporciona una forma de recuperar el número de serie a los usuarios que lo hayan olvidado/perdido, cada vez se iba haciendo más claro que la solución a todos los problemas tenía que pasar por&#8230;</p>
<p><strong>Tienda a medida</strong></p>
<p>Si necesito poder comprobar que un número de serie es válido y existe en mi base de datos antes de proceder a la venta, si quiero hacer cosas como promociones puntuales cuando saque el siguiente producto de pago, si quiero dar un formulario donde la gente se pueda recuperar el número de serie por sí misma, si quiero control total sobre lo que sale y cómo sale en mi tienda, tengo que hacerme yo la tienda. Punto.</p>
<p>Obviamente, la primera opción que consideré fue instalar Potion Store, pero ni tengo cuenta Website Payments Pro, ni es que sea muy leído y escribido en Rails, ni puede decirse que me guste lidiar con Paypal.</p>
<p>Como en el momento en el que estaba buscando la solución para la tienda me acababa de quedar colgado con un proyecto terminado pero no entregado que había desarrollado en CakePHP, y la verdad es que el framework me había hecho bastante gracia, aproveché la inercia, y me decidí a hacer una gestor muy sencillo para la <a href="http://store.bambooapps.com">nueva tienda de bambooapps</a>.</p>
<p>El problema, no obstante, era el procesador de pagos. Podía hacer que fuera Paypal, pero al no poder tener cuenta Payments Pro, la única opción es lanzar al comprador fuera de mi web, hacia Paypal, y esperar que la compra se cierre correctamente, para que al volver a mi servidor, pueda generar el número de serie. Además, Paypal oscurece cada vez más la posibilidad de pagar sin tener cuenta de usuario en su servicio, lo que me hacía temer que podía perder alguna que otra venta. Y no estamos para regalar el dinero.</p>
<p>Y aquí es cuando llegamos a&#8230;</p>
<p><strong>FastSpring</strong></p>
<p>FastSpring tiene buenas reviews, y fama de ofrecer un servicio al usuario de primera. Y sobre todo, el haber visto tiendas de otros desarrolladores perfectamente integradas con el resto de sus sitios web.</p>
<p>La primera impresión al abrir una cuenta fue muy buena. Nada más pedir el alta, recibí un email pidiéndome unos cuantos datos básicos sobre mi producto (nombre, precio, icono&#8230;) y en unas dos horas ya tenía una tienda funcional, con la que ya podría haber empezado a vender KYWs como rosquillas.</p>
<p>La personalización de sus páginas es muy sencilla (básicamente una plantilla que envuelve a la de ellos), y aunque el proceso de venta en sí también es bastante rígido (presentación de producto-> confirmación de pedido -> entrega serial), el sistema permite varios grados de flexibilidad más que Kagi. Para empezar, pueden embeberse cupones de descuento y otra información en la url, lo que me permite lanzar desde mi tienda en CakePHP todo tipo de ofertas, cross-selling, upselling, etc.</p>
<p>Otra cosa que me ha gustado de FastSpring, y de la que no me di cuenta hasta no empezar a trastear con su sistema, es lo fácil que es integrar la tienda con un generador de números de serie en mi servidor. Al contrario que Kagi, que aunque también permite generar el serial en tu servidor, requiere de un proceso administrativo de casi una semana para dar de alta la opción, basta con introducir la url de tu generador en la administración de FastSpring, asignar user y password para securizar la comunicación, y decidir qué quieres enviar a tu servidor, y qué quieres que éste conteste al suyo.</p>
<p>De esa forma, yo controlo qué quiero cobrar y cómo, paso el control a FastSpring, que en un interfaz completamente integrado con el mío, gestiona el cargo a la tarjeta, pide a mi servidor el serial, y se lo entrega al usuario. Obviamente, yo también aprovecho ese momento para automatizar una serie de cosas en mi lado, como el registro del nombre, email y serial del usuario en mi base de datos, alta en mi lista de correo, o la emisión de un email con la licencia.</p>
<p>El sistema sigue sin ser perfecto, sigue habiendo un punto del proceso donde pierdo el control del mismo, y hay un punto en el que todo depende de que dos servidores se entiendan sin problemas, así que sigue habiendo fricciones. No obstante, los riesgos son mucho menores que las ganancias con el nuevo sistema.</p>
<p>Y alguno se preguntará&#8230; ¿por qué cuentas todo esto? La verdad es que no lo sé. Imagino que por enfatizar un aspecto del desarrollo de software que siempre me ha parecido el más importante: el refinamiento sucesivo, el intentar montar algo que funcione adecuadamente con el mínimo de recursos aceptables, hacerlo público, sacarlo por la puerta, y a partir de ese momento, ir mejorándolo, ir engordándolo, de forma constante, añadiendo mejoras cuando sea necesario añadirlas, y refactorizando procesos cuando sea necesario hacerlo.</p>
<p>O dicho de otra forma, es muy probable que si hubiera tenido que montar mi propia tienda, con mi propio generador de números de serie, integrado con una tercera parte para procesar los pagos, no hubiera sacado la 1.0 nunca.</p>
]]></content:encoded>
			<wfw:commentRss>http://ctarda.net/2010/01/23/dos-punto-cero-de-kagi-a-fastspring/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Enviar emails en cakePHP</title>
		<link>http://ctarda.net/2009/12/07/enviar-emails-en-cakephp/</link>
		<comments>http://ctarda.net/2009/12/07/enviar-emails-en-cakephp/#comments</comments>
		<pubDate>Mon, 07 Dec 2009 09:36:04 +0000</pubDate>
		<dc:creator>ctarda</dc:creator>
				<category><![CDATA[bambooapps]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://ctarda.net/?p=165</guid>
		<description><![CDATA[Llevo ya un tiempo rematando (eso que los programadores llamamos rematar, que realmente quiere decir que aún queda un mes de curro) la nueva tienda online de bambooapps, que va a correr sobe cakePHP.
Los motivos de la elección de ese framework en concreto son múltiples, y al contrario de lo que suele ocurrir en estos [...]]]></description>
			<content:encoded><![CDATA[<p>Llevo ya un tiempo rematando (eso que los programadores llamamos rematar, que realmente quiere decir que aún queda un mes de curro) la nueva tienda online de <a href="http://bambooapps.com">bambooapps</a>, que va a correr sobe <a href="http://cakephp.org/">cakePHP</a>.</p>
<p>Los motivos de la elección de ese framework en concreto son múltiples, y al contrario de lo que suele ocurrir en estos casos, y una vez terminado el proyecto, debo reconocer que la elección ha sido un acierto, y que cada día me gusta más el framework.</p>
<p>Una de las soluciones que me han parecido más elegantes es la que han adoptado para el envío de correos electrónicos. Configuración cero, y separación de la presentación del email en dos capas: por un lado, el layout general y por otro la vista del mensaje.</p>
<p>Enviar un mensaje es muy sencillo. Por ejemplo:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:450px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">function</span> _sendNewUserMail<span style="color: #009900;">&#40;</span><span style="color: #000088;">$id</span><span style="color: #009900;">&#41;</span> <br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Registration</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">id</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$id</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">set</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'registration'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Registration</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">read</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Email</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">to</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Registration</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">email</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Email</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">bcc</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'support@bambooapps.com'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> &nbsp;<br />
&nbsp; &nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Email</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">subject</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'License recovery'</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Email</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">replyTo</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'support@bambooapps.com'</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Email</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">from</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'bambooapps &lt;support@bambooapps.com&gt;'</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Email</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">template</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'simple_message'</span><span style="color: #339933;">;</span><span style="color: #666666; font-style: italic;">// ctp filename</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Email</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sendAs</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'both'</span><span style="color: #339933;">;</span><span style="color: #666666; font-style: italic;">//text and html</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Email</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">send</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
<span style="color: #009900;">&#125;</span></div></div>
<p>Este método es un método privado de un controlador encargado de gestionar los usuarios registrados, y que envía el típico email de recuperación de número de serie.</p>
<p>La presentación del email a enviar está separada en dos partes. Por un lado el layout general, se encuentra en app/layouts/email/html/default.ctp, en el caso del mensaje en formato html, y en app/layouts/email/text/default.ctp para el mensaje de sólo texto. El layout podría ser algo como:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:450px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&lt;html&gt;<br />
&lt;body&gt;<br />
&lt;div id=&quot;mensaje&quot;&gt;<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$content_for_layout</span> <span style="color: #000000; font-weight: bold;">?&gt;</span> &nbsp; <br />
&lt;/div&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</div></div>
<p>El contenido real del mensaje, las dos vistas, html y texto, están en app/views/email/html/simple_message.ctp y app/views/email/text/simple_message.ctp</p>
<p>Por ejemplo, la vista para el mensaje html podría ser algo como:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:450px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&lt;p&gt;Dear <span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$registration</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'Registration'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'name'</span><span style="color: #009900;">&#93;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>,&lt;br /&gt;<br />
&nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;According to our records, this is your license:&lt;br/&gt; <br />
Name: <span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$registration</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'Registration'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'name'</span><span style="color: #009900;">&#93;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>&lt;br/&gt;<br />
E-mail: <span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$registration</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'Registration'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'email'</span><span style="color: #009900;">&#93;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>&lt;br/&gt;<br />
Serial Number: <span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$registration</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'Registration'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'serial'</span><span style="color: #009900;">&#93;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>&lt;/p&gt;</div></div>
<p>Y ya está. Separación perfecta de lógica, datos y presentación. Solución elegante.</p>
]]></content:encoded>
			<wfw:commentRss>http://ctarda.net/2009/12/07/enviar-emails-en-cakephp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Demografía de los usuarios no oficiales de Keep Your Word</title>
		<link>http://ctarda.net/2009/10/21/demografia-de-los-usuarios-no-oficiales-de-keep-your-word/</link>
		<comments>http://ctarda.net/2009/10/21/demografia-de-los-usuarios-no-oficiales-de-keep-your-word/#comments</comments>
		<pubDate>Wed, 21 Oct 2009 03:26:28 +0000</pubDate>
		<dc:creator>ctarda</dc:creator>
				<category><![CDATA[bambooapps]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://ctarda.net/?p=103</guid>
		<description><![CDATA[Hace un tiempo repasaba la distribución por países de los usuarios registrados de Keep Your Word.
Hoy vamos a fijarnos en otro tipo de usuarios, los que no han licenciado la aplicación. Pero, primero, vamos con una explicación de cómo se han realizado las estimaciones que han llevado a los resultados finales.
Keep Your Word puede sincronizar [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://ctarda.net/2009/09/23/la-demografia-de-los-usuarios-de-keep-your-word/">Hace un tiempo</a> repasaba la distribución por países de los usuarios registrados de <a href="http://www.bambooapps.com/kyw">Keep Your Word</a>.</p>
<p>Hoy vamos a fijarnos en otro tipo de usuarios, los que no han licenciado la aplicación. Pero, primero, vamos con una explicación de cómo se han realizado las estimaciones que han llevado a los resultados finales.</p>
<p>Keep Your Word puede sincronizar datos con un cliente para iPhone e iPod Touch, que se distribuye de forma gratuita, y que no sirve para nada sin la aplicación de escritorio. Dicho de otra forma, no tiene mucho sentido descargarse el cliente iPhone si no se tiene la aplicación de escritorio, por un lado, y por otro, si se consigue la aplicación para Mac por canales de distribución alternativos, cualquiera puede hacerse con la parte para iPhone desde la AppStore sin problemas.</p>
<p>En la descripción de la aplicación en la AppStore se deja claro que no sirve de nada sin su acompañamiento de escritorio. No obstante, como todos sabemos perfectamente, en internet no se lee nada. Sé, por tanto, que habrá quien se la instale simplemente porque es gratis, sin mirar si le puede servir para algo o no.</p>
<p>También hay que tener en cuenta que, al tener la aplicación para Mac un período de prueba de 30 días, habrá quien se instale el cliente iPhone aunque posteriormente no compre la licencia.</p>
<p>No obstante, eso no es un problema para realizar unas cuantas estimaciones de la forma siguiente:</p>
<ol>
<li>Calculamos el total de descargas, por países, del cliente iPhone.</li>
<li>Multiplicamos por 10 el total de licencias por países de la aplicación para Mac (para tener más cifras significativas).</li>
<li>Dividimos el número de descargas del cliente iPhone por el número de licencias vendidas para cada país.</li>
<li>Normalizamos los resultados, haciendo que el valor obtenido para Alemania (donde el resultado es menor), equivalga a un valor de 10 en la Escala de Piratines (que va de 1 a 100).</li>
</ol>
<p>El resultado final es el siguiente:</p>
<p><img src="http://ctarda.net/wp-content/uploads/2009/10/Captura-de-pantalla-2009-10-21-a-las-10.59.51.png" alt="Captura de pantalla 2009-10-21 a las 10.59.51.png" border="0" width="424" height="353" /></p>
<p>He eliminado del gráfico todos los valores intermedios, por aquello de hacer sangre y fijarnos sólo en los países com mayor Piratina.</p>
<p>Un breve análisis de los resultados nos arroja las siguientes conclusiones:</p>
<ul>
<li>La mayoría de los países están o en el rango del 80-100, o en el de 10-50, con muy pocos en el 50-80. Podría concluirse que hay sitios en los que la Piratina es alta, otros en los que la Piratina es muy baja, y muy pocos en los que no la Piratina ni es ni alta ni baja.</li>
<li>Nótese la posición de España. Sin más comentarios.</li>
<li>El valor real de la Piratina para China debería ser de infinito, no 100 (los que sepan lo que pasa cuando de divide un número por cero, y que hayan seguido la explicación lo entenderán). Pero como había que meterla en el gráfico&#8230; </li>
</ul>
<p>Por favor, que nadie se tome esto más en serio de lo que es: un mero ejercicio numérico. Creo firmemente que la posible categorización de los usuarios de aparatos de computación en relación con la Piratina no es vertical (por países) sino trasversal, en dos grupos: los que compran software, y los que no lo compran. El que compra software revisa sus opciones, considera alternativas open source, sopesa precios y funcionalidades, o simplemente compra lo que le parece cool, y el que no compra, se niega a comprar, en ocasiones justificando su negativa en argumentos épicos, y acude siempre a las mismas fuentes cuando una aplicación llama su atención.</p>
<p>Eso es un hecho inevitable, que hay que tomarse como la muerte, los impuestos o Gran Hermano: como algo que sabemos que está ahí, que antes o después va a llegar, pero contra lo que no merece la pena hacer nada, porque no hay nada que se pueda hacer.</p>
<p><a href="http://www.design-nation.net/es/archivos/003827.php">Mi opinión respecto</a> a este tema no ha cambiado. Prefiero dedicar mi tiempo (o dicho de otra forma, invertir mi dinero) en amasar la aplicación que en intentar que nadie se la lleve del horno. </p>
<p>Pero eso no quita para que, de vez en cuando, también sea divertido jugar con los números.</p>
]]></content:encoded>
			<wfw:commentRss>http://ctarda.net/2009/10/21/demografia-de-los-usuarios-no-oficiales-de-keep-your-word/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
