<?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>Cerebro en la Sombra &#187; Técnico</title>
	<atom:link href="http://blog.osusnet.com/category/tecnico/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.osusnet.com</link>
	<description></description>
	<lastBuildDate>Fri, 30 Jul 2010 11:50:12 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Importar datos a SQL Server directamente desde Excel</title>
		<link>http://blog.osusnet.com/2010/07/08/importar-datos-a-sql-server-directamente-desde-excel/</link>
		<comments>http://blog.osusnet.com/2010/07/08/importar-datos-a-sql-server-directamente-desde-excel/#comments</comments>
		<pubDate>Thu, 08 Jul 2010 07:44:13 +0000</pubDate>
		<dc:creator>Osus</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Técnico]]></category>
		<category><![CDATA[excel]]></category>
		<category><![CDATA[sql-server]]></category>

		<guid isPermaLink="false">http://blog.osusnet.com/?p=4652</guid>
		<description><![CDATA[Otro de esos pequeños problemas cotidianos que pueden acabar por convertirse en una tarea pesada. Siempre que tengo que importar datos de una hoja Excel acabo dando mil vueltas exportando a csv por aquí, importando por allá, etc. cuando en realidad es extremadamente sencillo, copiar y pegar. En el Excel, seleccionamos las celdas a copiar [...]]]></description>
			<content:encoded><![CDATA[<div class="socialize-in-content" style="float:right;"></div><p>Otro de esos pequeños problemas cotidianos que pueden acabar por convertirse en una tarea pesada. Siempre que tengo que importar datos de una hoja <strong><em>Excel</em> </strong>acabo dando mil vueltas exportando a <em><strong>csv</strong></em> por aquí, importando por allá, etc. cuando en realidad es extremadamente sencillo, <em><strong>copiar y pegar</strong></em>.</p>
<p>En el <em><strong>Excel</strong></em>, seleccionamos las celdas a copiar y&#8230; las copiamos <img src='http://blog.osusnet.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' title="Importar datos a SQL Server directamente desde Excel" /> , <em>Ctrl+C</em> o <em>click en el botón derecho y copiar</em>.</p>
<p style="text-align: center;"><a href="http://blog.osusnet.com/wp-content/uploads/2010/07/excel.gif"><img class="aligncenter" title="excel" src="http://blog.osusnet.com/wp-content/uploads/2010/07/excel.gif" alt="excel Importar datos a SQL Server directamente desde Excel" width="268" height="543" /></a></p>
<p>En el cliente de <strong><em>Microsoft SQL Server</em></strong>, abrimos la tabla donde queremos importar los datos y seleccionamos todo haciendo <em>click</em> en la celda superior izquierda, la primera de todas.</p>
<p><a href="http://blog.osusnet.com/wp-content/uploads/2010/07/excel.gif"></a> <a href="http://blog.osusnet.com/wp-content/uploads/2010/07/sqlserver1.gif"><img class="aligncenter size-full wp-image-4655" title="sqlserver1" src="http://blog.osusnet.com/wp-content/uploads/2010/07/sqlserver1.gif" alt="sqlserver1 Importar datos a SQL Server directamente desde Excel" width="365" height="173" /></a></p>
<p>Ahora simplemente debemos pegar las celdas que habíamos copiado anteriormente, (<em>Ctrl+V</em> o <em>botón derecho y pegar</em>).<a href="http://blog.osusnet.com/wp-content/uploads/2010/07/sqlserver2.gif"><img class="aligncenter size-full wp-image-4656" title="sqlserver2" src="http://blog.osusnet.com/wp-content/uploads/2010/07/sqlserver2.gif" alt="sqlserver2 Importar datos a SQL Server directamente desde Excel" width="359" height="612" /></a> Ya está! Así de sencillo. Anda que no le he dado vueltas yo a estas cosas&#8230;</p>
<p>Debes prestar atención, eso sí, a las características de cada campo (autonuméricos, campos null, etc&#8230;).</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.osusnet.com/2010/07/08/importar-datos-a-sql-server-directamente-desde-excel/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Renombrar fotografías en orden cronológico de captura usando la información EXIF</title>
		<link>http://blog.osusnet.com/2010/07/07/renombrar-fotografias-en-orden-cronologico-de-captura-usando-la-informacion-exif/</link>
		<comments>http://blog.osusnet.com/2010/07/07/renombrar-fotografias-en-orden-cronologico-de-captura-usando-la-informacion-exif/#comments</comments>
		<pubDate>Wed, 07 Jul 2010 17:21:18 +0000</pubDate>
		<dc:creator>Osus</dc:creator>
				<category><![CDATA[Fotografía]]></category>
		<category><![CDATA[Técnico]]></category>
		<category><![CDATA[exif]]></category>

		<guid isPermaLink="false">http://blog.osusnet.com/?p=4644</guid>
		<description><![CDATA[Como sabéis, suelo hacer muchas, muchísimas fotos mensualmente. Además las suelo hacer con distintas cámaras, con lo que al sacarlas de las tarjetas de memoria y meterlas en la misma carpeta no quedan ordenadas cronológicamente. Muchas veces he tenido que pasarme horas renombrándolas para tenerlas bien ordenaditas, sobre todo cuando quiero hacer un libro de [...]]]></description>
			<content:encoded><![CDATA[<div class="socialize-in-content" style="float:right;"></div><p>Como sabéis, suelo hacer muchas, muchísimas fotos mensualmente. Además las suelo hacer con distintas cámaras, con lo que al sacarlas de las tarjetas de memoria y meterlas en la misma carpeta no quedan ordenadas cronológicamente. Muchas veces he tenido que pasarme horas renombrándolas para tenerlas bien ordenaditas, sobre todo cuando quiero hacer un libro de fotos.</p>
<p>Hoy estaba decidido a crearme un <em>script</em> propio en <strong>PHP</strong> usando la <a href="http://php.net/manual/en/book.exif.php">librería</a> <a href="http://es.wikipedia.org/wiki/Exchangeable_image_file_format">EXIF</a> que leyese esta información y renombrase las fotos en base a ella cuando me he encontrado con <a href="http://www.sentex.net/~mwandel/jhead/">Jhead</a>, un pequeño programilla disponible para Linux, Windows y OSX que lo hace directamente y además tiene multitud de opciones.</p>
<p>Simplemente debes descargar el ejecutable y copiarlo en alguna ruta accesible (<em>/usr/local/bin</em>, <em>c:\windows</em>&#8230;) y listo para utilizar.</p>
<p>Desde la línea de comandos, nos vamos a la carpeta donde tenemos las fotos mezcladas y ejecutamos:</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1">jhead -n%Y-%m-%d_%H-%M-%S *.jpg</div>
</li>
</ol>
</div>
<p>Eso es todo, automáticamente nuestras fotos quedarán ordenadas por nombre, algo como:</p>
<ul>
<li>2010-01-04_12-05-12.jpg</li>
<li>2010-01-04_12-05-20.jpg</li>
<li>2010-02-01_19-10-02-jpg</li>
<li>&#8230;.</li>
</ul>
<p>Es decir: <em>YYYY-MM-DD_HH-MM-SS.jpg</em>.</p>
<p>Un trabajo menos <img src='http://blog.osusnet.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' title="Renombrar fotografías en orden cronológico de captura usando la información EXIF" /> .</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.osusnet.com/2010/07/07/renombrar-fotografias-en-orden-cronologico-de-captura-usando-la-informacion-exif/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Reempaquetar el rpm de Portsentry para que loguee en su propio archivo</title>
		<link>http://blog.osusnet.com/2010/06/04/reempaquetar-el-rpm-de-portsentry-para-que-loguee-en-su-propio-archivo/</link>
		<comments>http://blog.osusnet.com/2010/06/04/reempaquetar-el-rpm-de-portsentry-para-que-loguee-en-su-propio-archivo/#comments</comments>
		<pubDate>Fri, 04 Jun 2010 16:44:06 +0000</pubDate>
		<dc:creator>Osus</dc:creator>
				<category><![CDATA[Sistemas]]></category>
		<category><![CDATA[Técnico]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[portsentry]]></category>
		<category><![CDATA[seguridad]]></category>

		<guid isPermaLink="false">http://blog.osusnet.com/?p=4632</guid>
		<description><![CDATA[Desde hace mucho tiempo utilizo como media preventiva de seguridad el paquete Portsentry en los servidores para detectar potenciales accesos maliciosos y bloquearlos directamente en el firewall. El problema es que por defecto Portsentry deja sus logs en el archivo principal del sistema, /var/log/messages, lo que genera tal cantidad de ruido que es imposible encontrar [...]]]></description>
			<content:encoded><![CDATA[<div class="socialize-in-content" style="float:right;"></div><p>Desde hace mucho tiempo utilizo como media preventiva de seguridad el paquete <a href="http://sourceforge.net/projects/sentrytools/">Portsentry</a> en los servidores para detectar potenciales accesos maliciosos y bloquearlos directamente en el firewall. El problema es que por defecto <strong>Portsentry</strong> deja sus logs en el archivo principal del sistema, <em>/var/log/messages</em>, lo que genera tal cantidad de ruido que es imposible encontrar algo útil en el log. El archivo donde loguea Portsentry no es configurable sino que viene predefinido en tiempo de compilación, con lo que deberemos recompilarlo si queremos que sea otro. Podríamos compilar e instalar el fuente directamente, pero no quiero perder las ventajas que ofrece rpm, veamos como hacerlo para Centos5.5 (o RHEL5.5).</p>
<p>Lo primero que debemos hacer es descargar e instalar el rpm con los fuentes desde <a href="ftp://ftp.pbone.net/mirror/ftp.falsehope.net/home/tengel/SRPMS/portsentry-1.2-1.te.src.rpm">aquí</a>.</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re3">#rpm -ivh portsentry<span class="nu0">-1.2</span><span class="nu0">-1</span>.te.src.rpm</span></div>
</li>
</ol>
</div>
<p>Ahora debemos modificar el archivo donde se configura dónde logueará:</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re3">#cd /usr/src/redhat/SOURCES</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re3">#tar xvfz portsentry<span class="nu0">-1.2</span>.<span class="kw2">tar</span>.gz</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re3">#cd portsentry_beta</span></div>
</li>
</ol>
</div>
<p>Editamos el archivo<em> portsentry_config.h</em> cambiando la línea 32 para que quede así:</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re3">#define SYSLOG_FACILITY LOG_LOCAL6</span></div>
</li>
</ol>
</div>
<p>Con esto simplemente le decimos que loguee al<em><strong> &#8220;facility&#8221; local6</strong></em> en vez de al<strong> &#8220;daemon&#8221;</strong> por defecto.</p>
<p>Se guarda el archivo y se empaqueta de nuevo:</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re3">#tar cvfz portsentry<span class="nu0">-1.2</span>.<span class="kw2">tar</span>.gz portsentry_beta</span></div>
</li>
</ol>
</div>
<p>Ya podemos reconstruir el rpm:</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re3">#cd /usr/src/redhat/SPECS</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re3">#rpmbuild -ba portsentry.spec</span></div>
</li>
</ol>
</div>
<p>Si todo va bien tendremos el paquete generado:</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re3">#cd /usr/src/redhat/RPMS/x86_64</span></div>
</li>
</ol>
</div>
<p>Y ahí estará nuestro<em><strong> portsentry-1.2-1.te.x86_64.rpm</strong></em> preparado para loguear donde queremos que lo haga. Sólo queda instalarlo. Si tu arquitectura es de 32bits lo encontrarás en<em> /usr/src/redhat/RPMS/i386</em>.</p>
<p>Nos queda un detalle, configurar <em><strong>syslog</strong></em> para que guarde donde nos interesa la<em><strong> facility local6</strong></em>. Para eso editamos <em>/etc/syslog.conf</em>. Añadimos al final de todo la línea:</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1">local6.*   /var/log/portsentry.log</div>
</li>
</ol>
</div>
<p>y al principio de todo veremos algo parecido a:</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1">*.info;mail.none;authpriv.none;cron.none /var/log/messages</div>
</li>
</ol>
</div>
<p>La cambiaremos por:</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1">*.info;mail.none;authpriv.none;cron.none;local6.none    /var/log/messages</div>
</li>
</ol>
</div>
<p>Es decir, le decimos que de <em><strong>local6</strong></em> no loguee nada en <em>/var/log/messages</em>. Solo nos queda reiniciar los demonios:</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re3">#/sbin/service syslog restart</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re3">#/sbin/service portsentry start</span></div>
</li>
</ol>
</div>
<p>A partir de ahora tendremos nuestro log general bien limpio y la información de se seguridad separada.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.osusnet.com/2010/06/04/reempaquetar-el-rpm-de-portsentry-para-que-loguee-en-su-propio-archivo/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>SAI Salicru bajo Linux con nut y monitorización en Cacti</title>
		<link>http://blog.osusnet.com/2010/05/28/sai-salicru-bajo-linux-con-nut-y-monitorizacion-en-cacti/</link>
		<comments>http://blog.osusnet.com/2010/05/28/sai-salicru-bajo-linux-con-nut-y-monitorizacion-en-cacti/#comments</comments>
		<pubDate>Fri, 28 May 2010 11:42:16 +0000</pubDate>
		<dc:creator>Osus</dc:creator>
				<category><![CDATA[Sistemas]]></category>
		<category><![CDATA[Técnico]]></category>
		<category><![CDATA[cacti]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[sai]]></category>

		<guid isPermaLink="false">http://blog.osusnet.com/?p=4611</guid>
		<description><![CDATA[Recientemente he tenido que cambiar el SAI que tenía en casa desde hace unos años, un Powermust 1000 que me había dado muy buen resultado, sin embargo las baterías habían llegado a su fin. En App encontré uno con muy buena pinta, con puerto USB para monitorización, indicaban que soportaba Linux y, además, fabricado en [...]]]></description>
			<content:encoded><![CDATA[<div class="socialize-in-content" style="float:right;"></div><p>Recientemente he tenido que cambiar el <strong>SAI</strong> que tenía en casa desde hace unos años, un <strong>Powermust 1000</strong> que me había dado muy buen resultado, sin embargo las baterías habían llegado a su fin. En <a href="http://www.appinformatica.com/">App</a> encontré uno con muy buena pinta, con puerto <strong>USB</strong> para monitorización, indicaban que soportaba <strong>Linux</strong> y, además, fabricado en España <img src='http://blog.osusnet.com/wp-includes/images/smilies/icon_neutral.gif' alt=':|' class='wp-smiley' title="SAI Salicru bajo Linux con nut y monitorización en Cacti" /> , el <a href="http://www.appinformatica.com/sais-salicru-sai-sps-900-one.php">Salicru SPS 900 One</a>, a un precio insuperable. Me lo llevo <img src='http://blog.osusnet.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' title="SAI Salicru bajo Linux con nut y monitorización en Cacti" /> .</p>
<p>La decepción llegó al instalarlo. La monitorización se hace a través de una aplicación propia, algo que no me convencía ya que estaba acostumbrado a utilizar <a href="http://www.networkupstools.org/">nut</a> y a tenerlo integrado en <a href="http://blog.osusnet.com/tag/cacti/">Cacti</a>.</p>
<p>Leyendo y probando algunos <em>drivers </em>encontré cómo hacerlo funcionar <img src='http://blog.osusnet.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' title="SAI Salicru bajo Linux con nut y monitorización en Cacti" /> . Muy sencillo.</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1">./configure &#8211;with-usb &#8211;with-snmp &#8211;with-cgi &#8211;<span class="re2">prefix=</span>/usr &#8211;with-<span class="re2">cgipath=</span>/path/to/cgi-bin/nut/</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">make</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">make</span> <span class="kw2">install</span></div>
</li>
</ol>
</div>
<p>Esto instalará todo lo necesario y dejará los <em>scripts </em>para acceder vía web al estado del SAI en la ruta indicada.</p>
<p>No voy a entrar en detalles de la configuración, sólo indicar que el <em>driver </em>a utilizar es <em><strong>blazer_usb</strong></em>:</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">cat</span> /etc/ups/ups.conf</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#91;</span>salicru<span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1">driver = blazer_usb</div>
</li>
<li class="li1">
<div class="de1">port    = auto</div>
</li>
<li class="li2">
<div class="de2">desc    = <span class="st0">&quot;Sai Salicru 900&quot;</span></div>
</li>
</ol>
</div>
<p>Con eso iniciamos los demonios <strong><em>upsd </em></strong>y si todo va bien  lo tendremos funcionando. Si vamos a la ruta donde dejamos los scripts web veremos:</p>
<p style="text-align: center;"><a href="http://blog.osusnet.com/wp-content/uploads/2010/05/ups0.png"><img class="aligncenter" title="ups0" src="http://blog.osusnet.com/wp-content/uploads/2010/05/ups0.png" alt="ups0 SAI Salicru bajo Linux con nut y monitorización en Cacti" width="470" /></a></p>
<p><a href="http://blog.osusnet.com/wp-content/uploads/2010/05/ups1.png"><img class="aligncenter" title="ups1" src="http://blog.osusnet.com/wp-content/uploads/2010/05/ups1.png" alt="ups1 SAI Salicru bajo Linux con nut y monitorización en Cacti" width="470" /></a>Primer paso preparado. Vamos ahora a configurar el monitor de avisos para que sepamos cuando el SAI cambia de estado (se va la luz en casa, vuelve, se queda sin batería, etc.). Esto lo controla el demonio <em><strong>upsmon</strong></em>. Como veis se monitoriza todo bien excepto el nivel de batería, este SAI no informa de ese dato, pero tampoco es algo crítico, los cambios de estado sí que funcionan correctamente, con eso es suficiente para nuestro propósito.</p>
<p>Primero preparamos la configuración.</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re3"># <span class="kw2">cat</span> upsmon.conf</span></div>
</li>
<li class="li1">
<div class="de1">MONITOR salicru@localhost <span class="nu0">1</span> monmaster momi master</div>
</li>
<li class="li1">
<div class="de1">MINSUPPLIES <span class="nu0">1</span></div>
</li>
<li class="li1">
<div class="de1">SHUTDOWNCMD <span class="st0">&quot;/sbin/shutdown -h +0&quot;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">NOTIFYCMD /bin/avisoups</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">POLLFREQ <span class="nu0">5</span></div>
</li>
<li class="li1">
<div class="de1">POLLFREQALERT <span class="nu0">5</span></div>
</li>
<li class="li2">
<div class="de2">HOSTSYNC <span class="nu0">15</span></div>
</li>
<li class="li1">
<div class="de1">DEADTIME <span class="nu0">15</span></div>
</li>
<li class="li1">
<div class="de1">POWERDOWNFLAG /etc/killpower</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">NOTIFYMSG ONBATT <span class="st0">&quot;El SAI esta funcionando con bateria.&quot;</span></div>
</li>
<li class="li2">
<div class="de2">NOTIFYMSG LOWBATT <span class="st0">&quot;La bateria del SAI esta muy baja&quot;</span></div>
</li>
<li class="li1">
<div class="de1">NOTIFYMSG SHUTDOWN <span class="st0">&quot;El servidor sera apagado inmediatamente&quot;</span></div>
</li>
<li class="li1">
<div class="de1">NOTIFYMSG ONLINE <span class="st0">&quot;EL SAI esta funcionando con alimentacion externa&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">NOTIFYFLAG ONBATT WALL+EXEC</div>
</li>
<li class="li2">
<div class="de2">NOTIFYFLAG LOWBATT WALL+EXEC</div>
</li>
<li class="li1">
<div class="de1">NOTIFYFLAG SHUTDOWN WALL+EXEC</div>
</li>
<li class="li1">
<div class="de1">NOTIFYFLAG ONLINE WALL+EXEC</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">RBWARNTIME <span class="nu0">43200</span></div>
</li>
<li class="li2">
<div class="de2">NOCOMMWARNTIME <span class="nu0">300</span></div>
</li>
<li class="li1">
<div class="de1">FINALDELAY <span class="nu0">5</span></div>
</li>
</ol>
</div>
<p>Además de definir los mensajes que queremos recibir, le indicamos también que en los cambios de estado llame al script <strong><em>/bin/avisoups</em></strong>.</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re3"># <span class="kw2">cat</span> /bin/avisoups</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re3">#!/bin/bash</span></div>
</li>
<li class="li1">
<div class="de1">/bin/<span class="kw3">echo</span> <span class="st0">&quot;$*&quot;</span> | /usr/<span class="kw3">local</span>/bin/gammu &#8211;sendsms TEXT <span class="nu0">666666666</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">echo</span> <span class="st0">&quot;$*&quot;</span> | mail -s <span class="st0">&quot;Aviso del SAI&quot;</span> tu@tudominio.com</div>
</li>
</ol>
</div>
<p>Este <em>script </em>se ejecutará en cada cambio de estado que se produzca en el SAI y recibirá como parámetro el texto correspondiente al nuevo estado. En mi caso me envío un email y un SMS a través de <a href="http://blog.osusnet.com/2008/06/04/alertas-y-acciones-en-tu-servidor-a-traves-de-sms/">Gammu</a>.</p>
<p>Levantamos el demonio <em><strong>upsmon</strong></em> y probamos a enchufar y desenchufar la alimentación externa del SAI. Si todo va bien recibirás un email y/o un sms con el aviso <img src='http://blog.osusnet.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' title="SAI Salicru bajo Linux con nut y monitorización en Cacti" /> .</p>
<p>Cuando al SAI se le termine la batería apagará el servidor para evitar que se corte la alimentación de golpe. Si configuras la Bios para que arranque automáticamente cuando reciba alimentación, se reiniciará él solito en cuanto vuelva la luz <img src='http://blog.osusnet.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' title="SAI Salicru bajo Linux con nut y monitorización en Cacti" /> .</p>
<h3>Integración con Cacti</h3>
<p>Para integrar la monitorización en <a href="http://www.cacti.net/">Cacti</a> podemos utilizar <a href="http://forums.cacti.net/about14475.html">estas plantillas</a> ya creadas.</p>
<p>Una vez instalada y creada en el host que hace de monitor debemos configurar el &#8220;<em>Data source</em>&#8221; correspondiente indicando el SAI que debe monitorizar, en mi caso <strong><em>salicru@localhost</em></strong>.</p>
<p><a href="http://blog.osusnet.com/wp-content/uploads/2010/05/Cacti_1275046149348.png"><img class="aligncenter" title="Cacti_1275046149348" src="http://blog.osusnet.com/wp-content/uploads/2010/05/Cacti_1275046149348.png" alt="Cacti 1275046149348 SAI Salicru bajo Linux con nut y monitorización en Cacti" width="470" /></a>Si todo ha ido bien, comenzaremos a ver la gráfica de nuestro SAI. Tendremos sólo las líneas <em>Input, Output y Load</em>, la de <em>Batteries</em>, como he indicado, no se recibe en este SAI.</p>
<p style="text-align: center;"><a href="http://blog.osusnet.com/wp-content/uploads/2010/05/graph_image.png"><img class="aligncenter" title="graph_image" src="http://blog.osusnet.com/wp-content/uploads/2010/05/graph_image.png" alt="graph image SAI Salicru bajo Linux con nut y monitorización en Cacti" width="470" /></a></p>
<p>Ya tenemos nuestro SAI <em>baratito </em>bien instalado y configurado. A partir de ahora nos avisará cuando haya cortes de luz, apagará el equipo, se encenderá de nuevo automáticamente y, si lo configuramos todo bien, tendremos hasta un SMS en nuestro móvil. Y todo ello monitorizado a través de Cacti <img src='http://blog.osusnet.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' title="SAI Salicru bajo Linux con nut y monitorización en Cacti" /> .</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.osusnet.com/2010/05/28/sai-salicru-bajo-linux-con-nut-y-monitorizacion-en-cacti/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Adobe Air XI &#8211; Despliega tus aplicaciones directamente desde la web</title>
		<link>http://blog.osusnet.com/2010/05/05/adobe-air-xi-despliega-tus-aplicaciones-directamente-desde-la-web/</link>
		<comments>http://blog.osusnet.com/2010/05/05/adobe-air-xi-despliega-tus-aplicaciones-directamente-desde-la-web/#comments</comments>
		<pubDate>Wed, 05 May 2010 12:07:06 +0000</pubDate>
		<dc:creator>Osus</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[R.I.A.]]></category>
		<category><![CDATA[Técnico]]></category>
		<category><![CDATA[adobe]]></category>
		<category><![CDATA[air]]></category>

		<guid isPermaLink="false">http://blog.osusnet.com/?p=4514</guid>
		<description><![CDATA[Vuelvo con un artículo sobre la serie que hice hace algún tipo acerca de Adobe Air. Uno de los principales problemas con los que me he encontrado al desarrollar con Air es a la hora del despliegue, ya que los clientes deben instalarse primero el framework y después la aplicación, lo que da lugar a [...]]]></description>
			<content:encoded><![CDATA[<div class="socialize-in-content" style="float:right;"></div><p>Vuelvo con un artículo sobre la serie que hice hace algún tipo acerca de <a href="http://www.adobe.com/products/air/">Adobe Air</a>.</p>
<p>Uno de los principales problemas con los que me he encontrado al desarrollar con <strong>Air</strong> es a la hora del despliegue, ya que los clientes deben instalarse primero el <em>framework </em>y después la aplicación, lo que da lugar a muchas dudas y potenciales problemas. Para solucionarlo existe una librería de Adobe que permite saber si un cliente tiene instalado el <em>framework </em>y tu aplicación directamente desde una página web y lanzar la instalación de ambos en caso de que no los tenga, de esta manera los usuarios no tienen que descargar nada, todo muy sencillo e intuitivo.</p>
<p>Para interactuar con esta librería existe además una pequeña aplicación <em>Flash</em> que se distribuye con el <em>sdk</em> de <em>Flex</em> con los conceptos básicos: comprobar si el cliente tiene el <em>framework </em>y lanzar la instalación si es necesario. La podéis encontrar en:</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1">C:\Archivos de programa\Adobe\Adobe Flash Builder <span class="nu0">4</span>\sdks\<span class="nu0">4.0</span><span class="nu0">.0</span>\samples\badge</div>
</li>
</ol>
</div>
<p>Sin embargo puede ser realmente tedioso configurarla y programarla adecuadamente, así que existe <strong>Badger</strong>, una aplicación <strong>AIR</strong> que enmascara todo este proceso con un sencillo asistente donde rellenas los parámetros, incluidas las cadenas de texto a utilizar, y te genera el código necesario. Puedes descargarla <a href="http://download.macromedia.com/pub/developer/air/badger.air">aquí</a>.</p>
<p>Al ejecutarla veremos la pantalla principal.</p>
<p><a href="http://blog.osusnet.com/wp-content/uploads/2010/05/badger.gif"><img class="aligncenter size-full wp-image-4521" title="badger" src="http://blog.osusnet.com/wp-content/uploads/2010/05/badger.gif" alt="badger Adobe Air XI   Despliega tus aplicaciones directamente desde la web" width="470" height="375" /></a></p>
<p>Por defecto solo hay un <em>template</em>, así que el primer menú lo podemos obviar. Con el segundo seleccionas tu aplicación AIR para que <strong>Badger </strong>cargue automáticamente algunos de los parámetros y, cuando has terminado, con la última opción &#8220;<strong>Export badge</strong>&#8221; generas el código.</p>
<p>Dentro de la configuración hay dos campos importantes. &#8220;<em><strong>application url</strong></em>&#8220;, debes introducir la <em>url </em>completa (con http://) desde donde se descargará la aplicación, y &#8220;<em><strong>publisher ID</strong></em>&#8220;, donde tienes que seleccionar la ruta donde la tienes instalada localmente para que <strong>Badger </strong>lea automáticamente este dato, imprescindible para comprobar si el cliente ya la tiene instalada.</p>
<p>Al subir todos los archivos generados a tu web (el <em>html </em>puedes integrarlo adecuadamente) y cargar la <em>url </em>en un navegador verás algo parecido a esto suponiendo que no tienes la aplicación (o el <em>framework</em>) instalados.</p>
<p style="text-align: center;"><a href="http://blog.osusnet.com/wp-content/uploads/2010/05/Zed_1273050499847.png"><img class="size-full wp-image-4520 aligncenter" title="1273050499847" src="http://blog.osusnet.com/wp-content/uploads/2010/05/Zed_1273050499847.png" alt="Zed 1273050499847 Adobe Air XI   Despliega tus aplicaciones directamente desde la web" width="221" height="185" /></a></p>
<p>Al hacer click en &#8220;Instalar&#8221;, si no tienes el framework instalado, te pedirá autorización y comenzará la descarga:</p>
<p style="text-align: center;"><a href="http://blog.osusnet.com/wp-content/uploads/2010/05/Instant-Mensamovil-Alvento_1272955528226.png"><img title="Instant Mensamovil - Alvento_1272955528226" src="http://blog.osusnet.com/wp-content/uploads/2010/05/Instant-Mensamovil-Alvento_1272955528226.png" alt="Instant Mensamovil Alvento 1272955528226 Adobe Air XI   Despliega tus aplicaciones directamente desde la web" width="200" /></a><a href="http://blog.osusnet.com/wp-content/uploads/2010/05/Instant-Mensamovil-Alvento_1272955548743.png"><img title="Instant Mensamovil - Alvento_1272955548743" src="http://blog.osusnet.com/wp-content/uploads/2010/05/Instant-Mensamovil-Alvento_1272955548743.png" alt="Instant Mensamovil Alvento 1272955548743 Adobe Air XI   Despliega tus aplicaciones directamente desde la web" width="200" /></a></p>
<p>Para finalmente acabar instalando tu aplicación.</p>
<p><a href="http://blog.osusnet.com/wp-content/uploads/2010/05/mensamovil21.gif"><img class="aligncenter size-full wp-image-4530" title="mensamovil2" src="http://blog.osusnet.com/wp-content/uploads/2010/05/mensamovil21.gif" alt="mensamovil21 Adobe Air XI   Despliega tus aplicaciones directamente desde la web" width="487" height="422" /></a></p>
<p>Si el cliente ya tuviese la aplicación instalada podremos lanzarla automáticamente también. Para conseguirlo es necesario, primero, que en el descriptor de la aplicación hayas configurado el siguiente parámetro a &#8220;<em>true</em>&#8220;:</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1">&lt;allowBrowserInvocation&gt;true&lt;/allowBrowserInvocation&gt;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>Ahora, si el cliente ya tiene nuestra aplicación, veremos algo como esto:</p>
<p><a href="http://blog.osusnet.com/wp-content/uploads/2010/05/Zed_1273050371165.png"><img class="aligncenter size-full wp-image-4519" title="Zed_1273050371165" src="http://blog.osusnet.com/wp-content/uploads/2010/05/Zed_1273050371165.png" alt="Zed 1273050371165 Adobe Air XI   Despliega tus aplicaciones directamente desde la web" width="221" height="186" /></a></p>
<p>Y al hacer click en &#8220;<strong>Lanzar ahora</strong>&#8221; nuestra aplicación se cargará ella sola <img src='http://blog.osusnet.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' title="Adobe Air XI   Despliega tus aplicaciones directamente desde la web" /> .</p>
<p>Como veis es muy sencillo para el cliente instalar así nuestras aplicaciones <strong>AIR</strong>, nada que ver con tener que descargar el <em>framework </em>por un lado y la aplicación por el otro.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.osusnet.com/2010/05/05/adobe-air-xi-despliega-tus-aplicaciones-directamente-desde-la-web/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Nuevo proyecto en 5 horas: UsayTira.me, direcciones de correo de usar y tirar explicado paso a paso</title>
		<link>http://blog.osusnet.com/2010/04/21/nuevo-proyecto-en-5-horas-usaytira-me-direcciones-de-correo-de-usar-y-tirar-explicado-paso-a-paso/</link>
		<comments>http://blog.osusnet.com/2010/04/21/nuevo-proyecto-en-5-horas-usaytira-me-direcciones-de-correo-de-usar-y-tirar-explicado-paso-a-paso/#comments</comments>
		<pubDate>Wed, 21 Apr 2010 19:46:35 +0000</pubDate>
		<dc:creator>Osus</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Proyectos]]></category>
		<category><![CDATA[Técnico]]></category>
		<category><![CDATA[qmail]]></category>

		<guid isPermaLink="false">http://blog.osusnet.com/?p=4140</guid>
		<description><![CDATA[Parece que últimamente me aburro mucho . Hace unos días, leyendo un artículo, se me ocurrió de nuevo explicar cómo se hacen esos sistemas de correo instantáneos que se suelen utilizar para registrarse en webs y que después no te envíen spam . La idea me pareció muy adecuada para poner un ejemplo práctico de [...]]]></description>
			<content:encoded><![CDATA[<div class="socialize-in-content" style="float:right;"></div><p>Parece que últimamente me aburro mucho <img src='http://blog.osusnet.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' title="Nuevo proyecto en 5 horas: UsayTira.me, direcciones de correo de usar y tirar explicado paso a paso" /> . Hace unos días, leyendo un artículo, se me ocurrió de nuevo explicar cómo se hacen esos sistemas de correo instantáneos que se suelen utilizar para registrarse en webs y que después no te envíen spam <img src='http://blog.osusnet.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' title="Nuevo proyecto en 5 horas: UsayTira.me, direcciones de correo de usar y tirar explicado paso a paso" /> . La idea me pareció muy adecuada para poner un ejemplo práctico de algo que vimos hace tiempo sobre <a href="http://blog.osusnet.com/2008/12/31/otras-utilidades-para-un-servidor-de-correo/">otras utilidades para un servidor de correo</a> y, tal y como me ocurrió hace unos meses, lo que <a href="http://blog.osusnet.com/2009/11/24/de-articulo-a-proyecto-explicado-paso-a-paso-acorta-urls-con-iraurl-me/">era un artículo se convierte en proyecto</a>.</p>
<p><a href="http://blog.osusnet.com/wp-content/uploads/2010/04/usaytirame1.gif"><img class="aligncenter size-full wp-image-4143" title="usaytirame1" src="http://blog.osusnet.com/wp-content/uploads/2010/04/usaytirame1.gif" alt="usaytirame1 Nuevo proyecto en 5 horas: UsayTira.me, direcciones de correo de usar y tirar explicado paso a paso" width="470" height="300" /></a></p>
<p>La idea, por tanto, es crear un sistema que, <strong>sin necesidad de ningún registro</strong>, te permita crear una cuenta de correo y recibir y leer <em>emails </em>en ella por espacio de <strong>una hora</strong>, al cabo de este tiempo la cuenta se <em><strong>auto</strong></em><em><strong>destruye</strong> </em>y todos los <em>emails </em>serán devueltos. En nuestra aplicación tendremos dos opciones para crear la cuenta, aleatoria o personalizada, creo que no hacen falta más explicaciones. Una vez usas una cuenta puedes volver a ella más tarde cuando la necesites volviendo a crear una cuenta personalizada con el mismo usuario. Esto es útil, por ejemplo, para que te recuerden la contraseña que utilizaste para registrar en aquella web de descarga de películas y de la que ya no te acuerdas <img src='http://blog.osusnet.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' title="Nuevo proyecto en 5 horas: UsayTira.me, direcciones de correo de usar y tirar explicado paso a paso" /> .</p>
<h3>Qué necesitamos</h3>
<ul>
<li>Servidor Linux con <a href="http://qmail.org">Qmail</a> como MTA.</li>
<li>Apache, PHP y MySQL.</li>
<li><a href="http://pear.php.net/package/Mail_mimeDecode">Pear MimeDecode</a>: para procesar los correos entrantes con PHP.</li>
<li>Una plantilla superchula de <a href="http://www.freecsstemplates.org/">FreeCssTemplates</a></li>
<li><a href="http://jquery.com/">Jquery</a>: para todo lo que es <em>ajax </em>y <em>Javascript</em></li>
<li><a href="http://code.google.com/p/zeroclipboard/">ZeroClipboard</a>:  para copiar y pegar automáticamente</li>
<li><a href="http://plugins.jquery.com/project/ScrollTo">Jquery ScrollTo</a>: pluggin para desplazar el <em>scroll </em>automáticamente.</li>
<li>Una imagen de &#8220;Cargando&#8221; para las acciones <em>ajax </em>que personalizas <a href="http://www.ajaxload.info/">aquí</a>.</li>
<li>Diccionarios de palabras &#8220;aleatorias&#8221;. <a href="http://www.elhacker.org/index.php?Ver=Seccion&amp;Id=15">Aquí</a> hay unos cuantos.</li>
<li><a href="http://adodb.sourceforge.net/">Adodb</a> (opcional) para el acceso a base de datos.</li>
</ul>
<p>Eso es todo, sólo hay que juntar las piezas adecuadamente.</p>
<h3>Preparando Qmail</h3>
<p>Nuestro primer paso, antes de ponernos con los temas puramente web, será configurar adecuadamente el servidor de correo para nuestro propósito. Para ello necesitamos crear un usuario del sistema que reciba todo el correo dirigido a un dominio. Esto lo podemos hacer del siguiente modo:</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1">adduser -g <span class="kw2">users</span> -s /dev/null usaytirame</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">passwd</span> usaytirame UNACLAVESUPERCOMPLICADA</div>
</li>
</ol>
</div>
<p>Añadimos nuestro nombre de host en:</p>
<p><strong>/var/qmail/control/rcpthosts</strong></p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1">usaytira.me</div>
</li>
</ol>
</div>
<p>Y el usuario al que dirigiremos los correos en:</p>
<p><strong>/var/qmail/control/virtualdomains</strong></p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1">usaytira.me:usaytirame</div>
</li>
</ol>
</div>
<p>Reiniciando <strong>Qmail </strong>conseguiremos que los correos enviados a cualquier cuenta del dominio vayan al buzón del usuario indicado, es decir <em>cualquiercosa<strong>[arroba]</strong>usaytira.me</em>.</p>
<p>Pero no queremos que los correos vayan al buzón del usuario sino simplemente procesarlos. Para eso editamos el archivo:</p>
<p><strong>/home/usaytirame/.qmail-default</strong></p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1">|preline /usr/bin/php /home/usaytirame/procesa.php</div>
</li>
</ol>
</div>
<p>Sólo con esa línea. Con este comando conseguimos redirigir los correos entrantes a un <em>script </em>en el que podremos recuperarlos y reutilizarlos a nuestro antojo como veremos a continuación.</p>
<h3>Procesando los emails entrantes</h3>
<p>Vamos a comenzar por crear una base de datos donde guardaremos los emails recibidos. Como queremos poder acceder a los emails dirigidos a cada cuenta independientemente, haremos dos tablas, una (<em>emails</em>) la utilizaremos como tabla maestra para las cuentas de correo que se creen y en la otra (<em>correos</em>) iremos almacenando los emails recibidos para cada una de esas cuentas.  La estructura sería poco más o menos la siguiente:</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1">CREATE TABLE IF NOT EXISTS `emails` <span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; `idEmail` int<span class="br0">&#40;</span><span class="nu0">11</span><span class="br0">&#41;</span> NOT NULL auto_increment,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; `fecha` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; `email` varchar<span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span> NOT NULL,</div>
</li>
<li class="li2">
<div class="de2">&nbsp; `ip` varchar<span class="br0">&#40;</span><span class="nu0">15</span><span class="br0">&#41;</span> NOT NULL,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; PRIMARY KEY &nbsp;<span class="br0">&#40;</span>`idEmail`<span class="br0">&#41;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; KEY `email` <span class="br0">&#40;</span>`email`<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#41;</span> <span class="re2">ENGINE=</span>MyISAM &nbsp;DEFAULT <span class="re2">CHARSET=</span>utf8 <span class="re2">AUTO_INCREMENT=</span><span class="nu0">1</span> ;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">CREATE TABLE IF NOT EXISTS `correos` <span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; `<span class="kw2">id</span>` int<span class="br0">&#40;</span><span class="nu0">11</span><span class="br0">&#41;</span> NOT NULL auto_increment,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; `idEmail` int<span class="br0">&#40;</span><span class="nu0">11</span><span class="br0">&#41;</span> NOT NULL,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; `de` varchar<span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span> NOT NULL,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; `para` varchar<span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span> NOT NULL,</div>
</li>
<li class="li2">
<div class="de2">&nbsp; `subject` varchar<span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span> NOT NULL,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; `fecha` varchar<span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span> NOT NULL,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; `body` text NOT NULL,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; `fullmail` text NOT NULL,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; PRIMARY KEY &nbsp;<span class="br0">&#40;</span>`<span class="kw2">id</span>`<span class="br0">&#41;</span>,</div>
</li>
<li class="li2">
<div class="de2">&nbsp; KEY `idEmail` <span class="br0">&#40;</span>`idEmail`<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#41;</span> <span class="re2">ENGINE=</span>MyISAM &nbsp;DEFAULT <span class="re2">CHARSET=</span>utf8 <span class="re2">AUTO_INCREMENT=</span><span class="nu0">1</span> ;</div>
</li>
</ol>
</div>
<p>Creo que es suficientemente descriptiva. El campo <em>fecha</em> de <em>emails</em> nos servirá para controlar los 60 minutos de duración máxima.</p>
<p>Pues ya tenemos todo preparado. Veamos cómo procesamos los emails.</p>
<p><strong>/home/usaytirame/procesa.php</strong></p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">include</span> <span class="br0">&#40;</span><span class="st0">&quot;mimeDecode.php&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$email</span>=<a href="http://www.php.net/file"><span class="kw3">file</span></a><span class="br0">&#40;</span><span class="st0">&quot;php://stdin&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$email</span>=<a href="http://www.php.net/implode"><span class="kw3">implode</span></a><span class="br0">&#40;</span><span class="st0">&quot;&quot;</span>, <span class="re0">$email</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$params</span><span class="br0">&#91;</span><span class="st0">&#8216;include_bodies&#8217;</span><span class="br0">&#93;</span> = <span class="kw2">true</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$params</span><span class="br0">&#91;</span><span class="st0">&#8216;decode_bodies&#8217;</span><span class="br0">&#93;</span> = <span class="kw2">true</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$params</span><span class="br0">&#91;</span><span class="st0">&#8216;decode_headers&#8217;</span><span class="br0">&#93;</span> = <span class="kw2">true</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$params</span><span class="br0">&#91;</span><span class="st0">&#8216;input&#8217;</span><span class="br0">&#93;</span> = <span class="re0">$email</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="re0">$structure</span> = Mail_mimeDecode::<span class="me2">decode</span><span class="br0">&#40;</span><span class="re0">$params</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$subject</span> = <a href="http://www.php.net/quoted_printable_decode"><span class="kw3">quoted_printable_decode</span></a><span class="br0">&#40;</span><a href="http://www.php.net/trim"><span class="kw3">trim</span></a><span class="br0">&#40;</span><span class="re0">$structure</span>-&gt;<span class="me1">headers</span><span class="br0">&#91;</span><span class="st0">&#8216;subject&#8217;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$ddate</span> = <a href="http://www.php.net/quoted_printable_decode"><span class="kw3">quoted_printable_decode</span></a><span class="br0">&#40;</span><a href="http://www.php.net/trim"><span class="kw3">trim</span></a><span class="br0">&#40;</span><span class="re0">$structure</span>-&gt;<span class="me1">headers</span><span class="br0">&#91;</span><span class="st0">&#8216;date&#8217;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$from</span> = <a href="http://www.php.net/quoted_printable_decode"><span class="kw3">quoted_printable_decode</span></a><span class="br0">&#40;</span><a href="http://www.php.net/trim"><span class="kw3">trim</span></a><span class="br0">&#40;</span><span class="re0">$structure</span>-&gt;<span class="me1">headers</span><span class="br0">&#91;</span><span class="st0">&#8216;from&#8217;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="re0">$to</span> = <a href="http://www.php.net/quoted_printable_decode"><span class="kw3">quoted_printable_decode</span></a><span class="br0">&#40;</span><a href="http://www.php.net/trim"><span class="kw3">trim</span></a><span class="br0">&#40;</span><span class="re0">$structure</span>-&gt;<span class="me1">headers</span><span class="br0">&#91;</span><span class="st0">&#8216;to&#8217;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span><span class="br0">&#40;</span><a href="http://www.php.net/ereg"><span class="kw3">ereg</span></a><span class="br0">&#40;</span><span class="st0">&quot;&lt;(.*)&gt;&quot;</span>, <span class="re0">$to</span>, <span class="re0">$p</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$to</span>=<span class="re0">$p</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$to</span>=<a href="http://www.php.net/strtolower"><span class="kw3">strtolower</span></a><span class="br0">&#40;</span><span class="re0">$to</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Tenemos la primera parte del procesado preparada. De aquí debemos destacar:</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re0">$email</span>=<a href="http://www.php.net/file"><span class="kw3">file</span></a><span class="br0">&#40;</span><span class="st0">&quot;php://stdin&quot;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Con esto leemos desde la entrada estandar el contenido del email. Recordad que no estamos en una <em>aplicación web</em> sino en un <em>script</em> ejecutado en la <strong>consola del sistema</strong>.</p>
<p>La otra línea importante es:</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re0">$structure</span> = Mail_mimeDecode::<span class="me2">decode</span><span class="br0">&#40;</span><span class="re0">$params</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Con ella conseguimos procesar el email y separar su estructura en un <em>array asociativo</em> con los distintos parámetros. Os ayudará mucho ver el contenido de ese <em>array</em>:</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><a href="http://www.php.net/print_r"><span class="kw3">print_r</span></a><span class="br0">&#40;</span><span class="re0">$structure</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>Llegados a este punto podemos hacer una prueba. Necesitamos el contenido completo de un email, podemos sacarlo de nuestro cliente de correo o del propio servidor.</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">cat</span> prueba.eml | /home/usaytirame/procesa.php</div>
</li>
</ol>
</div>
<p>Si todo ha ido bien veremos en pantalla un array con la estructura del correo.</p>
<p>No voy a detallar todo el proceso ya que alargaría mucho el artículo. Vamos con el siguiente paso:</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re0">$query</span>=<span class="st0">&quot;select idEmail from emails where email=&quot;</span>.<span class="re0">$conn</span>-&gt;<span class="me1">quote</span><span class="br0">&#40;</span><span class="re0">$to</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$rs</span>=<span class="re0">$conn</span>-&gt;<span class="me1">Execute</span><span class="br0">&#40;</span><span class="re0">$query</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$rs</span>-&gt;<span class="me1">recordcount</span><span class="br0">&#40;</span><span class="br0">&#41;</span>==<span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/exit"><span class="kw3">exit</span></a><span class="br0">&#40;</span><span class="nu0">100</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span><span class="kw1">else</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$idEmail</span>=<span class="re0">$rs</span>-&gt;<span class="me1">fields</span><span class="br0">&#91;</span><span class="st0">&#8216;idEmail&#8217;</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$content</span> = get_content<span class="br0">&#40;</span><span class="re0">$structure</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$query</span>=<span class="st0">&quot;insert into correos</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(idEmail, de, para, subject, fecha, body, fullmail)</span></div>
</li>
<li class="li2">
<div class="de2"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  VALUES</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ($idEmail,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&quot;</span>.<span class="re0">$conn</span>-&gt;<span class="me1">Quote</span><span class="br0">&#40;</span><span class="re0">$from</span><span class="br0">&#41;</span>.<span class="st0">&quot;,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&quot;</span>.<span class="re0">$conn</span>-&gt;<span class="me1">Quote</span><span class="br0">&#40;</span><span class="re0">$to</span><span class="br0">&#41;</span>.<span class="st0">&quot;,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&quot;</span>.<span class="re0">$conn</span>-&gt;<span class="me1">Quote</span><span class="br0">&#40;</span><span class="re0">$subject</span><span class="br0">&#41;</span>.<span class="st0">&quot;,</span></div>
</li>
<li class="li2">
<div class="de2"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&quot;</span>.<span class="re0">$conn</span>-&gt;<span class="me1">Quote</span><span class="br0">&#40;</span><span class="re0">$ddate</span><span class="br0">&#41;</span>.<span class="st0">&quot;,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&quot;</span>.<span class="re0">$conn</span>-&gt;<span class="me1">Quote</span><span class="br0">&#40;</span><span class="re0">$content</span><span class="br0">&#41;</span>.<span class="st0">&quot;,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&quot;</span>.<span class="re0">$conn</span>-&gt;<span class="me1">Quote</span><span class="br0">&#40;</span><span class="re0">$email</span><span class="br0">&#41;</span>.<span class="st0">&quot;)&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$rs</span>=<span class="re0">$conn</span>-&gt;<span class="me1">Execute</span><span class="br0">&#40;</span><span class="re0">$query</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>En la primera parte del <em>script </em>comprobamos si la cuenta a la que va destinado el email existe en nuestra base de datos, si no, muy importante, <strong>devolvemos un código 100</strong> que indica a <strong>qmail </strong>que debe devolver el correo ya que no existe el usuario.</p>
<p>Si la cuenta existe recogemos el cuerpo del mensaje. Yo lo hago con la función <strong>get_content</strong>, que analiza la estructura del correo y devuelve el contenido. Esta parte os la dejo a vosotros. Básicamente consiste en comprobar las distintas partes que puede tener un correo y devolver lo que estimemos oportuno. Un detalle muy importante a tener en cuenta es la <strong>codificación</strong> tanto del email como de nuestra base de datos y la aplicación web. En mi caso las dos últimas están en <strong>UTF-8</strong>, con lo que debo convertir todos los textos del email a esta misma codificación. La estructura que teníamos inicialmente en un array tendrá parámetros que nos indican el <em><strong>charset</strong></em> en el que viene el email. Las funciones de conversión de PHP te pueden ser útiles: <strong>iconv</strong>, <strong>utf8_encode</strong>, etc.Finalmente introducimos todos los campos del email en la base de datos.</p>
<p>Puedes volver a probar a procesar el email de prueba tal y como hicimos antes. Recuerda que debes añadir el registro de la tabla emails para que  guarde el correo, si no la cuenta no existirá. Una vez te funcione desde la línea de comandos ya puedes probar a enviarte un correo real <img src='http://blog.osusnet.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' title="Nuevo proyecto en 5 horas: UsayTira.me, direcciones de correo de usar y tirar explicado paso a paso" /> .</p>
<h3>La aplicación web</h3>
<p>No creo que hacer la parte <em>web</em> propiamente dicha necesite muchas explicaciones. Tenemos ya todos los elementos preparados, sólo debemos añadir los formularios para crear la cuenta de correo (aleatoria o personalizada) y, con un poco de <em>ajax</em>, ir cargando los correos a medida que van llegando. No  hay más truco.</p>
<p>Añadiré, eso sí, algunas aclaraciones interesantes.</p>
<p>Para crear las cuentas aleatorias, en vez de utilizar una secuencia aleatoria de números y letras, que daría como resultado algo ininteligible, usamos los <strong>diccionarios</strong> que comentaba más arriba. Los importamos en una tabla de la base de datos y simplemente tenemos que buscar aleatoriamente una palabra que no esté utilizada todavía como cuenta de correo, sencillo y muy impactante visualmente ya que estás ofreciendo cuentas legibles y con sentido.</p>
<p>Como en cualquier otra aplicación accesible públicamente, hay que añadir algún tipo de mecanismo de seguridad. En mi caso lo he hecho implementando una <strong>blacklist</strong> de direcciones IP. Cada vez que se crea una cuenta actualizo en una base de datos el número de cuentas que se han creado desde esa IP, si pasa del límite que estimemos oportuno, esa IP se pasa a la tabla de lista negra y cuando intente crear una nueva cuenta no se le dejará.</p>
<p>Nos falta una cosa: <strong>Eliminar las cuentas que tienen más de una hora</strong>. Muy sencillo, una tarea en el <a href="http://es.wikipedia.org/wiki/Cron_%28Unix%29">CRON</a> que ejecuta un <em>script </em>que lanza una consulta a la base de datos que elimina las cuentas (y sus correos asociados) que se crearon hace más de 60 minutos.</p>
<p>Finalmente he añadido la opción de reiniciar esos 60 minutos de tiempo, simplemente actualizando el <em>timestamp </em>de la base de datos y algunos efectos visuales para plegar y desplegar los mensajes usando <strong>Jquery</strong>.</p>
<p>No hay mucho más, en unas <strong>cinco horas</strong> tenemos la aplicación hecha y funcionando.</p>
<h3>Conclusiones</h3>
<p>Como conclusión, <a href="http://blog.osusnet.com/2009/11/24/de-articulo-a-proyecto-explicado-paso-a-paso-acorta-urls-con-iraurl-me/">la misma que hice hace unos meses con el primer proyecto</a>. La copio tal cual porque es igual de válida.</p>
<p>Bueno, y todo este rollo ¿<strong>para qué</strong>?. Pues muy sencillo, para que veais que hoy en día la tecnología está al alcance de todos, es sencillo y rápido crear un proyecto en <strong>Internet</strong>, hay de todo por todas las esquinas, la tecnología no es lo importante, lo que verdaderamente cuenta es cómo mueves ese producto tecnológico para rentabilizarlo y obtener un beneficio de él.</p>
<p>Ya tengo mi proyecto superchulo funcionando, sólo me ha costado unas 5 horas de trabajo. Le he puesto un poco de <strong>Adsense </strong>por aquí y por allí. ¿Y ahora qué? ¿A esperar a que la gente entre y me haga millonario? <img src='http://blog.osusnet.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' title="Nuevo proyecto en 5 horas: UsayTira.me, direcciones de correo de usar y tirar explicado paso a paso" />  Es mucho más complicado que eso como todos sabéis, primero tienes que tener una masa de usuarios elevada que le dé movimiento al proyecto y después tienes que conseguir que la mayoría de ellos sean gente normal, no gente técnica, usuarios avanzados que no pagamos por nada ni pinchamos en publicidad <img src='http://blog.osusnet.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' title="Nuevo proyecto en 5 horas: UsayTira.me, direcciones de correo de usar y tirar explicado paso a paso" />  .</p>
<p>Hoy en día, en Internet, como en cualquier negocio, <strong>las técnicas de marketing y venta son mucho más importantes que la tecnología en sí misma</strong>, es duro reconocerlo, pero es así. De nada sirve que tengas el mejor producto del mundo mundial si no consigues que la gente lo utilice y se deje dinero, así de claro. Si tienes los conocimientos adecuados para mover el negocio, no te preocupes, la tecnología te la aporta cualquier partner por un módico precio, pero poner en manos de otro toda la estrategia de ventas de tu negocio no está tan claro ¿no?.</p>
<p>Espero que os sirva de algo el artículo. He querido mostrar, fundamentalmente, cómo utilizando algunas librerías que puedes obtener sin coste puedes hacer algo realmente útil y funcional con muy poco esfuerzo. Seguro que sacáis alguna idea.</p>
<p>Perdón por el rollo <img src='http://blog.osusnet.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' title="Nuevo proyecto en 5 horas: UsayTira.me, direcciones de correo de usar y tirar explicado paso a paso" />  , al final me ha costado mucho más escribir el artículo que implementarlo.</p>
<p>Podíamos haber añadido una opción que he visto por ahí que consiste en crear una cuenta automáticamente cada vez que entra un email para una cuenta que no existe, pero estaríamos creando cuentas para todo el spam que recibamos, así que prefiero no hacerlo. Si quisierais hacerlo creo que ya sabéis cómo.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.osusnet.com/2010/04/21/nuevo-proyecto-en-5-horas-usaytira-me-direcciones-de-correo-de-usar-y-tirar-explicado-paso-a-paso/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Segmentation fault al instanciar un webservice WCF de .NET desde PHP</title>
		<link>http://blog.osusnet.com/2010/04/16/segmentation-fault-al-instanciar-un-webservice-wcf-de-net-desde-php/</link>
		<comments>http://blog.osusnet.com/2010/04/16/segmentation-fault-al-instanciar-un-webservice-wcf-de-net-desde-php/#comments</comments>
		<pubDate>Fri, 16 Apr 2010 10:03:49 +0000</pubDate>
		<dc:creator>Osus</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Sistemas]]></category>
		<category><![CDATA[Técnico]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[wcf]]></category>
		<category><![CDATA[webservice]]></category>

		<guid isPermaLink="false">http://blog.osusnet.com/?p=4128</guid>
		<description><![CDATA[Recientemente nos hemos encontrado con un problema que nos ha tenido varios días bloqueados hasta conseguir averiguar el origen. Llevamos mucho tiempo utilizando webservices programados en .NET desde aplicaciones PHP sin ningún problema, pero esta vez estaba hecho con la nueva tecnología WCF (Windows Communication Foundation) de Microsoft .NET 3.5. El problema era que en [...]]]></description>
			<content:encoded><![CDATA[<div class="socialize-in-content" style="float:right;"></div><p>Recientemente nos hemos encontrado con un problema que nos ha tenido varios días bloqueados hasta conseguir averiguar el origen. Llevamos mucho tiempo utilizando <em>webservices</em> programados en <a href="http://es.wikipedia.org/wiki/Microsoft_.NET">.NET</a> desde aplicaciones <a href="http://www.php.net">PHP</a> sin ningún problema, pero esta vez estaba hecho con la nueva tecnología <a href="http://msdn.microsoft.com/es-es/library/ms735119.aspx">WCF (Windows Communication Foundation)</a> de <em>Microsoft .NET 3.5</em>. El problema era que en cuanto lo subimos a producción la aplicación <strong>PHP</strong> devolvía un <em>pantallazo </em>en blanco sin más información. Analizando los <em>logs </em>vimos que el proceso de <a href="http://httpd.apache.org/">Apache</a> provocaba un <a href="http://en.wikipedia.org/wiki/Segmentation_fault">Segmentation Fault</a> con lo que no llegábamos a ver ninguna excepción.</p>
<p>Tras muchas pruebas conseguimos aislar el error en la línea de código que instanciaba el nuevo <em>webservice</em>, si eliminábamos esa parte todo funcionaba correctamente.</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re0">$client</span>=<span class="kw2">new</span> SoapClient<span class="br0">&#40;</span><span class="st0">&quot;http://wcf.tudominio.com/webservice/ws.svc?wsdl&quot;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Lo más curioso es que en los entornos de <em>preproducción </em>sí que funcionaba, no entendíamos nada. Analizando las máquinas de los distintos entornos todas eran idénticas en cuanto a versiones y configuración excepto algunos parámetros <strong>SOAP </strong>para <strong>PHP</strong>, en la máquina de producción tienen la caché de <a href="http://es.wikipedia.org/wiki/WSDL">wsdl</a> activada mientras que en los demás está desactivada.</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1">soap.wsdl_cache_enabled = <span class="nu0">1</span></div>
</li>
<li class="li1">
<div class="de1">soap.wsdl_cache_dir = /tmp/</div>
</li>
<li class="li1">
<div class="de1">soap.wsdl_cache_ttl = <span class="nu0">7200</span></div>
</li>
<li class="li1">
<div class="de1">soap.wsdl_cache_limit = <span class="nu0">50</span></div>
</li>
</ol>
</div>
<p>No puede ser que el error sea el cacheo. Pues <strong>sí, lo es,</strong> en cuanto desactivamos la caché del servidor de producción todo comenzó a funcionar correctamente.</p>
<p>Perfecto, pero la caché <strong>tiene que estar activada</strong>, la aplicación hace uso de unos 35 <em>webservices</em>, si para cada instancia de cada uno de ellos hay que cargar previamente el <em>wsdl</em>, el rendimiento cae por los suelos, es imprescindible.</p>
<p>Pues nada, solución increíblemente <em>cutre</em>:</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1">ini_set<span class="br0">&#40;</span><span class="st0">&#8216;soap.wsdl_cache_enabled&#8217;</span>, <span class="st0">&#8217;0&#8242;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">ini_set<span class="br0">&#40;</span><span class="st0">&#8216;soap.wsdl_cache_ttl&#8217;</span>, <span class="st0">&#8217;0&#8242;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">ini_set<span class="br0">&#40;</span><span class="st0">&#8216;soap.wsdl_cache&#8217;</span>, <span class="st0">&#8217;0&#8242;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="re1">$client</span> = new SoapClient<span class="br0">&#40;</span><span class="st0">&quot;http://wcf.tudominio.com/webservice/ws.svc?wsdl&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">ini_set<span class="br0">&#40;</span><span class="st0">&#8216;soap.wsdl_cache_enabled&#8217;</span>, <span class="st0">&#8217;1&#8242;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">ini_set<span class="br0">&#40;</span><span class="st0">&#8216;soap.wsdl_cache_ttl&#8217;</span>, <span class="st0">&#8217;7200&#8242;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">ini_set<span class="br0">&#40;</span><span class="st0">&#8216;soap.wsdl_cache&#8217;</span>, <span class="st0">&#8217;3&#8242;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Así es, <strong>desactivamos la caché</strong> antes de instanciar sólo este <em>webservice </em>y la volvemos a activar después. No hemos encontrado otra manera de solucionarlo ni hemos encontrado ninguna referencia de alguien que haya sufrido el mismo problema. La solución es mala, muy mala, no deja de ser un <em>apaño</em>, pero funciona y nos permite salir del paso hasta que sepamos por qué ocurre.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.osusnet.com/2010/04/16/segmentation-fault-al-instanciar-un-webservice-wcf-de-net-desde-php/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Aumenta tu productividad integrando el sistema de incidencias en el entorno de desarrollo: Eclipse + Mylyn + TFS</title>
		<link>http://blog.osusnet.com/2010/04/16/aumenta-tu-productividad-integrando-el-sistema-de-incidencias-en-el-entorno-de-desarrollo-eclipse-mylyn-tfs/</link>
		<comments>http://blog.osusnet.com/2010/04/16/aumenta-tu-productividad-integrando-el-sistema-de-incidencias-en-el-entorno-de-desarrollo-eclipse-mylyn-tfs/#comments</comments>
		<pubDate>Fri, 16 Apr 2010 08:27:28 +0000</pubDate>
		<dc:creator>Osus</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Técnico]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[mylyn]]></category>
		<category><![CDATA[productividad]]></category>
		<category><![CDATA[tfs]]></category>

		<guid isPermaLink="false">http://blog.osusnet.com/?p=4112</guid>
		<description><![CDATA[Si hace unas semanas veíamos como integrar las incidencias de Jira en Eclipse, hoy veremos como hacer lo propio con Microsoft Team Foundation Server (TFS). En determinados proyectos nos vemos obligados utilizar TFS para el control de versiones, pero en nuestro caso lo utilizamos desde Eclipse utilizando un plugin desarrollado por Teamprise. A finales de [...]]]></description>
			<content:encoded><![CDATA[<div class="socialize-in-content" style="float:right;"></div><p>Si hace unas semanas veíamos como integrar las <a href="http://blog.osusnet.com/2010/03/02/aumenta-tu-productividad-integrando-el-sistema-de-incidencias-en-el-entorno-de-desarrollo-eclipse-mylyn-jira/">incidencias de Jira en Eclipse</a>, hoy veremos como hacer lo propio con <a href="http://msdn.microsoft.com/en-us/vstudio/dd408375.aspx">Microsoft Team Foundation Server</a> (<strong>TFS</strong>).</p>
<p>En determinados proyectos nos vemos obligados utilizar <strong>TFS</strong> para el control de versiones, pero en nuestro caso lo utilizamos desde <a href="http://www.eclipse.org">Eclipse</a> utilizando un <em>plugin </em>desarrollado por <a href="http://www.teamprise.com/">Teamprise</a>. A finales de 2009 <em>Microsoft </em>compró esta empresa con lo que el <em>plugin </em>se llama ahora <a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;FamilyID=af1f5168-c0f7-47c6-be7a-2a83a6c02e57">Microsoft Visual Studio Team Explorer Everywhere 2010</a>, casi nada <img src='http://blog.osusnet.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' title="Aumenta tu productividad integrando el sistema de incidencias en el entorno de desarrollo: Eclipse + Mylyn + TFS" /> , así que ya es parte de <em>Visual Studio</em>.</p>
<p>El paso final de la integración consiste en poder acceder a las incidencias del <strong>TFS</strong> desde el sistema integrado en <strong>Eclipse</strong>, <a href="http://www.eclipse.org/mylyn/">Mylyn</a>. Para conseguirlo <em>Teamprise</em> tiene otro <em>plugin</em>, <a href="http://labs.teamprise.com/mylyn/">Teamprise Mylyn Conector</a>.</p>
<p>La instalación es muy sencilla, se descomprime en la carpeta de <strong>Eclipse</strong>, se reinicia éste y a funcionar. Veamos como configurarlo. Si no visualizamos la lista de tareas en nuestro <strong>Eclipse</strong>, vamos a <em>&#8220;Window -&gt; Show view -&gt; Task list&#8221;</em>, nos aparecerá la ventana correspondiente. Haciendo <em>click </em>con el botón derecho vamos a <em>&#8220;New -&gt; Query&#8221;</em> y en la ventana que se abre seleccionamos &#8220;<em>Add task repository</em>&#8220;.</p>
<p>En la nueva ventana seleccionamos &#8220;<em>Teamprise repository</em>&#8220;:<a href="http://blog.osusnet.com/wp-content/uploads/2010/04/02.gif"><img class="aligncenter size-full wp-image-4114" title="02" src="http://blog.osusnet.com/wp-content/uploads/2010/04/02.gif" alt="02 Aumenta tu productividad integrando el sistema de incidencias en el entorno de desarrollo: Eclipse + Mylyn + TFS" width="440" height="350" /></a></p>
<p>Indicamos los datos del <strong>TFS</strong>:        <a href="http://blog.osusnet.com/wp-content/uploads/2010/04/03.gif"><img class="aligncenter size-full wp-image-4115" title="03" src="http://blog.osusnet.com/wp-content/uploads/2010/04/03.gif" alt="03 Aumenta tu productividad integrando el sistema de incidencias en el entorno de desarrollo: Eclipse + Mylyn + TFS" width="470" height="437" /></a></p>
<p>Seleccionamos el nuevo repositorio creado:</p>
<p style="text-align: center;"><a href="http://blog.osusnet.com/wp-content/uploads/2010/04/07.gif"><img class="aligncenter" title="07" src="http://blog.osusnet.com/wp-content/uploads/2010/04/07.gif" alt="07 Aumenta tu productividad integrando el sistema de incidencias en el entorno de desarrollo: Eclipse + Mylyn + TFS" width="405" height="341" /></a></p>
<p>El proyecto al que necesitamos acceder:<a href="http://blog.osusnet.com/wp-content/uploads/2010/04/05.gif"><img class="aligncenter size-full wp-image-4117" title="05" src="http://blog.osusnet.com/wp-content/uploads/2010/04/05.gif" alt="05 Aumenta tu productividad integrando el sistema de incidencias en el entorno de desarrollo: Eclipse + Mylyn + TFS" width="380" height="329" /></a></p>
<p>Y el tipo de incidencias a cargar:        <a href="http://blog.osusnet.com/wp-content/uploads/2010/04/06.gif"><img class="aligncenter size-full wp-image-4118" title="06" src="http://blog.osusnet.com/wp-content/uploads/2010/04/06.gif" alt="06 Aumenta tu productividad integrando el sistema de incidencias en el entorno de desarrollo: Eclipse + Mylyn + TFS" width="380" height="410" /></a> Eso es todo, en la ventana de <em>&#8220;Task list&#8221;</em> nos aparecerá la lista de las incidencias:</p>
<p><a href="http://blog.osusnet.com/wp-content/uploads/2010/04/08.gif"><img class="aligncenter size-full wp-image-4120" title="08" src="http://blog.osusnet.com/wp-content/uploads/2010/04/08.gif" alt="08 Aumenta tu productividad integrando el sistema de incidencias en el entorno de desarrollo: Eclipse + Mylyn + TFS" width="187" height="463" /></a></p>
<p>Tal y como <a href="http://blog.osusnet.com/2010/03/02/aumenta-tu-productividad-integrando-el-sistema-de-incidencias-en-el-entorno-de-desarrollo-eclipse-mylyn-jira/">veíamos en el caso de Jira</a>, desde ahí podremos ver las incidencias, modificarlas, crear otras nuevas, asociar contextos, programar las tareas, etc.</p>
<p>¿La pega? Que <strong>no permite realizar filtros en las incidencias</strong>. Así como cuando vimos la integración con <strong>Jira</strong> la creación de consultas era muy completa, permitiendo múltiples filtros, en este caso se limita a recoger todas las incidencias del tipo indicado, no pudiendo, por ejemplo, recoger sólo <strong>las incidencias o tareas asociadas a nuestro usuario</strong>. Es un mal menor, sí, pero limita tu productividad ya que tienes que revisar todas las incidencias una por una hasta encontrar las tuyas. En el propio <em>plugin</em> de <strong>TFS</strong> el comportamiento es muy parecido, no puedes hacer filtros en las incidencias, como mucho puedes ordenarlas alfabéticamente por el &#8220;<em>Asigned to</em>&#8221; y localizar las tuyas, poco útil también.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.osusnet.com/2010/04/16/aumenta-tu-productividad-integrando-el-sistema-de-incidencias-en-el-entorno-de-desarrollo-eclipse-mylyn-tfs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Usando Amazon S3 como sistema de backup</title>
		<link>http://blog.osusnet.com/2010/04/13/usando-amazon-s3-como-sistema-de-backup/</link>
		<comments>http://blog.osusnet.com/2010/04/13/usando-amazon-s3-como-sistema-de-backup/#comments</comments>
		<pubDate>Tue, 13 Apr 2010 15:44:15 +0000</pubDate>
		<dc:creator>Osus</dc:creator>
				<category><![CDATA[Proyectos]]></category>
		<category><![CDATA[Sistemas]]></category>
		<category><![CDATA[Técnico]]></category>
		<category><![CDATA[amazon]]></category>
		<category><![CDATA[backups]]></category>
		<category><![CDATA[rsync]]></category>
		<category><![CDATA[s3]]></category>

		<guid isPermaLink="false">http://blog.osusnet.com/?p=4084</guid>
		<description><![CDATA[Estoy tratando de mejorar el sistema de backups que utilizo habitualmente usando Amazon S3 como plataforma de almacenamiento. S3 (así como otros servicios Cloud de Amazon) tienen dos ventajas importantes, por un lado la disponibilidad, del orden del 99,99% y por otro el precio, altamente competitivo, cobran por espacio utilizado y por peticiones realizadas pero [...]]]></description>
			<content:encoded><![CDATA[<div class="socialize-in-content" style="float:right;"></div><p>Estoy tratando de mejorar el sistema de <strong>backups</strong> que utilizo habitualmente usando <a href="http://aws.amazon.com/s3/">Amazon S3</a> como plataforma de almacenamiento. <strong>S3</strong> (así como otros servicios <em>Cloud </em>de Amazon) tienen dos ventajas importantes, por un lado la disponibilidad, del orden del 99,99% y por otro el precio, altamente competitivo, cobran por espacio utilizado y por peticiones realizadas pero aún así sale por un precio espectacular.</p>
<p>Nuestro backup es del orden de 40gb, y, si el sistema va bien, planeo utilizarlo también para <strong>backups </strong>personales (fotos sobre todo <img src='http://blog.osusnet.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' title="Usando Amazon S3 como sistema de backup" /> ).</p>
<p>El requerimiento básico es que la sincronización se realizará de manera automatizada desde un servidor Linux con lo que el sistema debe permitir el envío desatentido.</p>
<p>Buscando por ahí como hacerlo encontré <a href="http://code.google.com/p/s3fs/wiki/FuseOverAmazon">FuseOverAmazon</a>, un sistema basado en <a href="http://fuse.sourceforge.net/">Fuse</a> que permite montar un &#8220;<em>bucket</em>&#8221; de <strong>S3</strong> como si fuese una unidad local y sobre la que posteriormente podríamos utilizar <a href="http://samba.anu.edu.au/rsync/">rsync</a>. ¿Qué más se puede pedir? Dicho y hecho, vamos a probarlo. En mi caso utilizo <a href="http://centos.org/">CentOS</a>.</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1">yum <span class="kw2">install</span> fuse fuse-devel curl-devel libxml2-devel</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">wget</span> http://s3fs.googlecode.com/files/s3fs-r191-<span class="kw3">source</span>.<span class="kw2">tar</span>.gz</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">tar</span> xvfz s3fs-r191-<span class="kw3">source</span>.<span class="kw2">tar</span>.gz</div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">cd</span> s3fs</div>
</li>
<li class="li2">
<div class="de2"><span class="kw2">make</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">make</span> <span class="kw2">install</span></div>
</li>
</ol>
</div>
<p>Vamos a probarlo.</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1">/usr/bin/s3fs nombrebucket -o <span class="re2">accessKeyId=</span>TUACCESSKEYID -o <span class="re2">secretAccessKey=</span>TUSECRETKEY /mnt/s3</div>
</li>
</ol>
</div>
<p>Si todo ha ido bien tendrás montado en <em>/mnt/s3</em> tu &#8220;<em>nombrebucket</em>&#8221; y podrás listar los archivos, copiar, eliminar, etc., como si fuese una unidad del equipo. Hasta aquí todo ha ido bien.  Sólo nos queda sincronizar nuestro <em>backup</em>:</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1">/usr/bin/rsync -avz &#8211;delete /usr1 /mnt/s3</div>
</li>
</ol>
</div>
<p>Y aquí es donde viene el problema. En mi caso han pasado 4 días y aún no ha pasado del 10% de la sincronización, funciona todo bien pero la sincronización es extremadamente lenta, no sé si estoy haciendo algo mal, si es normal, o no, pero es imposible de utilizar así.</p>
<p>Como la idea no ha sido del todo buena, tenemos un <em>plan B</em>. Se trata de utilizar <a href="http://s3sync.net/wiki">s3sync</a>, un script en Ruby que hace el proceso muy sencillo, sólamente hay que configurarlo indicando tus datos de acceso y a funcionar:</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1">s3sync -r /mnt/backup nombrebucket:prefijo</div>
</li>
</ol>
</div>
<p>Donde &#8220;<em>prefijo</em>&#8221; puede ser nulo.</p>
<p>Esto enviará a <em>nombrebucket/prefijo/</em> tu backup.  De momento las pruebas son mucho más satisfactorias que con <strong>s3fs</strong>, la velocidad se puede considerar más que adecuada, sobre todo comparada con el anterior.</p>
<p>Como decía, de momento estoy probando el rendimiento y la velocidad, pero no estoy del todo convencido, así que estoy pensando en utilizar <a href="http://aws.amazon.com/ec2/">Amazon EC2</a> en vez de <a href="http://aws.amazon.com/s3/">S3</a>, de manera que lanzando una instancia de una máquina virtual pueda hacer un <strong>rsync </strong>clásico contra un sistema de ficheros <em>de verdad</em>. La ventaja es que la máquina virtual puedo lanzarla sólo cuando la necesite y pararla después, con lo que con una hora diaria podría ser suficiente, recordemos que <em>Amazon EC2</em> cuesta, entre otras cosas, por cada hora que utilizas la instancia. Adicionalmente se podría hacer después un volcado del <strong>backup </strong>desde<strong> EC2</strong> a <strong>S3</strong>, pero en nuestro caso los 40gb sería una limitación que encarecería el precio considerablemente aún en el caso de utilizar rotaciones semanales.</p>
<p>Ya os contaré <img src='http://blog.osusnet.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' title="Usando Amazon S3 como sistema de backup" /> .</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.osusnet.com/2010/04/13/usando-amazon-s3-como-sistema-de-backup/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Aumenta tu productividad integrando el sistema de incidencias en el entorno de desarrollo: Eclipse + Mylyn + Jira + Subversion</title>
		<link>http://blog.osusnet.com/2010/03/02/aumenta-tu-productividad-integrando-el-sistema-de-incidencias-en-el-entorno-de-desarrollo-eclipse-mylyn-jira/</link>
		<comments>http://blog.osusnet.com/2010/03/02/aumenta-tu-productividad-integrando-el-sistema-de-incidencias-en-el-entorno-de-desarrollo-eclipse-mylyn-jira/#comments</comments>
		<pubDate>Tue, 02 Mar 2010 07:00:33 +0000</pubDate>
		<dc:creator>Osus</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Técnico]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[jira]]></category>
		<category><![CDATA[mylyn]]></category>
		<category><![CDATA[productividad]]></category>

		<guid isPermaLink="false">http://blog.osusnet.com/?p=3671</guid>
		<description><![CDATA[Hoy voy a hablaros de algo que ha revolucionado mi entorno de trabajo. Hasta ahora tenía por un lado el entorno de desarrollo con Eclipse y por el otro el sistema de incidencias web con Jira (también sirven Trac o Bugzilla). La verdad es que me resultaba muy pesado ir cambiando de uno a otro [...]]]></description>
			<content:encoded><![CDATA[<div class="socialize-in-content" style="float:right;"></div><p>Hoy voy a hablaros de algo que ha revolucionado mi entorno de trabajo. Hasta ahora tenía por un lado el entorno de desarrollo con <a href="http://www.eclipse.org/">Eclipse</a> y por el otro el sistema de incidencias web con <a href="http://www.google.es/url?sa=t&amp;source=web&amp;ct=res&amp;cd=1&amp;ved=0CAwQFjAA&amp;url=http%3A%2F%2Fwww.atlassian.com%2Fsoftware%2Fjira%2F&amp;ei=uPOLS-OYNKLSmgOTtpy1BA&amp;usg=AFQjCNGx2m653qgbdvjNB8XxITgsQAI6eg&amp;sig2=UNmW8xlI7X6lCT0UgiBcZA">Jira</a> (también sirven <a href="http://trac.edgewall.org/">Trac</a> o <a href="http://www.bugzilla.org/">Bugzilla</a>). La verdad es que me resultaba muy pesado ir cambiando de uno a otro para revisar las incidencias y más aún para cambiar los archivos necesarios para revisar las distintas incidencias. Cuando digo que me resultaba pesado me refiero a que entonces no me daba cuenta del tiempo que perdía, pero ahora sí.</p>
<p>Para comenzar veremos cómo podemos acceder a las incidencias desde el propio <strong>Eclipse</strong> sin necesidad de cambiar de aplicación. La magia viene aportada por <a href="http://www.eclipse.org/mylyn/">Mylyn</a>.</p>
<p>Para instalar el <em>plugin</em> necesario para <strong>Jira</strong> debemos añadir el repositorio donde se encuentra desde</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1">Help-&gt;Install new software -&gt; Available sites -&gt; Add</div>
</li>
</ol>
</div>
<p>con la url:</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1">http://update.atlassian.com/atlassian-eclipse-plugin/e3<span class="nu0">.4</span></div>
</li>
</ol>
</div>
<p>Desde este nuevo repositorio seleccionamos los componentes a instalar, probablemente <strong>Mylyn</strong> ya lo tengas instalado. Esto es lo que debes escoger:</p>
<p style="text-align: center;"><a href="http://blog.osusnet.com/wp-content/uploads/2010/01/0-install.gif"><img class="aligncenter" title="0-install" src="http://blog.osusnet.com/wp-content/uploads/2010/01/0-install.gif" alt="0 install Aumenta tu productividad integrando el sistema de incidencias en el entorno de desarrollo: Eclipse + Mylyn + Jira + Subversion" width="455" height="480" /></a></p>
<p>Si en vez de Jira usas Trac o Bugzilla, utiliza el conector adecuado.</p>
<p>Una vez reiniciado Eclipse mostraremos la pestaña de incidencias desde</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1">Window-&gt;Show view-&gt;Task list</div>
</li>
</ol>
</div>
<p>Desde el primer icono de la pestaña vamos a &#8220;<em>Add Repository</em>&#8220;.</p>
<p><a href="http://blog.osusnet.com/wp-content/uploads/2010/01/addrepo.gif"><img class="aligncenter size-full wp-image-3871" title="addrepo" src="http://blog.osusnet.com/wp-content/uploads/2010/01/addrepo.gif" alt="addrepo Aumenta tu productividad integrando el sistema de incidencias en el entorno de desarrollo: Eclipse + Mylyn + Jira + Subversion" width="384" height="219" /></a></p>
<p>Seleccionas el tipo de repositorio de incidencias que vas a crear.</p>
<p style="text-align: center;"><a href="http://blog.osusnet.com/wp-content/uploads/2010/01/1-addrepo.gif"><img class="aligncenter" title="1-addrepo" src="http://blog.osusnet.com/wp-content/uploads/2010/01/1-addrepo.gif" alt="1 addrepo Aumenta tu productividad integrando el sistema de incidencias en el entorno de desarrollo: Eclipse + Mylyn + Jira + Subversion" width="470" height="418" /></a></p>
<p>Y añades los datos de acceso al mismo.</p>
<p style="text-align: center;"><a href="http://blog.osusnet.com/wp-content/uploads/2010/01/2-addrepo2.gif"><img class="aligncenter" title="2-addrepo2" src="http://blog.osusnet.com/wp-content/uploads/2010/01/2-addrepo2.gif" alt="2 addrepo2 Aumenta tu productividad integrando el sistema de incidencias en el entorno de desarrollo: Eclipse + Mylyn + Jira + Subversion" width="466" height="418" /></a></p>
<p>Si todo ha ido bien verás una pantalla similar a ésta donde puedes crear tu primera consulta de incidencias o seleccionar una previamente guardada en el servidor ya que importa tus filtros existentes.</p>
<p style="text-align: center;"><a href="http://blog.osusnet.com/wp-content/uploads/2010/01/3-query11.gif"><img class="aligncenter size-full wp-image-3880" title="3-query1" src="http://blog.osusnet.com/wp-content/uploads/2010/01/3-query11.gif" alt="3 query11 Aumenta tu productividad integrando el sistema de incidencias en el entorno de desarrollo: Eclipse + Mylyn + Jira + Subversion" width="438" height="307" /></a></p>
<p>Si decides crear una consulta nueva tienes un formulario con todas las opciones a tu disposición. Por ejemplo, yo he creado una que me lista todas las incidencias reportadas por mi.</p>
<p style="text-align: center;"><a href="http://blog.osusnet.com/wp-content/uploads/2010/01/4-query2.gif"><img class="aligncenter" title="4-query2" src="http://blog.osusnet.com/wp-content/uploads/2010/01/4-query2.gif" alt="4 query2 Aumenta tu productividad integrando el sistema de incidencias en el entorno de desarrollo: Eclipse + Mylyn + Jira + Subversion" width="470" height="573" /></a></p>
<p>Automáticamente irá recuperando del servidor las incidencias que cumplan los requisitos especificados en los filtros.</p>
<p style="text-align: center;"><a href="http://blog.osusnet.com/wp-content/uploads/2010/01/6-tasklist1.gif"><img class="aligncenter size-full wp-image-3872" title="6-tasklist" src="http://blog.osusnet.com/wp-content/uploads/2010/01/6-tasklist1.gif" alt="6 tasklist1 Aumenta tu productividad integrando el sistema de incidencias en el entorno de desarrollo: Eclipse + Mylyn + Jira + Subversion" width="320" height="398" /></a></p>
<p>Haciendo doble click en una incidencia se abre el detalle de la misma con todas sus opciones que podremos modificar a nuestro antojo, añadir comentarios nuevos, adjuntar archivos, etc.</p>
<p><a href="http://blog.osusnet.com/wp-content/uploads/2010/01/7-task-tarea1.gif"><img class="aligncenter size-full wp-image-3873" title="7-task-tarea" src="http://blog.osusnet.com/wp-content/uploads/2010/01/7-task-tarea1.gif" alt="7 task tarea1 Aumenta tu productividad integrando el sistema de incidencias en el entorno de desarrollo: Eclipse + Mylyn + Jira + Subversion" width="470" height="583" /></a></p>
<p><strong>Mylyn</strong> aporta al sistema funcionalidades extra, una de ellas es la de programarnos las incidencias en función de nuestra carga de trabajo y tener una previsión de lo que vamos a hacer y cuando. Esta información no se guarda en el servidor, es interna.</p>
<p style="text-align: center;"><a href="http://blog.osusnet.com/wp-content/uploads/2010/01/8-task5-calendario1.gif"><img class="aligncenter size-full wp-image-3874" title="8-task5-calendario" src="http://blog.osusnet.com/wp-content/uploads/2010/01/8-task5-calendario1.gif" alt="8 task5 calendario1 Aumenta tu productividad integrando el sistema de incidencias en el entorno de desarrollo: Eclipse + Mylyn + Jira + Subversion" width="470" height="461" /></a></p>
<p>A la hora de adjuntar archivos, además de seleccionar los que tengamos en nuestro equipo podremos hacer directamente desde <strong>Eclipse</strong> una captura de pantalla, recortar el trozo que nos interesa y enviarlo a <strong>Jira</strong>, todo en uno y sin salir de nuestro entorno de desarrollo.</p>
<p style="text-align: center;"><a href="http://blog.osusnet.com/wp-content/uploads/2010/01/9-task6-upload.gif"><img class="aligncenter" title="9-task6-upload" src="http://blog.osusnet.com/wp-content/uploads/2010/01/9-task6-upload.gif" alt="9 task6 upload Aumenta tu productividad integrando el sistema de incidencias en el entorno de desarrollo: Eclipse + Mylyn + Jira + Subversion" width="408" height="90" /></a></p>
<p>Llegamos a una de las opciones que realmente hacen que ahorremos muchísimo tiempo, el <strong>contexto</strong>. Cada incidencia tiene un circulito a su izquierda que permite <em><strong>activar</strong></em> esa tarea. Al activar una tarea el sistema asume que todos los archivos que vayas abriendo mientras la tengas activada están asociados a la resolución de la misma.</p>
<p style="text-align: center;"><a href="http://blog.osusnet.com/wp-content/uploads/2010/01/10-task2-contexto.gif"><img class="aligncenter" title="10-task2-contexto" src="http://blog.osusnet.com/wp-content/uploads/2010/01/10-task2-contexto.gif" alt="10 task2 contexto Aumenta tu productividad integrando el sistema de incidencias en el entorno de desarrollo: Eclipse + Mylyn + Jira + Subversion" width="470" height="343" /></a></p>
<p>Abre algunos archivos de ejemplo y en la pestaña &#8220;Context&#8221; de la incidencia verás cómo va asociándolos. Si ahora, en vez de cerrar la incidencia en la &#8220;X&#8221; la <em><strong>desactivas</strong></em> de nuevo en el circulito, verás como automáticamente se cierran también todos los archivos asociados. Y aquí viene lo bueno, si vuelves a activarla se abren automáticamente todos los archivos sobre los que estabas trabajando. Este sistema te permite cambiar rápidamente el entorno de trabajo de una incidencia a otra sin tener que buscar de nuevo todos los fuentes uno a uno.</p>
<p style="text-align: center;"><a href="http://blog.osusnet.com/wp-content/uploads/2010/01/11-task3-context-conarchivos.gif"><img class="aligncenter" title="11-task3-context-conarchivos" src="http://blog.osusnet.com/wp-content/uploads/2010/01/11-task3-context-conarchivos.gif" alt="11 task3 context conarchivos Aumenta tu productividad integrando el sistema de incidencias en el entorno de desarrollo: Eclipse + Mylyn + Jira + Subversion" width="470" height="314" /></a></p>
<p>Hay una opción más para trabajar con los <strong>contextos</strong> que permite que distintos usuarios los compartan y consiste en subirlos al propio servidor de <strong>Jira</strong>. Se suben como archivos zip como si fuese un archivo adjunto a la incidencia normal y corriente, pero <strong>Mylyn</strong> sabe lo que tiene que hacer con ellos cuando se recuperan.</p>
<p style="text-align: center;"><a href="http://blog.osusnet.com/wp-content/uploads/2010/01/12-context.gif"><img class="aligncenter" title="12-context" src="http://blog.osusnet.com/wp-content/uploads/2010/01/12-context.gif" alt="12 context Aumenta tu productividad integrando el sistema de incidencias en el entorno de desarrollo: Eclipse + Mylyn + Jira + Subversion" width="327" height="324" /></a></p>
<p>Finalmente otra opción interesante es la integración con <a href="http://subversion.tigris.org/">Subversion</a>. Teniendo una incidencia <em><strong>activada</strong></em>, cada vez que hagamos <em>commit</em> al repositorio nos adjuntará automáticamente en el comentario del <strong>svn</strong> información acerca de la incidencia que se resuelve, eso que nunca hacemos <img src='http://blog.osusnet.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' title="Aumenta tu productividad integrando el sistema de incidencias en el entorno de desarrollo: Eclipse + Mylyn + Jira + Subversion" /> .</p>
<p><a href="http://blog.osusnet.com/wp-content/uploads/2010/01/13-svn.gif"><img class="aligncenter" title="13-svn" src="http://blog.osusnet.com/wp-content/uploads/2010/01/13-svn.gif" alt="13 svn Aumenta tu productividad integrando el sistema de incidencias en el entorno de desarrollo: Eclipse + Mylyn + Jira + Subversion" width="470" height="724" /></a>Como veis tenemos el desarrollo junto a las incidencias y la resolución de las mismas en <strong>Subversión</strong> completamente integrado en una sola aplicación. Cuando os comentaba al principio del artículo sobre que no me daba cuenta de lo pesado que era hacerlo en tres pasos, ahora veis a qué me refería, es una de esas cosas que hasta que las tienes no sabes lo que vale.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.osusnet.com/2010/03/02/aumenta-tu-productividad-integrando-el-sistema-de-incidencias-en-el-entorno-de-desarrollo-eclipse-mylyn-jira/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
