<?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>soft·in·spain &#187; Desarrollo</title>
	<atom:link href="http://softinspain.com/category/desarrollo/feed/" rel="self" type="application/rss+xml" />
	<link>http://softinspain.com</link>
	<description>negocios y software desde españa</description>
	<lastBuildDate>Sat, 14 Apr 2012 11:29:21 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Como probar diferentes versiones de un mismo código</title>
		<link>http://softinspain.com/desarrollo/como-probar-diferentes-versiones-de-un-mismo-codig/</link>
		<comments>http://softinspain.com/desarrollo/como-probar-diferentes-versiones-de-un-mismo-codig/#comments</comments>
		<pubDate>Sat, 27 Mar 2010 12:17:27 +0000</pubDate>
		<dc:creator>Jose Alberto</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[usuarios]]></category>
		<category><![CDATA[versiones]]></category>

		<guid isPermaLink="false">http://softinspain.com/?p=958</guid>
		<description><![CDATA[Tengo una necesidad y no se como resolverla, llevo tiempo dándole vueltas, buscando información y no encuentro la forma correcta de hacerlo. Por eso pido que si alguien me pudiera orientar un poco, se lo agradecería. Necesito poder tener varias versiones de un mismo código PHP corriendo, es decir, tengo la aplicación A en su [...]


No hay posts relacionados.]]></description>
			<content:encoded><![CDATA[	<p>Tengo una necesidad y no se como resolverla, llevo tiempo dándole vueltas, buscando información y no encuentro la forma correcta de hacerlo. Por eso pido que si alguien me pudiera orientar un poco, se lo agradecería.</p>
	<p>Necesito poder tener varias versiones de un mismo código PHP corriendo, es decir, tengo la aplicación A en su versión 2 corriendo, pero quiero que algunos usuarios me prueben la versión 3 y otros la versión 4. Claro que eso debe hacerse de forma transparente para el usuario, debe loguearse con la misma dirección, con sus mismos datos, etc.</p>
	<p>Una dificultad añadida es la base de datos, pero si resuelvo lo del código esto no me supone mayor problema. Se puede afrontar de varias formas, desde tener las tablas con diferentes nombres según la versión, o diferentes bases de datos para cada versión: bd_v1, bd_v2, etc&#8230;. y según se van migrando los usuarios se va pasando de una versión a otra. Claro que según va aumentando el número de usuarios esto se complica, por el tiempo necesario para la migración, pero hay técnicas para ello.</p>
	<p>Evidentemente existirá una tabla/lista donde indique cada usuario a que versión de código ha de acceder.</p>
	<p>El objetivo, por si alguien necesita una aclaración, es poder hacer pruebas de código sin que afecte al 100% de usuarios. Primero con un grupo reducido de betatesters, luego con uno más amplio y así hasta que se decide pasarlo a todos.</p>
	<p>¿Alguien me puede pasar alguna referencia, algún artículo donde se explique cómo resolverlo?, porque se ve que no soy capaz de encontrarlo por mi mismo. Muchas gracias.</p>

 

<p>No hay posts relacionados.</p>]]></content:encoded>
			<wfw:commentRss>http://softinspain.com/desarrollo/como-probar-diferentes-versiones-de-un-mismo-codig/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Desarrollo multiplataforma</title>
		<link>http://softinspain.com/desarrollo/desarrollo-multiplataforma/</link>
		<comments>http://softinspain.com/desarrollo/desarrollo-multiplataforma/#comments</comments>
		<pubDate>Thu, 17 Sep 2009 17:37:33 +0000</pubDate>
		<dc:creator>Jose Alberto</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[Delphi]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[multiplataforma]]></category>
		<category><![CDATA[realbasic]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://softinspain.com/?p=861</guid>
		<description><![CDATA[Los clientes que tenemos en Arcadina, fotógrafos profesionales en su mayoría, trabajan con dos plataformas Windows y Mac, aunque últimamente, sobre todo desde que Apple se pasó a los procesadores Intel y durante el último año más todavía (no sabemos porqué), Mac parece que esté ganando la &#8220;batalla&#8221;. Nuestro software PhotoGestión está desarrollado con Delphi [...]


Posts relacionados:<ol><li><a href='http://softinspain.com/desarrollo/desarrollo-web-trabajo-en-equipo/' rel='bookmark' title='Desarrollo web: trabajo en equipo'>Desarrollo web: trabajo en equipo</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[	<p>Los clientes que tenemos en Arcadina, fotógrafos profesionales en su mayoría, trabajan con dos plataformas Windows y Mac, aunque últimamente, sobre todo desde que Apple se pasó a los procesadores Intel y durante el último año más todavía (no sabemos porqué), Mac parece que esté ganando la &#8220;<em>batalla</em>&#8221;.</p>
	<p>Nuestro software PhotoGestión está desarrollado con Delphi y funciona sobre Windows, yprácticamente a diario se produce una conversación así (más o menos):<br />
<p style="padding-left: 30px;">- ¿Funciona en Mac? &#8211; No, todavía no funciona en Mac &#8211; ¿Para cuando estará en Mac? &#8211; Pues no sabemos decirle, no tenemos definida una fecha.</p>
	<p>Llevo bastante tiempo, a ratos no a <em>full-time</em>, buscando una solución que permita a una empresa pequeña desarrollar para Windows y para Mac, he probado varios entornos, pero ninguno me ha terminado de gustar (debe ser que los comparo con mi estimado <a href="http://softinspain.com/category/delphi/">Delphi</a>). He estado evaluando Mono+C#, RealBasic, FreePascal+Lazarus, Java, Mono+Delphi Prism y Velneo V7</p>
	<p><a href="http://www.mono-project.com/Main_Page">Mono+C#</a> Es un lenguaje avanzado, con una gran comunidad, con miles de componentes y librerías, es un lenguaje estándar ISO. Mono está apoyado por grandes empresas, es OpenSource y está demostrando</p>
	<p><a href="http://www.realsoftware.com/realbasic/?lang=es">RealBasic</a> casi lo consigue, pero no me decidí por la falta de comunidad, porque no será sencillo encontrar a desarrolladores con experiencia, y porque no encontré algunos componentes que necesitamos si o si.</p>
	<p><a href="http://www.lazarus.freepascal.org/">FreePascal+Lazarus</a>, no llega al nivel, tuve muchos problemas al intentar hacer algo, posiblemente por falta de experiencia, no lo niego. Era el primer candidato, para aprovechar parte del código que tenemos. Espero que alguna empresa (¿Embarcadero?) lo respalde y puedan dedicarle más recursos.</p>
	<p><a href="http://java.sun.com/javase/technologies/">Java</a>, el entorno multiplataforma por excelencia. Muchos puntos a favor: millones de programadores con experiencia, gran comunidad, miles de librerías y componentes, rendimiento más que suficiente para el tipo de aplicación que realizamos, abrumado por la cantidad de documentación y código que hay. Para mí el que más posibilidades tiene.</p>
	<p><a href="http://www.embarcadero.com/products/delphi-prism">Delphi Prism</a> he estado leyendo sobre él. Es el Pascal para .NET y Mono. Pero me parece que todavía está verde, hablo con la probabilidad de equivocarme porque no lo he probado.</p>
	<p><a href="http://velneo.es/info/">Velneo V7</a>, con éste entorno me pasa lo mismo que con Delphi Prism, sólo he leído acerca de él. No encontré demasiadas referencias, ni componentes y supongo que no será sencillo encontrar personal con experiencia.</p>
	<p>Lo que he sacado en claro durante este tiempo es que:<br />
<ol><br />
<li>Es un tema complejo, que igual se escapa a nuestras posibilidades, dados nuestros recursos.</li><br />
<li>El tema de la apariencia/interfaz: o no se parece a ningún entorno, o si queremos que tenga el <em>look&#038;feel</em> de cada uno se ha de separar por capas y la de presentación hacerla <em>ex-profeso</em> para cada GUI con los widgets que correspondan, con las normas de cada entorno, etc. cosa que complica más el asunto.</li><br />
<li>Las pruebas y verificaciones se multiplican por mucho.</li><br />
<li>Temas de instaladores, bases de datos, sistemas de informes, mecanismos de impresión (necesitamos imprimir en una impresora de tickets), etc. Es algo que se multiplica por dos.</li><br />
<li>Que posiblemente el futuro vaya por <a href="http://es.wikipedia.org/wiki/Software_como_servicio">SaaS</a> (alquiler de aplicaciones que se encuentran alojadas en servidores ajenos a la empresa que los utiliza), y que por lo tanto este <em>perdiendo</em> el tiempo con ésto. Claro que desarrollar una aplicación vía web tampoco está exenta de retos.</li><br />
</ol><br />
En fin, un mundo apasionante éste del desarrollo de aplicaciones informáticas <img src='http://softinspain.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>

 

<p>Posts relacionados:<ol><li><a href='http://softinspain.com/desarrollo/desarrollo-web-trabajo-en-equipo/' rel='bookmark' title='Desarrollo web: trabajo en equipo'>Desarrollo web: trabajo en equipo</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://softinspain.com/desarrollo/desarrollo-multiplataforma/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>mod_rewrite de Apache: una profunda explicación</title>
		<link>http://softinspain.com/desarrollo/mod_rewrite-de-apache-una-profunda-explicacion/</link>
		<comments>http://softinspain.com/desarrollo/mod_rewrite-de-apache-una-profunda-explicacion/#comments</comments>
		<pubDate>Tue, 15 Sep 2009 15:05:50 +0000</pubDate>
		<dc:creator>Jose Alberto</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[mod_rewrite]]></category>

		<guid isPermaLink="false">http://softinspain.com/?p=857</guid>
		<description><![CDATA[Los que hemos tenido que trastear alguna vez con el mod_rewrite del servidor web Apache sabemos que puede llegar a ser un quebradero de cabeza si se intenta hacer algo complejo. No me considero un experto del tema, apenas he realizado unos pocos, por eso quiero compartir un artículo que he encontrado que creo puede [...]


No hay posts relacionados.]]></description>
			<content:encoded><![CDATA[	<p>Los que hemos tenido que trastear alguna vez con el mod_rewrite del servidor web Apache sabemos que puede llegar a ser un quebradero de cabeza si se intenta hacer algo complejo. No me considero un experto del tema, apenas he realizado unos pocos, por eso quiero compartir un artículo que he encontrado que creo puede ser de mucha utilidad: <a href="http://bit.ly/1f7Oas">http://bit.ly/1f7Oas</a> ¡Que lo disfrutéis!</p>

 

<p>No hay posts relacionados.</p>]]></content:encoded>
			<wfw:commentRss>http://softinspain.com/desarrollo/mod_rewrite-de-apache-una-profunda-explicacion/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tratamiento del AJAX en un solo fichero</title>
		<link>http://softinspain.com/desarrollo/tratamiento-del-ajax-en-un-solo-fichero/</link>
		<comments>http://softinspain.com/desarrollo/tratamiento-del-ajax-en-un-solo-fichero/#comments</comments>
		<pubDate>Tue, 18 Aug 2009 09:05:26 +0000</pubDate>
		<dc:creator>Jose Alberto</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[arcadina]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://softinspain.com/?p=608</guid>
		<description><![CDATA[Últimamente estoy desarrollando sobre todo con PHP+JavaScript (jQuery). En un proyecto interno de Arcadina, que hace un uso intensivo del AJAX, decidí probar un planteamiento diferente del utilizado hasta ahora. Normalmente las llamadas a la parte AJAX del servidor se hacen a diferentes scripts PHP en función de lo que deseamos obtener (query) o guardar [...]


No hay posts relacionados.]]></description>
			<content:encoded><![CDATA[	<p>Últimamente estoy desarrollando sobre todo con PHP+JavaScript (jQuery). En un proyecto interno de <a href="http://www.arcadina.com">Arcadina</a>, que hace un uso intensivo del <a href="http://es.wikipedia.org/wiki/AJAX">AJAX</a>, decidí probar un planteamiento diferente del utilizado hasta ahora.</p>
	<p>Normalmente las llamadas a la parte AJAX del servidor se hacen a diferentes scripts PHP en función de lo que deseamos obtener (<em>query</em>) o guardar (<em>submit</em>). Por ejemplo, si estamos tratando una lista de clientes podemos llamar a <code>get_cliente.php</code> para solicitar los datos de un cliente pasando su identificador, podemos llamar a <code>delete_cliente.php</code> para eliminarlo o a <code>save_cliente.php</code> para guardar cambios en la ficha, etc. (tengo la manía de utilizar <em>spanglish</em> en el nombre de funciones, procedimientos, etc.). Ejemplo de llamada según esté método:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left2">Descargar <a href="http://softinspain.com/wp-content/plugins/wp-codebox/wp-codebox.php?p=608&amp;download=form1.php">form1.php</a></span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p6085"><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code" id="p608code5"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>form name<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;ejemplo1&quot;</span> action<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;/api/save_cliente.php&quot;</span> method<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;post&quot;</span><span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>input type<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;hidden&quot;</span> name<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;id&quot;</span> value<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;&lt;?= <span style="color: #006699; font-weight: bold;">$cliente-&gt;id</span> ?&gt;&quot;</span><span style="color: #339933;">&gt;</span>
Nombre<span style="color: #339933;">:</span> <span style="color: #339933;">&lt;</span>input type<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;text&quot;</span> name<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;nombre&quot;</span> value<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;&lt;?= <span style="color: #006699; font-weight: bold;">$cliente-&gt;nombre</span> ?&gt;&quot;</span><span style="color: #339933;">&gt;&lt;</span>br<span style="color: #339933;">/&gt;</span>
EMail<span style="color: #339933;">:</span> <span style="color: #339933;">&lt;</span>input type<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;text&quot;</span> name<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;email&quot;</span> value<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;&lt;?= <span style="color: #006699; font-weight: bold;">$cliente-&gt;email</span> ?&gt;&quot;</span><span style="color: #339933;">&gt;&lt;</span>br<span style="color: #339933;">/&gt;</span>
<span style="color: #339933;">&lt;/</span>form<span style="color: #339933;">&gt;</span></pre></td></tr></table></div>

	<p>Según el proyecto va avanzando nos podemos encontrar con decenas de scripts: <code>get_&lt;em&gt;loquesea&lt;/em&gt;</code>, <code>delete_&lt;em&gt;loquesea&lt;/em&gt;</code>.... En cada uno de ellos añadir el código de validación, los includes, etc. Se me ocurrió centralizarlo en dos ficheros <code>ajaxsubmit.php</code> y <code>ajaxquery.php</code>, y utilizar un parametro para indicar la acción a realizar. Ejemplo de un formulario utilizando este sistema:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left2">Descargar <a href="http://softinspain.com/wp-content/plugins/wp-codebox/wp-codebox.php?p=608&amp;download=form2.php">form2.php</a></span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p6086"><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code" id="p608code6"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>form name<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;ejemplo2&quot;</span> action<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;/api/ajaxsubmit.php&quot;</span> method<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;post&quot;</span><span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>input type<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;hidden&quot;</span> name<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;ajaxsubmit&quot;</span> value<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;save_cliente&quot;</span><span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>input type<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;hidden&quot;</span> name<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;id&quot;</span> value<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;&lt;?= <span style="color: #006699; font-weight: bold;">$cliente-&gt;id</span> ?&gt;&quot;</span><span style="color: #339933;">&gt;</span>
Nombre<span style="color: #339933;">:</span> <span style="color: #339933;">&lt;</span>input type<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;text&quot;</span> name<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;nombre&quot;</span> value<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;&lt;?= <span style="color: #006699; font-weight: bold;">$cliente-&gt;nombre</span> ?&gt;&quot;</span><span style="color: #339933;">&gt;&lt;</span>br<span style="color: #339933;">/&gt;</span>
EMail<span style="color: #339933;">:</span> <span style="color: #339933;">&lt;</span>input type<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;text&quot;</span> name<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;email&quot;</span> value<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;&lt;?= <span style="color: #006699; font-weight: bold;">$cliente-&gt;email</span> ?&gt;&quot;</span><span style="color: #339933;">&gt;&lt;</span>br<span style="color: #339933;">/&gt;</span>
<span style="color: #339933;">&lt;/</span>form<span style="color: #339933;">&gt;</span></pre></td></tr></table></div>

	<p>Como se ve tampoco es que varíe mucho en la parte que se envía al navegador, se añade un nuevo campo oculto &#8220;ajaxsubmit&#8221; que indica la acción que queremos realizar. Veamos el <code>ajaxsubmit.php</code>:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left2">Descargar <a href="http://softinspain.com/wp-content/plugins/wp-codebox/wp-codebox.php?p=608&amp;download=ajaxsubmit.php">ajaxsubmit.php</a></span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p6087"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
</pre></td><td class="code" id="p608code7"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Incluimos código mínimo de autenticación y librerías</span>
<span style="color: #b1b100;">include</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'includes.inc.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Si no está logeado el usuario, devolvemos error</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$usuario_login</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$usuario_login</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">''</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000088;">$respuesta</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'resultado'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'nok'</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$respuesta</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'mensaje'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Error: primero debe identificarse'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000088;">$respuesta</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'resultado'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'nok'</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$respuesta</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'mensaje'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Error no identificado'</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000088;">$ajaxsubmit</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'ajaxsubmit'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// &quot;AS_&quot; viene de AjaxSubmit ... ;)	</span>
	<span style="color: #000088;">$funcion</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'AS_'</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$ajaxsubmit</span><span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;">// Comprobamos que tenemos una función con ese nombre</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">function_exists</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$funcion</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$funcion</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Llamamos a la función AS_ que indique el ajaxsubmit</span>
	<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$respuesta</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'resultado'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'nok'</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$ajaxsubmit</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">''</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000088;">$respuesta</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'mensaje'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'No se ha indicado &quot;ajaxsubmit&quot;'</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000088;">$respuesta</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'mensaje'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'AjaxSubmit: orden &quot;'</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$ajaxsubmit</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'&quot; no reconocida.'</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>		
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Si el resultado es NOK registramos en el log de errores</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$respuesta</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'resultado'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'nok'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #990000;">error_log</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'*** AJAXSUBMIT - error - '</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$respuesta</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'mensaje'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// ---------------------------------------------------------------------------------------</span>
<span style="color: #666666; font-style: italic;">// Devolvemos respuesta en formato JSON</span>
<span style="color: #000088;">$json</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Services_JSON<span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$json</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">encode</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$respuesta</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #990000;">exit</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// =======================================================================================</span>
<span style="color: #666666; font-style: italic;">// Procesos de guardar, eliminar, actualizar, etc...</span>
<span style="color: #666666; font-style: italic;">// =======================================================================================</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> AS_save_cfg<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">global</span> <span style="color: #000088;">$respuesta</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$cfg</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$clave</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$valor</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// Comprobar si $clave empieza por 'cfg_'</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">ereg</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'^cfg_'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$clave</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000088;">$k</span> <span style="color: #339933;">=</span> <span style="color: #990000;">ereg_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;^cfg_&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$clave</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000088;">$cfg</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$k</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$valor</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #000088;">$errormsg</span> <span style="color: #339933;">=</span> SaveConfig<span style="color: #009900;">&#40;</span><span style="color: #000088;">$cfg</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$errormsg</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'ok'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$respuesta</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'resultado'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'ok'</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$respuesta</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'mensaje'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Configuración guardada'</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$respuesta</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'resultado'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'nok'</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$respuesta</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'mensaje'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$errormsg</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> AS_save_cliente<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">global</span> <span style="color: #000088;">$respuesta</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// Código simplificado para el ejemplo: se debería</span>
	<span style="color: #666666; font-style: italic;">// añadir validación y protección contra SQL injection</span>
	<span style="color: #000088;">$cliente</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Cliente<span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'id'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$cliente</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">nombre</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'nombre'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$cliente</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">email</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'email'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000088;">$errormsg</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$cliente</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Save</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$errormsg</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'ok'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$respuesta</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'resultado'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'ok'</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$respuesta</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'mensaje'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Cliente guardado'</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$respuesta</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'resultado'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'nok'</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$respuesta</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'mensaje'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$errormsg</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

	<p>La &#8220;gracia&#8221; del código está en ésta parte:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p608code8'); return false;">Ver código</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p6088"><td class="line_numbers"><pre>19
20
21
22
23
24
25
</pre></td><td class="code" id="p608code8"><pre class="php" style="font-family:monospace;">	<span style="color: #000088;">$ajaxsubmit</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'ajaxsubmit'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// &quot;AS_&quot; viene de AjaxSubmit ... ;)	</span>
	<span style="color: #000088;">$funcion</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'AS_'</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$ajaxsubmit</span><span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;">// Comprobamos que tenemos una función con ese nombre</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">function_exists</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$funcion</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$funcion</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Llamamos a la función AS_ que indique el ajaxsubmit</span></pre></td></tr></table></div>

	<p>Lo que se envia en la variable &#8220;ajaxsubmit&#8221; es el nombre de la función a llamar, pero la precedemos de &#8220;AS_&#8221; para evitar conflictos con otros nombres de funciones. Entonces gracias a la <em>magia</em> de PHP, porque es un lenguaje de script, aprovechamos la variable <code>$funcion</code> para realizar una llamada a una funcion: <code>$funcion()</code></p>
	<p>¿Qué ventajas tiene este sistema? Tenerlo centralizado, de esa forma, añadir una capa de autenticación o variar el formato de salida de JSON a XML, por ejemplo, es mucho más sencillo. Evidentemente si alguna función es compleja se puede separar en un fichero aparte y hacer el correspondiente <code>include</code>, que además lo recomiendo.</p>
	<p>Para facilitar la labor de serializar los inputs de un formulario y enviarlo por ajax estoy utilizando el plugin <a href="http://malsup.com/jquery/form/">ajaxForm</a> para jQuery.</p>


 

<p>No hay posts relacionados.</p>]]></content:encoded>
			<wfw:commentRss>http://softinspain.com/desarrollo/tratamiento-del-ajax-en-un-solo-fichero/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cambio de servidor de www.lagaleriadigital.com</title>
		<link>http://softinspain.com/desarrollo/cambio-de-servidor-de-wwwlagaleriadigitalcom/</link>
		<comments>http://softinspain.com/desarrollo/cambio-de-servidor-de-wwwlagaleriadigitalcom/#comments</comments>
		<pubDate>Sun, 17 May 2009 18:01:55 +0000</pubDate>
		<dc:creator>Jose Alberto</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[cambio]]></category>
		<category><![CDATA[migración]]></category>
		<category><![CDATA[rsync]]></category>
		<category><![CDATA[servidor]]></category>

		<guid isPermaLink="false">http://softinspain.com/?p=524</guid>
		<description><![CDATA[Este fin de semana hemos cambiado nuestro servicio LaGaleriaDigital (www.lagaleriadigital.com) de servidor. Era un cambio necesario puesto que en el anterior se venía consumiendo semanalmente un 1% del espacio de disco disponible, y estábamos ya en el 70%. Además de que la conectividad no era adecuada. El nuevo servidor tiene, de momento, suficiente capacidad tanto [...]


No hay posts relacionados.]]></description>
			<content:encoded><![CDATA[	<p>Este fin de semana hemos cambiado nuestro servicio LaGaleriaDigital (<a href="http://lagaleriadigital.com">www.lagaleriadigital.com</a>) de servidor. Era un cambio necesario puesto que en el anterior se venía consumiendo semanalmente un 1% del espacio de disco disponible, y estábamos ya en el 70%. Además de que la conectividad no era adecuada.</p>
	<p>El nuevo servidor tiene, de momento, suficiente capacidad tanto de disco como de conectividad, pero aún así estamos ya trabajando para empezar a utilizar el servicio S3 de Amazon, en vistas a ofrecer a nuestros clientes más espacio para almacenar sus fotos.</p>
	<p>La migración se ha venido planificando desde hace un par de meses, primero buscando el servidor, luego lo contratamos y configuramos, después empezamos a escribir los scripts que utilizaríamos durante el proceso para tenerlo todo automatizado y más controlado. Además modificamos el software para que la configuración del mismo (rutas, base de datos, librerías, etc.) fuera más sencilla.</p>
	<p>Siguiendo los <a href="http://softinspain.com/twitter/twitts-del-2009-03-11/">consejos que nos dieron</a>, hemos venido haciendo sincronizaciones (mediante rsync) entre los servidores desde hace unas semanas, aprovechando horas de poco tráfico, para así no tener que volcarlo todo de una vez, solo lo que había cambiado y lo nuevo.</p>
	<p>El viernes, a las 22:00 se puso la galería en modo mantenimiento, a las 23:00 se lanzó el proceso de rsync incluyendo la copia de las bases de datos. A las 06:11 del sábado terminó el proceso, que me puse a revisar a las 07:00 y sobre las 10:00, con una pausa para desayunar, había terminado de hacer las pruebas, solicité el cambio de DNS. Para hacer las pruebas cambié el fichero hosts de mi equipo para que apuntara al nuevo servidor.</p>
	<p>Hoy domingo, sobre las 10:00 repetí las pruebas una vez las DNS se habían cambiado y todo ha ido perfecto, bueno todo no, un pequeño problema con la configuración del correo que se ha resuelto nada más detectarlo (una redirección de una cuenta a otra).</p>
	<p>Nos ha facilitado mucho el que hemos intercambiado las claves SSH de los usuarios de los dos servidores, de forma que hemos podido utilizar scp, rsync, ssh y otros comando desde un servidor hacia el otro.</p>
	<p>Para ser la primera vez que hacemos una migración de tantos gigas creo que no nos ha podido salir mejor.</p>

 

<p>No hay posts relacionados.</p>]]></content:encoded>
			<wfw:commentRss>http://softinspain.com/desarrollo/cambio-de-servidor-de-wwwlagaleriadigitalcom/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Depurar PHP: dump_var</title>
		<link>http://softinspain.com/desarrollo/depurar-php-dump_var/</link>
		<comments>http://softinspain.com/desarrollo/depurar-php-dump_var/#comments</comments>
		<pubDate>Tue, 05 May 2009 12:17:28 +0000</pubDate>
		<dc:creator>Jose Alberto</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[var_dump]]></category>
		<category><![CDATA[xdebug]]></category>

		<guid isPermaLink="false">http://softinspain.com/?p=516</guid>
		<description><![CDATA[Hay muchas formas de depurar software escrito en PHP. Dependiendo del entorno que utilicemos para desarrollar podemos acudir a XDebug, a ZendDebugger, etc. No voy a escribir un articulo extenso sobre ello, quizás otro día. A veces tenemos que depurar un código en ejecución sobre un servidor en el que no podemos poner ningún software, [...]


No hay posts relacionados.]]></description>
			<content:encoded><![CDATA[	<p>Hay muchas formas de depurar software escrito en PHP. Dependiendo del entorno que utilicemos para desarrollar podemos acudir a <a href="http://www.xdebug.org/">XDebug</a>, a <a href="http://files.zend.com/help/Zend-Server-Community-Edition/zenddebugger.html">ZendDebugger</a>, etc. No voy a escribir un articulo extenso sobre ello, quizás otro día.</p>
	<p>A veces tenemos que depurar un código en ejecución sobre un servidor en el que no podemos poner ningún software, entonce recurrimos a varias técnicas como escribir mensajes en el log de errores, con error_log, o ir mostrando cosas en el resultado que se envía al navegador, o recurrimos a var_dump para ver un array o un objeto.</p>
	<p>Hoy me he encontrado con la necesidad de utilizar var_dump, pero sobre una estructura que no conocía y que además es compleja, y no es que precisamente sea una delicia leer los datos de var_dump. Así que me he puesto a buscar librerías, funciones, utilidades que sacaran la información de var_dump de una forma más legible, y he encontrado una que me ha gustado: <a href="http://code.google.com/p/dump-var/downloads/list">dump_var</a>, está alojada en Google Code, es la versión 0.1, pero a mi me ha funcionado muy bien.</p>

 

<p>No hay posts relacionados.</p>]]></content:encoded>
			<wfw:commentRss>http://softinspain.com/desarrollo/depurar-php-dump_var/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Probando Redis</title>
		<link>http://softinspain.com/desarrollo/probando-redis/</link>
		<comments>http://softinspain.com/desarrollo/probando-redis/#comments</comments>
		<pubDate>Sun, 15 Mar 2009 19:47:48 +0000</pubDate>
		<dc:creator>Jose Alberto</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[pruebas]]></category>
		<category><![CDATA[redis]]></category>
		<category><![CDATA[rendimiento]]></category>

		<guid isPermaLink="false">http://softinspain.com/?p=484</guid>
		<description><![CDATA[Me he descargado el código fuente de Redis y lo he compilado, sin problemas. He ejecutado el benchmark que lleva en el código y me ha dado los resultados esperados. Luego he preparado un test con PHP basado en una lista de 1000 frases generadas con el famoso &#8220;lorem ipsum&#8221;. El test consiste en insertar [...]


Posts relacionados:<ol><li><a href='http://softinspain.com/desarrollo/mas-bases-de-datos-ligeras/' rel='bookmark' title='Más bases de datos ligeras'>Más bases de datos ligeras</a></li>
<li><a href='http://softinspain.com/desarrollo/minipost-excelente-articulo-sobre-escalabilidad/' rel='bookmark' title='Minipost: Excelente artículo sobre escalabilidad'>Minipost: Excelente artículo sobre escalabilidad</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[	<p>Me he descargado el código fuente de Redis y lo he compilado, sin problemas. He ejecutado el benchmark que lleva en el código y me ha dado los resultados esperados.</p>
	<p>Luego he preparado un test con PHP basado en una lista de 1000 frases generadas con el famoso &#8220;<a href="http://es.lipsum.com/">lorem ipsum</a>&#8221;. El test consiste en insertar 1.000.000 de entradas del tipo id1=texto, id2=texto&#8230;.id1000000=texto. Para comparar he hecho el mismo test contra MySQL.</p>
	<p>El equipo de pruebas es el portátil que tengo, un Dell Inspiron 6400 de hace un tiempo con un Core Duo a 1.7Gh con 1GB de RAM, corriendo Ubuntu 8.04.</p>
	<p>Los resultados no han sido satisfactorios: MySQL 1 minuto 30 segundos, Redis 1 minuto 20 segundos. Yo lo achaco a que el cliente PHP para Redis no está optimizado, tampoco se integra &#8220;dentro&#8221; de PHP como si lo hace el cliente MySQL, que se carga como un módulo.</p>
	<p>He dejado una nota en la página de <a href="http://code.google.com/p/redis/wiki/Benchmarks">Benchmarks</a> de Redis.</p>
	<p>Por si alguien le interesa, aqui dejo el código utilizado: <a href="http://softinspain.com/wp-content/uploads/2009/03/testredis.tar.gz">testredis.tar.gz</a> Si alguien encuentra algún fallo en el código le agradecería que me lo indicara.</p>
	<p><strong>Actualización</strong>: Mientras he escrito este post, <a href="http://antirez.com/">antirez</a>, el creador de Redis, me ha respondido en el wiki. <img src='http://softinspain.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>

 

<p>Posts relacionados:<ol><li><a href='http://softinspain.com/desarrollo/mas-bases-de-datos-ligeras/' rel='bookmark' title='Más bases de datos ligeras'>Más bases de datos ligeras</a></li>
<li><a href='http://softinspain.com/desarrollo/minipost-excelente-articulo-sobre-escalabilidad/' rel='bookmark' title='Minipost: Excelente artículo sobre escalabilidad'>Minipost: Excelente artículo sobre escalabilidad</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://softinspain.com/desarrollo/probando-redis/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Minipost: Velocidad vs Calidad</title>
		<link>http://softinspain.com/desarrollo/minipost-velocidad-vs-calidad/</link>
		<comments>http://softinspain.com/desarrollo/minipost-velocidad-vs-calidad/#comments</comments>
		<pubDate>Fri, 13 Mar 2009 16:47:45 +0000</pubDate>
		<dc:creator>Jose Alberto</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[agil]]></category>
		<category><![CDATA[minipost]]></category>
		<category><![CDATA[scrum]]></category>

		<guid isPermaLink="false">http://softinspain.com/?p=475</guid>
		<description><![CDATA[Buen artículo donde se explica porqué es mejor tener una buena velocidad de iteración (de hacer ciclos cortos y rápido) a tener una buena calidad de iteración (ciclos perfectos): &#8220;Velocidad de iteración vs Calidad de iteración&#8221; Posts relacionados:Minipost: Excelente artículo sobre escalabilidad Minipost: JSON vs. XML


Posts relacionados:<ol><li><a href='http://softinspain.com/desarrollo/minipost-excelente-articulo-sobre-escalabilidad/' rel='bookmark' title='Minipost: Excelente artículo sobre escalabilidad'>Minipost: Excelente artículo sobre escalabilidad</a></li>
<li><a href='http://softinspain.com/desarrollo/minipost-json-vs-xml/' rel='bookmark' title='Minipost: JSON vs. XML'>Minipost: JSON vs. XML</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[	<p>Buen artículo donde se explica porqué es mejor tener una buena velocidad de iteración (de hacer ciclos cortos y rápido) a tener una buena calidad de iteración (ciclos perfectos): &#8220;<a href="http://geeks.ms/blogs/rcorral/archive/2009/03/12/velocidad-de-iteraci-243-n-vs-calidad-de-iteraci-243-n.aspx">Velocidad de iteración vs Calidad de iteración</a>&#8221; </p>

 

<p>Posts relacionados:<ol><li><a href='http://softinspain.com/desarrollo/minipost-excelente-articulo-sobre-escalabilidad/' rel='bookmark' title='Minipost: Excelente artículo sobre escalabilidad'>Minipost: Excelente artículo sobre escalabilidad</a></li>
<li><a href='http://softinspain.com/desarrollo/minipost-json-vs-xml/' rel='bookmark' title='Minipost: JSON vs. XML'>Minipost: JSON vs. XML</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://softinspain.com/desarrollo/minipost-velocidad-vs-calidad/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Más bases de datos ligeras</title>
		<link>http://softinspain.com/desarrollo/mas-bases-de-datos-ligeras/</link>
		<comments>http://softinspain.com/desarrollo/mas-bases-de-datos-ligeras/#comments</comments>
		<pubDate>Thu, 12 Mar 2009 18:57:19 +0000</pubDate>
		<dc:creator>Jose Alberto</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[bases de datos]]></category>
		<category><![CDATA[clave-valor]]></category>
		<category><![CDATA[key-value]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://softinspain.com/?p=468</guid>
		<description><![CDATA[Siguiendo con el tema del otro día (Bases de datos clave-valor) hoy he descubierto otras dos bases de datos ágiles: Drizzle y Redis. Drizzle viene a ser MySQL pero aligerado, muy orientado a lo que se necesita en un servidor web. Pero parece que su desarrollo aún está verde. Redis, que he descubierto gracias a [...]


Posts relacionados:<ol><li><a href='http://softinspain.com/desarrollo/bases-de-datos-clave-valor/' rel='bookmark' title='Bases de datos clave-valor'>Bases de datos clave-valor</a></li>
<li><a href='http://softinspain.com/desarrollo/probando-redis/' rel='bookmark' title='Probando Redis'>Probando Redis</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[	<p>Siguiendo con el tema del otro día (<a href="http://softinspain.com/desarrollo/bases-de-datos-clave-valor/">Bases de datos clave-valor</a>) hoy he descubierto otras dos bases de datos ágiles: Drizzle y Redis.</p>
	<p><a href="https://launchpad.net/drizzle"><img class="aligncenter size-full wp-image-469" title="drizzle" src="http://softinspain.com/wp-content/uploads/2009/03/drizzle.png" alt="drizzle" width="108" height="108" />Drizzle</a> viene a ser MySQL pero aligerado, muy orientado a lo que se necesita en un servidor web. Pero parece que su desarrollo aún está verde.</p>
	<p><a href="http://code.google.com/p/redis/"><img class="aligncenter size-full wp-image-470" title="redis" src="http://softinspain.com/wp-content/uploads/2009/03/redis.png" alt="redis" width="108" height="82" /></a></p>
	<p><a href="http://code.google.com/p/redis/">Redis</a>, que he descubierto gracias a <a href="http://carrero.es/potencia-sin-limites-para-tus-bases-de-datos-con-redis/3021">carrero</a>, es una base de datos clave-valor, que tiene muy buena pinta y que quiero probar pronto. Hay un <a href="http://code.google.com/p/redis/wiki/TwitterAlikeExample">ejemplo</a> desarrollado, y muy bien explicado, de un clon de Twitter.</p>

 

<p>Posts relacionados:<ol><li><a href='http://softinspain.com/desarrollo/bases-de-datos-clave-valor/' rel='bookmark' title='Bases de datos clave-valor'>Bases de datos clave-valor</a></li>
<li><a href='http://softinspain.com/desarrollo/probando-redis/' rel='bookmark' title='Probando Redis'>Probando Redis</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://softinspain.com/desarrollo/mas-bases-de-datos-ligeras/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Bases de datos clave-valor</title>
		<link>http://softinspain.com/desarrollo/bases-de-datos-clave-valor/</link>
		<comments>http://softinspain.com/desarrollo/bases-de-datos-clave-valor/#comments</comments>
		<pubDate>Sat, 07 Mar 2009 19:43:52 +0000</pubDate>
		<dc:creator>Jose Alberto</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[bases de datos]]></category>
		<category><![CDATA[bigtable]]></category>
		<category><![CDATA[clave-valor]]></category>
		<category><![CDATA[couchdb]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[simpledb]]></category>

		<guid isPermaLink="false">http://softinspain.com/?p=412</guid>
		<description><![CDATA[He estado leyendo sobre las bases de datos de clave-valor (key-value) como SimpleDB de Amazon, o BigTable de Google, además de otros como CouchDB, Tokyo Cabinet o LightCloud, porque prometen un rendimiento excelente para volumenes de datos muy grandes (pero que muy grandes), a cambio, eso si, de ser muy simples y renunciar a funcionalidades [...]


Posts relacionados:<ol><li><a href='http://softinspain.com/desarrollo/mas-bases-de-datos-ligeras/' rel='bookmark' title='Más bases de datos ligeras'>Más bases de datos ligeras</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[	<p>He estado leyendo sobre las bases de datos de clave-valor (key-value) como <a href="http://aws.amazon.com/simpledb/">SimpleDB</a> de Amazon, o <a href="http://labs.google.com/papers/bigtable.html">BigTable</a> de Google, además de otros como <a href="http://couchdb.apache.org/">CouchDB,</a> <a href="http://tokyocabinet.sourceforge.net">Tokyo Cabinet</a> o <a href="http://opensource.plurk.com/LightCloud/">LightCloud</a>, porque prometen un rendimiento excelente para volumenes de datos muy grandes (pero que muy grandes), a cambio, eso si, de ser muy simples y renunciar a funcionalidades que tenemos en otros sistemas como verificación intrinseca de la integridad de datos, referencias externas (<em>foreign keys</em>) o <em>triggers</em>.</p>
	<p>Todo se deja a la aplicación, siendo la base de datos, simplemente donde guardamos los datos. No se verifican integridades, no se comprueban referencias cruzadas, todo eso se ha de implementar a nivel de aplicación, de código cliente.</p>
	<p>En un sistema relacional tenemos bases de datos y dentro de cada base de datos tenemos tablas formadas por filas y columnas. En un sistema clave-valor tenemos contenedores, también se les llama <em>cabinets</em>, en cada contenedor podemos tener tantas parejas de clave-valor como queramos, hay sistemas que permiten tener claves duplicadas y hay que no, o que se puede indicar que no queremos que se dupliquen. En cada contenedor podemos tener datos de la misma naturaleza (por ejemplo productos, pedidos, clientes, etc) o totalmente diferente (podríamos tener un contenedor por cliente), eso depende de nosotros, de la aplicación.</p>
	<p>A cada clave se asocia un valor (clave=valor), por ejemplo: &#8220;Nombre=Jose&#8221;, &#8220;Apellido=Hernandis&#8221;. Pero claro, eso no tiene mucho potencial, si queremos añadir otra persona, ¿cómo lo hacemos? El truco está en la &#8220;clave&#8221;.</p>
	<p>Vamos a suponer que estamos montando un sistema que requiere de identificación de usuarios, vamos a suponer que tenemos un contenedor para los usuarios y otro para los datos de estos (nombre completo, email, fecha nacimiento, etc.). Podríamos hacer que en el primer contenedor la clave fuera el nombre de usuario y el valor la contraseña, así (esto es una versión simplificada):</p>
	<p><strong>[users.cab]</strong><br />
<p style="padding-left: 30px;">pepe=patata<br />
juan=minino<br />
mario=ferrari</p>
	<p>En otro contenedor podríamos tener los datos de los usuarios:<br />
<strong></strong></p>
	<p><strong>[user_data.cab]</strong><br />
<p style="padding-left: 30px;">pepe_nombre=Jose Alberto<br />
pepe_email=ja@ja.com<br />
pepe_fecha=19700315<br />
juan_nombre=Juan Antoni<br />
juan_email=juan@hatmail.com<br />
juan_fecha=19800218<br />
mario_nombre=Mario Garcia<br />
mario_email=mgarcia@micorreo.es</p>
	<p><em>Esto es una versión simplificada, hay bases de datos clave-valor más sofisticadas, llamadas orientadas a documentos, como CouchDB. Otras permiten estructuras más complejas como almacenar arrays asociados a una clave. Incluso &#8220;simular&#8221; tablas con sus columnas.<br />
</em></p>
	<p>Como se ve la clave se forma por el usuario+dato (<em>usuario_dato</em>), de esa forma, al loguearse un usuario podemos preguntar al primer contenedor que nos devuelva la contraseña del usuario, si no devuelve nada el usuario no existe, si devuelve algo verificamos la contraseña y si es correcta podemos recuperar el resto de valores.</p>
	<p>Una alternativa sería en el contenedor user.cab poner el usuario y un ID único, tipo un GUID y utilizar ese GUID para poner la clave a los valores del segundo contenedor.</p>
	<p>Hay sistemas que permiten utilizar <em>comodines</em> a la hora de recuperar valores, por ejemplo se puede pedir que devuelva una lista con las claves que coincidan con <strong>juan_*</strong> de forma que recuperemos juan_nombre, juan_email y juan_fecha. Como se puede ver, del usuario mario no tenemos fecha de nacimiento, si dicho usuario no la ha proporcionado, no tenemos porque almacenarla.</p>
	<p>En algunos sistemas los valores se guardan siempre como cadenas, en otros los valores están tipificados: cadena, entero, flotante, fecha, etc.</p>
	<p>Las bases de datos clave-valor no están pensadas para el análisis de datos, sino para el almacenamiento puro y duro. Si necesitamos analizar los datos almacenados así, mejor que los pasemos primero a un sistema relacional o, mejor todavía, a un OLAP.</p>
	<p>Esto mismo se puede implementar en una base de datos relacional, de hecho es algo que se viene haciendo desde hace años, básicamente para guardar configuraciones. Se trata de utilizar un diseño <em>vertical</em> en lugar de <em>horizontal</em>, me explico:</p>
	<p><strong>Horizontal:</strong></p>
	<p></p>
<table class="wptable rowstyle-alt" id="wptable-2"  cellspacing="1">
	<thead>
	<tr>
		<th class="sortable" style="width:30px" align="center">ID</th>
		<th class="sortable" style="width:60px" align="left">Usuario</th>
		<th class="sortable" style="width:100px" align="left">Nombre</th>
		<th class="sortable" style="width:150px" align="left">EMail</th>
		<th class="sortable" style="width:60px" align="left">Fecha</th>
	</tr>
	</thead>
	<tr>
		<td style="width:30px" align="center">1</td>
		<td style="width:60px" align="left">pepe</td>
		<td style="width:100px" align="left">Jose Alberto</td>
		<td style="width:150px" align="left">ja@ja.com</td>
		<td style="width:60px" align="left">02/04/1971</td>
	</tr>
	<tr class="alt">
		<td style="width:30px" align="center">2</td>
		<td style="width:60px" align="left">juan</td>
		<td style="width:100px" align="left">Juan Antonio</td>
		<td style="width:150px" align="left">juan@hatmail.com</td>
		<td style="width:60px" align="left">18/02/1982</td>
	</tr>
	<tr>
		<td style="width:30px" align="center">3</td>
		<td style="width:60px" align="left">mario</td>
		<td style="width:100px" align="left">Mario Garcia</td>
		<td style="width:150px" align="left">mgarcia@micorreo.es</td>
		<td style="width:60px" align="left">null</td>
	</tr>
</table><p>
</p>
	<p><strong>Vertical:</strong></p>
	<p>Se requieren dos tablas para esta variante, al igual que se requerían dos contenedores para el sistema clave-valor.</p>
	<p>Usuarios<br />
</p>
<table class="wptable rowstyle-alt" id="wptable-3"  cellspacing="1">
	<thead>
	<tr>
		<th class="sortable" style="width:30px" align="center">ID</th>
		<th class="sortable" style="width:30px" align="center">Usuario</th>
	</tr>
	</thead>
	<tr>
		<td style="width:30px" align="center">1</td>
		<td style="width:30px" align="center">pepe</td>
	</tr>
	<tr class="alt">
		<td style="width:30px" align="center">2</td>
		<td style="width:30px" align="center">juan</td>
	</tr>
	<tr>
		<td style="width:30px" align="center">3</td>
		<td style="width:30px" align="center">mario</td>
	</tr>
</table><p>
</p>
	<p>DatosUsuarios<br />
</p>
<table class="wptable rowstyle-alt" id="wptable-4"  cellspacing="1">
	<thead>
	<tr>
		<th class="sortable" style="width:30px" align="center">IDusuario</th>
		<th class="sortable" style="width:60px" align="left">Clave</th>
		<th class="sortable" style="width:60px" align="left">Valor</th>
	</tr>
	</thead>
	<tr>
		<td style="width:30px" align="center">1</td>
		<td style="width:60px" align="left">nombre</td>
		<td style="width:60px" align="left">Jose Alberto</td>
	</tr>
	<tr class="alt">
		<td style="width:30px" align="center">1</td>
		<td style="width:60px" align="left">email</td>
		<td style="width:60px" align="left">ja@ja.com</td>
	</tr>
	<tr>
		<td style="width:30px" align="center">1</td>
		<td style="width:60px" align="left">fecha</td>
		<td style="width:60px" align="left">19710402</td>
	</tr>
	<tr class="alt">
		<td style="width:30px" align="center">2</td>
		<td style="width:60px" align="left">nombre</td>
		<td style="width:60px" align="left">Juan Antonio</td>
	</tr>
	<tr>
		<td style="width:30px" align="center">2</td>
		<td style="width:60px" align="left">email</td>
		<td style="width:60px" align="left">juan@hatmail.com</td>
	</tr>
	<tr class="alt">
		<td style="width:30px" align="center">2</td>
		<td style="width:60px" align="left">fecha</td>
		<td style="width:60px" align="left">19820218</td>
	</tr>
	<tr>
		<td style="width:30px" align="center">3</td>
		<td style="width:60px" align="left">nombre</td>
		<td style="width:60px" align="left">Mario Garcia</td>
	</tr>
	<tr class="alt">
		<td style="width:30px" align="center">3</td>
		<td style="width:60px" align="left">email</td>
		<td style="width:60px" align="left">mgarcia@micorreo.es</td>
	</tr>
</table><p>
</p>
	<p>Cada uno de los modelos tiene su pros y sus contras: El horizontal es más sencillo de entender, es más habitual, pero más dificil si crece o se requieren cambios de estructura. El vertical se complica un poco, requiere de unas conversiones de tipos de datos puesto que todo se almacena como cadena o no es sencillo hacer consultas que devuelvan los datos en formato tabla, pero a cambio tenemos unas ventajas como que no es preciso que todos los usuarios tengan los mismos datos, que es inmediato añadir o eliminar datos sin necesidad de reestructurar la tabla, o que cada tabla podría estar en un servidor diferente.</p>
	<p>Una lista de los diversos sistemas de bases de datos clave-valor: <a href="http://www.metabrew.com/article/anti-rdbms-a-list-of-distributed-key-value-stores/">Anti-RDBMS</a><a href="http://www.metabrew.com/article/anti-rdbms-a-list-of-distributed-key-value-stores/"><br />
</a></p>

 

<p>Posts relacionados:<ol><li><a href='http://softinspain.com/desarrollo/mas-bases-de-datos-ligeras/' rel='bookmark' title='Más bases de datos ligeras'>Más bases de datos ligeras</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://softinspain.com/desarrollo/bases-de-datos-clave-valor/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

