<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Projects on Marcello Barnaba</title>
    <link>https://sindro.me/it/tags/projects/</link>
    <description>Recent content in Projects on Marcello Barnaba</description>
    <generator>Hugo</generator>
    <language>it</language>
    <lastBuildDate>Tue, 11 May 2010 19:00:00 +0000</lastBuildDate>
    <atom:link href="https://sindro.me/it/tags/projects/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Oggi ho speso la giornata su Erlang-Ruby-Marshal ;-)</title>
      <link>https://sindro.me/it/posts/2010-05-11-spent-my-day-on-erlang-ruby-marshal-today/</link>
      <pubDate>Tue, 11 May 2010 19:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2010-05-11-spent-my-day-on-erlang-ruby-marshal-today/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://sindro.me/posts/2010-05-11-spent-my-day-on-erlang-ruby-marshal-today/erlang.png&#34; alt=&#34;Erlang logo&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;In sintesi, aggiunge il supporto per l&amp;rsquo;unmarshaling delle stringhe 1.9, e&#xA;implementa l&amp;rsquo;ultimo tipo mancante (&lt;code&gt;TYPE_LINK&lt;/code&gt;) che mancava dal codice. I test&#xA;ancora latitano, qualcuno vuole &lt;a href=&#34;http://github.com/vjt/erlang-ruby-marshal&#34; target=&#34;_blank&#34;&gt;dare una mano&lt;/a&gt;? :-)&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Added TYPE_LINK, needed because of how ruby 1.9 marshals strings.&#xA;&#xA;In 1.9, Ruby marshals the string encoding in the binary output, and&#xA;uses an Ivar construct (TYPE_IVAR) to wrap the string and adds an&#xA;&amp;#34;encoding&amp;#34; instance variable (notice: without a leading @) whose&#xA;value is the encoding itself.&#xA;&#xA;While the Ivar code worked correctly, the values of the encodings&#xA;are actually *strings*, that are being reused via the TYPE_LINK&#xA;construct, that wasn&amp;#39;t implemented.&#xA;&#xA;So, the get() and put() primitives are being used to store not&#xA;only tuples {id, sym} for symbols, but now store either&#xA;&#xA;  {{symbol, ID}, sym}&#xA;&#xA;  OR&#xA;&#xA;  {{value,  ID}, val}&#xA;&#xA;for the other types that use TYPE_LINK.&#xA;&#xA;By reading the ruby marshal.c source code, it looks like that MANY&#xA;data types save their values in the arg-&amp;gt;data hashtable, but by&#xA;inspecting the binary marshal output of, e.g, an array of floats,&#xA;links aren&amp;#39;t used.&#xA;&#xA;Thus, in this unmarshaler, links are considered, for now, only for&#xA;strings and regexes.&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Forkami su GitHub: &lt;a href=&#34;http://github.com/vjt/erlang-ruby-marshal&#34; target=&#34;_blank&#34;&gt;http://github.com/vjt/erlang-ruby-marshal&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>CouchDB 0.11 Invalid UTF-8 JSON: Risolto</title>
      <link>https://sindro.me/it/posts/2010-04-03-couchdb-invalid-utf8-json/</link>
      <pubDate>Sat, 03 Apr 2010 19:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2010-04-03-couchdb-invalid-utf8-json/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://sindro.me/posts/2010-04-03-couchdb-invalid-utf8-json/couchdb.png&#34; alt=&#34;CouchDB logo&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Se il tuo CouchDB 0.11 ti spara l&amp;rsquo;errore &amp;ldquo;Invalid UTF-8 JSON&amp;rdquo; ad &lt;strong&gt;ogni&lt;/strong&gt; POST&#xA;o PUT che gli mandi, assicurati che nella tua&#xA;&lt;code&gt;$prefix/usr/lib/couchdb/erlang/lib&lt;/code&gt; non ci siano residui di installazioni&#xA;precedenti.&lt;/p&gt;&#xA;&lt;p&gt;Sul server di sviluppo &lt;a href=&#34;http://exelab.eu/&#34; target=&#34;_blank&#34;&gt;nostro&lt;/a&gt;, ho trovato due directory&#xA;(&amp;ldquo;couch-0.10&amp;rdquo; e &amp;ldquo;mochiweb-r97&amp;rdquo;) dalla vecchia installazione 0.10 che causavano&#xA;il problema.&lt;/p&gt;&#xA;&lt;p&gt;Questo vale se hai aggiornato da sorgenti, come probabilmente hai fatto, perché&#xA;ad aprile 2010 non è che ci fossero tutti questi pacchetti di CouchDB 0.11 :-).&lt;/p&gt;&#xA;&lt;p&gt;Un grazie enorme a &lt;a href=&#34;http://twitter.com/couchdb&#34; target=&#34;_blank&#34;&gt;@couchdb&lt;/a&gt; per &lt;a href=&#34;http://twitter.com/CouchDB/status/11495632471&#34; target=&#34;_blank&#34;&gt;avermi indicato&#xA;la direzione giusta&lt;/a&gt; dopo &lt;a href=&#34;http://mail-archives.apache.org/mod_mbox/couchdb-dev/201002.mbox/%3c112036548.3241265012630999.JavaMail.jira@brutus.apache.org%3e&#34; target=&#34;_blank&#34;&gt;aver&#xA;letto una segnalazione sulla mailing list&#xA;dev&lt;/a&gt;&#xA;— ma non volevo fare &amp;ldquo;rimuovi e reinstalla&amp;rdquo; perché mi piace capire cosa sta&#xA;succedendo ;-).&lt;/p&gt;&#xA;&lt;p&gt;&lt;small&gt;Nota a margine: che sia la fine dell&amp;rsquo;Hiatus? Spero di sì ;-p&lt;/small&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Implementare una galleria immagini con facebox e will_paginate</title>
      <link>https://sindro.me/it/posts/2009-02-21-implementing-an-image-gallery-using-facebox-and-will_paginate/</link>
      <pubDate>Sat, 21 Feb 2009 00:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2009-02-21-implementing-an-image-gallery-using-facebox-and-will_paginate/</guid>
      <description>&lt;p&gt;Su &lt;a href=&#34;http://www.visitacsa.it/&#34; target=&#34;_blank&#34;&gt;VisitaCSA&lt;/a&gt; stiamo usando&#xA;&lt;a href=&#34;http://famspam.com/facebox&#34; target=&#34;_blank&#34;&gt;facebox&lt;/a&gt; di&#xA;&lt;a href=&#34;http://errtheblog.com/&#34; target=&#34;_blank&#34;&gt;defunkt&lt;/a&gt; per mostrare le &lt;a href=&#34;http://www.visitacsa.it/luoghi/chiesa-di-santantonio&#34; target=&#34;_blank&#34;&gt;immagini dei&#xA;luoghi&lt;/a&gt; in grande.&#xA;Facebox e&amp;rsquo; un ottimo lightbox generico, perche&amp;rsquo; e&amp;rsquo; veloce, stabile, si basa su&#xA;&lt;a href=&#34;http://jquery.com/&#34; target=&#34;_blank&#34;&gt;jQuery&lt;/a&gt; e ha un&amp;rsquo;API davvero pulita.&lt;/p&gt;&#xA;&lt;p&gt;Ma avevamo bisogno di qualcosa in piu&amp;rsquo; di un semplice lightbox di&#xA;visualizzazione, perche&amp;rsquo; volevamo che i nostri utenti potessero navigare&#xA;facilmente tra tutte le immagini, possibilmente senza modificare facebox. La&#xA;soluzione si e&amp;rsquo; rivelata piuttosto semplice, grazie anche al plugin&#xA;&lt;a href=&#34;http://github.com/mislav/will_paginate/wikis&#34; target=&#34;_blank&#34;&gt;&lt;code&gt;will_paginate&lt;/code&gt;&lt;/a&gt; che stavamo&#xA;gia&amp;rsquo; usando. In sostanza si tratta di avere:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Un model Photo, attrezzato con il metodo &lt;code&gt;has_attachment&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Route per le risorse photos (&lt;code&gt;map.resources :photos, :only =&amp;gt; :show&lt;/code&gt; in&#xA;&lt;code&gt;config/routes.rb&lt;/code&gt;)&lt;/li&gt;&#xA;&lt;li&gt;Un metodo &lt;code&gt;show&lt;/code&gt; nel controller &lt;code&gt;PhotosController&lt;/code&gt; che chiama &lt;code&gt;.paginate&lt;/code&gt;&#xA;con un argomento &lt;code&gt;:per_page&lt;/code&gt; di 1&lt;/li&gt;&#xA;&lt;li&gt;Una vista HTML per la risorsa photo, con i controlli di paginazione usando&#xA;l&amp;rsquo;helper &lt;code&gt;will_paginate&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Del codice jQuery che si aggancia ai link di paginazione e fa caricare al&#xA;browser via AJAX la foto successiva direttamente nel facebox.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Ecco il codice rilevante, semplificato rispetto a quello effettivamente&#xA;online, perche&amp;rsquo; il model photo e&amp;rsquo; in realta&amp;rsquo; polimorfico (usa STI) e diverse&#xA;collezioni sono gestite dal photos controller (foto, volantini, ecc.) per&#xA;diversi model, con miniature diverse :P.&lt;/p&gt;&#xA;&lt;h3 id=&#34;model-appmodelsphotorb&#34;&gt;Model [app/models/photo.rb]&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Photo&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;ActiveRecord&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;Base&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  has_attachment &lt;span style=&#34;color:#e6db74&#34;&gt;:storage&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;:file_system&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;:path_prefix&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;public/photos&amp;#39;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;:processor&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;ImageScience&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;:thumbs&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; { &lt;span style=&#34;color:#e6db74&#34;&gt;:thumb&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;600x800&amp;#39;&lt;/span&gt; }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;controller-appcontrollersphotos_controllerrb&#34;&gt;Controller [app/controllers/photos_controller.rb]&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;PhotosController&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;ApplicationController&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  layout &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  before_filter &lt;span style=&#34;color:#e6db74&#34;&gt;:find_place&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;# The photo gallery core is here&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;show&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    photo &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;Photo&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;find(params&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;:id&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    page &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; params&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;:page&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; @place&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;photos&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;index(photo) &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    @photos &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; @place&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;photos&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;paginate(&lt;span style=&#34;color:#e6db74&#34;&gt;:per_page&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;:page&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; page)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    @photo &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; @photos&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;first&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;find_place&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    @place &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;Place&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;find(params&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;:place_id&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;vista-appviewsphotosshowhtmlerb&#34;&gt;Vista [app/views/photos/show.html.erb]&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;photo&amp;#34;&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;style&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;width: &amp;lt;%= photo_width(@photo) %&amp;gt;px; text-align: center;&amp;#34;&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&amp;lt;&lt;/span&gt;%= next_photo_link_for @photo, :in =&amp;gt; @photos %&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;p&lt;/span&gt;&amp;gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&amp;lt;&lt;/span&gt;%=h @photo.title %&amp;gt;&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;p&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;p&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&amp;lt;&lt;/span&gt;%= will_paginate @photos, :prev_label =&amp;gt; &amp;#39;&amp;amp;nbsp;&amp;#39;, :next_label =&amp;gt; &amp;#39;&amp;amp;nbsp;&amp;#39; %&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;p&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;La gem &lt;a href=&#34;http://imagesize.rubyforge.org/&#34; target=&#34;_blank&#34;&gt;&lt;code&gt;image_size&lt;/code&gt;&lt;/a&gt; e&amp;rsquo; necessaria per&#xA;consentire a facebox di allinearsi correttamente al centro della finestra.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Un miglioramento a permalink_fu: permettere la modifica dei permalink e inviare redirect HTTP al volo</title>
      <link>https://sindro.me/it/posts/2009-01-29-a-permalink_fu-improvement-allow-modification-of-permalinks-and-create-redirects-on-the-fly/</link>
      <pubDate>Thu, 29 Jan 2009 19:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2009-01-29-a-permalink_fu-improvement-allow-modification-of-permalinks-and-create-redirects-on-the-fly/</guid>
      <description>&lt;p&gt;Un altro spin-off dal sito &lt;a href=&#34;http://www.visitacsa.it/&#34; target=&#34;_blank&#34;&gt;www.visitacsa.it&lt;/a&gt;: un&#xA;miglioramento a&#xA;&lt;a href=&#34;http://github.com/technoweenie/permalink_fu/tree/master&#34; target=&#34;_blank&#34;&gt;permalink_fu&lt;/a&gt; che&#xA;permette &lt;strong&gt;permalink dinamici&lt;/strong&gt;. Lo so che è un&#xA;&lt;a href=&#34;http://en.wikipedia.org/wiki/Oxymoron&#34; target=&#34;_blank&#34;&gt;ossimoro&lt;/a&gt;, perché i permalink dovrebbero&#xA;essere&amp;hellip; beh&amp;hellip; permanenti! E siccome i &lt;a href=&#34;http://www.searchlores.org/main.htm&#34; target=&#34;_blank&#34;&gt;motori di&#xA;ricerca&lt;/a&gt; li indicizzano, non dovrebbero&#xA;mai cambiare. Ma cosa succede quando pubblichi &lt;em&gt;qualcosa&lt;/em&gt;, il tuo permalink&#xA;viene generato con permalink_fu usando il &lt;em&gt;titolo&lt;/em&gt; del tuo post, e dopo un&#xA;paio di giorni vuoi cambiare il titolo, e anche il permalink sotto il quale il&#xA;post è accessibile?&lt;/p&gt;&#xA;&lt;p&gt;Seguendo la&#xA;&lt;a href=&#34;http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html&#34; target=&#34;_blank&#34;&gt;specifica&lt;/a&gt;, la tua&#xA;applicazione dovrebbe inviare uno status HTTP &lt;em&gt;301 moved permanently&lt;/em&gt; quando si&#xA;accede al vecchio permalink e fare redirect del client verso il nuovo Uniform&#xA;Resource Locator. Questo è più o meno quello che fa la mia modifica a&#xA;&lt;em&gt;permalink_fu&lt;/em&gt;: ogni volta che gli attributi del tuo post vengono modificati, il&#xA;permalink precedente e quello nuovo vengono salvati nel database, e puoi&#xA;abilitare il tuo controller a generare redirect &lt;em&gt;302 moved temporarily&lt;/em&gt; quando&#xA;necessario. In altre parole, controlla se l&amp;rsquo;URL richiesto è un vecchio&#xA;permalink e reindirizza automagicamente il client verso quello nuovo.&lt;/p&gt;&#xA;&lt;p&gt;Tutto avviene dietro le quinte, e il plugin ha anche dei comodi task rake per&#xA;impostare il model Redirect e le migration associate. E puoi anche cambiarne&#xA;il nome, ovviamente! :)&lt;/p&gt;&#xA;&lt;p&gt;Il codice &lt;em&gt;302&lt;/em&gt; è stato scelto perché lo status code &lt;em&gt;301 permanent&lt;/em&gt; &lt;a href=&#34;http://www.google.com/support/webmasters/bin/answer.py?hl=en&amp;amp;amp;answer=40132&#34; target=&#34;_blank&#34;&gt;ha&#xA;effetti piuttosto dirompenti sui motori di&#xA;ricerca&lt;/a&gt;,&#xA;ma ulteriori discussioni sono benvenute.&lt;/p&gt;&#xA;&lt;p&gt;Dai un&amp;rsquo;occhiata al &lt;a href=&#34;http://github.com/vjt/permalink_fu/tree/master&#34; target=&#34;_blank&#34;&gt;mio repository su&#xA;GitHub&lt;/a&gt;, leggi il&#xA;&lt;a href=&#34;http://github.com/vjt/permalink_fu/blob/b8d979f28c9795389cc65e9670a3529f805618dc/README&#34; target=&#34;_blank&#34;&gt;README&lt;/a&gt;&#xA;che contiene la documentazione delle funzionalità aggiunte, e guarda il codice!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Il plugin jQuery ajax-upload-fu</title>
      <link>https://sindro.me/it/posts/2009-01-29-the-jquery-ajax-upload-fu-plugin-2/</link>
      <pubDate>Thu, 29 Jan 2009 09:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2009-01-29-the-jquery-ajax-upload-fu-plugin-2/</guid>
      <description>&lt;p&gt;Di recente ho scritto un &lt;a href=&#34;http://gist.github.com/54441&#34; target=&#34;_blank&#34;&gt;plug-in jQuery&lt;/a&gt; che&#xA;permette l&amp;rsquo;upload di file via &lt;strong&gt;AJAX&lt;/strong&gt; senza usare un pulsante file input&#xA;fisso. Raggiunge il suo scopo installando un handler OnMouseMove sugli elementi&#xA;selezionati e spostando il pulsante input sotto il cursore del mouse.&lt;/p&gt;&#xA;&lt;p&gt;La citazione che ha ispirato questo codice e&amp;rsquo;: &amp;ldquo;Se Maometto non va alla&#xA;montagna, la montagna va da Maometto&amp;rdquo;, il contrario del &lt;a href=&#34;http://en.wikipedia.org/wiki/If_the_mountain_won%27t_come_to_Muhammad&#34; target=&#34;_blank&#34;&gt;proverbio piu&#39;&#xA;noto&lt;/a&gt; :).&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;EDIT 2023: ATTENZIONE: questi link sono scaduti :-(&lt;/em&gt;&#xA;E&amp;rsquo; stato estratto dalla codebase JavaScript dell&amp;rsquo;&lt;a href=&#34;http://www.visitacsa.it/&#34; target=&#34;_blank&#34;&gt;applicazione Visita&#xA;CSA&lt;/a&gt;, guarda il&#xA;&lt;a href=&#34;http://gist.github.com/54441&#34; target=&#34;_blank&#34;&gt;gist&lt;/a&gt; per maggiori informazioni, e dai&#xA;un&amp;rsquo;occhiata &lt;a href=&#34;http://www.visitacsa.it/javascripts/business-registration.js&#34; target=&#34;_blank&#34;&gt;al codice dell&amp;rsquo;app live per un esempio di&#xA;utilizzo&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Ecco il codice sorgente:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//  ~ JavaScript Kung-FU, with an excess chunky bacon dose! ~&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// This plugin allows seamless ajax file uploads without having&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// a fixed file input button. It achieves this by installing an&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// OnMouseMove handler over the interested elements, and moving&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// the input button under the cursor. &amp;lt;&amp;lt;If Muhammad won&amp;#39;t go to&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// the the mountain, the mountain will come to Muhammad.&amp;gt;&amp;gt; :-).&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// This approach is needed on the majority of browser, except&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// Safari, on which the coder is allowed to trigger a &amp;#34;click&amp;#34; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// event onto an input type=file element. On other browsers,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// you can not, that&amp;#39;s why the complicated mousemove approach&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// was chosen.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// Either way, when the value of the input type=file changes,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// handlers are disabled, and a user-provided callback is then&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// called (passed via the &amp;#34;upload&amp;#34; option). Handlers are then&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// re-enabled again when the upload succeeds or fails.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// IE has additional problems, because, quite unexplicably,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// when submitting a form that causes a page load, the change&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// event on the file input is triggered AGAIN, thus triggering&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// a new file upload. To circumvent this, you can pass a &amp;#34;linked&amp;#34; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// option, that contains the jQuery selector of the form, and&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// whenever an input under this form is hovered, ajax upload&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// handlers are temporarily cleared and thus the spurious form&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// submission.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// The jquery Form plugin is a perfect companion of this one,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// because of its .ajaxSubmit method. Have a look at its home&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// page: http://malsup.com/jquery/form/.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// Have fun!&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// - vjt@openssl.it&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;$&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;fn&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;ajaxFormUpload&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;options&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;positioning&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; { &lt;span style=&#34;color:#a6e22e&#34;&gt;top&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;left&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;position&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;absolute&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;cursor&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;pointer&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;z-index&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt; };&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;form&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;$&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;options&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;form&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;#ajax_upload&amp;#39;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;form&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;css&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;positioning&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;input&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;form&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;find&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;input[type=file]&amp;#39;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;input&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;css&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;$&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;extend&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;positioning&lt;/span&gt;, { &lt;span style=&#34;color:#a6e22e&#34;&gt;width&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;10px&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;opacity&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;font-size&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;0px&amp;#39;&lt;/span&gt; }));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;hovering_element&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;null&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;elements&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;$&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;handler&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;event_&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;$&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;browser&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;safari&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;event_&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;click&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;handler&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#a6e22e&#34;&gt;hovering_element&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;$&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#a6e22e&#34;&gt;input&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;click&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    };&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  } &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;event_&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;mousemove&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;handler&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;event&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#a6e22e&#34;&gt;hovering_element&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;$&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#a6e22e&#34;&gt;form&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;css&lt;/span&gt;({ &lt;span style=&#34;color:#a6e22e&#34;&gt;left&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;event&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;pageX&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;top&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;event&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;pageY&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt; });&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    };&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;enable&lt;/span&gt;()  { &lt;span style=&#34;color:#a6e22e&#34;&gt;$&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;elements&lt;/span&gt;).&lt;span style=&#34;color:#a6e22e&#34;&gt;bind&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;event_&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;handler&lt;/span&gt;);   }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;disable&lt;/span&gt;() { &lt;span style=&#34;color:#a6e22e&#34;&gt;$&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;elements&lt;/span&gt;).&lt;span style=&#34;color:#a6e22e&#34;&gt;unbind&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;event_&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;handler&lt;/span&gt;); }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;input&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;change&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;element&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;hovering_element&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#f92672&#34;&gt;!&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;element&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;disable&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;options&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;upload&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;element&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;form&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;enable&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  });&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;enable&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;options&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;linked&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;$&lt;/span&gt;(document).&lt;span style=&#34;color:#a6e22e&#34;&gt;ready&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#a6e22e&#34;&gt;$&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;options&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;linked&lt;/span&gt;).&lt;span style=&#34;color:#a6e22e&#34;&gt;find&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;input&amp;#39;&lt;/span&gt;).&lt;span style=&#34;color:#a6e22e&#34;&gt;mouseover&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt;() { &lt;span style=&#34;color:#a6e22e&#34;&gt;hovering_element&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;null&lt;/span&gt;; });&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    });&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Puoi trovarlo su &lt;a href=&#34;http://gist.github.com/54441&#34; target=&#34;_blank&#34;&gt;github&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
