<?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>El Futirifoken &#187; html</title>
	<atom:link href="http://www.gazer.com.ar/tag/html/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.gazer.com.ar</link>
	<description>El arte de no decir nada ;-)</description>
	<lastBuildDate>Mon, 26 Dec 2011 19:56:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Filtrando datos con jQuery</title>
		<link>http://www.gazer.com.ar/2010/06/25/filtrando-datos-con-jquery/</link>
		<comments>http://www.gazer.com.ar/2010/06/25/filtrando-datos-con-jquery/#comments</comments>
		<pubDate>Fri, 25 Jun 2010 03:19:21 +0000</pubDate>
		<dc:creator>Gazer</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://www.gazer.com.ar/?p=1289</guid>
		<description><![CDATA[Filtrar elementos dentro de una lista o una tabla para realizar una búsqueda inline con jQuery es bastante simple, solo basta entender un poco donde va cada cosa. La función en cuestión que nos permite hacer esto es filter() que junto con un poco de trabajo para hacer un deep-search dentro del DOM nos da [...]]]></description>
			<content:encoded><![CDATA[<p>Filtrar elementos dentro de una lista o una tabla para realizar una búsqueda inline con jQuery es bastante simple, solo basta entender un poco donde va cada cosa. La función en cuestión que nos permite hacer esto es <a href="http://api.jquery.com/filter/">filter()</a> que junto con un poco de trabajo para hacer un deep-search dentro del DOM nos da esta funcionalidad.</p>
<p>Por ejemplo si queremos mostrar los elementos de una lista que coinciden con una búsqueda deberíamos hacer algo como :</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">  v <span style="color: #339933;">=</span> <span style="color: #3366CC;">'some word'</span><span style="color: #339933;">;</span>
  <span style="color: #009966; font-style: italic;">/* Ocultamos todos los LI */</span>
  $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#list ul li'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">hide</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009966; font-style: italic;">/* Filtramos y mostramos los que coinciden */</span>
  $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#list ul'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">contents</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">filter</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">return</span> innerSearch<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #339933;">,</span> v<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">show</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>La función innerSearch la pueden ver en el ejemplo, y básicamente hace un recorrido por el DOM y devolviendo true en aquellos tags donde su contenido de texto contiene el patrón buscado.</p>
<p>Eso nos da muchas posibilidades, ya que por ejemplo en lugar de un simple show se podría aplicar alguna clase CSS para resaltar, modificar el color o lo que se les pueda ocurrir.</p>
<p>Por razones de <em>performance</em> no es muy útil para un DOM muy complejo, pero para el <a href="http://club.speedy.com.ar/concursos/llevate-dos-entradas-para-el-avant-premiere-de-brigada-a/ganadores">caso</a> donde yo lo necesité funciona aceptablemente bien.</p>
<p>Dejo <a href='http://www.gazer.com.ar/wp-content/uploads/2010/06/jquery_filter.html' target="_blank">un ejemplo</a> completo con filtrado en listas y tablas.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gazer.com.ar/2010/06/25/filtrando-datos-con-jquery/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>HTML5 : Guardar el contenido de &lt;canvas&gt; en el servidor</title>
		<link>http://www.gazer.com.ar/2010/04/13/html5-guardar-el-contenido-de-canvas-en-el-servidor/</link>
		<comments>http://www.gazer.com.ar/2010/04/13/html5-guardar-el-contenido-de-canvas-en-el-servidor/#comments</comments>
		<pubDate>Tue, 13 Apr 2010 03:57:34 +0000</pubDate>
		<dc:creator>Gazer</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[canvas]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[Sinatra]]></category>

		<guid isPermaLink="false">http://www.gazer.com.ar/?p=1267</guid>
		<description><![CDATA[Hoy tenía ganas de hacer algo distinto (vamos, no quería trabajar ) así que me puse a jugar con HTML5, entre otras cosas con el tag &#60;canvas&#62; para poder dibujar. Luego de bajar varios ejemplos y tener un &#8216;paint&#8217; andando lo que quería era guardar la imagen, y llegué a este post donde el autor [...]]]></description>
			<content:encoded><![CDATA[<p>Hoy tenía ganas de hacer algo distinto (vamos, no quería trabajar <img src='http://www.gazer.com.ar/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> ) así que me puse a jugar con HTML5, entre otras cosas con el tag &lt;canvas&gt; para poder dibujar. Luego de bajar varios ejemplos y tener un &#8216;paint&#8217; andando lo que quería era guardar la imagen, y llegué a este <a href="http://www.nihilogic.dk/labs/canvas2image/">post</a> donde el autor deja guardar en PNG, JPG hasta incluso en BMP el contenido del canvas.</p>
<p>Pero que el usuario se pueda guardar la imagen no era mi idea, era más bien guardarle en el servidor. Por ejemplo para hacer una firma digital y usarla después en el sitio para firmar los posts como si fueran documentos <img src='http://www.gazer.com.ar/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> .</p>
<p>Al principio pensé que iba a ser <em>super</em> complicado, pero me encontré que todo fue mucho más fácil de lo que imaginé. Así que vamos por partes.</p>
<p>Vamos a empezar por el server. Como era muy poco código para este ejemplo, hice una aplicación en <a href="http://www.sinatrarb.com/">Sinatra</a> que me permite mostrar un canvas y luego hacer un POST con los datos. Es ideal en este caso, ya que el server queda de tan solo unas 20 líneas de código :</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'sinatra'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'RMagick'</span>
&nbsp;
get <span style="color:#996600;">'/'</span> <span style="color:#9966CC; font-weight:bold;">do</span>
   erb <span style="color:#ff3333; font-weight:bold;">:index</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
post <span style="color:#996600;">'/'</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  <span style="color:#008000; font-style:italic;"># Ya completaremos ...</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Como se puede ver tenemos una vista en el root y el POST lo manejamos también en la raiz. Para procesar la imagen decidí usar la única gema que conozco, RMagick, que buscando en la documentación de ImageMagick me <a href="http://www.imagemagick.org/script/formats.php">encontré</a> con grata sorpresa que sale leer &#8216;Base64-encoded inline image&#8217; , que resulta que es justo el formato en que se obtienen los datos desde el canvas <img src='http://www.gazer.com.ar/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . La única diferencia es que hay que preceder el string con &#8216;inline:&#8217; y ya estamos, nuestro método POST queda así :</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">post <span style="color:#996600;">'/'</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  data = <span style="color:#996600;">'inline:'</span> <span style="color:#006600; font-weight:bold;">+</span> request.<span style="color:#9900CC;">body</span>.<span style="color:#9900CC;">read</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">begin</span>
    image = <span style="color:#6666ff; font-weight:bold;">Magick::Image</span>.<span style="color:#9900CC;">read</span><span style="color:#006600; font-weight:bold;">&#40;</span>data<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">first</span>
&nbsp;
    image.<span style="color:#9900CC;">write</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">'image.png'</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#996600;">&quot;alert('Image saved successfully')&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">rescue</span>
    <span style="color:#996600;">&quot;alert('Image format not recognized')&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Habría que revisar la documentación y bugs de ImageMagick para ver que tipos de implicancia puede llegar a tener en la seguridad del sitio o del sistema, pero son cosas que no vienen al caso <img src='http://www.gazer.com.ar/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p>La vista (reducida para el ejemplo) puede resumirse en el siguiente HTML :</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">  &lt;canvas id=&quot;example&quot; width=&quot;200&quot; height=&quot;200&quot;&gt;
    This text is displayed if your browser does not support HTML5 Canvas.
  &lt;/canvas&gt;
&nbsp;
  &lt;input type=&quot;button&quot; id=&quot;submit&quot; value=&quot;Submit&quot; /&gt;</pre></div></div>

<p>Y un poco de javascript :</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>script type<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;text/javascript&quot;</span><span style="color: #339933;">&gt;</span>
  $<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;input&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">click</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #006600; font-style: italic;">// jQuery todavía no habla bien con HTML5, hack para</span>
      <span style="color: #006600; font-style: italic;">// no usar un plugin.</span>
      <span style="color: #003366; font-weight: bold;">var</span> c <span style="color: #339933;">=</span> $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;#example&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">get</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      $.<span style="color: #660066;">post</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'/'</span><span style="color: #339933;">,</span> c.<span style="color: #660066;">toDataURL</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;script&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">// Un dibujito estático para probar</span>
    <span style="color: #003366; font-weight: bold;">var</span> example <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'example'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #003366; font-weight: bold;">var</span> context <span style="color: #339933;">=</span> example.<span style="color: #660066;">getContext</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'2d'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    context.<span style="color: #660066;">fillStyle</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;rgb(255,0,0)&quot;</span><span style="color: #339933;">;</span>
    context.<span style="color: #660066;">fillRect</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">30</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">30</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">50</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">50</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>
<span style="color: #339933;">&lt;/</span>script<span style="color: #339933;">&gt;</span></pre></div></div>

<p>Y ya estamos, al presionar el botón se envían los datos de la imagen dibujada, si está todo bien ImageMagick creará el archivo en el filesystem y por último devolverá algo de javascript para informar al usuario como salió todo. Obviamente si tuviéramos un sistema de usuarios en el server podríamos guardar la imagen para cada uno, pero de nuevo, no viene al caso.</p>
<p>El resultado final :</p>
<p><img src="http://www.gazer.com.ar/wp-content/uploads/2010/04/image.png" alt="" title="image" width="200" height="200" class="aligncenter size-full wp-image-1268" /></p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ identify <span style="color: #660033;">-verbose</span> image.png 
Image: image.png
  Format: PNG <span style="color: #7a0874; font-weight: bold;">&#40;</span>Portable Network Graphics<span style="color: #7a0874; font-weight: bold;">&#41;</span>
  Class: DirectClass
  Geometry: 200x200+<span style="color: #000000;">0</span>+<span style="color: #000000;">0</span>
  Resolution: 72x72
  Print <span style="color: #c20cb9; font-weight: bold;">size</span>: 2.77778x2.77778
  Colorspace: RGB
  Depth: <span style="color: #000000;">8</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">1</span>-bit
  Histogram:
     <span style="color: #000000;">37500</span>: <span style="color: #7a0874; font-weight: bold;">&#40;</span>  <span style="color: #000000;">0</span>,  <span style="color: #000000;">0</span>,  <span style="color: #000000;">0</span>,  <span style="color: #000000;">0</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #666666; font-style: italic;">#00000000 none</span>
      <span style="color: #000000;">2500</span>: <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">255</span>,  <span style="color: #000000;">0</span>,  <span style="color: #000000;">0</span>,<span style="color: #000000;">255</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #666666; font-style: italic;">#FF0000 red</span>
  Page geometry: 200x200+<span style="color: #000000;">0</span>+<span style="color: #000000;">0</span>
  Compression: Zip
  Properties:
    create-date: <span style="color: #000000;">2010</span>-04-13T00:<span style="color: #000000;">20</span>:<span style="color: #000000;">15</span>-03:00
    modify-date: <span style="color: #000000;">2010</span>-04-13T00:<span style="color: #000000;">20</span>:<span style="color: #000000;">15</span>-03:00
    signature: 0a42f3c85d6364e38f14dac554d26c62a90b84b06ac7f22264c9d964657ba8d6
  Tainted: False
  Filesize: 503b
  Number pixels: 39.1kb
  Version: ImageMagick 6.5.1-<span style="color: #000000;">0</span> <span style="color: #000000;">2009</span>-08-<span style="color: #000000;">27</span> Q16 OpenMP http:<span style="color: #000000; font-weight: bold;">//</span>www.imagemagick.org</pre></div></div>

<p>Probado en :</p>
<ul>
<li>Chromium 5.0.372.0 (44042) Ubuntu</li>
<li>Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.9) Gecko/20100401 Ubuntu/9.10 (karmic) Firefox/3.5.9</li>
</ul>
<p>Código completo : <a href='http://www.gazer.com.ar/wp-content/uploads/2010/04/html5_canvas_submit.zip'>html5_canvas_submit</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.gazer.com.ar/2010/04/13/html5-guardar-el-contenido-de-canvas-en-el-servidor/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Limpiando los mails de Yahoo Groups</title>
		<link>http://www.gazer.com.ar/2009/03/16/limpiando-los-mails-de-yahoo-groups/</link>
		<comments>http://www.gazer.com.ar/2009/03/16/limpiando-los-mails-de-yahoo-groups/#comments</comments>
		<pubDate>Mon, 16 Mar 2009 13:58:08 +0000</pubDate>
		<dc:creator>Gazer</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[html]]></category>

		<guid isPermaLink="false">http://www.gazer.com.ar/?p=1032</guid>
		<description><![CDATA[Una de las cosas más molestas que tiene Yahoo Groups es la cantidad de basura que le mete a los emails que llegan desde el grupo. Como dicen, una imagen dice más que mil palabras : Es realmente perturbante, sobre todo porque lo pone en cada email. La primer opción que busqué fue decirle a [...]]]></description>
			<content:encoded><![CDATA[<p>Una de las cosas más molestas que tiene Yahoo Groups es la cantidad de basura que le mete a los emails que llegan desde el grupo. Como dicen, una imagen dice más que mil palabras :</p>
<p><a href="http://www.gazer.com.ar/wp-content/uploads/2009/03/yahoogroups_bad.png"><img class="aligncenter size-medium wp-image-1033" title="yahoogroups_bad" src="http://www.gazer.com.ar/wp-content/uploads/2009/03/yahoogroups_bad-300x223.png" alt="" width="300" height="223" /></a></p>
<p>Es realmente perturbante, sobre todo porque lo pone en cada email. La primer opción que busqué fue decirle a Gmail que me muestre los emails como plain-text, lo que no encontré. Después recordé que como uso Gmail para trabajar, me llegan emails con links en html-only :S, por lo que de todas formas no me servía.</p>
<p>Entonces dije &#8220;no hay drama, lo modifico con <a href="https://addons.mozilla.org/en-US/firefox/addon/2108">Stylish</a>&#8220;, una extensión de Firefox que permite mediante CSS cambiar cosas (y un poco más liviana que <a href="https://addons.mozilla.org/en-US/firefox/addon/748">Greasemonkey</a>). La cosa no fue tan fácil, ya que el HTML que inserta Yahoo no tiene ni class ni id en los tags HTML, por lo que tuve que hacer un poco de magia con los CSS Selectors de Firefox, que por fortuna son varios <img src='http://www.gazer.com.ar/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p>El resultado final obtenido es :</p>
<p><a href="http://www.gazer.com.ar/wp-content/uploads/2009/03/yahoogroups_good.png"><img class="aligncenter size-medium wp-image-1034" title="yahoogroups_good" src="http://www.gazer.com.ar/wp-content/uploads/2009/03/yahoogroups_good-300x96.png" alt="" width="300" height="96" /></a></p>
<p>Todavía quedan algunos detalles, como sacar una imagen de 1&#215;1 pixels al final del cuerpo que según parece usa Yahoo para geolocalizar desde donde se leen sus email.</p>
<p>El CSS aplicado :</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;"><span style="color: #a1a100;">@namespace url(http://www.w3.org/1999/xhtml);</span>
<span style="color: #a1a100;">@-moz-document domain(mail.google.com) {</span>
  <span style="color: #6666ff;">.ii</span> <span style="color: #00AA00;">&gt;</span> div <span style="color: #00AA00;">&gt;</span> div <span style="color: #00AA00;">&gt;</span> div <span style="color: #00AA00;">&gt;</span> div <span style="color: #00AA00;">&gt;</span> div <span style="color: #00AA00;">+</span> div <span style="color: #00AA00;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">display</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">none</span> !important<span style="color: #00AA00;">;</span>
  <span style="color: #00AA00;">&#125;</span>
  <span style="color: #6666ff;">.ii</span> <span style="color: #00AA00;">&gt;</span> div <span style="color: #00AA00;">&gt;</span> div <span style="color: #00AA00;">&gt;</span> div <span style="color: #00AA00;">&gt;</span> div <span style="color: #00AA00;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">display</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">none</span> !important<span style="color: #00AA00;">;</span>
  <span style="color: #00AA00;">&#125;</span>
  <span style="color: #6666ff;">.ii</span> <span style="color: #00AA00;">&gt;</span> div <span style="color: #00AA00;">&gt;</span> div <span style="color: #00AA00;">&gt;</span> <span style="color: #3333ff;">:first-child </span><span style="color: #00AA00;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">width</span><span style="color: #00AA00;">:</span> <span style="color: #933;">95%</span> !important<span style="color: #00AA00;">;</span>
  <span style="color: #00AA00;">&#125;</span>
  <span style="color: #6666ff;">.ii</span> <span style="color: #00AA00;">&gt;</span> div <span style="color: #00AA00;">&gt;</span> div <span style="color: #00AA00;">&gt;</span> div <span style="color: #00AA00;">&gt;</span> <span style="color: #3333ff;">:first-child </span><span style="color: #00AA00;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">display</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">block</span> !important<span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">width</span><span style="color: #00AA00;">:</span> <span style="color: #933;">100%</span> !important<span style="color: #00AA00;">;</span>
  <span style="color: #00AA00;">&#125;</span>
<span style="color: #00AA00;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.gazer.com.ar/2009/03/16/limpiando-los-mails-de-yahoo-groups/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Edit In Place con Prototype</title>
		<link>http://www.gazer.com.ar/2009/01/21/edit-in-place-con-prototype/</link>
		<comments>http://www.gazer.com.ar/2009/01/21/edit-in-place-con-prototype/#comments</comments>
		<pubDate>Wed, 21 Jan 2009 13:25:57 +0000</pubDate>
		<dc:creator>Gazer</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[falta uno]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[prototype]]></category>

		<guid isPermaLink="false">http://www.gazer.com.ar/?p=1001</guid>
		<description><![CDATA[Una de las cosas que me venían pidiendo en ¡Falta Uno! era que se le pudieran asignar nombre a los equipos de un partido. En un principio pensé solo en poner los campos en el formulario de &#8220;crear partido&#8221; pero después me pareció que quedaba piola que se puedan editar directamente desde el resumen, usando [...]]]></description>
			<content:encoded><![CDATA[<p>Una de las cosas que me venían pidiendo en <a href="http://www.falta-uno.com.ar/">¡Falta Uno!</a> era que se le pudieran asignar nombre a los equipos de un partido. En un principio pensé solo en poner los campos en el formulario de &#8220;crear partido&#8221; pero después me pareció que quedaba piola que se puedan editar directamente desde el resumen, usando un &#8220;Edit in place&#8221;. Me puse a buscar si había algo hecho con Proptotype (que es lo que uso en este proyecto) y encontré <a href="http://editinplace.org/">esto</a> que viene con varios <a href="http://release.editinplace.org/latest/example.html">ejemplos</a>.</p>
<p>La biblioteca es muy fácil de usar y bastante flexible en cómo queremos que se comporte el edit (puede ser un input, un textarea, un combo). Suponiendo que los nombres de equipos estén siendo mostrados de la siguiente manera :</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;h2 id=&quot;team_name_1&quot;&gt;&lt;%= h(@match.team[0].name) %&gt;&lt;/h2&gt;
&nbsp;
&lt;!-- skip --&gt;
&nbsp;
&lt;h2 id=&quot;team_name_2&quot;&gt;&lt;%= h(@match.team[1].name) %&gt;&lt;/h2&gt;</pre></div></div>

<p>Para poder editar los títulos simplemente basta con ejecutar el siguiente código cuando se carga la página :</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'team_name_1'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">editInPlace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
  auto_adjust<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span>
  select_text<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span>
  save_url<span style="color: #339933;">:</span> <span style="color: #3366CC;">'&lt;%= changename_match_path(@match, :team =&gt; 1) %&gt;'</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'team_name_2'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">editInPlace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
  auto_adjust<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span>
  select_text<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span>
  save_url<span style="color: #339933;">:</span> <span style="color: #3366CC;">'&lt;%= changename_match_path(@match, :team =&gt; 2) %&gt;'</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Es recomendable poner este código dentro de un método y usar un Observer para ejecutarlo, así mantenemos separada la lógica JS del HTML. Bastaría con un simple <code>Event.observe(window, 'load', initEIP);</code>.</p>
<p>Por el lado del servidor, el método que atiende el request (el definido el save_url) tiene que devolver el nuevo valor que va a tomar el campo. Por ejemplo, si el nombre no se pudo cambiar, deberíamos devolver el anterior. En este caso que es simple el template a devolver es el siguiente :</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;%= h(@team.name) %&gt;</pre></div></div>

<p>Para terminar, en caso de que el navegador del usuario no tenga JS queda el formulario de &#8220;Editar/Crear Partido&#8221; donde se pueden poner los nombres de manera tradicional.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gazer.com.ar/2009/01/21/edit-in-place-con-prototype/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Sobreviviendo ataques</title>
		<link>http://www.gazer.com.ar/2008/12/11/sobreviviendo-ataques/</link>
		<comments>http://www.gazer.com.ar/2008/12/11/sobreviviendo-ataques/#comments</comments>
		<pubDate>Fri, 12 Dec 2008 01:42:49 +0000</pubDate>
		<dc:creator>Gazer</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[deploy]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[http]]></category>

		<guid isPermaLink="false">http://www.gazer.com.ar/?p=981</guid>
		<description><![CDATA[Está terminando un día largo, de esos que uno espera que no le toquen, pero que tarde o temprano llegan. Ayer a la noche en 3DG fuimos víctimas de un pequeño ataque. Por suerte los atacantes super buena onda. Luego de que apagamos el primer incendio estuvimos chateando con ellos y nos dieron la data [...]]]></description>
			<content:encoded><![CDATA[<p>Está terminando un día largo, de esos que uno espera que no le toquen, pero que tarde o temprano llegan. Ayer a la noche en <a href="http://www.3dgames.com.ar/">3DG</a> fuimos víctimas de un pequeño ataque. Por suerte los atacantes super buena onda. Luego de que apagamos el primer incendio estuvimos chateando con ellos y nos dieron la data de por donde entraron, cómo, qué cosas modificaron y lo mejor de todo, donde nos habían dejado los backups que habían hecho <img src='http://www.gazer.com.ar/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p>El ataque consistió en hacer que nuestros sitios (el target era el foro que es el que tiene más tráfico, pero afectó a otros sitios también) sean redirigidos a una página muy graciosa que no pienso linkear porque no es ATP. Para lograrlo (ya que el foro está aislado y no pudieron entrar por ahí) nos crackearon el sistema de publicidad e insertaron un banner javascript que hacía el redirect. Simple y efectivo.</p>
<p>Para lograr el acceso al server de ads fue más fácil, simplemente explotaron un SQL Injection que por la fecha de última modificación del script, estaba desde el 2001 <img src='http://www.gazer.com.ar/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Con eso consiguieron el password de admin para poder poner su publicidad. Nuestro segundo problema fue obvio, el usuario que usa ese script para acceder a la DB tenía demasiados privilegios y pudo leer y modificar una otra base de datos.</p>
<p>Más allá del trabajo que tuvimos que hacer para recuperar de nuestros backups cosas por las dudas (aunque nos hicieron backups tampoco confiar a ciegas <img src='http://www.gazer.com.ar/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> ) tuvimos que empezar a auditar cosas que teníamos pendiente hace rato. Para empezar necesitamos bajar los servicios completamente y la forma más linda que encontré fue usando un rewrite rule de apache, como sigue :</p>

<div class="wp_syntax"><div class="code"><pre class="apache" style="font-family:monospace;"><span style="color: #00007f;">RewriteEngine</span> <span style="color: #0000ff;">on</span>
<span style="color: #00007f;">RewriteCond</span> %{REQUEST_URI} !^/imagenes
<span style="color: #00007f;">RewriteCond</span> %{DOCUMENT_ROOT}/maintenance.html -f
<span style="color: #00007f;">RewriteCond</span> %{REQUEST_URI} !/maintenance.html$
&nbsp;
<span style="color: #00007f;">RewriteRule</span> $ /maintenance.html [R=<span style="color: #ff0000;">302</span>,L]</pre></div></div>

<p>De esta manera cuando terminamos de hacer el mantenimiento simplemente borramos el maintenance.html y el sitio vuelve solo a la vida. De paso ya lo dejamos para cuando hagamos futuros updates.</p>
<p>Lo otro que nos entró en duda cuando arreglamos el problema fue : ¿lo arreglamos realmente? ¿tendremos otro agujero en algún lado?. Para poder revisar esto comencé a buscar herramientas para auditar SQL Injections y me encontré con un <a href="http://www.security-hacks.com/2007/05/18/top-15-free-sql-injection-scanners">post</a> donde habían varias soluciones. La que usamos finalmente fue <a href="http://sqlmap.sourceforge.net/index.html#intro">sqlmap</a> porque fue la que mejor nos pareció que andaba.</p>
<p>Fue una tarde divertida viendo que podíamos romper de nuestro viejo sitio. Para escanearlo simplemente corríamos :</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#$ sqlmap -dbs -u &quot;http://127.0.0.1/scriptbuggeado.php?Id=1&quot;</span></pre></div></div>

<p>El programa primero trata de ver si el parámetro Id es vulnerable a diferentes formas de hacer injection y si descubre alguna trata de obtener la lista de DBs. Es lindo ver cuando aparecen todas tus DBs en la consola <img src='http://www.gazer.com.ar/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Si le agregamos &#8220;-v 2&#8243; es más gracioso aún, porque los nombres van apareciendo letra a letra (parece que las va adivinando o algo, no me fijé en el código para ver como lo hace).</p>
<p>A esta hora cerramos ya el agujero del ataque y dos más que detectamos.</p>
<p>El último problema que encontramos fue que habían subido un shell. Para esto crackearon el password de programa para enviar newsletters y subieron un archivo php que tiene un shell re lindo que tiene funciones para escanear vulnerabilidades localmente. Acá el problema fue que el sysadmin anterior dejó permiso para ejecutar script en el directorio donde el programa guarda attachments que después se usan en el email (como imágenes en esos emails molestos HTML que nos llegan todos los días). Sacando los permisos para ejecutar cualquier tipo de script el shell ya no funciona.</p>
<p>Como sysadmin &#8220;temporal&#8221; fue una experiencia divertida, sobre todo porque no hubo pérdida de datos y la buena onda de los atacantes <img src='http://www.gazer.com.ar/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  (¿tendré el <a href="http://es.wikipedia.org/wiki/S%C3%ADndrome_de_Estocolmo">Síndrome de Estocolmo</a>?).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gazer.com.ar/2008/12/11/sobreviviendo-ataques/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Parseando HTML desde Ruby</title>
		<link>http://www.gazer.com.ar/2008/11/20/parseando-html-desde-ruby/</link>
		<comments>http://www.gazer.com.ar/2008/11/20/parseando-html-desde-ruby/#comments</comments>
		<pubDate>Thu, 20 Nov 2008 05:10:36 +0000</pubDate>
		<dc:creator>Gazer</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.gazer.com.ar/?p=871</guid>
		<description><![CDATA[Con todo este lío de la crisis mundial, corridas bancarias y demás en la oficina los días tranquilos jugamos a &#8220;Adiviná cuánto va a salir el dolay hoy&#8221;. Como es muy molesto entrar a &#8220;Dolar hoy dot com&#8221; donde miramos el valor oficial del juego, me puse a armar un script para robarme el valor [...]]]></description>
			<content:encoded><![CDATA[<p>Con todo este lío de la crisis mundial, corridas bancarias y demás en la oficina los días tranquilos jugamos a &#8220;Adiviná cuánto va a salir el dolay hoy&#8221;. Como es muy molesto entrar a &#8220;Dolar hoy dot com&#8221; donde miramos el valor oficial del juego, me puse a armar un script para robarme el valor actual y así ir tirando el dato minuto a minuto.</p>
<p>Siempre es una molestia tener que parsear HTML, sobre todo cuando es tan feo como el del sitio en cuestión, que no solo no tiene un solo class de CSS ni id, sino que usa el tag FONT, dios. Por suerte Hpricot está para ayudarnos <img src='http://www.gazer.com.ar/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p><a href="http://code.whytheluckystiff.net/hpricot/">Hpricot</a> es &#8220;a fast, flexible HTML parser written in C&#8221; con su interfaz a Ruby, obvio <img src='http://www.gazer.com.ar/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Hace cosas muy copadas, como por ejemplo agarrar un HTML, buscar todos los &lt;a&gt; que tengan el class <em>custom</em>, o todos los P seguidos de un DIV seguidos de un IMG, etc. Podemos consultar por ID, borrar, agregarle class a las cosas que encontramos y muchas cosas más, útiles para manipular HTML.</p>
<p>Lo primero que tuve que hacer fue saltear la &#8220;<em>protección</em>&#8221; del sitio, ya que para acceder a la página con las cotizaciones verifican que vengas del dominio principal. Un básico chequeo contra el HTTP_REFERER. Como suelo usar <a href="http://www.ruby-doc.org/stdlib/libdoc/open-uri/rdoc/index.html">open-uri</a>, a ésta le puedo pasar el referer que yo quiero enviar en el header, como cualquier biblioteca para manejar URIs que tenga auto-respeto <img src='http://www.gazer.com.ar/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p>Para encontrar los valores fue fácil. Mirando el HTML de la página se ve que el valor del dolar está dentro de un &#8220;div/font/b/font&#8221;, por lo que solo tuve que buscarlo. Después hago un cleanup para sacarle un non-breaking space que me molestaba y los espacios que también quedan feos.</p>
<p>Y eso es todo. Ahora puedo consultar el valor del dolar desde mi consola <img src='http://www.gazer.com.ar/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Seguramente hay miles de formas más cómodas de hacerlo, algún widget para Gnome, página que te de un RSS, etc, pero fue un lindo ejercicio.</p>
<p>Dejo acá el script para el que quiera jugar un rato.</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'rubygems'</span>
<span style="color:#008000; font-style:italic;"># gem install hpricot si no lo tienen instalado</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'hpricot'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'open-uri'</span>
&nbsp;
&nbsp;
doc = Hpricot<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0066; font-weight:bold;">open</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;http://dolarhoy.com/indexx.php&quot;</span>, <span style="color:#996600;">&quot;Referer&quot;</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;http://dolarhoy.com/&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
div = <span style="color:#006600; font-weight:bold;">&#40;</span>doc<span style="color:#006600; font-weight:bold;">/</span><span style="color:#996600;">&quot;div/font/b/font&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span>
&nbsp;
dolar = div.<span style="color:#9900CC;">inner_html</span>
&nbsp;
dolar = dolar.<span style="color:#CC0066; font-weight:bold;">gsub</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">/</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">&amp;</span>nbsp;<span style="color:#006600; font-weight:bold;">|</span>$<span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">/</span>, <span style="color:#996600;">&quot;&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
dolar.<span style="color:#9900CC;">strip</span>!
&nbsp;
<span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Dolar Hoy : $#{dolar}&quot;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.gazer.com.ar/2008/11/20/parseando-html-desde-ruby/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

