<?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; javascript</title>
	<atom:link href="http://www.gazer.com.ar/tag/javascript/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>Take A  Photo &#8211; Fotos instantáneas desde tu web</title>
		<link>http://www.gazer.com.ar/2009/04/02/take-a-photo-fotos-instantaneas-desde-tu-web/</link>
		<comments>http://www.gazer.com.ar/2009/04/02/take-a-photo-fotos-instantaneas-desde-tu-web/#comments</comments>
		<pubDate>Thu, 02 Apr 2009 19:58:49 +0000</pubDate>
		<dc:creator>Gazer</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[ruby on rails]]></category>

		<guid isPermaLink="false">http://www.gazer.com.ar/?p=1060</guid>
		<description><![CDATA[En la última semana estuve trabajando en agregar nuevas funcionalidades a un sitio de un cliente y entre los pedidos estaba una especie de Fotoblog para los usuarios (y bue, hay que pagar las cuentas a fin de mes ). La cosa salió rápido, usando Paperclip que guarda las imágenes que se suben, se muestra [...]]]></description>
			<content:encoded><![CDATA[<p>En la última semana estuve trabajando en agregar nuevas funcionalidades a un sitio de un cliente y entre los pedidos estaba una especie de Fotoblog para los usuarios (y bue, hay que pagar las cuentas a fin de mes <img src='http://www.gazer.com.ar/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> ).</p>
<p>La cosa salió rápido, usando Paperclip que guarda las imágenes que se suben, se muestra en orden, etc, nada del otro mundo. Pero hablando con el cliente surgió la idea de hacer que el usuario se pueda tomar una foto directamente desde la web usando su webcam, así que después de decir &#8220;<em>si, se debe poder hacer</em>&#8221; mentalmente me salió un &#8220;<em>doh!, que dije!</em>&#8220;. Lo último que se dijo en esa reunión fue &#8220;<em>Lo quiero</em>&#8221; <img src='http://www.gazer.com.ar/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> .</p>
<p>Ya había visto juegos flash que utilizan la webcam así que empecé por ahí, para ver como sacaban un frame del video, lo cual era muy fácil. Lo siguiente era serializarla. A falta de algo mejor hice un serializador de imágenes muy pedorro, pero que anda (aunque es lento), que envía por POST la información de cada pixel.</p>
<p>La parte de Ruby fue fácil y decidí encapsularla en un plugin de Rails para poder reutilizarlo luego o por si a alguien más le sirve <img src='http://www.gazer.com.ar/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Además se puede integrar con Paperclip o AttachmentFu para hacer la persistencia de la imagen en donde sea.</p>
<p>La única parte que usa Flash es el capturador de la cámara, porque otra no quedaba, pero luego el botón para tomar la foto y los eventos se manejan todo por Javascript.</p>
<p>El plugin tiene varios TODOs, pero por si a alguien le sirve está en <a href="http://github.com/Gazer/take-a-photo/tree/master">github</a>.</p>
<p><strong>Update</strong> : A falta de demo, algunas de las fotos tomadas con la aplicación de ejemplo que hice hoy durante Locos x rails.</p>
<p style="text-align: center;">
<a href='http://www.gazer.com.ar/2009/04/02/take-a-photo-fotos-instantaneas-desde-tu-web/take_a_photo1342-3/' title='take_a_photo1342-3'><img width="150" height="150" src="http://www.gazer.com.ar/wp-content/uploads/2009/04/take_a_photo1342-3-150x150.jpg" class="attachment-thumbnail" alt="take_a_photo1342-3" title="take_a_photo1342-3" /></a>
<a href='http://www.gazer.com.ar/2009/04/02/take-a-photo-fotos-instantaneas-desde-tu-web/take_a_photo1342-2/' title='take_a_photo1342-2'><img width="150" height="150" src="http://www.gazer.com.ar/wp-content/uploads/2009/04/take_a_photo1342-2-150x150.jpg" class="attachment-thumbnail" alt="take_a_photo1342-2" title="take_a_photo1342-2" /></a>
<a href='http://www.gazer.com.ar/2009/04/02/take-a-photo-fotos-instantaneas-desde-tu-web/take_a_photo1342-1/' title='take_a_photo1342-1'><img width="150" height="150" src="http://www.gazer.com.ar/wp-content/uploads/2009/04/take_a_photo1342-1-150x150.jpg" class="attachment-thumbnail" alt="take_a_photo1342-1" title="take_a_photo1342-1" /></a>
<a href='http://www.gazer.com.ar/2009/04/02/take-a-photo-fotos-instantaneas-desde-tu-web/take_a_photo1342-0/' title='take_a_photo1342-0'><img width="150" height="150" src="http://www.gazer.com.ar/wp-content/uploads/2009/04/take_a_photo1342-0-150x150.jpg" class="attachment-thumbnail" alt="take_a_photo1342-0" title="take_a_photo1342-0" /></a>
</p>
<p style="text-align: center;">
]]></content:encoded>
			<wfw:commentRss>http://www.gazer.com.ar/2009/04/02/take-a-photo-fotos-instantaneas-desde-tu-web/feed/</wfw:commentRss>
		<slash:comments>7</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>Multiupload de imágenes con Prototype</title>
		<link>http://www.gazer.com.ar/2008/08/26/multiupload-de-imagenes-con-prototype/</link>
		<comments>http://www.gazer.com.ar/2008/08/26/multiupload-de-imagenes-con-prototype/#comments</comments>
		<pubDate>Wed, 27 Aug 2008 00:02:01 +0000</pubDate>
		<dc:creator>Gazer</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[prototype]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[upload]]></category>

		<guid isPermaLink="false">http://www.gazer.com.ar/?p=283</guid>
		<description><![CDATA[Desde hace unos días que estoy haciendo un widget que soporte upload de múltiples archivos para una aplicación web. No fue fácil el comienzo pero despues de varias horas (unas 8 hasta este momento) ya va tomando forma. Para poder trackear el upload de cada archivo utilizo apache_mod_upload_progress, un genio &#8220;Drogomir&#8221; . Para compilarlo en [...]]]></description>
			<content:encoded><![CDATA[<p>Desde hace unos días que estoy haciendo un widget que soporte upload de múltiples archivos para una aplicación web. No fue fácil el comienzo pero despues de varias horas (unas 8 hasta este momento) ya va tomando forma.</p>
<p>Para poder trackear el upload de cada archivo utilizo <a href="http://drogomir.com/blog/2008/6/18/upload-progress-bar-with-mod_passenger-and-apache">apache_mod_upload_progress</a>, un genio &#8220;Drogomir&#8221; <img src='http://www.gazer.com.ar/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Para compilarlo en OSX tuve algunos problemas ya que apache2 esta compilado en x86_64 y el default del apsx es x86 pero googleando se encuentra fácil como pasarle el parámetro al gcc. Lo otro que necesitamos tener instalado es mod_rails y apache 2.2. Cuando termine el código y lo publique estará todo explicado en detalle <img src='http://www.gazer.com.ar/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p>El segundo problema grande fue el formulario. Para hacer el upload lo que hago es crear un iframe oculto y cambiar el target del formulario a ese frame (de esta menera si no tenemos javascript la aplicación degrada automáticamente al upload de imagenes individuales y el usuario no se entera), pero claro, necesitaba tener múltiples input:file, uno por cada archivo a subir. De ponerlos todos juntos tendríamos un POST super gigante que no era lo que se buscaba ya que no podría trackear cada upload por separado.</p>
<p>La solución fue, cada vez que se selecciona un archivo sacar el INPUT del form y guardarlo en un array. El espacio vacío se reemplaza con un nuevo INPUT y como todo es tán rápido, uno no se da cuenta. El problema llegó cuando terminaba el primer archivo, tenía que volver a agregar el siguiente file al formulario y hacer otra vez el submit. Pero si uno llama $(form).submit() desde javascript, el callback onSubmit no es ejecutado (defecto de las implementaciones de todos los navegadores que probé y parece que no va a cambiar) por lo que no era útil.</p>
<p>La solución finalmente fue simular el click enel botón enviar con un simple $(submit_button).click() que resuelve el problema anterior. Les dejo el video para que lo disfruten <img src='http://www.gazer.com.ar/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p style="text-align: center;">
<p><a href="http://www.youtube.com/watch?v=7PqZg_1Pi1w">http://www.youtube.com/watch?v=7PqZg_1Pi1w</a></p></p>
]]></content:encoded>
			<wfw:commentRss>http://www.gazer.com.ar/2008/08/26/multiupload-de-imagenes-con-prototype/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

