<?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>Carlos Robles frikiblog</title>
	<atom:link href="http://www.carlosrobles.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.carlosrobles.com/blog</link>
	<description>Eso tampoco me preocupa demasiado...</description>
	<lastBuildDate>Thu, 15 Dec 2011 01:46:50 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Conocer espacio libre en memoria interna del teléfono</title>
		<link>http://www.carlosrobles.com/blog/2011/11/conocer-espacio-libre-en-memoria-interna-del-telefono/</link>
		<comments>http://www.carlosrobles.com/blog/2011/11/conocer-espacio-libre-en-memoria-interna-del-telefono/#comments</comments>
		<pubDate>Wed, 16 Nov 2011 00:53:38 +0000</pubDate>
		<dc:creator>carlosrobles</dc:creator>
				<category><![CDATA[Android]]></category>

		<guid isPermaLink="false">http://www.carlosrobles.com/blog/?p=120</guid>
		<description><![CDATA[Sin rodeos: File path = Environment.getDataDirectory(); StatFs stat = new StatFs(path.getPath()); long blockSize = stat.getBlockSize(); long availableBlocks = stat.getAvailableBlocks(); return Formatter.formatFileSize(this, availableBlocks * blockSize); Por su puesto, on StatFs podemos conseguir información de una ruta concreta, por ejemplo StatFs stats &#8230; <a href="http://www.carlosrobles.com/blog/2011/11/conocer-espacio-libre-en-memoria-interna-del-telefono/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Sin rodeos:</p>
<pre class="brush: java; title: ;">
File path = Environment.getDataDirectory();
StatFs stat = new StatFs(path.getPath());
long blockSize = stat.getBlockSize();
long availableBlocks = stat.getAvailableBlocks();
return Formatter.formatFileSize(this, availableBlocks * blockSize);
</pre>
<p>Por su puesto, on StatFs podemos conseguir información de una ruta concreta, por ejemplo</p>
<pre class="brush: java; title: ;">StatFs stats = new StatFs(&quot;/data&quot;);
[...]
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.carlosrobles.com/blog/2011/11/conocer-espacio-libre-en-memoria-interna-del-telefono/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Magento envía un email en blanco</title>
		<link>http://www.carlosrobles.com/blog/2011/11/magento-envia-un-email-en-blanco/</link>
		<comments>http://www.carlosrobles.com/blog/2011/11/magento-envia-un-email-en-blanco/#comments</comments>
		<pubDate>Sun, 06 Nov 2011 01:57:01 +0000</pubDate>
		<dc:creator>carlosrobles</dc:creator>
				<category><![CDATA[Magento]]></category>
		<category><![CDATA[Vete a saber]]></category>
		<category><![CDATA[magento email plantillas]]></category>

		<guid isPermaLink="false">http://www.carlosrobles.com/blog/?p=117</guid>
		<description><![CDATA[Hay veces en que nos encontramos con que nuestra tienda envia alguno de los emails (por ejemplo de nuevo pedido, de envio, de lo que sea) y el asunto se lee correctamente, pero no tiene contenido. De hecho si miramos &#8230; <a href="http://www.carlosrobles.com/blog/2011/11/magento-envia-un-email-en-blanco/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Hay veces en que nos encontramos con que nuestra tienda envia alguno de los emails (por ejemplo de nuevo pedido, de envio, de lo que sea) y el asunto se lee correctamente, pero no tiene contenido. De hecho si miramos el código fuente del email (si, soy un raro) vemos que no tiene nada, es decir, no es que el HTML este mal formado, sino que ha habido algún fallo antes y no se ha llegado a generar el cuerpo del mail</p>
<p>Magento esta increiblemente bien programado, asique el fallo esta sin duda en las plantillas.</p>
<p>Y eso tenemos que revisar. Primero comprobamos qué plantilla estamos usando <strong>(si la hemos definido desde el admin, desde ahi mismo podemos ver el código,</strong> si no recordais como, un dia de estos preparé un post) <strong>y si es una de las del sistema (que posiblemente hayamos adaptado o que sea de una traduccion) buscamos el archivo.</strong> Las plantillas de los emails se encuentran en:<br />
<strong>app\locale\en_US\template\email\<br />
app\locale\en_US\template\email\sales</strong><br />
(cambiando en_US por lo que corresponda al idioma que sea, por ejemplo es_ES para español)</p>
<p>dentro veremos una serie de archivos, los nombres son bastante representativos. Si no habeis tocado mucho más, directamente sabreis lo que hace cada uno, pero en cualquier caso no esta de mas comprobarlo. Tengo pendiente es post explicando como saber que plantilla esta asociada a cada evento del sistema, y de paso como crearlas nuevas.</p>
<p><strong>Ahora que las tenemos localizadas, lo primero es asegurarnos que la que buscamos está. Si no está ya hemos encontrado el problema. </strong><br />
Si sí esta, la abrimos, y vemos lo que pasa. Por lo general sera o que esta mal formateado, o que utiliza variables mal, o que tiene algun caracter que no puede reconocer, porque no olvidemos que lo que va a hacer magento es cargar ese archivo, parsearlo, y rellenarlo con datos, y si falla una sola linea al parsear o asignar los datos de las variables, lo que va a pasar es que falle todo y el mail llegue en blanco.</p>
<p><strong>La primera cosa que tenemos que buscar, y esto es sorprendente&#8230;son caracteres que no sean &#8220;normales&#8221;. Todo lo que no sea un caracter alfanumerico normalito del alfabeto ingles, deberá substituirse por el código html correspondiente. Por ejempo si pones la palabra &#8220;teléfono&#8221; fallara, deberas poner su equivalente &#8220;teléfono&#8221;. Y asi con todo. </strong></p>
<p>Si ese no es el problema, tocará revisar estructuras.<br />
un ejemplo de plantilla es algo asi:</p>
<pre class="brush: xml; title: ;">&lt;!--@subject {{var store.getFrontendName()}}: Cambios en pedido # {{var order.increment_id}} @--&gt;
&lt;!--@vars {&quot;store url=\&quot;\&quot;&quot;:&quot;Store Url&quot;, &quot;skin url=\&quot;images/logo_email.gif\&quot; _area='frontend'&quot;:&quot;Email Logo Image&quot;, &quot;htmlescape var=$order.getCustomerName()&quot;:&quot;Customer Name&quot;, &quot;var order.increment_id&quot;:&quot;Order Id&quot;, &quot;var order.getStatusLabel()&quot;:&quot;Order Status&quot;, &quot;store url=\&quot;customer/account/\&quot;&quot;:&quot;Customer Account Url&quot;, &quot;var comment&quot;:&quot;Order Comment&quot;, &quot;var store.getFrontendName()&quot;:&quot;Store Name&quot;} @--&gt;
&lt;!--@styles body,td { color:#2f2f2f; font:11px/1.35em Verdana, Arial, Helvetica, sans-serif; } @--&gt;&lt;/pre&gt;
&lt;div style=&quot;font: 11px/1.35em Verdana, Arial, Helvetica, sans-serif;&quot;&gt;
&lt;table style=&quot;margin-top: 10px; font: 11px/1.35em Verdana, Arial, Helvetica, sans-serif; margin-bottom: 10px;&quot; width=&quot;98%&quot; border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot; valign=&quot;top&quot;&gt;&lt;!-- [ header starts here] --&gt;
&lt;table width=&quot;650&quot; border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot;&gt;&lt;a href=&quot;{{store url=&quot;&gt;&lt;img style=&quot;margin-bottom: 10px;&quot; src=&quot;{{skin url=&quot; alt=&quot;{{var store.getFrontendName()}}&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
 &lt;!-- [ middle starts here] --&gt;
&lt;table width=&quot;650&quot; border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot;&gt;
 &lt;strong&gt;Estimado/a {{htmlescape var=$order.getCustomerName()}}&lt;/strong&gt;,

 Tu pedido # {{var order.increment_id}} ha sido
 &lt;strong&gt;{{var order.getStatusLabel()}}&lt;/strong&gt;.

 Puedes comprobar el estado de tu pedido &lt;a style=&quot;color: #1e7ec8;&quot; href=&quot;{{store url=&quot;&gt;en la web de ups: www.ups.es&lt;/a&gt;.

{{var comment}}

 Si tienes alguna duda, contacta con nosotros:
 &lt;a style=&quot;color: #1e7ec8;&quot; href=&quot;mailto:{{config path='trans_email/ident_support/email'}}&quot;&gt;{{config path='trans_email/ident_support/email'}}&lt;/a&gt;&lt;!--                       o por tel&amp;eacute;fono:  {{config path='general/store_information/phone'}}--&gt;.

Gracias de nuevo,
&lt;strong&gt;{{var store.getFrontendName()}}&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;pre&gt;
</pre>
<p>La primera linea en comentario es el asunto que llegará realmente, aqui es donde se define. El siguiente bloque como comentario es un poco complicado de explicar, y prefiero no hacerlo, y despues son los estilos CSS que se meteran en el body. Por ultimo esta todo el HTML del cuerpo del mail, con sus variables y etc.</p>
<p><strong>Tanto en el asunto como en el cuerpo, lo unico que tenemos que hacer es comprobar que las variables se estan usando bien. Las variables son todo lo que hay entre {{}}<br />
Posiblemente alguna la hayamos escrito mal y esté fallando por ahi. Podemos ver una lista completa de las permitidas aqui:</strong><br />
<a href="http://www.magentocommerce.com/wiki/modules_reference/english/mage_adminhtml/system_email_template/index">http://www.magentocommerce.com/wiki/modules_reference/english/mage_adminhtml/system_email_template/index</a></p>
<p>su significado es bastante intuitivo. De todas formas siempre te puedes crear un email con todas ellas para saber qué valor tienen en tu caso concreto.</p>
<p>Basicamente controlando que las variables se esten usando bien, y los caracteres especiales estén codificados correctamente, aseguramos que el mail llegue como tiene que llegar. Y si no, a quejarse en los comentarios.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.carlosrobles.com/blog/2011/11/magento-envia-un-email-en-blanco/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Los Sprites parpadean, se pierden frames, algunas texturas no se cargan?</title>
		<link>http://www.carlosrobles.com/blog/2011/09/los-sprites-parpadean-se-pierden-frames-algunas-texturas-no-se-cargan/</link>
		<comments>http://www.carlosrobles.com/blog/2011/09/los-sprites-parpadean-se-pierden-frames-algunas-texturas-no-se-cargan/#comments</comments>
		<pubDate>Mon, 12 Sep 2011 19:02:47 +0000</pubDate>
		<dc:creator>carlosrobles</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[OpenGL]]></category>

		<guid isPermaLink="false">http://www.carlosrobles.com/blog/?p=114</guid>
		<description><![CDATA[En Andengine, y por ende en cualquier sistema basado en openGL, nos podemos encontrar un problema (curiosamente comun) que nos puede hacer volvernos locos. Por lo general, creamos una textura, le añadimos sources, y luego definimos una region, y a &#8230; <a href="http://www.carlosrobles.com/blog/2011/09/los-sprites-parpadean-se-pierden-frames-algunas-texturas-no-se-cargan/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>En Andengine, y por ende en cualquier sistema basado en openGL, nos podemos encontrar un problema (curiosamente comun) que nos puede hacer volvernos locos.</p>
<p>Por lo general, creamos una textura, le añadimos sources, y luego definimos una region, y a partir de ahi hacemos un sprite animado. No tiene secreto.</p>
<p>Pues muchas veces nos encontramos que algo sale mal, y algunos de los frames no apareceren.  Es decir, la imagen animada a veces desaparece por un momento, como si uno de los frames fuese transparente.<br />
Despues de mucho recorrer el código, y comprobar que las texturas estan cargadas por los procedimientos habituales la cosa se complica, porque ademas suele pasar que entre varios frames que realmente estan en la misma textura, unos se ven y otros no, por lo que la textura si que tiene que estar cargada en el hardware, si no no se veria ninguno. Por otro lado, ya se sabe que cuando una textura se intenta usar antes de que esté cargado, no aparece un rectangulo transparente, sino que aprece un rectangulo blanco. El enfoque era malo desde el principio.</p>
<p>Esto nos hace pensar un poco más, y nos acordamos de openGL ysus secretos. Hay una cosa que se llama <a href="http://en.wikipedia.org/wiki/Vertex_Buffer_Object">Vertex Buffer Object </a>, que es uno de los mayores trucos de kung fu de openGL,  muy resumido es una extension que permite que las imagenes estén en la tarjeta gráfica en vez de en la memoria del sistema, lo que permite un rendimiento mucho mayo, que no es nada que se deba despreciar. Pero a la vez es otro punto por donde pasan los datos, y que por tanto hay que tener controlado.</p>
<p>Me di cuenta que en el emulador el programa corria perfectamente, pero en el móvil no, y también me di cuenta que cada vez fallaba una imagen distinta, y en distintos moviles fallaba mas, menos, o nada. Por lo tanto no es algo de programación, sino de Hardware.</p>
<p>Con estos datos, y buscando por el completisimo Andengine, encuentro que ya han previsto la forma de desactivar el VBO, que siempre es mejor que meter un comando openGL a mano, porque soy un vago.</p>
<p>la forma es antes de crear el Engine, hacemos esto con el objeto EngineOptions que le vamos a pasar:</p>
<pre class="brush: java; title: ;"> engineOptions.getRenderOptions().disableExtensionVertexBufferObjects(); </pre>
<p>y &#8230; funciona!</p>
<p>Supongo que a no ser que tengas un dispositivo muy potente, la memoria gráfica es mas bien poca, y puede que sea que al intentar cargar un juego con demasiadas imágenes, no sea demasiado bueno depender de ella, porque puede fallar.</p>
<p>Y como lo tengo que hacer mucho, porque varias de las Activities que uso llevan un monton de imágenes, y ademas hay otras cuantas chorradas en comun, pues me he creado una subclase de EngineOptions que ya hace lo propio:</p>
<pre class="brush: java; title: ;">public class GameEngineOptions extends EngineOptions {

 public GameEngineOptions(boolean pFullscreen,
 ScreenOrientation pScreenOrientation,
IResolutionPolicy pResolutionPolicy, Camera pCamera) {
 super(pFullscreen, pScreenOrientation, pResolutionPolicy, pCamera);
getRenderOptions().disableExtensionVertexBufferObjects();
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.carlosrobles.com/blog/2011/09/los-sprites-parpadean-se-pierden-frames-algunas-texturas-no-se-cargan/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Depurar servicios, teclados,  aplicaciones desde el telefono, aplicaciones que ya hemos subido</title>
		<link>http://www.carlosrobles.com/blog/2011/09/depurar-servicios-teclados-aplicaciones-desde-el-telefono-aplicaciones-que-ya-hemos-subido/</link>
		<comments>http://www.carlosrobles.com/blog/2011/09/depurar-servicios-teclados-aplicaciones-desde-el-telefono-aplicaciones-que-ya-hemos-subido/#comments</comments>
		<pubDate>Tue, 06 Sep 2011 18:38:09 +0000</pubDate>
		<dc:creator>carlosrobles</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[IDEs]]></category>

		<guid isPermaLink="false">http://www.carlosrobles.com/blog/?p=111</guid>
		<description><![CDATA[Las mismas soluciones interesan para distintas cosas. Si vamos a lanzar un servicio (como puede ser un input method o mil cosas mas). si queremos que un programa siempre lleve conectado el depurador, aunque lo lancemos desde el telefono o &#8230; <a href="http://www.carlosrobles.com/blog/2011/09/depurar-servicios-teclados-aplicaciones-desde-el-telefono-aplicaciones-que-ya-hemos-subido/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Las mismas soluciones interesan para distintas cosas.<br />
Si vamos a lanzar un servicio (como puede ser un input method o mil cosas mas).<br />
si queremos que un programa siempre lleve conectado el depurador, aunque lo lancemos desde el telefono o el emulador.<br />
Otro caso muy normal es cuando subimos una aplicacion y falla, y queremos volverlo a ejecutar pero sin cambiar codigo. A veces eclipse sabe que no tiene.<br />
Y otro es cuando estamos en una actividad que lanza a otra, pero no llamamos a finish, porque la primera sigue teniendo que estar ahi a la vuelta. Si falla la segunda, se finalizará pero en muchos de los casos volveremos a la actividad anterior, que aunque sean actividades distintas, por suerte se identifican como parte del mismo proceso, asique podemos rescatar la depuracion y volverlo a intentar sin tener que subirla de nuevo o empezar la ejecucion desde el principio. Eso, si, el depurador se habra desconectado.</p>
<p>Para todas estas situaciones y más, tenemos dos opciones:<br />
1. Tener en cuenta que el debugger se puede conectar manualmente.  Para ello vamos a la perspectiva DDMS y en la pestaña Devices.<br />
Pinchamos el nombre del proceso, que es facil porque se llama igual que el paquete, y despues pulsamos el bichito verde.<br />
Otro dia explicaré mas cosas útiles de los demas botones, pero aprovecho para destacar otro muy util, que es el de Stop, que va muy  bien por ejemplo cuando un proceso se nos cuelga y no podemos pararlo desde el mismo programa o con los botones del movil.</p>
<p><a href="http://www.carlosrobles.com/blog/wp-content/uploads/2011/09/06-09-2011-19-55-10.png"><img class="alignnone size-full wp-image-112" title="06-09-2011 19-55-10" src="http://www.carlosrobles.com/blog/wp-content/uploads/2011/09/06-09-2011-19-55-10.png" alt="" width="402" height="285" /><br />
</a><br />
2. La otra opcion para conectar el depurador, mucho mas facil, menos estresante que ir corriendo,  y que nos garantiza que estará conectado a tiempo para la linea que lo necesitamos, es incluir esta instruccion en el código, al principio de la actividad (en el onCreate esta bien) o donde queramos. Acuerdate de quitarlo para la version release, por dejar las cosas limpias.</p>
<pre class="brush: java; title: ;">android.os.Debug.waitForDebugger();</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.carlosrobles.com/blog/2011/09/depurar-servicios-teclados-aplicaciones-desde-el-telefono-aplicaciones-que-ya-hemos-subido/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Regedit: Error al eliminar la clave</title>
		<link>http://www.carlosrobles.com/blog/2011/09/regedit-error-al-eliminar-la-clave/</link>
		<comments>http://www.carlosrobles.com/blog/2011/09/regedit-error-al-eliminar-la-clave/#comments</comments>
		<pubDate>Thu, 01 Sep 2011 22:07:59 +0000</pubDate>
		<dc:creator>carlosrobles</dc:creator>
				<category><![CDATA[Vete a saber]]></category>
		<category><![CDATA[malware]]></category>
		<category><![CDATA[regedit]]></category>
		<category><![CDATA[spyware]]></category>

		<guid isPermaLink="false">http://www.carlosrobles.com/blog/?p=107</guid>
		<description><![CDATA[A veces cuando estamos limpiando basurilla de nuestro ordenador, por ejemplo con algun programa anti malware, descubrimos que tenemos una entrada en el registro que las está liando pardas, y tenemos que quitarla. Ejecutamos regedit, la buscamos, la intentamos eliminar, &#8230; <a href="http://www.carlosrobles.com/blog/2011/09/regedit-error-al-eliminar-la-clave/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>A veces cuando estamos limpiando basurilla de nuestro ordenador, por ejemplo con algun programa anti malware, descubrimos que tenemos una entrada en el registro que las está liando pardas, y tenemos que quitarla.<br />
Ejecutamos regedit, la buscamos, la intentamos eliminar, y nos dice que leches.<br />
Por lo general, en estos casos, en el panel de la izquierda donde estn los datos, no veremos nada a parte del tipico(Predeterminado) que sale siempre. Lo cual ya es sospechoso, porque si el antimalware nos dijo que esto es malware, es raro que no tenga datos. ¿qué pasa? lo de siempre, que se ocultan.<br />
En estos casos lo que puede pasar es que el que creo la clave, lo hizo con un usuario concreto (por ejemplo system) y quitó todos los derechos a los demas.<br />
Para poder ver lo que hay y para poderlo eliminar, seleccionamos la clave en el panel de la izquierda (donde las carpetitas) le damos clic derecho, y luego pinchamos en &#8220;permisos&#8221;.<br />
En &#8220;nombres de grupos o usuarios&#8221; seguramente vemos que no sale nuestro nombre de usuario. Bueno, pues por suerte lo podemos añadir. Clic en Agregar&#8230; y donde dice &#8220;Escriba los nombres de objeto que queremos seleccionar&#8221; aunque suene raro, lo unico que hay que hacer es escribir nuestro nombre de usuario de windows y pulsar aceptar. Despues, en la pantalla que nos sale, que es la de antes, seleccionamos nuestro usuario, y abajo, en permitir, marcamos control total y leer, y en denegar lo desmarcamos todo. Pulsamos aceptar, y al volver al visor del registro, veremos que en el panel de la derecha aparece un monton de cosas, y ademas podemos eliminar lo que nos haga falta. Un problema menos.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.carlosrobles.com/blog/2011/09/regedit-error-al-eliminar-la-clave/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Me desespero depurando Android en Eclipse.</title>
		<link>http://www.carlosrobles.com/blog/2011/09/me-desespero-depurando-android-en-eclipse/</link>
		<comments>http://www.carlosrobles.com/blog/2011/09/me-desespero-depurando-android-en-eclipse/#comments</comments>
		<pubDate>Thu, 01 Sep 2011 21:07:09 +0000</pubDate>
		<dc:creator>carlosrobles</dc:creator>
				<category><![CDATA[Vete a saber]]></category>

		<guid isPermaLink="false">http://www.carlosrobles.com/blog/?p=109</guid>
		<description><![CDATA[Dicen que hay un nuevo procedimiento en las carceles para decidir si a un tio le dan la condicional. Le ponen a depurar una aplicacion de más de 30 megas en eclipse. Si despues de un rato en esas condiciones &#8230; <a href="http://www.carlosrobles.com/blog/2011/09/me-desespero-depurando-android-en-eclipse/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Dicen que hay un nuevo procedimiento en las carceles para decidir si a un tio le dan la condicional.<br />
Le ponen a depurar una aplicacion de más de 30 megas en eclipse. Si despues de un rato en esas condiciones ni mata a nadie ni recurre a las drogas, podemos estar seguros de que no lo va a hacer nunca.</p>
<p>No, es mentira, esto me lo acabo de inventar pero la verdad es que depurando una aplicación Android un poco grande con eclipse, te puedes desesperar, puedes acabar con la moral por los suelos, y lo que es peor, te puede tirar abajo la productividad. No se si es culpa del emulador de Android o del propio eclipse. </p>
<p>Las errores tipicos son cosas como que estés subiendo el apk, y falle sin mas explicaciones, o que haya algun timeout en medio de la depuracion, se pierda el control, y ni los breakpoints ni los steps funcionen. Estas cosas matan, pero de momento no se como atajarlas. En cambio hay otro par de errores habituales que se pueden evitar muy facilmente, y nos ahorraran horas en los desarrollos de aplicaciones grandes. </p>
<p>Uno es el habitual error <strong>INSTALL_FAILED_INSUFFICIENT_STORAGE </strong><br />
Puedes intentar cien veces depurar una aplicacion, y que te funcione 10. Muy frustrante.<br />
Se recomiendan cosas como :</p>
<ul>
<li>  Reconstruir el proyecto (Project->Clean)</li>
<li>Reiniciar el emulador, y eclipse, e incluso el ordenador. </li>
<li>
Cambiar la ruta del proyecto a una carpeta que no tenga espacios (que va bien tambien pare el siguiente error del que voy a hablar)</li>
</ul>
<p><strong>Todo esto está bien, pero no es definitivo. Lo que es muy cercano a ser definitivo, y lo que os obligo a hacer, es esto:</strong><br />
Vas a la configuracion de ejecucion o de depuracion (Debug Configuration de toda la vida) En la pestaña Target, abajo del todo, hay un campo de texto que pone “additional emulator command line options” <strong>Si no lo ves, maximiza la ventana, hazla todo lo grande que puedas, o inventa algo, porque está ahi, y muchas veces no se vé</strong> cuando lo tengas, escribes dentro:</p>
<pre class="brush: plain; title: ;">	-partition-size 1024 </pre>
<p><strong>y reinicias el emulador</strong><br />
Adicionalmente, si tu aplicacion es realmente grande, y pensando en dispositivos reales antiguos, donde la particion de memoria interna del telefono puede ser pequeña, no viene de mas poner esto en tu manifest:</p>
<pre class="brush: xml; title: ;"> &lt;manifest xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
    android:installLocation=&quot;preferExternal&quot;</pre>
<p>que no siempre es una opcion necesaria, ni a veces deseable, y es mas, creo que solo funciona a partir de 2.2, pero aunque en la version release lo quitemos, hara la depuracion en dispositivos reales menos frustrante. </p>
<p>La otra cosa desesperante es el muy habitual <strong> Failed to install miactividad.apk on device &#8216;tal y cual&#8217;: timeout <br />
 Launch canceled!</strong> Esto con una aplicacion grande pasa todo el tiempo, y es facil ver por qué:<br />
<strong>Si vamos a  Window -> Preferences<br />
y despues desplegamos  Android -> DDMS </strong><br />
vemos que ahi está configurado, en milisegundos el timeout, y que por defecto el límite es bajísimo para cualquier aplicacion un poco grande. Concretamente son 5 segundos, que siempre se va a superar aunque todo vaya bien! No le va mal ponerle un cerito mas, y pasarlo a 50 segundos.</p>
<p>Esto nos quita otro gran porcentaje de desesperacion!</p>
<p>Update: Ah! y para evitar el error que dice <strong>Installation failed due to invalid APK file! </strong>&#8230;no seas manazas, cuando ya le has dado al botoncito para ejecutar o depurar la aplicacion&#8230;no toques el codigo! aunque solo cambies un punto y coma, va a reconstruirlo entero, mientras se esta subiendo, y puede fallar.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.carlosrobles.com/blog/2011/09/me-desespero-depurando-android-en-eclipse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Elegir resaltador de sintáxis</title>
		<link>http://www.carlosrobles.com/blog/2011/08/elegir-resaltador-de-sintaxis/</link>
		<comments>http://www.carlosrobles.com/blog/2011/08/elegir-resaltador-de-sintaxis/#comments</comments>
		<pubDate>Thu, 11 Aug 2011 23:48:57 +0000</pubDate>
		<dc:creator>carlosrobles</dc:creator>
				<category><![CDATA[Yo/Meta]]></category>
		<category><![CDATA[Syntax Highlighter]]></category>

		<guid isPermaLink="false">http://www.carlosrobles.com/blog/?p=105</guid>
		<description><![CDATA[Pues ni lo dudes, lo mejor que he probado es el http://alexgorbatchev.com/SyntaxHighlighter/ Va por la version 3 y algo, pero la 2 sigue siendo mas que suficiente. Soporta practicamente todos estos lenguajes, y solo hay que poner el código entre unas &#8230; <a href="http://www.carlosrobles.com/blog/2011/08/elegir-resaltador-de-sintaxis/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Pues ni lo dudes, lo mejor que he probado es el http://alexgorbatchev.com/SyntaxHighlighter/<br />
Va por la version 3 y algo, pero la 2 sigue siendo mas que suficiente. Soporta practicamente todos estos lenguajes, y solo hay que poner el código entre unas etiquetas de de la forma [lenguaje] [/lenguaje]<br />
lenguaje puede ser cualquiera de los de la tabla, utilziando el brush alias, por ejemplo:</p>
<table border="2" cellspacing="0" cellpadding="0" style="border:1px solid gray">
<tbody>
<tr>
<td><strong>Brush name</strong></td>
<td><strong>Brush aliases</strong></td>
</tr>
<tr>
<td>ActionScript3</td>
<td>as3, actionscript3</td>
</tr>
<tr>
<td>Bash/shell</td>
<td>bash, shell</td>
</tr>
<tr>
<td>ColdFusion</td>
<td>cf, coldfusion</td>
</tr>
<tr>
<td>C#</td>
<td>c-sharp, csharp</td>
</tr>
<tr>
<td>C++</td>
<td>cpp, c</td>
</tr>
<tr>
<td>CSS</td>
<td>css</td>
</tr>
<tr>
<td>Delphi</td>
<td>delphi, pas, pascal</td>
</tr>
<tr>
<td>Diff</td>
<td>diff, patch</td>
</tr>
<tr>
<td>Erlang</td>
<td>erl, erlang</td>
</tr>
<tr>
<td>Groovy</td>
<td>groovy</td>
</tr>
<tr>
<td>JavaScript</td>
<td>js, jscript, javascript</td>
</tr>
<tr>
<td>Java</td>
<td>java</td>
</tr>
<tr>
<td>JavaFX</td>
<td>jfx, javafx</td>
</tr>
<tr>
<td>Perl</td>
<td>perl, pl</td>
</tr>
<tr>
<td>PHP</td>
<td>php</td>
</tr>
<tr>
<td>Plain Text</td>
<td>plain, text</td>
</tr>
<tr>
<td>PowerShell</td>
<td>ps, powershell</td>
</tr>
<tr>
<td>Python</td>
<td>py, python</td>
</tr>
<tr>
<td>Ruby</td>
<td>rails, ror, ruby</td>
</tr>
<tr>
<td>Scala</td>
<td>scala</td>
</tr>
<tr>
<td>SQL</td>
<td>sql</td>
</tr>
<tr>
<td>Visual Basic</td>
<td>vb, vbnet</td>
</tr>
<tr>
<td>XML</td>
<td>xml, xhtml, xslt, html, xhtml</td>
</tr>
</tbody>
</table>
<p>Y un monton de parametros configurables para cada vez que se usa:</p>
<p>autolinks — Toggle automatic URL linking.<br />
classname — Add an additional CSS class to the code box.<br />
collapse — Toggle collapsing the code box by default, requiring a click to expand it. Good for large code posts.<br />
firstline — An interger specifying what number the first line should be (for the line numbering).<br />
gutter — Toggle the left-side line numbering.<br />
highlight — A comma-sperated list of line numbers to highlight. You can also specify a range. Example: 2,5-10,12<br />
htmlscript — Toggle highlighting any extra HTML/XML. Good for when you&#8217;re mixing HTML/XML with another language, such as having PHP inside an HTML web page. The above preview has it enabled for example. This only works with certain languages.<br />
light — Toggle light mode which disables the gutter and toolbar all at once.<br />
padlinenumbers — Controls line number padding. Valid values are false (no padding), true (automatic padding), or an integer (forced padding).<br />
title (v3 only) — Sets some text to show up before the code. Very useful when combined with the collapse parameter.<br />
toolbar — Toggle the toolbar (buttons in v2, the about question mark in v3)<br />
wraplines (v2 only) — Toggle line wrapping.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.carlosrobles.com/blog/2011/08/elegir-resaltador-de-sintaxis/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Enviar un mail desde un script sh</title>
		<link>http://www.carlosrobles.com/blog/2011/08/enviar-un-mail-desde-un-script-sh/</link>
		<comments>http://www.carlosrobles.com/blog/2011/08/enviar-un-mail-desde-un-script-sh/#comments</comments>
		<pubDate>Thu, 11 Aug 2011 22:59:37 +0000</pubDate>
		<dc:creator>carlosrobles</dc:creator>
				<category><![CDATA[Unix Shell]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[mail]]></category>
		<category><![CDATA[sh]]></category>
		<category><![CDATA[unix]]></category>

		<guid isPermaLink="false">http://www.carlosrobles.com/blog/?p=103</guid>
		<description><![CDATA[Si queremos hacer un script que haga lo que sea (por ejemplo para un cron) y que nos envie un email con el resultado, hay bastantes cosas que se pueden hacer. Una muy facil es mediante el comado mail, disponible &#8230; <a href="http://www.carlosrobles.com/blog/2011/08/enviar-un-mail-desde-un-script-sh/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Si queremos hacer un script que haga lo que sea (por ejemplo para un cron) y que nos envie un email con el resultado, hay bastantes cosas que se pueden hacer.<br />
Una muy facil es mediante el comado mail, disponible en bash.</p>
<p>Empezamos el script</p>
<pre class="brush: bash; title: ;">
#!/bin/bash

#creamos la variable con el mail de destino
email=&quot;foo@estudiocarlosrobles.com&quot;

# Si vamos a guardar mucho texto, o es un texto que vayamos a crear secuencialmente, yo recomiendo crear un archivo de log mejor que crear una variable con todo. Asi el archivo de log se puede guardar en el servidor, que no ocupa mucho
#configuramos la ruta
logfile=&quot;/home/estudiocarlosrobles/url/temp.log&quot;

# eliminamos el archivo si existe (el -f es para que lo ignore si no existe)
rm -f $logfile
#y lo creamos vacio
touch $logfile

#Ahora metemos texto en el archivo, como queramos

echo &quot;este es el primer texto&quot; &gt;&gt; $logfile
echo &quot;ahora metemos otro&quot; &gt;&gt; $logfile
echo &quot;y asi pues todo lo que haga falta&quot; &gt;&gt; $logfile

#basicamente echo muestra el texto en la consola, pero con &gt;&gt; lo redirigimos a donde queremos, en este caso al archivo que creamos antes. 

#y ahora lo enviamos,   para ello usamos cat, que se usa para concatenar archivos, pero como estas cosas son magicas, podemos concatenar el contenido, al email que creamos con mail.
# añadimos -s para el asunto, y al final de todo la direccion de destino, y ya esta listo. 

cat $logfile|mail -s &quot;Asunto del mail&quot; $email
</pre>
<p>puedes probarlo asi mismo y si todo esta bien en tu servidor, y a partir de aqui, ir metiendo cosas. </p>
<p>Otro dia contaré como hacer un envio masivo, y mas importante, como adjuntar un archivo, que es algo muy util.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.carlosrobles.com/blog/2011/08/enviar-un-mail-desde-un-script-sh/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Seguridad informática de usuario, somos un poco retorcidos</title>
		<link>http://www.carlosrobles.com/blog/2011/08/seguridad-informatica-que-es-lo-que-pretendemos/</link>
		<comments>http://www.carlosrobles.com/blog/2011/08/seguridad-informatica-que-es-lo-que-pretendemos/#comments</comments>
		<pubDate>Thu, 11 Aug 2011 22:10:06 +0000</pubDate>
		<dc:creator>carlosrobles</dc:creator>
				<category><![CDATA[Vete a saber]]></category>

		<guid isPermaLink="false">http://www.carlosrobles.com/blog/?p=100</guid>
		<description><![CDATA[Vale que los crackers utilizan diccionarios, pero creo que ni aun asi esto pierde razón&#8230; via xkcd: http://xkcd.com/936/]]></description>
			<content:encoded><![CDATA[<p>Vale que los crackers utilizan diccionarios, pero creo que ni aun asi esto pierde razón&#8230;</p>
<p><img class="alignnone size-full wp-image-101" title="password_strength" src="http://www.carlosrobles.com/blog/wp-content/uploads/2011/08/password_strength.png" alt="" width="740" height="601" /></p>
<p>via xkcd: http://xkcd.com/936/</p>
]]></content:encoded>
			<wfw:commentRss>http://www.carlosrobles.com/blog/2011/08/seguridad-informatica-que-es-lo-que-pretendemos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Imagen no encontrada, controlar apariencia en los distintos navegadores</title>
		<link>http://www.carlosrobles.com/blog/2011/08/imagen-no-encontrada-controlar-apariencia-en-los-distintos-navegadores/</link>
		<comments>http://www.carlosrobles.com/blog/2011/08/imagen-no-encontrada-controlar-apariencia-en-los-distintos-navegadores/#comments</comments>
		<pubDate>Thu, 11 Aug 2011 22:01:57 +0000</pubDate>
		<dc:creator>carlosrobles</dc:creator>
				<category><![CDATA[apache]]></category>
		<category><![CDATA[htaccess]]></category>
		<category><![CDATA[apariencia]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[imagen no encontrada]]></category>
		<category><![CDATA[reemplazar]]></category>

		<guid isPermaLink="false">http://www.carlosrobles.com/blog/?p=98</guid>
		<description><![CDATA[A veces cuando nuestra tiene una imagen que se ha movido, que tiene el nombre mal, que esta rota, o que por lo que sea no se puede mostrar&#8230;normalmente el navegador hace cosas muy feas, como mostrar el tipico cuadrado &#8230; <a href="http://www.carlosrobles.com/blog/2011/08/imagen-no-encontrada-controlar-apariencia-en-los-distintos-navegadores/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>A veces cuando nuestra tiene una imagen que se ha movido, que tiene el nombre mal, que esta rota, o que por lo que sea no se puede mostrar&#8230;normalmente el navegador hace cosas muy feas, como mostrar el tipico cuadrado con una x roja dentro. Como si por si acaso no tuvieses bastante lio con haber perdio una imagen, además quisiera dar evidencia de ello a todos tus visitantes, y de paso romper todo lo posible la estética de la página.  Opera simplemente no lo muestra, y creo que firefox tampoco, safari no se pero chrome muestra el borde y tambien ie, aunque haya dicho que no borde en html o css, te lo pone, como diciendo &#8220;eh! que aqui hay algo&#8221;.   Lo hacen con la mejor intencion, pero es un royo.</p>
<p>Para solucionarlo rapidamente, podemos tirar de htaccess. Habra mil cosas mas finas pero no mas rápidas y mas divertidas que la magia del mod_rewrite</p>
<p>Vamos a nuestro .htaccess, y si no tenemos, lo creamos. Si no sabemos lo que es&#8230;buscamos en internet <img src='http://www.carlosrobles.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>una vez dentro, nos hace falta esto:</p>
<pre class="brush: plain; title: ;">

RewriteEngine on
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
RewriteRule \.(gif|jpe?g|png|bmp) /path/to/spacer.gif [NC,L]
</pre>
<p>Lo cual, si miramos el mod_rewrite cheat cart, que os recomendaba en <a title="Cheat Sheets, chuletas, referencias rapidas" href="http://www.carlosrobles.com/blog/2011/04/cheat-sheets-chuletas-referencias-rapidas/" target="_blank">otro post</a>, y un poco más que os explico ahora, significa que:</p>
<p>-Habilitamos lo de reescribir direcciones, y<br />
-Si se cumple la condicion de que el recurso solicitado ( %{DOCUMENT_ROOT}%{REQUEST_URI} )  no se encuentra (!-f)<br />
-Reescribimos la ruta si es una imagen (acaba en .gif, .jpg, .jpeg, .bmp, y las que queramos añadir) y la cambiamos por la ruta a una imagen de reemplazo. No nos importa si la extension esta en mayusculas o minisculas (NC) y no hay que comprobar nada mas, esta es la ultima regla (L)</p>
<p>Si no te gusta, puedes usar tambien esto, concatenando las reglas, y despues reemplazando toda la URL</p>
<pre class="brush: plain; title: ;">

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} \.(gif|jpg|jpeg|png)$  [NC]
RewriteRule .* path/to/noimage.gif [L]
</pre>
<p>La imagen de reemplazo puede ser un spacer (tipica imagen transparente que simplemente ocupa el espacio que ocuparia la original, pero sin mostrar nada) o una imagen que hayamos creado que diga que la imagen no se encuentra, o tal vez una imagen por defecto si estamos en una miniatura de un album, un avatar de un usuario, o algo del estilo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.carlosrobles.com/blog/2011/08/imagen-no-encontrada-controlar-apariencia-en-los-distintos-navegadores/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

