<?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>Blog de Laura Berdasco &#187; Programación</title>
	<atom:link href="http://www.lauraberdasco.com/categorias/programacion/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.lauraberdasco.com</link>
	<description>Guías, trucos, procesos y modelos tecnológicos</description>
	<lastBuildDate>Thu, 20 Oct 2011 06:30:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Enviar emails mediante Drupal y PHPmailer</title>
		<link>http://www.lauraberdasco.com/2011/04/enviar-emails-drupal-y-phpmailer/</link>
		<comments>http://www.lauraberdasco.com/2011/04/enviar-emails-drupal-y-phpmailer/#comments</comments>
		<pubDate>Sun, 17 Apr 2011 12:21:15 +0000</pubDate>
		<dc:creator>laura</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[cms]]></category>
		<category><![CDATA[configuracion]]></category>
		<category><![CDATA[drupal]]></category>
		<category><![CDATA[email]]></category>
		<category><![CDATA[smtp]]></category>
		<category><![CDATA[trucos]]></category>

		<guid isPermaLink="false">http://www.lauraberdasco.com/?p=1007</guid>
		<description><![CDATA[Mini-tutorial de PHPMailer y Drupal para el envío de emails, juntamente con MIMEMail. Se incluye la configuración y los enlaces de descarga de los módulos empleados.  <a href="http://www.lauraberdasco.com/2011/04/enviar-emails-drupal-y-phpmailer/" rel="bookmark">leer más</a>]]></description>
			<content:encoded><![CDATA[<p>El envío de emails en entornos de prueba y con servidores de email en local resultan sencillos de configurar si lo comparamos con un entorno de producción y teniendo un servidor SMTP externo. La dificultad sobretodo está en el momento en que no podemos acceder a la configuración de dicho servidor ni ponerlo como a nosotros nos gustaría.</p>
<p>El problema lo he encontrado a la hora de configurar el envío de correos electrónicos desde un Drupal ya instalado en el servidor del cliente y con pocas opciones de acceso a según que directorios. Estoy a la espera de que me solucionen un problema de conexión con el SMTP del mismo, pero lo he probado con el SMTP de GMail y funciona perfectamente. Os presento este último caso.</p>
<p><strong>Recordamos los datos de conexión SMTP de GMail</strong></p>
<blockquote><p>host: smtp.gmail.com<br />
puerto: 465<br />
usar SSL<br />
usuario:  tuemail@gmail.com<br />
contraseña: tuContraseñaEnGmail</p></blockquote>
<p><strong>¿Qué debemos tener instalado?</strong></p>
<p><em>Opcional</em>: Para poder enviar emails con HTML yo he instalado el módulo <a title="Descarga módulo MIMEMail" href="http://drupal.org/project/mimemail" target="_blank">MIMEMail</a> de Drupal.</p>
<ul>
<li> <a title="Descarga la librería PHPMailer para PHP5-6" href="http://sourceforge.net/projects/phpmailer/files/phpmailer%20for%20php5_6/" target="_blank">Librería de PHPMailer</a>, necesitaremos extraer sobretodo las clases <em>class.phpmailer.php </em>y <em>class.smtp.php. </em></li>
<li> <a title="Descarga el módulo PHPMailer para Drupal 6" href="http://drupal.org/project/phpmailer" target="_blank">PHPMailer</a>, el módulo de Drupal.</li>
</ul>
<p>Para más información sobre la instalación y configuración de estas librerías y módulos podéis ver los archivos &#8216;README&#8217; correspondientes.</p>
<ol>
<li>Extraemos la librería y el módulo de Drupal en una carpeta de nuestro ordenador.</li>
<li>Dentro de la carpeta <strong>/phpmailer</strong> (correspondiente al módulo de Drupal) veremos que existe otra carpeta con el mismo nombre &#8216;phpmailer&#8217;.<br />
Veréis que hay un archivo &#8216;<strong>COPYHERE</strong>.txt&#8217;, lo único que contiene son los archivos que debemos copiar en esta segunda carpeta. Una vez realizada la copia podemos eliminar el .txt.</li>
<li>Abrimos la carpeta de la librería que ya hemos descomprimido y buscamos las clases <em><strong>class.phpmailer.php</strong> </em>y <em><strong>class.smtp.php </strong></em>. Las copiamos, y las enganchamos en la carpeta del módulo de paso 2 (<strong>/phpmailer/phpmailer</strong>).</li>
<li>Mediante nuestro cliente de FTP, subimos la carpeta del módulo de Drupal con las clases de la librería incluidas en el directorio correspondiente (/modules).</li>
</ol>
<p><strong>¿Cómo se usa?</strong></p>
<ul>
<li>Activamos el <strong>PHPMailer</strong> en el listado de <strong>Administración de módulos</strong> ( <em>/admin/build/modules ).</em> Una vez activado aparecerá un aviso que nos dice que debemos configurar el módulo; seguimos el enlace que nos aparece para configurarlo.</li>
<li>En mi caso, el enlace me lleva a la configuración de <em>MIMEMail</em> que es el módulo que utilizo para enviar <strong>email con HTML</strong>. Desde allí mismo puedo configurar la conexión SMTP.<br />
<strong>NOTA</strong>: <em>He probado de tener instalado el módulo <strong>SMTP auth</strong> al mismo tiempo, y al final sólo acaba repitiendo la misma funcionalidad. No aporta ninguna configuración nueva, por lo que al final lo desinstalé. </em></li>
<li>En la configuración desde MIMEMail para el SMTP:</li>
</ul>
<ol>
<li><strong>Escogemos el motor</strong> para el Envío de emails: <strong>PHPMailer</strong><br />
<img class="aligncenter size-full wp-image-1012" title="Escogemos el motor PHPMailer" src="http://www.lauraberdasco.com/wp-content/uploads/2011/04/www.serveisplus.cat-2011-4-17-135817.png" alt="Imagen seleccion motor PHPMailer" width="372" height="109" /></li>
<li><strong>Configuramos el motor</strong>, probamos con los datos de conexión SMTP para una cuenta de GMail<br />
<img class="aligncenter size-full wp-image-1014" title="Configuración motor PHPMailer" src="http://www.lauraberdasco.com/wp-content/uploads/2011/04/www.serveisplus.cat-2011-4-17-14028.png" alt="Imagen Configuración motor PHPMailer" width="682" height="353" /></li>
<li>Introducimos los datos de autentificación del SMTP (en el caso de tenerlos)<br />
<img class="aligncenter size-full wp-image-1016" title="Introducir los datos de conexión SMTP" src="http://www.lauraberdasco.com/wp-content/uploads/2011/04/www.serveisplus.cat-2011-4-17-14057.png" alt="Imagen configuración conexión SMTP" width="738" height="272" /></li>
<li><strong>Configuramos las opciones avanzadas (opcional)</strong>: tal como introducir un email válido para cuando el destinatario quiere responder al email que le hemos enviado, o habilitar los avisos en los logs (modo Developper de Drupal) en el caso de que se produzca un error en el envío del mail.</li>
<li><strong>Envíamos un email de prueba</strong><br />
<img class="aligncenter size-full wp-image-1017" title="Enviar email de prueba" src="http://www.lauraberdasco.com/wp-content/uploads/2011/04/www.serveisplus.cat-2011-4-17-14211.png" alt="Imagen envío prueba" width="736" height="182" /></li>
</ol>
<p>El envío es casi inmediato <img src='http://www.lauraberdasco.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Espero que os haya servido este mini-tutorial si teniáis problemas con el envío de emails con Drupal.</p>
<p>Por cierto, la versión de Drupal que suelo utilizar es la 6 aunque la 7 ya esté operativa. ¿Mi motivo? L<strong>a mayoría de los módulos que me interesan aún no están preparados para la versión 7</strong> <img src='http://www.lauraberdasco.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> .</p>
<p>Un saludo!</p>
<ol></ol>
]]></content:encoded>
			<wfw:commentRss>http://www.lauraberdasco.com/2011/04/enviar-emails-drupal-y-phpmailer/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Generación XML mediante PHP5, XMLWritter</title>
		<link>http://www.lauraberdasco.com/2009/10/generacion-xml-mediante-php-xmlwritter/</link>
		<comments>http://www.lauraberdasco.com/2009/10/generacion-xml-mediante-php-xmlwritter/#comments</comments>
		<pubDate>Tue, 13 Oct 2009 18:38:52 +0000</pubDate>
		<dc:creator>laura</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://www.lauraberdasco.com/?p=464</guid>
		<description><![CDATA[Buenas noches a tod@s! El motivo de la publicación de hoy es la necesidad que hemos tenido de generar un XML con la lista de contactos de la que hablábamos el otro día (aquí y aquí), y el lenguaje escogido es el que utilizamos normalmente: PHP5. El método que os presentaré es muy sencillo y… <a href="http://www.lauraberdasco.com/2009/10/generacion-xml-mediante-php-xmlwritter/" rel="bookmark">leer más</a>]]></description>
			<content:encoded><![CDATA[<p>Buenas noches a tod@s!</p>
<p>El motivo de la publicación de hoy es la necesidad que hemos tenido de generar un XML con la lista de contactos de la que hablábamos el otro día (<a href="http://www.lauraberdasco.com/?p=438" target="_blank">aquí</a> y <a href="http://www.lauraberdasco.com/?p=459" target="_blank">aquí</a>), y el lenguaje escogido es el que utilizamos normalmente: PHP5. El método que os presentaré es muy sencillo y ha sido compuesto con funcionalidades relacionadas con <strong>XMLWriter</strong> (<em>propia de PHP5</em>).</p>
<p>El listado de contactos importados de una cuenta de Gmail por ejemplo, es guardado en un <em>array</em>. Dicho <em>array</em> es pasado como parámetro del método que presento a continuación y dentro de él, se genera el XML. Tal que así:</p>
<p>[stextbox id="info"]private function getXML(array $contacts){<br />
$xml = new XMLWriter;<br />
$xml-&gt;openMemory();<br />
$xml-&gt;startDocument(&#8217;1.0&#8242;, &#8216;UTF-8&#8242;);<br />
$xml-&gt;startElement(&#8216;contacts&#8217;);<br />
foreach ($contacts as $email =&gt; $name) {<br />
$xml-&gt;startElement(&#8216;contact&#8217;);<br />
$xml-&gt;startElement(&#8216;user&#8217;);<br />
$xml-&gt;text($name);<br />
$xml-&gt;endElement();<br />
$xml-&gt;startElement(&#8216;mailbox&#8217;);<br />
$xml-&gt;text($email);<br />
$xml-&gt;endElement();<br />
$xml-&gt;endElement();<br />
<em>$xml-&gt;writeElement(&#8216;br&#8217;, &#8221;);</em><br />
}<br />
$xml-&gt;endElement();<br />
$xml-&gt;endDocument();<br />
echo $xml-&gt;outputMemory();<br />
}[/stextbox]</p>
<p><strong>NOTA</strong>: <em>$xml-&gt;writeElement(&#8216;br&#8217;, &#8221;); puede eliminarse ya que no debería formar parte del xml.  Pero de esta manera podréis ver si os muestra por pantalla todo el listado correctamente. Lo he utilizado para listar contact(user+mailbox) uno debajo de otro.<br />
</em></p>
<p>Esta solución ha sido ideada después de ver varias documentaciones y páginas web, y os comparto la que ha sido más importante <a href="http://www.webtaller.com/construccion/lenguajes/php/lecciones/xml-php5-php-2.php" target="_blank">aquí</a>. Cómo en todo lo relacionado con este mundillo, no hay una sola manera (más eficiente o menos) para hacer las cosas y seguro que podéis encontrar muchísimos scripts por ahí, pero espero que os sea de ayuda igualmente. Almenos para que véais por donde podéis empezar a probar.</p>
<p>Para más información sobre las diferentes funcionalidades de <em>XMLWritter</em>, os comparto el enlace de la<a href="http://www.php.net/manual/en/book.xmlwriter.php" target="_blank"> documentación de PHP</a> que habla sobre ello. Y en el caso que tengáis soluciones mejores, no dudéis en compartirlas aquí también.</p>
<p>Un saludo desde pingüinos y manzanitas world!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lauraberdasco.com/2009/10/generacion-xml-mediante-php-xmlwritter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Problema con OpenInviter. Fatal error: Call to a member function isEmail() on a non-object in&#8230;</title>
		<link>http://www.lauraberdasco.com/2009/10/problema-con-openinviter-fatal-error-call-to-a-member-function-isemail-on-a-non-object-in/</link>
		<comments>http://www.lauraberdasco.com/2009/10/problema-con-openinviter-fatal-error-call-to-a-member-function-isemail-on-a-non-object-in/#comments</comments>
		<pubDate>Fri, 09 Oct 2009 08:07:34 +0000</pubDate>
		<dc:creator>laura</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[configuracion]]></category>
		<category><![CDATA[contactos]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[solucion]]></category>

		<guid isPermaLink="false">http://www.lauraberdasco.com/?p=459</guid>
		<description><![CDATA[Fatal error: Call to a member function isEmail() on a non-object in&#8230; es un error que ha estado dando vueltas por mi cabeza desde ayer, y gracias a una respuesta del foro oficial de la &#8216;herramienta&#8217; he podido dar una vuelta más al asunto. Uno de los problemas que teníamos era que OpenInviter trabaja con… <a href="http://www.lauraberdasco.com/2009/10/problema-con-openinviter-fatal-error-call-to-a-member-function-isemail-on-a-non-object-in/" rel="bookmark">leer más</a>]]></description>
			<content:encoded><![CDATA[<p><strong><em>Fatal error: Call to a member function isEmail() on a non-object in&#8230;</em></strong> es un error que ha estado dando vueltas por mi cabeza desde ayer, y gracias a una respuesta del foro oficial de la &#8216;herramienta&#8217; he podido dar una vuelta más al asunto.</p>
<p>Uno de los problemas que teníamos era que OpenInviter trabaja con SQLite, y si no se tiene dicha extensión instalada en el sistema no es posible modificar algunos archivos sqllite con los que trabaja. No sé hasta que punto es esto bueno o no, pero aquí os dejo la posible solución publicada por este usuario:<br />
Si accedemos al archivo <em>conf.php</em> encontraremos una serie de atributos; debemos buscar aquellos que sean &#8216;state&#8217; y &#8216;update_files&#8217; cuyo valor es TRUE y cambiarlo a FALSE (estos dos atributos son los que se encargan de la parte SQLite), o en cualquier caso habilitar dicha extensión SQLite y dejar dichos valores como TRUE.</p>
<p>Otro de los problemas era que debemos eliminar, después de haber sido ejecutado, el archivo <em>postinstall.php</em>. Aún desconozco el uso real de dicho archivo, pero así te lo recomiendan en algún punto de la documentación. Con un poco de tiempo quiero investigar un poco más en ello.</p>
<p>Con estos dos problemas solucionados, ya tenemos otro tipo de sistema de importación de contactos de cuentas de GMAIL aunque también probaremos, con OpenInviter, las otras alternativas (importación de contactos de YahooMail, AOL, MSN, LinkedIn o <em>Plaxo</em> -wow <img src='http://www.lauraberdasco.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> -).</p>
<p>Esto es todo, de momento, desde el zulo, pingüinos y manzanitas world!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lauraberdasco.com/2009/10/problema-con-openinviter-fatal-error-call-to-a-member-function-isemail-on-a-non-object-in/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>¿CURL habilitado?</title>
		<link>http://www.lauraberdasco.com/2009/10/%c2%bfcurl-habilitado/</link>
		<comments>http://www.lauraberdasco.com/2009/10/%c2%bfcurl-habilitado/#comments</comments>
		<pubDate>Thu, 08 Oct 2009 09:12:45 +0000</pubDate>
		<dc:creator>laura</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[configuracion]]></category>
		<category><![CDATA[curl]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[trucos]]></category>

		<guid isPermaLink="false">http://www.lauraberdasco.com/?p=454</guid>
		<description><![CDATA[Voy a compartir un truquillo que he encontrado por ahí, para poder saber si tenemos la extensión de PHP5 CURL corriendo en nuestro sistema. Podemos añadir la siguiente sentencia en nuestro archivo de prueba .php, para luego ejecutarlo allí dónde queramos probar la extensión. [stextbox id="info"]var_dump(curl_version());[/stextbox] Si no está disponible, var_dump no pintará nada por… <a href="http://www.lauraberdasco.com/2009/10/%c2%bfcurl-habilitado/" rel="bookmark">leer más</a>]]></description>
			<content:encoded><![CDATA[<p>Voy a compartir un truquillo que he encontrado por ahí, para poder saber si tenemos la extensión de PHP5 CURL corriendo en nuestro sistema. Podemos añadir la siguiente sentencia en nuestro archivo de prueba .<em>php</em>, para luego ejecutarlo allí dónde queramos probar la extensión.</p>
<p>[stextbox id="info"]var_dump(curl_version());[/stextbox]</p>
<p>Si no está disponible, var_dump no pintará nada por pantalla y saltará un error sobre la función <em>curl_version()</em>.</p>
<p>Esto ha sido sacado de la siguiente <a href="http://www.wallpaperama.com/forums/how-to-find-out-if-php-is-compiled-with-curl-extension-installed-enabled-t1576.html">página web</a> y me ha servido para realizar algunas operaciones en nuestro servidor que requerían de dicha extensión.</p>
<h2>¿Cómo ver si está habilitado sobre un entorno Ubuntu?</h2>
<p>Debemos proceder a consultar el archivo de configuración de php que tengamos en nuestro sistema. En mi caso, dicho archivo se encuentra dentro de /etc/php5/conf.g/ y se llama curl.ini. Si visualizamos dicho archivo:</p>
<p>[stextbox id="info"]sudo nano curl.ini[/stextbox]</p>
<p>Veremos las siguientes líneas si está habilitado:</p>
<p>[stextbox id="info" caption="curl.ini"]# configuration for php CURL module<br />
extension=curl.so[/stextbox]</p>
<p>En el caso de que delante de <em>extension=curl.so </em>haya un símbolo #, procederemos a borrarlo (<em>NOTA</em>: # <em>es símbolo de comentario, por lo tanto es como si no estuviera escrito y no se ejecuta</em>).</p>
<p>Un saludo desde el zulo, pingüinos y manzanitas world!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lauraberdasco.com/2009/10/%c2%bfcurl-habilitado/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Importación de Contactos de Gmail mediante Zend Framework</title>
		<link>http://www.lauraberdasco.com/2009/10/importacion-de-contactos-de-gmail-mediante-zend-framework/</link>
		<comments>http://www.lauraberdasco.com/2009/10/importacion-de-contactos-de-gmail-mediante-zend-framework/#comments</comments>
		<pubDate>Wed, 07 Oct 2009 10:33:26 +0000</pubDate>
		<dc:creator>laura</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[configuracion]]></category>
		<category><![CDATA[contactos]]></category>
		<category><![CDATA[gmail]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[trucos]]></category>
		<category><![CDATA[zend]]></category>

		<guid isPermaLink="false">http://www.lauraberdasco.com/?p=438</guid>
		<description><![CDATA[En el post de hoy voy a hablar sobre la importación de contactos de Gmail y os presentaré una pequeña solución que utiliza tokens de seguridad en vez de la introducción de cuenta y contraseña de los usuarios. Es una solución funcional, ya que aún está por maquetar y generalizar pero prefiero publicarla antes de… <a href="http://www.lauraberdasco.com/2009/10/importacion-de-contactos-de-gmail-mediante-zend-framework/" rel="bookmark">leer más</a>]]></description>
			<content:encoded><![CDATA[<p>En el post de hoy voy a hablar sobre la importación de contactos de Gmail y os presentaré una pequeña solución que utiliza <em>tokens</em> de seguridad en vez de la introducción de cuenta y contraseña de los usuarios. Es una solución funcional, ya que aún está por maquetar y generalizar pero prefiero publicarla antes de que se me olvide. Por temas de trabajo debo dejarla un poco de lado.</p>
<p>El Zend Framework no da soporte a la API de Google Contacts, de momento, así que parte del trabajo que se había realizado para la integración de Youtube y Picasa no servía de mucho -en principio-. He leído en algún foro del Framework que se está trabajando en este nuevo módulo de Zend_GData, pero aún no hay una fecha de salida. Llegados a este punto, no ha quedado más remedio que pasar unas cuantas horas navegando por la red para poder encontrar alguna solución.</p>
<p>La primera de ellas apareció en este <a title="Memorias de un programador" href="http://www.memoriasdeunprogramador.com/?p=185&amp;cpage=1#comment-4" target="_blank">post</a>. Después de realizar nuevas clases y aprender un poco el funcionamiento de algunas funciones cUrl, no he conseguido hacerla funcionar finalmente por temas de autentificación y el token de seguridad. Estoy a la espera de recibir un mensaje del desarrollador a ver si nos puede echar una mano en el asunto.</p>
<p>La segunda de ellas apareció de una idea que tuve relacionada con el siguiente <a href="http://blog.charlvn.com/2008/11/google-contacts-api-with-zend-framework.html" target="_blank">post</a>. Del sistema que ya se había montado para Youtube y Picasa se podían añadir unas nuevas operaciones al objeto Zend_GData:</p>
<blockquote><p>$gdata = new Zend_Gdata($client);<br />
$query = new Zend_Gdata_Query(&#8220;http://www.google.com/m8/feeds/contacts/$username/full&#8221;);<br />
$feed = $gdata-&gt;getFeed($query);<br />
$entries = $gdata-&gt;retrieveAllEntriesForFeed($feed);</p></blockquote>
<p>En nuestro sistema, $client sería un objeto del tipo Zend_Gdata_HttpClient al que le hacemos un set de las cabeceras necesarias para la conexión con los sistemas Google, las llaves privadas y el token de seguridad provisto. Para más información sobre esto, podéis consultar el <a href="http://www.ixavi.com/?p=263" target="_blank">post de Xavi</a> dónde se explica el proceso que seguimos para sincronizar con Youtube y Picasa. Os comparto el código del método que nos genera dicho objeto $cliente:</p>
<blockquote><p>private function getClient($singleUseToken){<br />
$fclient = new Zend_Gdata_HttpClient();<br />
$fclient-&gt;setHeaders(&#8220;X-GData-Key: key=&#8221;.&#8217;google_key&#8217;);<br />
$fclient-&gt;setAuthSubPrivateKeyFile(&#8216;path-to-keys&#8217;,null, true);<br />
$sessionToken = Zend_Gdata_AuthSub::getAuthSubSessionToken(trim($singleUseToken),$fclient);<br />
$fclient-&gt;setAuthSubToken($sessionToken);<br />
return $fclient;<br />
}</p></blockquote>
<p>Para terminar os comparto el siguiente <a href="http://blog.unijimpe.net/importar-contactos-con-php/" target="_blank">enlace</a> que será la tercera solución que probaremos. Como se puede ver, es una clase llamada <em>Open Inviter</em> escrita en PHP5 que permite importar contactos de diferentes cuentas y aplicaciones.<br />
Vamos allá!!!</p>
<p>Un saludo desde pingüinos y manzanitas world!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lauraberdasco.com/2009/10/importacion-de-contactos-de-gmail-mediante-zend-framework/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Por fin hemos dominado la subida de videos con la API de Youtube (desde servidor)</title>
		<link>http://www.lauraberdasco.com/2009/08/por-fin-hemos-dominado-la-subida-de-videos-con-la-api-de-youtube-desde-servidor/</link>
		<comments>http://www.lauraberdasco.com/2009/08/por-fin-hemos-dominado-la-subida-de-videos-con-la-api-de-youtube-desde-servidor/#comments</comments>
		<pubDate>Tue, 18 Aug 2009 14:22:14 +0000</pubDate>
		<dc:creator>laura</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[videos]]></category>
		<category><![CDATA[youtube]]></category>
		<category><![CDATA[zend]]></category>

		<guid isPermaLink="false">http://www.lauraberdasco.com/?p=386</guid>
		<description><![CDATA[Será un post breve, pero quería reflejar la alegría de este día histórico. Después de muchas horas de estudio, errores, de documentarse, de pegarse de canto con la API de Youtube para poder subir vídeos, y desde un servidor externo (S3)&#8230; nuestro sistema es capaz de hacerlo! Hemos sudado la gota gorda pero después de… <a href="http://www.lauraberdasco.com/2009/08/por-fin-hemos-dominado-la-subida-de-videos-con-la-api-de-youtube-desde-servidor/" rel="bookmark">leer más</a>]]></description>
			<content:encoded><![CDATA[<p>Será un post breve, pero quería reflejar la alegría de este día histórico. Después de muchas horas de estudio, errores, de documentarse, de pegarse de canto con la API de Youtube para poder subir vídeos, y desde un servidor externo (S3)&#8230; nuestro sistema es capaz de hacerlo! <img src='http://www.lauraberdasco.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Hemos sudado la gota gorda pero después de 6 días y dos cabezas pensantes, lo hemos conseguido.</p>
<p>En los próximos días se publicará un post en el <a href="http://www.ixavi.com" target="_blank">blog de Xavi</a>, donde se explicará lo que se ha de tener en cuenta para poder comunicarse y subir videos a Youtube. Lo que no se ha conseguido desde la documentación de Youtube, Zend Framework y las API&#8217;s de Google (todo junto),&#8230; en los próximos días.</p>
<p>Un saludo desde pingüinos y manzanitas world!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lauraberdasco.com/2009/08/por-fin-hemos-dominado-la-subida-de-videos-con-la-api-de-youtube-desde-servidor/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Primeros pasos con Drupal – Instalación sobre Ubuntu 9.04</title>
		<link>http://www.lauraberdasco.com/2009/05/primeros-pasos-con-drupal-instalacion-sobre-ubuntu-904/</link>
		<comments>http://www.lauraberdasco.com/2009/05/primeros-pasos-con-drupal-instalacion-sobre-ubuntu-904/#comments</comments>
		<pubDate>Sun, 03 May 2009 19:23:55 +0000</pubDate>
		<dc:creator>laura</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[cms]]></category>
		<category><![CDATA[configuracion]]></category>
		<category><![CDATA[drupal]]></category>
		<category><![CDATA[herramientas]]></category>
		<category><![CDATA[trucos]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.lauraberdasco.com/?p=311</guid>
		<description><![CDATA[Hace tiempo empezamos a probar diferentes CMS para poder incorporarlos en algunos proyectos paralelos. Jugamos unos días con Joomla, pero después de ver la poca información práctica que tiene y la complicación de la estructura de páginas, decidimos probar Drupal. Este CMS permite el montaje de nuevas páginas de una forma rapida y sencilla, y… <a href="http://www.lauraberdasco.com/2009/05/primeros-pasos-con-drupal-instalacion-sobre-ubuntu-904/" rel="bookmark">leer más</a>]]></description>
			<content:encoded><![CDATA[<p>Hace tiempo empezamos a probar diferentes <em>CMS</em> para poder incorporarlos en algunos proyectos paralelos. Jugamos unos días con <strong>Joomla</strong>, pero después de ver la poca información práctica que tiene y la complicación de la estructura de páginas, decidimos probar <strong>Drupal</strong>. Este <em>CMS</em> permite el montaje de nuevas páginas de una forma rapida y sencilla, y aunque sea menos galmuroso o menos espectacular que <strong>Joomla</strong> (a la vista), su uso es mucho más ágil.</p>
<p>Debo decir que tanto para uno, como para el otro, la información que se pueda encontrar (sitios oficiales, comunidades o libros) no están orientados a la práctica y es muy dificil ver hasta dónde puede llegar. Con esta nueva serie de publicaciones intentaremos ejemplificar su uso. Espero que os sirva de ayuda esta mini guía práctica.</p>
<p><strong>Instalación</strong><br />
Insisto en que la mayoría de los ejemplos prácticos que se publican en este blog estan probados sobre la distribución <strong>Ubuntu</strong> de Linux. Para este caso, utilizaremos la nueva<strong> versión 9.04</strong>, y como elementos indispensables <strong>PHP</strong>, <strong>MySQL</strong> y <strong>Apache2</strong>.</p>
<ul>
<li>Lo primero de todo será que os descarguéis la versión de drupal disponible en su <a title="Proyecto Drupal OpenSource" href="http://drupal.org/" target="_blank">página web oficial</a>. Podéis descargarla directamente <a title="Drupal 6.11" href="http://drupal.org/drupal-6.11" target="_blank">aquí</a>. Una vez la tengáis en vuestro ordenador, extraerla y guardarla allí donde queráis tener el proyecto; en este ejemplo se guardará dentro de una carpeta, en /home/usuario, llamada proyecto.</li>
<li>El siguiente paso será comprobar que tenemos instalados MySQL, Apache2, y PHP. Como herramienta de administración de MySQL yo utilzo <strong>Navicat</strong> en su versión Lite. Si no téneis ninguno en el sistema ya instalado, podéis descargarlo <a title="Descarga Navicat versión Lite" href="http://www.navicat.com/html/index.php/en/download/download.html" target="_blank">aquí</a>.</li>
<li>Como os podéis imaginar, lo siguiente que haremos será modificar los archivos pertinentes para poder habilitar el nuevo proyecto en local. Para ello tocaremos, entre otros, los archivos de Apache2.</li>
</ul>
<ol style="padding-left: 50px;">
<li>Habilitar el nuevo sitio, partiendo por ejemplo del archivo default almacenado en <em>/etc/apache2/sites-available</em> y cambiando la ruta del nuevo proyecto. El nombre del nuevo sitio será <em>local.drupal.com</em>.<br />
[stextbox id="info"]cd /etc/apache2/sites-available<br />
sudo cp default local.drupal.comEditamos la información de local.drupal.com.<br />
sudo gedit local.drupal.com[/stextbox]</p>
<p>Añadimos los siguiente:<br />
<span style="font-family: monospace, 'Times New Roman', 'Bitstream Charter', Times, serif;"> [stextbox id="info"]&lt;VirtualHost *:80&gt;<br />
ServerAdmin webmaster@localhost<br />
ServerName local.drupal.com<br />
DocumentRoot /home/usuario/proyecto/drupal/<br />
&lt;Directory /&gt;<br />
Options FollowSymLinks<br />
AllowOverride All<br />
&lt;/Directory&gt;<br />
&lt;Directory /home/usuario/proyecto/drupal/&gt;<br />
Options Indexes FollowSymLinks MultiViews<br />
AllowOverride All<br />
Order allow,deny<br />
allow from all<br />
&lt;/Directory&gt;<br />
&#8230;[/stextbox]</span></li>
<li>Editamos el archivo hosts almacenado en <em>/etc</em>/<br />
[stextbox id="info"]sugo gedit /etc/hosts[/stextbox]</p>
<p>Y añadimos la siguiente línea:<br />
[stextbox id="info"]127.0.0.1    local.drupal.com[/stextbox]</li>
<li>[stextbox id="info"]sudo a2ensite local.drupal.com[/stextbox]&#8230;y reiniciamos el servidor apache<br />
[stextbox id="info"]sudo /etc/init.d/apache2 restart[/stextbox]</li>
</ol>
<ul>
<li>Una vez hecho todo esto, y antes de ejecutar el archivo que nos permita instalar Drupal, es recomendable cambiar los permisos de la carpeta &#8220;drupal&#8221;.<br />
[stextbox id="info"]sudo chmod 777 -R /home/usuario/proyecto/drupal[/stextbox]</li>
<li>Abrimos el navegador y tecleamos:<br />
[stextbox id="info"]http://local.drupal.com/index.php[/stextbox]</p>
<p><em>NOTA</em>: index.php es el archivo que se carga para empezar la instalación de drupal.</li>
</ul>
<p>Si os ha dado algún problema, revisad que tengáis todos los elementos necesarios instalados en vuestro sistema y que los archivos de configuración sean correctos. Si no se ha producido ningún error, se os mostrará la siguiente página:</p>
<p style="text-align: center;"><a rel="attachment wp-att-334" href="http://www.lauraberdasco.com/2009/05/primeros-pasos-con-drupal-instalacion-sobre-ubuntu-904/drupal1/"><img class="size-medium wp-image-334 aligncenter" title="drupal1" src="http://www.lauraberdasco.com/wp-content/uploads/2009/05/drupal1-300x207.jpg" alt="1 paso instalación Drupal" width="300" height="207" /></a></p>
<p>Click en Install Drupal in English (en mi caso)<br />
<em>NOTA</em>: En la versión anterior no funcionaba del todo bien si se instalaba en otro idioma.</p>
<p>En la siguiente pantalla se pedirá que introduzcamos los datos relacionados con la base de datos. Para crear una nueva base de datos, en mi caso con Navicat Lite, abriremos el programa y seguiremos los siguientes pasos.</p>
<ol>
<li>Crearemos una nueva Conexión (<em>clic derecho&gt;new Connection</em>)<a rel="attachment wp-att-339" href="http://www.lauraberdasco.com/2009/05/primeros-pasos-con-drupal-instalacion-sobre-ubuntu-904/navicat1/"><img class="aligncenter size-medium wp-image-339" title="navicat1" src="http://www.lauraberdasco.com/wp-content/uploads/2009/05/navicat1-300x229.jpg" alt="navicat1" width="300" height="229" /><br />
</a><a rel="attachment wp-att-340" href="http://www.lauraberdasco.com/2009/05/primeros-pasos-con-drupal-instalacion-sobre-ubuntu-904/navicat2/"><img class="aligncenter size-medium wp-image-340" title="navicat2" src="http://www.lauraberdasco.com/wp-content/uploads/2009/05/navicat2-300x228.jpg" alt="navicat2" width="300" height="228" /></a></li>
<li>Crearemos una nueva base de datos en esta nueva Conexión (<em>clic derecho&gt;new Database</em>)<a rel="attachment wp-att-341" href="http://www.lauraberdasco.com/2009/05/primeros-pasos-con-drupal-instalacion-sobre-ubuntu-904/navicat3/"><img class="aligncenter size-medium wp-image-341" title="navicat3" src="http://www.lauraberdasco.com/wp-content/uploads/2009/05/navicat3-300x229.jpg" alt="navicat3" width="300" height="229" /></a></li>
<li>Cerramos el programa y volvemos al navegador.</li>
</ol>
<p>Introducimos los datos relacionados con la base de datos que acabamos de crear, y continuamos con la instalación.</p>
<p>Una vez instalado Drupal, se nos pedirá que introduzcamos los datos del site y la cuenta inicial. Aparecerá una pantalla como la siguiente:</p>
<p>Clic a Save And Continue, para finalizar el proceso.</p>
<p><a rel="attachment wp-att-342" href="http://www.lauraberdasco.com/2009/05/primeros-pasos-con-drupal-instalacion-sobre-ubuntu-904/drupal2/"><img class="aligncenter size-medium wp-image-342" title="drupal2" src="http://www.lauraberdasco.com/wp-content/uploads/2009/05/drupal2-300x210.jpg" alt="drupal2" width="300" height="210" /></a><em>NOTA</em>: Como último paso es necesario seguir las instrucciones que nos aparecen recuadradas en rojo. (imagen de arriba)</p>
<p>Ya téneis vuestro sistema instalado. En las próximas publicaciones intentaremos describir la estructura de los sites hechos con Drupal e intentaremos empezar a introducir contenido -páginas y bloques-.</p>
<p>Esto es todo, por hoy, desde pingüinos y manzanitas world (sin zulo)!!</p>
<p>Saludos!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lauraberdasco.com/2009/05/primeros-pasos-con-drupal-instalacion-sobre-ubuntu-904/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Replicación MySQL con Master-Slave sobre Ubuntu 8.10 (slave)</title>
		<link>http://www.lauraberdasco.com/2009/03/replicacion-mysql-con-master-slave-sobre-ubuntu-810-slave/</link>
		<comments>http://www.lauraberdasco.com/2009/03/replicacion-mysql-con-master-slave-sobre-ubuntu-810-slave/#comments</comments>
		<pubDate>Thu, 12 Mar 2009 09:54:34 +0000</pubDate>
		<dc:creator>laura</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[configuracion]]></category>
		<category><![CDATA[master slave]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[trucos]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.lauraberdasco.com/?p=296</guid>
		<description><![CDATA[Configuración del slave Ahora, empecemos con la configuración desde cero de un slave en una nueva máquina (Ubuntu 8.10). Accedemos, como hemos comentado antes, al archivo my.cnf para configurar en la nueva máquina el slave. sudo gedit /etc/mysql/my.cnf Añadimos las siguientes líneas en el apartado [mysqld] : server-id=2 master-host = ip/DNShost master-user = usuarioslave master-password… <a href="http://www.lauraberdasco.com/2009/03/replicacion-mysql-con-master-slave-sobre-ubuntu-810-slave/" rel="bookmark">leer más</a>]]></description>
			<content:encoded><![CDATA[<p><strong>Configuración del slave</strong></p>
<p>Ahora, empecemos con la configuración desde cero de un <em>slave</em> en una nueva máquina (Ubuntu 8.10).</p>
<ol>
<li>Accedemos, como hemos comentado antes, al archivo my.cnf para configurar en la nueva máquina el slave.<br />
<code><br />
sudo gedit /etc/mysql/my.cnf</code>
</li>
<li>Añadimos las siguientes líneas en el apartado <strong>[mysqld]</strong> :<br />
<code>server-id=2<br />
master-host = ip/DNShost<br />
master-user = usuarioslave<br />
master-password = clave_acceso_slave<br />
master-port= 3306<br />
replicate-do-db=base_datos</code><br />
Comentamos las líneas de skip-networking y bind-address, como hemos dicho en el <a title="Replicación MYSQL con Master-Slave sobre Ubuntu 8.10 (master)" href="http://www.lauraberdasco.com/?p=273" target="_blank">post</a> anterior.</li>
<li>Reiniciamos el servidor MySQL<br />
<code><br />
sudo /etc/init.d/mysql restart</code></li>
<li>Accedemos a la consola de MySQL como <em>root</em>:<br />
<code><br />
mysql -u root -p</code>
</li>
<li>Miraremos el estado y configuración del slave, por si ya se hubiera inicializado automáticamente al arrancar MySql.<br />
<code><br />
SHOW SLAVE STATUS \G;</code><br />
Y a continuación, aparecerá algo así:<br />
<code>*************************** 1. row ***************************<br />
Slave_IO_State: Waiting for master to send event<br />
Master_Host: IP/DNS_host<br />
Master_User: usuarioslave<br />
Master_Port: 3306<br />
Connect_Retry: 60<br />
Master_Log_File: mysql-bin.000002<br />
Read_Master_Log_Pos: 98<br />
Relay_Log_File: mysqld-relay-bin.000021<br />
Relay_Log_Pos: 235<br />
Relay_Master_Log_File: mysql-bin.000002<br />
Slave_IO_Running: Yes<br />
Slave_SQL_Running: Yes<br />
Replicate_Do_DB: base_datos<br />
Replicate_Ignore_DB:<br />
Replicate_Do_Table:<br />
Replicate_Ignore_Table:<br />
Replicate_Wild_Do_Table:<br />
Replicate_Wild_Ignore_Table:<br />
Last_Errno: 0<br />
Last_Error:<br />
Skip_Counter: 0<br />
Exec_Master_Log_Pos: 98<br />
Relay_Log_Space: 235<br />
Until_Condition: None<br />
Until_Log_File:<br />
Until_Log_Pos: 0<br />
Master_SSL_Allowed: No<br />
Master_SSL_CA_File:<br />
Master_SSL_CA_Path:<br />
Master_SSL_Cert:<br />
Master_SSL_Cipher:<br />
Master_SSL_Key:<br />
Seconds_Behind_Master: 0<br />
1 row in set (0.00 sec)</code></p>
<p><strong>NOTA</strong>: Si no se muestran estas opciones del <em>slave</em>, iguales o parecidas, podemos estar frente dos casos:</p>
<ul>
<li><em>Slave_IO_Running</em> y <em>Slave_SQL_Running</em> estén a <em>No</em>, cuyo significado es que no están corriendo (no se ha producido un <strong>START SLAVE;</strong> o a fallado). Muchas veces se soluciona escribiendo dicha sentencia en la consola de MySQL.</li>
<li>Los datos referentes al <em>master</em>, que hemos especificado en el archivo de configuración del <em>slave</em>, no son los correctos. Esto podría pasar en el caso de que previamente tuviéramos unos datos del máster que por cualquier operación sobre él se hayan modificado. Esto se puede resolver con el uso de la instrucción<strong> RESET SLAVE;</strong> qué lo que hace es eliminar los datos anteriores a una modificación del master y vuelve a cargar los nuevos introducidos en el archivo <em>my.cnf</em> del <em>slave</em>. Otra opción, que he encontrado por Internet, es el uso de la siguiente sentencia indicando los nuevos atributos del master:<br />
<code>STOP SLAVE;<br />
CHANGE MASTER TO MASTER_HOST='IP/DNSnueva', MASTER_USER='usuarioslave', MASTER_PASSWORD='clave_acceso_slave', MASTER_LOG_FILE='file_log_determinado' ;<br />
START SLAVE;</code><br />
<strong>NOTA</strong>: Este último paso no lo hemos necesitado ya que, una vez inicializado el <em>slave</em>, ha conectado directamente con el <em>master</em> y ha recogido sus datos.</li>
</ul>
</li>
</ol>
<p>Con esto hemos acabado esta serie de post sobre la configuración de un<em> master-slave</em> en MySQL. Espero que os sirva de ayuda. <img src='http://www.lauraberdasco.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Esto es todo, por hoy, desde el zulo, pingüinos y manzanitas world!! (con el jefe perdido xD&#8230;)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lauraberdasco.com/2009/03/replicacion-mysql-con-master-slave-sobre-ubuntu-810-slave/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Replicación MySQL con Master-Slave sobre Ubuntu 8.10 (master)</title>
		<link>http://www.lauraberdasco.com/2009/03/replicacion-mysql-con-master-slave-sobre-ubuntu-810-master/</link>
		<comments>http://www.lauraberdasco.com/2009/03/replicacion-mysql-con-master-slave-sobre-ubuntu-810-master/#comments</comments>
		<pubDate>Wed, 11 Mar 2009 11:05:39 +0000</pubDate>
		<dc:creator>laura</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[configuracion]]></category>
		<category><![CDATA[master slave]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[trucos]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.lauraberdasco.com/?p=273</guid>
		<description><![CDATA[Tras decidir, como se indica en el post anterior, que el sistema de bases de datos que utilizaríamos en nuestro proyecto sería, finalmente, por replicación hemos empezado a hacer unas cuantas pruebas. Lo primero de todo decir que, después de unas horas de lucha intensa con diferentes fuentes de información sobre master-slave de MySQL, hemos… <a href="http://www.lauraberdasco.com/2009/03/replicacion-mysql-con-master-slave-sobre-ubuntu-810-master/" rel="bookmark">leer más</a>]]></description>
			<content:encoded><![CDATA[<p>Tras decidir, como se indica en el <a title="Limitaciones de MySQL Cluster, decisión final" href="http://www.lauraberdasco.com/?p=261" target="_blank">post anterior</a>, que el sistema de bases de datos que utilizaríamos en nuestro proyecto sería, finalmente, por replicación hemos empezado a hacer unas cuantas pruebas. Lo primero de todo decir que, después de unas horas de lucha intensa con diferentes fuentes de información sobre <em>master-slave</em> de <strong>MySQL</strong>, hemos conseguido montar un primer sistema sencillo con el que podremos hacer diferentes prueb as encaradas a su implementación final sobre <strong>Amazon EC2</strong>. En la publicación que os presento hoy repasaremos estos pasos iniciales que tanto nos ha costado realizar. Partimos de una base de datos (<em>base_datos</em>) completamente vacía (<em>sin registro alguno</em>); para bases de datos que no esté vacía, el sistema de montaje es un poco diferente.</p>
<p><strong>NOTA</strong>: El sistema operativo sobre el cuál realizamos el montaje es Ubuntu 8.10.</p>
<p><strong>Configuración del master</strong></p>
<p>En este apartado os indicaré los pasos que hemos seguido para montar nuestro servidor <em>master</em>.</p>
<ol>
<li>Como muchos de vosotros estaréis pensando, uno de los pasos necesarios para la configuración del sistema de MySQL es la edición de su archivo de configuración (valgase la redundancia). En este caso, efectivamente, lo primero que tendremos que hacer será editar <em>my.cnf</em> con privilegios de <em>root</em>; para ello, abriremos el terminal y escribiremos la siguiente línia (<em>la ruta puede variar. Os dejo la ruta donde se encuentra mi archivo de configuración</em>):<br />
<code><br />
sudo gedit /etc/mysql/my.cnf<br />
</code></li>
<li>Introducir en el apartado <strong>[mysqld]</strong> los siguientes atributos:<br />
<code><br />
server-id=1<br />
innodb_flush_log_at_trx_commit=1<br />
sync_binlog=1<br />
log-bin=mysql-bin<br />
binlog-do-db=base_datos<br />
</code></p>
<p>Vamos por partes:</p>
<ul>
<li>El id del server, para definir un master, debe ser 1. Por eso indicamos que<em> server-id=1</em>.</li>
<li><em>innodb_flush_log_at_trx_commit=1</em> y <em>sync_binlog=1</em> son dos atributos que colocamos en este caso (leer más en el artículo anterior) ya que decidímos que el master debería tener como motor de almacenamiento el <strong>InnoDB</strong>. Para más información, consultar la documentación de <a title="MySQL Configuration Master" href="http://dev.mysql.com/doc/refman/5.0/en/replication-howto-masterbaseconfig.html" target="_blank">MySQL</a>.</li>
<li><em>log-bin</em> debe indicar en que archivo se escribirá el log del máster. En este caso, utilizamos el mismo que utiliza MySQL. Os dejo un <a title="Replicación master slave" href="http://ele-zeta.com.ar/2007/11/20/replicacion-de-bases-de-datos-mysql-parte-2/" target="_blank">tutorial</a> en el que podréis ver que este archivo log puede destinarse en cualquier lugar.</li>
<li><em>binlog-do-db=base_datos</em> , le indica al master sobre qué base de datos debe guardar la actividad.</li>
</ul>
<p><strong>IMPORTANTE</strong>: Comentaremos las opciones de <em>skip-networking</em> y <em>bind-address</em> que se encuentran en ese mismo archivo de configuración, en el caso de que existan. Para comentar las líneas debemos situarnos al principio de la línea y añadir un símbolo <strong>#</strong>.</li>
<li>Reiniciar el servidor MySQL<br />
<code><br />
sudo /etc/init.d/mysql restart<br />
</code></li>
<li>Acceder a la consola de MySQL, como <em>root</em>.<br />
<code><br />
mysql -u root -p<br />
</code><br />
Dentro crearemos un usuario &#8220;slave&#8221; para que pueda ponerse en contacto con nuestro <em>master</em> y retendremos información del estado del máster para establecer un punto de inicio antes de comenzar el proceso de replicación con el <em>slave</em>.<br />
<code><br />
GRANT REPLICATION SLAVE ON *.* TO 'usuarioslave'@'%' IDENTIFIED BY 'clave_acceso_slave';<br />
FLUSH PRIVILEGES;<br />
USE  base_datos;<br />
FLUSH TABLES WITH READ LOCK;<br />
SHOW MASTER STATUS;<br />
+----------------------------+------------+----------------------+---------------------------+<br />
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB |<br />
+---------------------------+-------------+----------------------+---------------------------+<br />
| mysql-bin.000007 |       98   | base_datos    |                             |<br />
+----------------------------+------------+----------------------+---------------------------+<br />
UNLOCK TABLES;</code></p>
<p><strong>NOTA</strong>: &#8216;%&#8217; puede substituirse también por una dirección IP o DNS concreta. Pero para hacer pruebas, este símbolo ya nos sirve.</li>
<li><strong>NOTA2</strong>: En el caso en el que queramos más slaves, tendremos que darles permisos a cada uno de ellos, con la línea descrita &#8220;GRANT REPLICATION SLAVE ON *.* TO &#8216;usuarioslave&#8217;@'%&#8217; IDENTIFIED BY &#8216;clave_acceso_slave&#8217;;&#8221; .</li>
<li>Una vez hecho todo esto, saldremos de la consola de MySQL con la sentencia:<br />
<code><br />
exit;<br />
</code></li>
</ol>
<p><strong>NOTA DE LA AUTORA</strong>: A partir de aquí empezaría la configuración del <em>slave</em>. Deseo que tengáis paciencia, en breve la acabaré de redactar y la compartiré con vosotros. Si téneis cualquier duda o sugerencia, solo téneis que dejar un comentario <img src='http://www.lauraberdasco.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Muchas gracias!</p>
<p>Esto es todo, de momento, desde el zulo, pigüinos y manzaitas world! (aún, sin jefe&#8230; <img src='http://www.lauraberdasco.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> )</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lauraberdasco.com/2009/03/replicacion-mysql-con-master-slave-sobre-ubuntu-810-master/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Limitaciones de MySQL Cluster, decisión final</title>
		<link>http://www.lauraberdasco.com/2009/03/limitaciones-de-mysql-cluster-decision-final/</link>
		<comments>http://www.lauraberdasco.com/2009/03/limitaciones-de-mysql-cluster-decision-final/#comments</comments>
		<pubDate>Mon, 09 Mar 2009 10:52:09 +0000</pubDate>
		<dc:creator>laura</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[cluster]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.lauraberdasco.com/?p=261</guid>
		<description><![CDATA[En el proyecto que estamos desarrollando necesitamos, antes que nada, una alta y fácil escalabilidad del sistema de datos y por eso, en el momento de escoger el tipo de sistema de bases de datos que íbamos a utilizar pensamos como primera opción en el cluster de MySQL. MySQL Cluster nos permitía tener esa flexibilidad,… <a href="http://www.lauraberdasco.com/2009/03/limitaciones-de-mysql-cluster-decision-final/" rel="bookmark">leer más</a>]]></description>
			<content:encoded><![CDATA[<p>En el proyecto que estamos desarrollando necesitamos, antes que nada, una alta y fácil escalabilidad del sistema de datos y por eso, en el momento de escoger el tipo de sistema de bases de datos que íbamos a utilizar pensamos como primera opción en el cluster de MySQL. MySQL Cluster nos permitía tener esa flexibilidad, además de una simple replicación y transmisión de los datos&#8230; en un principio, creímos que la elección era acertada. Aún así, nos quedaban cosas por descubrir.</p>
<p>Intentamos trasladar la idea del Cluster y su montaje a un entorno EC2 de Amazon con su almacenamiento en nube (Elastic Compute Cloud) -<em>más información sobre EC2 en los blogs de <a title="Santi's Blog" href="http://nowaynoback.com" target="_blank">Santi</a> y <a title="Xavi's blog" href="http://ixavi.com" target="_blank">Xavi</a>, o en la página oficial de <a title="Amazon EC2" href="http://aws.amazon.com/ec2/" target="_blank">Amazon EC2</a></em>- y algo empezó a no cuadrar. Nos dimos cuenta, primeramente, que MySQL Cluster es un sistema cuyo <strong>uso es recomendado en redes locales</strong> que permitan una rápida velocidad y no es un sistema orientado a sistemas web; aún así, decidimos seguir adelante.</p>
<p>Otra piedra en el camino la encontramos unas horas más tarde, cuando leímos (<em>en algún apartado de la documentación de <a title="MySQL Cluster" href="http://dev.mysql.com/doc/refman/5.0/es/ndbcluster.html" target="_blank">MySQL Cluster</a></em>) que la<strong> seguridad entre la comunicación de los nodos de datos dejaba bastante que desear</strong> ya que ésta no estaba encriptada y corrías el peligro de que pudieran interceptar informaciones del sistema. Es por eso que se recomendaba la proximidad entre nodos; nuestra idea era crear diferentes instancias en EC2 que sirvieran como nodos de datos independientes y Amazon no te garantiza ningún tipo de &#8220;proximidad&#8221; entre instancias (<em>si es que puede hablarse de proximidad como una propiedad realmente física</em>). Aún así, decidimos arriesgarnos a continuar con nuestra primera solución.</p>
<p>Algunos dicen que nuestro sistema, en papel, está muy bien organizado y una vez implementado la mitad de los elementos que aparecen en el modelo de datos desaparecen. Otros dicen que no es necesario el uso de Foreign Keys (claves foráneas) en el momento real de la implementación. Aún así, nosotros estamos en la convicción de que si que lo son y por eso queríamos que nuestro sistema de base de datos las tuviera en cuenta; no importa que digáis que esta es una reflexión demasiado metódica, somos estudiantes en su último año de carrera y apostamos por un sistema bien hecho desde el principio. Por esto, cuando vimos que el motor del Cluster (ndbcluster) <strong>no soportaba claves foráneas</strong> decidimos no jugar más con dicha estructura.</p>
<p>Nos estuvimos peleando durante varias horas barajando diferentes motores e información diversa de sistemas de bases de datos y finalmente nos dimos cuenta que el propio MySQL tiene un sistema de replicación <em>master-slave</em> que permite el uso de diferentes motores para el <em>master</em> y para el <em>slave</em>. Concretamente, podíamos tener en el <em>master</em> el motor de MySQL <strong>InnoDb</strong> que si que soporta el uso de claves foráneas (tan importantes en nuestro sistema) y utilizar el motor <strong>MyIsam</strong> para los <em>slaves</em>. Este sistema se puede montar fácilmente en un entorno EC2, guardando todos los datos en un volumen <strong>EBS</strong> y utilizando las instancias para montar el <em>master-slave</em> sin contener datos propios. Esta es la última deducción, ya veremos si finalmente es la acertada.</p>
<p>En los próximos días publicaremos las pruebas que vayamos haciendo en su construcción en EC2.</p>
<p>Esto es todo por hoy desde el zulo, pingüinos y manzanitas world! (hoy sin jefe&#8230;)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lauraberdasco.com/2009/03/limitaciones-de-mysql-cluster-decision-final/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

