<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Development on Marcello Barnaba</title>
    <link>https://sindro.me/it/categories/development/</link>
    <description>Recent content in Development on Marcello Barnaba</description>
    <generator>Hugo</generator>
    <language>it</language>
    <lastBuildDate>Sat, 04 Apr 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://sindro.me/it/categories/development/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Come ho rimpiazzato l&#39;app Verisure con Home Assistant</title>
      <link>https://sindro.me/it/posts/2026-04-04-verisure-italy-home-assistant/</link>
      <pubDate>Sat, 04 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2026-04-04-verisure-italy-home-assistant/</guid>
      <description>&lt;p&gt;L&amp;rsquo;app Verisure fa schifo. Lì, l&amp;rsquo;ho detto.&lt;/p&gt;&#xA;&lt;p&gt;Non che l&amp;rsquo;allarme funzioni male — il pannello SDVECU è solido, i sensori&#xA;sono affidabili, l&amp;rsquo;installazione è professionale. Ma l&amp;rsquo;app. Dio santo,&#xA;l&amp;rsquo;app.&lt;/p&gt;&#xA;&lt;h2 id=&#34;il-problema&#34;&gt;Il problema&lt;/h2&gt;&#xA;&lt;p&gt;Apri l&amp;rsquo;app per controllare lo stato dell&amp;rsquo;allarme e ti accoglie una &lt;strong&gt;pubblicità&#xA;di Verisure stessa&lt;/strong&gt;. Io pago fior di quattrini per il servizio e loro mi&#xA;piazzano le ads &lt;em&gt;dentro&lt;/em&gt; l&amp;rsquo;app. È il 2026 e un&amp;rsquo;azienda di sicurezza mi fa&#xA;vedere banner pubblicitari quando provo a verificare se casa mia è protetta.&lt;/p&gt;&#xA;&lt;p&gt;Ma le ads sono il meno. I veri problemi sono:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Routine cieche.&lt;/strong&gt; Sì, l&amp;rsquo;app ha le &amp;ldquo;routine&amp;rdquo; — attiva a&#xA;mezzanotte, disattiva alle 7. Ma non sanno dove sei. Mezzanotte&#xA;e sei ancora in giardino? L&amp;rsquo;allarme si attiva e i sensori scattano.&#xA;Finestra aperta? Il pannello annuncia che non riesce ad attivare,&#xA;ma se non lo senti l&amp;rsquo;allarme resta spento. Vai in vacanza e&#xA;dimentichi di disabilitare la routine di disattivazione mattutina?&#xA;Allarme spento con la casa vuota. E le modifiche alle routine&#xA;impiegano &lt;em&gt;20 minuti a propagarsi&lt;/em&gt; — &amp;ldquo;o il giorno dopo&amp;rdquo;. Nel 2026.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Zero presenza.&lt;/strong&gt; L&amp;rsquo;app non sa dove sei. Non sa chi è in casa.&#xA;Non sa se la donna delle pulizie è andata via. Nessuna automazione&#xA;basata sulla posizione.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Una telecamera alla volta.&lt;/strong&gt; Vuoi vedere tutte le camere? Tocca,&#xA;aspetta, torna indietro, tocca la prossima, aspetta. Nessuna vista&#xA;d&amp;rsquo;insieme. Nessun &amp;ldquo;cattura tutto&amp;rdquo;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Lentezza biblica.&lt;/strong&gt; Richiedi un&amp;rsquo;immagine, aspetti, aspetti, forse&#xA;arriva. A volte ricarichi l&amp;rsquo;app e riprovi. Nel 2026.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Nessuno storage permanente.&lt;/strong&gt; Le immagini catturate spariscono. Non&#xA;c&amp;rsquo;è uno storico consultabile.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Nessun timestamp sulle immagini.&lt;/strong&gt; Catturi una foto e non sai&#xA;&lt;em&gt;quando&lt;/em&gt; è stata scattata né &lt;em&gt;da quale camera&lt;/em&gt;. Devi ricordartelo tu.&#xA;Per un sistema di sicurezza è imbarazzante.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Notifiche generiche.&lt;/strong&gt; Una notifica uguale per tutti. Niente&#xA;notifiche actionable, niente notifiche critiche che bypassano il&#xA;&amp;ldquo;Non Disturbare&amp;rdquo;.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Quello che volevo: il mio allarme, integrato nella mia domotica, con&#xA;automazioni intelligenti, notifiche per tutti i residenti, e una&#xA;dashboard che mostra &lt;em&gt;tutto&lt;/em&gt; in un colpo d&amp;rsquo;occhio. Senza pubblicità.&lt;/p&gt;</description>
    </item>
    <item>
      <title>wifi-dethrash: trovare e risolvere il thrashing WiFi mesh su OpenWrt</title>
      <link>https://sindro.me/it/posts/2026-04-03-wifi-dethrash-openwrt-mesh-analyzer/</link>
      <pubDate>Fri, 03 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2026-04-03-wifi-dethrash-openwrt-mesh-analyzer/</guid>
      <description>&lt;p&gt;Tutto è cominciato con il &lt;a href=&#34;https://sindro.me/posts/2026-02-15-wifi-presence-detection-home-assistant/&#34;&gt;rilevamento presenza WiFi&lt;/a&gt;. Avevo costruito un sistema che traccia in quale stanza si trova ognuno scrapando l&amp;rsquo;RSSI dai miei AP OpenWrt. Funzionava &amp;ndash; ma le assegnazioni delle stanze continuavano a sfarfallare. Cucina. Ufficio. Cucina. Ufficio. Tre volte in dieci secondi. La macchina a stati era a posto. Il WiFi no.&lt;/p&gt;&#xA;&lt;p&gt;La mia rete domestica ha sei AP OpenWrt su tre piani, due SSID &amp;ndash; Mercury su 5 GHz, Saturn su 2,4 GHz &amp;ndash; tutti con 802.11r per il roaming veloce. Vista da fuori, sembra una mesh fatta bene. Vista da dentro, un telefono rimbalzava tra access point &lt;strong&gt;129 volte in 24 ore&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Non lo sapevo finché non ho costruito lo strumento per vederlo.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://sindro.me/posts/2026-04-03-wifi-dethrash-openwrt-mesh-analyzer/roaming-timeline-24h.png&#34; alt=&#34;Timeline di roaming — 24 ore&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Ogni riga è un client WiFi, il colore mostra a quale AP è connesso. I client sani mostrano barre lunghe e piene. Quelli malati sembrano pali da barbiere. Vedi &lt;code&gt;sara-iphone&lt;/code&gt;? Quella striscia arcobaleno sono 129 connessioni in 24 ore &amp;ndash; il telefono cammina in una zona di overlap tra due AP dove entrambi hanno un segnale circa uguale (e orrendo).&lt;/p&gt;&#xA;&lt;h2 id=&#34;il-problema-che-non-puoi-vedere&#34;&gt;Il problema che non puoi vedere&lt;/h2&gt;&#xA;&lt;p&gt;Il roaming WiFi è invisibile. Il tuo telefono mostra tutte le tacche, Netflix bufferizza un attimo, e tu dai la colpa alla connessione internet. Ma quello che è successo davvero è che il tuo telefono si è disconnesso da un AP, ha scansionato le alternative, ne ha scelto un altro con un segnale marginalmente diverso, si è associato, autenticato, e ha ricominciato lo streaming &amp;ndash; tutto in meno di un secondo se 802.11r funziona, diversi secondi se non funziona.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Rilevamento presenza WiFi per Home Assistant con OpenWrt</title>
      <link>https://sindro.me/it/posts/2026-02-15-wifi-presence-detection-home-assistant/</link>
      <pubDate>Sun, 15 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2026-02-15-wifi-presence-detection-home-assistant/</guid>
      <description>&lt;p&gt;Avevo due problemi con il rilevamento presenza di Home Assistant.&lt;/p&gt;&#xA;&lt;p&gt;Il primo: il GPS ti dice &lt;em&gt;se&lt;/em&gt; qualcuno è a casa, ma non &lt;em&gt;dove&lt;/em&gt; in casa si trova. La mia casa ha sei access point OpenWrt distribuiti su tre piani. Sanno già esattamente quale telefono è connesso a quale AP in ogni momento &amp;ndash; sono dati di presenza a livello di stanza, lì nello stack WiFi, che urlano per essere usati. Sapere chi è in quale stanza apre un&amp;rsquo;intera classe di automazioni che il GPS non può toccare: luci che ti seguono, climatizzazione per stanza occupata, una dashboard che mostra la situazione della casa a colpo d&amp;rsquo;occhio.&lt;/p&gt;&#xA;&lt;p&gt;Il secondo: la nostra donna delle pulizie sta a casa nostra un paio di giorni a settimana. Non voglio configurarle un account HA completo, installarle l&amp;rsquo;app companion sul telefono, o avere a che fare con i permessi GPS. Ma &lt;em&gt;devo&lt;/em&gt; sapere se è a casa &amp;ndash; perché la mia automazione dell&amp;rsquo;allarme ha bisogno di sapere se la casa è davvero vuota prima di attivarsi. Il suo telefono si connette al WiFi. Mi basta questo.&lt;/p&gt;&#xA;&lt;p&gt;Così ho scritto &lt;a href=&#34;https://github.com/vjt/openwrt-ha-presence&#34; target=&#34;_blank&#34;&gt;openwrt-ha-presence&lt;/a&gt;: una macchina a stati che scrapa le metriche RSSI direttamente dai tuoi AP OpenWrt, capisce in quale stanza si trova ogni persona in base alla potenza del segnale, e pubblica lo stato casa/fuori per ogni persona su Home Assistant via MQTT Discovery. Niente cloud, niente beacon, niente parsing di log, niente database time-series. Python, async, ~600 righe di logica effettiva.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://sindro.me/posts/2026-02-15-wifi-presence-detection-home-assistant/home-assistant.png&#34; alt=&#34;Storico tracking stanze di Home Assistant&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Sblocco remoto via SSH di ZFS cifrato su FreeBSD</title>
      <link>https://sindro.me/it/posts/2026-01-28-freebsd-encrypted-zfs-remote-unlock/</link>
      <pubDate>Wed, 28 Jan 2026 00:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2026-01-28-freebsd-encrypted-zfs-remote-unlock/</guid>
      <description>&lt;h2 id=&#34;luks-remoto-pfft-ecco-come-sbloccare-via-ssh-una-root-zfs-cifrata-su-freebsd-nel-modo-difficile&#34;&gt;LUKS remoto? Pfft. Ecco come sbloccare via SSH una root ZFS cifrata su FreeBSD (nel modo difficile)&lt;/h2&gt;&#xA;&lt;p&gt;Se usi FreeBSD &lt;a href=&#34;https://sindro.me/posts/2023-08-13-freebsd-encrypted-root-on-zfs/&#34; target=&#34;_blank&#34;&gt;come me&lt;/a&gt;, su un server remoto con cifratura completa del disco (ZFS su GELI), conosci il panico del riavvio. Sei sempre alla mercé di un KVM-over-IP o di una connessione VNC dal browser, per inserire la password del filesystem root al prompt del kernel.&lt;/p&gt;&#xA;&lt;p&gt;Inoltre, se (come me) fai girare un sistema con &lt;code&gt;kern.securelevel&lt;/code&gt; &amp;gt; 0, allora installare una nuova libc significa riavviare in single user e installare gli aggiornamenti tramite la suddetta connessione KVM o VNC, che &lt;em&gt;non è ergonomica&lt;/em&gt; per usare un eufemismo.&lt;/p&gt;&#xA;&lt;p&gt;La soluzione standard è di solito un ambiente SSH pre-boot. Su Linux, dropbear-initramfs rende la cosa banale. Su FreeBSD? Devi costruirti un mfsroot (memory file system) custom da zero.&lt;/p&gt;&#xA;&lt;p&gt;La maggior parte delle guide suggerisce di usare un semplice shell script come init. Funziona, ma è misero. Perdi il job control (niente Ctrl+C), non hai un TTY decente, e in bocca al lupo se devi fare debug dei problemi di rete in modo interattivo.&lt;/p&gt;&#xA;&lt;p&gt;Non volevo un hack raffazzonato. Volevo un ambiente vero. Volevo &lt;code&gt;init&lt;/code&gt;, &lt;code&gt;getty&lt;/code&gt;, &lt;code&gt;login&lt;/code&gt;, autenticazione PAM, e un chroot ZFS per la manutenzione &amp;ndash; per installare aggiornamenti.&lt;/p&gt;&#xA;&lt;p&gt;Ecco come ho costruito un unlocker remoto robusto per FreeBSD.&lt;/p&gt;&#xA;&lt;h2 id=&#34;il-problema-con-binsh-come-init&#34;&gt;Il problema con /bin/sh come Init&lt;/h2&gt;&#xA;&lt;p&gt;L&amp;rsquo;approccio ingenuo è compilare un ramdisk minuscolo, ficcarci dentro un binario sh statico, e dire al loader di eseguirlo come PID 1.&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Questo crea incubi&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cat &amp;gt; /sbin/init &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;lt;&amp;lt;EOF&#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:#e6db74&#34;&gt;#!/bin/sh&#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:#e6db74&#34;&gt;/sbin/dropbear&#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:#e6db74&#34;&gt;exec /bin/sh&#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:#e6db74&#34;&gt;EOF&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Perché fallisce?&lt;/p&gt;</description>
    </item>
    <item>
      <title>Root cifrata con LUKS su Raspberry PI 5</title>
      <link>https://sindro.me/it/posts/2026-01-20-raspberry-pi-luks-encrypted-root/</link>
      <pubDate>Tue, 20 Jan 2026 00:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2026-01-20-raspberry-pi-luks-encrypted-root/</guid>
      <description>&lt;h2 id=&#34;premessa&#34;&gt;Premessa&lt;/h2&gt;&#xA;&lt;p&gt;Quindi ho cominciato a far girare &lt;a href=&#34;https://www.home-assistant.io/&#34; target=&#34;_blank&#34;&gt;Home Assistant&lt;/a&gt;&#xA;a casa su un Raspberry PI 5 e ho semplicemente installato HAOS su una SD. Poi ho&#xA;iniziato a sentirmi sempre più a disagio nel salvare credenziali nel filesystem&#xA;di HA in chiaro (qualsiasi offuscamento non è sufficiente).&lt;/p&gt;&#xA;&lt;p&gt;Considerando che configurare una root cifrata con HAOS è semplicemente&#xA;impossibile senza forkarlo, e considerando anche che dedicare un intero RPI5&#xA;a HAOS è uno spreco di risorse, ho deciso di aggiungere un SSD al Pi, avviarlo&#xA;con Raspbian e poi far girare HAOS dentro una VM.&lt;/p&gt;&#xA;&lt;p&gt;In questo modo, posso avere una root cifrata sull&amp;rsquo;host principale, cifrando&#xA;così l&amp;rsquo;intera VM HAOS.&lt;/p&gt;&#xA;&lt;p&gt;Inoltre posso ora fare snapshot dell&amp;rsquo;intera VM HAOS e ho molta più&#xA;flessibilità nella gestione. Ultimo ma non meno importante, posso anche usare&#xA;la CPU e la RAM rimanenti del RPI per qualcos&amp;rsquo;altro.&lt;/p&gt;&#xA;&lt;h2 id=&#34;ringraziamenti&#34;&gt;Ringraziamenti&lt;/h2&gt;&#xA;&lt;p&gt;Prima di tutto, un grande grazie a &lt;a href=&#34;https://rr-developer.github.io/LUKS-on-Raspberry-Pi/&#34; target=&#34;_blank&#34;&gt;questo&#xA;post&lt;/a&gt; che mi ha dato&#xA;le indicazioni iniziali su come fare il setup. Ma quel post del 2021 è ora&#xA;leggermente datato, e molti passaggi non sono più necessari.&lt;/p&gt;&#xA;&lt;p&gt;Secondo, un grande grazie a &lt;a href=&#34;https://github.com/ericfjosne&#34; target=&#34;_blank&#34;&gt;Eric Fjøsne&lt;/a&gt; per&#xA;&lt;a href=&#34;https://github.com/vjt/sindro.me/pull/1&#34; target=&#34;_blank&#34;&gt;aver usato questa guida e averla corretta&lt;/a&gt;&#xA;dato che l&amp;rsquo;avevo scritta perlopiù a posteriori :-).&lt;/p&gt;&#xA;&lt;h2 id=&#34;requisiti&#34;&gt;Requisiti&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Un RPI5 con Debian 13 (trixie) o successivo&lt;/li&gt;&#xA;&lt;li&gt;Una chiavetta USB decente e affidabile che può essere completamente cancellata&lt;/li&gt;&#xA;&lt;li&gt;Una tastiera e un monitor collegati direttamente al RPI&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;panoramica&#34;&gt;Panoramica&lt;/h2&gt;&#xA;&lt;p&gt;L&amp;rsquo;idea di fondo è:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Prepariamo un initrd che contiene i seguenti strumenti:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;resize2fs&lt;/code&gt; per ridurre e ingrandire filesystem &lt;code&gt;ext4&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;cryptsetup&lt;/code&gt; per gestire la cifratura delle partizioni&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Configuriamo il sistema per avviarsi da una root cifrata che non esiste ancora,&#xA;forzando così il sistema a cadere nell&amp;rsquo;initrd.&lt;/li&gt;&#xA;&lt;li&gt;Nell&amp;rsquo;initrd, riduciamo il filesystem root alla dimensione minima possibile&lt;/li&gt;&#xA;&lt;li&gt;Copiamo il filesystem root dalla partizione in chiaro sulla chiavetta USB&lt;/li&gt;&#xA;&lt;li&gt;Creiamo la partizione cifrata usando LUKS&lt;/li&gt;&#xA;&lt;li&gt;Copiamo il filesystem root dalla chiavetta USB sulla partizione cifrata&lt;/li&gt;&#xA;&lt;li&gt;Estendiamo il filesystem root alla dimensione massima&lt;/li&gt;&#xA;&lt;li&gt;Configuriamo SSH nell&amp;rsquo;initrd così da poterlo sbloccare anche dopo aver&#xA;piazzato il Raspberry Pi in un posto senza tastiera o schermo.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Pronti? Via!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Talk su MetalOS ad All Systems Go! 2025</title>
      <link>https://sindro.me/it/posts/2025-10-09-all-systems-go/</link>
      <pubDate>Thu, 09 Oct 2025 00:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2025-10-09-all-systems-go/</guid>
      <description>&lt;p&gt;Ho presentato un talk ad &lt;a href=&#34;https://all-systems-go.io/&#34; target=&#34;_blank&#34;&gt;All Systems Go 2025&lt;/a&gt;, la conferenza fondamentale sullo userspace Linux. La conferenza è organizzata principalmente dal team di systemd, ed è un punto d&amp;rsquo;incontro annuale per tutti quelli che lavorano su software di sistema Linux.&lt;/p&gt;&#xA;&lt;p&gt;Il tema di quest&amp;rsquo;anno è stato prevalentemente &amp;ldquo;container, container, container&amp;rdquo;, con molte nuove funzionalità in systemd per supportare la containerizzazione e anche esperienze pratiche da persone che lavorano sul campo su come usano systemd e software collaterali per costruire infrastrutture a container.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://sindro.me/posts/2025-10-09-all-systems-go/vjt-dubros-on-stage.jpg&#34; alt=&#34;Io e Serge sul palco&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Ho presentato insieme al mio collega &lt;a href=&#34;https://www.linkedin.com/in/serge-dubrouski-2902638/&#34; target=&#34;_blank&#34;&gt;Serge Dubrouski&lt;/a&gt; il nostro lavoro nella costruzione di un sistema operativo alla scala di Meta. Gestiamo un sistema operativo basato su immagini, ma l&amp;rsquo;azienda viene da due decenni di aggiornamenti del SO online, quindi abbiamo dovuto progettare una strategia di migrazione adeguata e gettare le fondamenta per il futuro.&lt;/p&gt;&#xA;&lt;p&gt;Descriviamo come prepariamo le release CentOS dall&amp;rsquo;upstream, gli &lt;a href=&#34;https://github.com/facebookincubator/antlir&#34; target=&#34;_blank&#34;&gt;strumenti OSS&lt;/a&gt; che abbiamo costruito per creare le immagini del SO, e la tecnologia interna (MetalOS) che abbiamo ideato per costruire un SO che gira su milioni di server Linux.&lt;/p&gt;&#xA;&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;&#xA;      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/PpDDdLMiPCs?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;&#xA;    &lt;/div&gt;&#xA;&#xA;&lt;p&gt;Puoi anche &lt;a href=&#34;https://sindro.me/posts/2025-10-09-all-systems-go/asg2025-332-eng-OS_as_a_Service_at_Meta_Platforms_hd.mp4&#34;&gt;scaricare il video per la visione offline&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Domande? Commenti? Sfogate qui sotto! 🤣&lt;/p&gt;</description>
    </item>
    <item>
      <title>pfasciilogd: collegare pf e fail2ban</title>
      <link>https://sindro.me/it/posts/2023-08-17-pfasciilogd-link-pf-and-fail2ban/</link>
      <pubDate>Thu, 17 Aug 2023 00:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2023-08-17-pfasciilogd-link-pf-and-fail2ban/</guid>
      <description>&lt;h2 id=&#34;tldr&#34;&gt;TL;DR&lt;/h2&gt;&#xA;&lt;p&gt;FreeBSD: come bloccare i port scanner dall&amp;rsquo;enumerare le porte aperte sul&#xA;tuo server, usando fail2ban e una rappresentazione ASCII dei log di &lt;code&gt;pf&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;premessa&#34;&gt;Premessa&lt;/h2&gt;&#xA;&lt;p&gt;Uso &lt;a href=&#34;https://fail2ban.org/&#34; target=&#34;_blank&#34;&gt;&lt;code&gt;fail2ban&lt;/code&gt;&lt;/a&gt; per tenere alla larga attaccanti e bot&#xA;che tentano di scansionare i miei siti web o di forzare le mie caselle di posta.&#xA;Fail2ban funziona scansionando i file di log alla ricerca di pattern specifici e&#xA;mantenendo un conteggio delle corrispondenze per IP, e permette&#xA;all&amp;rsquo;amministratore di sistema di definire cosa fare quando quel conteggio supera&#xA;una soglia definita.&lt;/p&gt;&#xA;&lt;p&gt;I pattern sono indicativi di attività malevola, come il tentativo di indovinare&#xA;la password di una casella di posta, o il tentativo di scansionare lo spazio di&#xA;un sito web alla ricerca di vulnerabilità.&lt;/p&gt;&#xA;&lt;p&gt;L&amp;rsquo;azione da eseguire nella maggior parte dei casi è bloccare l&amp;rsquo;indirizzo IP&#xA;incriminato tramite il firewall della macchina, ma fail2ban supporta qualsiasi&#xA;meccanismo che tu possa concepire, purché possa essere attuato da un comando&#xA;UNIX.&lt;/p&gt;&#xA;&lt;h2 id=&#34;pf-e-i-suoi-log&#34;&gt;PF e i suoi log&lt;/h2&gt;&#xA;&lt;p&gt;Sul mio server FreeBSD uso l&amp;rsquo;eccellente &lt;a href=&#34;https://docs.freebsd.org/en/books/handbook/firewalls/#firewalls-pf&#34; target=&#34;_blank&#34;&gt;pf&lt;/a&gt;,&#xA;il packet filter, per gestire il traffico in entrata e per eseguire la&#xA;normalizzazione del traffico.&lt;/p&gt;&#xA;&lt;p&gt;Il meccanismo di logging di PF è molto UNIX-iano: fornisce un&amp;rsquo;interfaccia di&#xA;rete virtuale (&lt;code&gt;pflog0&lt;/code&gt;) sulla quale vengono inoltrati i primi byte dei&#xA;pacchetti bloccati da una regola con lo specificatore &lt;code&gt;log&lt;/code&gt;, così che i log&#xA;dei blocchi in tempo reale possano essere ispezionati con un semplice:&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# tcpdump -eni pflog0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tcpdump: verbose output suppressed, use -v or -vv &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; full protocol decode&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;listening on pflog0, link-type PFLOG &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;OpenBSD pflog file&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;, capture size &lt;span style=&#34;color:#ae81ff&#34;&gt;262144&lt;/span&gt; bytes&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;01:48:13.748353 rule 1/0&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;match&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;: block in on vtnet0: 121.224.77.46.41854 &amp;gt; 46.38.233.77.6379: Flags &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;S&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;, seq 1929621329, win 29200, options &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;mss 1460,sackOK,TS val &lt;span style=&#34;color:#ae81ff&#34;&gt;840989709&lt;/span&gt; ecr 0,nop,wscale 7&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;, length &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;01:48:15.726215 rule 1/0&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;match&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;: block in on vtnet0: 192.241.235.20.37422 &amp;gt; 46.38.233.77.5632: UDP, length &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;01:48:17.993439 rule 1/0&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;match&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;: block in on vtnet0: 145.239.244.34.54154 &amp;gt; 46.38.233.77.1024: Flags &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;S&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;, seq 3365362952, win 1024, length &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;^C&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt; packets captured&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt; packets received by filter&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; packets dropped by kernel&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Questi log possono essere salvati da &lt;code&gt;pflogd&lt;/code&gt; in un file formato &lt;code&gt;pcap&lt;/code&gt; in&#xA;&lt;code&gt;/var/log/pflog&lt;/code&gt;, che può essere usato per troubleshooting e ispezione&#xA;asincrona, sempre con &lt;code&gt;tcpdump&lt;/code&gt; o qualsiasi cosa che sappia leggere file&#xA;&lt;code&gt;pcap&lt;/code&gt; (come Wireshark).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Root cifrata su ZFS con FreeBSD</title>
      <link>https://sindro.me/it/posts/2023-08-13-freebsd-encrypted-root-on-zfs/</link>
      <pubDate>Sun, 13 Aug 2023 00:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2023-08-13-freebsd-encrypted-root-on-zfs/</guid>
      <description>&lt;h2 id=&#34;premessa&#34;&gt;Premessa&lt;/h2&gt;&#xA;&lt;p&gt;Nel 2023, gestisco ancora il mio mailserver. Sì, perché mi piace avere il&#xA;controllo (almeno in parte) della mia vita digitale, e mi piace avere&#xA;diversi nomi di dominio su cui tenere le mie cose. Tuttavia, stavo pagando&#xA;30€/mese ad AWS per avere in cambio 2 core, 2GiB di RAM e 40G di disco,&#xA;appena sufficienti per far girare IMAP+SMTP+MySQL+Clamd, figurarsi qualsiasi&#xA;forma di protezione antispam o ricerca full-text nel corpo delle email.&lt;/p&gt;&#xA;&lt;p&gt;Insomma, stavo pagando un botto di soldi per far girare un servizio merdoso,&#xA;e avevo persino pensato di chiudere tutto e spostare la posta e i siti web&#xA;su qualche servizio completamente managed.&lt;/p&gt;&#xA;&lt;h2 id=&#34;però-voglio-ancora-farlo&#34;&gt;Però voglio ancora farlo&lt;/h2&gt;&#xA;&lt;p&gt;Beh, per ospitare quattro domini con solo qualche redirect email più i siti&#xA;web che gestisco, avrei speso di più di quanto stavo già pagando,&#xA;incatenandomi per di più a qualche fornitore di servizi e alle sue politiche.&lt;/p&gt;&#xA;&lt;p&gt;Quindi, volevo usare FreeBSD e ho cominciato a cercare nella &lt;a href=&#34;https://www.freebsd.org/commercial/isp/&#34; target=&#34;_blank&#34;&gt;pagina degli&#xA;ISP&lt;/a&gt; fino a decidere di valutare&#xA;&lt;a href=&#34;https://www.hetzner.com/cloud&#34; target=&#34;_blank&#34;&gt;Hetzner&lt;/a&gt; e&#xA;&lt;a href=&#34;https://www.netcup.eu/vserver/vps.php&#34; target=&#34;_blank&#34;&gt;netcup&lt;/a&gt;, che offrono entrambi&#xA;prezzi aggressivi e un buon vecchio VPS senza fronzoli.&lt;/p&gt;&#xA;&lt;h2 id=&#34;scelta-del-provider&#34;&gt;Scelta del provider&lt;/h2&gt;&#xA;&lt;p&gt;Alla fine, ho scelto un netcup VPS 1000 che mi dà, a 1/3 del prezzo&#xA;che pagavo ad AWS, 4 volte le risorse: 6 core, 8GiB di RAM, 160GiB di&#xA;SSD RAID10 e un&amp;rsquo;installazione FreeBSD completamente libera e senza&#xA;limitazioni.&lt;/p&gt;&#xA;&lt;p&gt;Tuttavia, l&amp;rsquo;immagine base fornita da Netcup ha alcune limitazioni:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Gira su UFS&lt;/li&gt;&#xA;&lt;li&gt;Non ha una partizione di swap&lt;/li&gt;&#xA;&lt;li&gt;Non ha cifratura&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;fare-un-piano&#34;&gt;Fare un piano&lt;/h2&gt;&#xA;&lt;p&gt;Dato che ero già in fase di configurazione e non volevo ricominciare da zero&#xA;(questo è un server vecchio stile, gestito a mano, zero automazione) ho&#xA;deciso di:&lt;/p&gt;</description>
    </item>
    <item>
      <title>goto fail;</title>
      <link>https://sindro.me/it/posts/2014-02-28-goto-fail/</link>
      <pubDate>Fri, 28 Feb 2014 03:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2014-02-28-goto-fail/</guid>
      <description>&lt;h2 id=&#34;con-le-sue-stesse-parole&#34;&gt;Con le sue stesse parole:&lt;/h2&gt;&#xA;&lt;figure&gt;&lt;img src=&#34;https://sindro.me/posts/2014-02-28-goto-fail/goto-fail.png&#34;&#xA;    alt=&#34;goto fail diff&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;Sorgenti:&#xA;&lt;a href=&#34;http://opensource.apple.com/source/Security/Security-55179.13/libsecurity_ssl/lib/sslKeyExchange.c?txt&#34; target=&#34;_blank&#34;&gt;55179.13.c&lt;/a&gt;,&#xA;&lt;a href=&#34;http://opensource.apple.com/source/Security/Security-55471/libsecurity_ssl/lib/sslKeyExchange.c?txt&#34; target=&#34;_blank&#34;&gt;55471.c&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Differenze nel codice sorgente tra due versioni consecutive del&#xA;Security.framework, un componente MacOS/iOS. L&amp;rsquo;apparentemente innocuo goto&#xA;fail; in più è la causa di una &lt;a href=&#34;http://nakedsecurity.sophos.com/2014/02/24/anatomy-of-a-goto-fail-apples-ssl-bug-explained-plus-an-unofficial-patch/&#34; target=&#34;_blank&#34;&gt;grave falla di sicurezza nella maggior parte dei&#xA;prodotti Apple&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Installare node.js via APT su Debian Squeeze</title>
      <link>https://sindro.me/it/posts/2011-09-12-install-node-js-via-apt-on-debian-squeeze/</link>
      <pubDate>Mon, 12 Sep 2011 12:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2011-09-12-install-node-js-via-apt-on-debian-squeeze/</guid>
      <description>&lt;p&gt;In breve: aggiungi la sorgente APT di &lt;a href=&#34;http://www.debian.org/releases/sid/&#34; target=&#34;_blank&#34;&gt;SID&lt;/a&gt;,&#xA;configura l&amp;rsquo;&lt;a href=&#34;http://wiki.debian.org/AptPreferences&#34; target=&#34;_blank&#34;&gt;APT Pinning&lt;/a&gt; per dare&#xA;priorità ai pacchetti di &lt;code&gt;squeeze&lt;/code&gt; rispetto a quelli di &lt;code&gt;SID&lt;/code&gt;, ricompila il&#xA;pacchetto &lt;code&gt;nodejs&lt;/code&gt; sotto &lt;code&gt;squeeze&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Aggiungi la &lt;strong&gt;sorgente APT di SID&lt;/strong&gt; creando &lt;code&gt;/etc/apt/sources.list.d/sid.list&lt;/code&gt;&#xA;(usa il tuo &lt;a href=&#34;http://www.debian.org/mirror/&#34; target=&#34;_blank&#34;&gt;mirror più vicino&lt;/a&gt;):&lt;/li&gt;&#xA;&lt;/ul&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-plaintext&#34; data-lang=&#34;plaintext&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;deb http://ftp.us.debian.org/debian/ sid main&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;deb-src http://ftp.us.debian.org/debian/ sid main&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#xA;&lt;li&gt;Configura il pinning APT creando /etc/apt/preferences.d/sid:&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Package: *&#xA;Pin: release a=unstable&#xA;Pin-Priority: 50&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;&#xA;&lt;li&gt;Installa manualmente l&amp;rsquo;ultima versione di libv8, &lt;code&gt;libv8-3.8.9.20&lt;/code&gt; al momento di questo articolo:&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;apt-get install libv8-3.8.9.20&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;&#xA;&lt;li&gt;Scarica i sorgenti del pacchetto nodejs, le dipendenze e compilali:&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;cd&#xA;apt-get source nodejs&#xA;apt-get build-dep nodejs&#xA;cd nodejs-*&#xA;debuild -nc -uc&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Se incontri errori di dipendenze di build, dovresti provare prima ad abbassare&#xA;la dipendenza in debian/control, sia in Build-Depends che in Depends, e&#xA;rieseguire &lt;code&gt;debuild&lt;/code&gt;. Se la compilazione fallisce (ad es. con &lt;code&gt;undefined reference to &#39;ev_run&#39;&lt;/code&gt;)&#xA;la versione precedente non ha le funzioni richieste. Quindi, devi installare le&#xA;versioni aggiornate delle dipendenze necessarie (ad es. &lt;code&gt;libev4&lt;/code&gt;) da sid, usando&#xA;&lt;code&gt;apt-get install nome=versione&lt;/code&gt; ad es. &lt;code&gt;libev4=1:4.11-1&lt;/code&gt;. Lo suggerisco perché&#xA;dovrai aggiornare manualmente i pacchetti installati da sid, quindi meno sono,&#xA;meglio è.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Installa il pacchetto generato&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;dpkg -i nodejs_*.deb nodejs-dev*.deb&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;&#xA;&lt;li&gt;Profit :-)&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>Fare il bind della porta 80/TCP come non-root sul server di sviluppo</title>
      <link>https://sindro.me/it/posts/2011-07-07-binding-port-80-for-your-development-application-server/</link>
      <pubDate>Thu, 07 Jul 2011 14:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2011-07-07-binding-port-80-for-your-development-application-server/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://sindro.me/posts/2011-07-07-binding-port-80-for-your-development-application-server/neo-tux.png&#34; alt=&#34;Neo Tux&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Quindi hai una VM Linux che usi per lo sviluppo, perché vuoi replicare&#xA;l&amp;rsquo;ambiente di produzione il più fedelmente possibile. Hai molte applicazioni da&#xA;gestire, devono girare tutte contemporaneamente perché sono dei bei web service&#xA;REST JSON.&lt;/p&gt;&#xA;&lt;p&gt;Sei stanchissimo di ricordarti quale hai messo sulla porta &lt;code&gt;8081&lt;/code&gt;, e i tuoi file&#xA;di configurazione stanno diventando un vero casino. Quindi configuri degli alias&#xA;per gli indirizzi IP sull&amp;rsquo;interfaccia di rete e decidi di assegnare persino dei&#xA;nomi host — &lt;code&gt;/etc/hosts&lt;/code&gt; va benissimo — per ogni applicazione.&lt;/p&gt;&#xA;&lt;p&gt;Poi, in una configurazione del genere, perché dovresti ancora farle girare su&#xA;porte superiori a &lt;code&gt;1024&lt;/code&gt;? Non sarebbe fantastico digitare il nome&#xA;dell&amp;rsquo;applicazione nella barra degli indirizzi del browser? Sì che lo sarebbe, ma&#xA;è meglio non farle girare come &lt;code&gt;root&lt;/code&gt;, comunque.&lt;/p&gt;&#xA;&lt;p&gt;La soluzione sono le &lt;a href=&#34;http://www.kernel.org/doc/man-pages/online/pages/man7/capabilities.7.html&#34; target=&#34;_blank&#34;&gt;Linux&#xA;capabilities&lt;/a&gt;&#xA;(vedi anche &lt;a href=&#34;http://www.friedhoff.org/posixfilecaps.html&#34; target=&#34;_blank&#34;&gt;qui&lt;/a&gt;). Quella che ci&#xA;interessa è &lt;code&gt;cap_net_bind_service&lt;/code&gt;: dà a un processo il diritto di fare il bind&#xA;su porte well-known (&amp;lt; 1024). Se usi un linguaggio interpretato, ovviamente&#xA;dovrai aggiungere la capability all&amp;rsquo;interprete stesso. Ecco perché c&amp;rsquo;è&#xA;&lt;strong&gt;sviluppo&lt;/strong&gt; nel titolo di questo articolo — non dovresti configurare questo su&#xA;un server di produzione, se non sai cosa stai facendo.&lt;/p&gt;&#xA;&lt;p&gt;Un&amp;rsquo;ultima stranezza: se ti capita di fare &lt;code&gt;dlopen()&lt;/code&gt; su shared object che&#xA;linkano dinamicamente verso librerie fuori dai path canonici, non puoi caricarli&#xA;tramite &lt;code&gt;LD_LIBRARY_PATH&lt;/code&gt; (ad es. il &lt;code&gt;SYBASE.sh&lt;/code&gt;) perché viene ignorato per i&#xA;processi con &lt;code&gt;setcap&lt;/code&gt;. Meglio spostare i path delle librerie in uno snippet&#xA;dentro &lt;code&gt;/etc/ld.so.conf.d&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;tldr&#34;&gt;tl;dr&lt;/h2&gt;&#xA;&lt;p&gt;Assumendo che tu sia l&amp;rsquo;ultimo e più grande sviluppatore Rails, dovresti&#xA;diventare root — o usare sudo, come preferisci — e&lt;/p&gt;</description>
    </item>
    <item>
      <title>PH-Neutral 0x7db</title>
      <link>https://sindro.me/it/posts/2011-07-02-ph-neutral-0x7db/</link>
      <pubDate>Sat, 02 Jul 2011 17:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2011-07-02-ph-neutral-0x7db/</guid>
      <description>&lt;p&gt;&amp;#8220;&lt;strong&gt;If it is good, they stop making it&lt;/strong&gt;&amp;#8221;, il&#xA;payoff stampato sui laccetti della conferenza, distribuiti a ogni partecipante,&#xA;insieme a un badge über-l33t personalizzato con il nostro nickname e l&#39;hash&#xA;della chiave.&lt;/p&gt;&#xA;&lt;p style=&#34;text-align:center;&#34;&gt;&lt;img src=&#34;https://sindro.me/posts/2011-07-02-ph-neutral-0x7db/phneutral-badge.jpg&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;&#xA;&lt;p&gt;Essendo la mia prima esperienza a una conferenza di sicurezza internazionale&#xA;(sono stato solo al camp ccc2k+7), ed essendo un outsider di ph dato che non&#xA;avevo mai partecipato alle edizioni precedenti, il keynote di apertura tenuto da&#xA;&lt;a href=&#34;http://twitter.com/41414141&#34;&gt;FX&lt;/a&gt;, staffer e frontman, è stato&#xA;illuminante: &amp;#8220;you ought to be here!&amp;#8221;, ha urlato indicando il palco,&#xA;indossando una camicia bianca col logo Phenoelit stampato su entrambe le&#xA;maniche.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a name=&#34;continue&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&amp;#8220;Questa conferenza non è mai iniziata in orario&amp;#8221;, ha continuato,&#xA;&amp;#8220;quindi non c&#39;era motivo di farlo per quest&#39;ultima&amp;#8221;. Il programma è&#xA;lineare: festa, il giorno dopo talk dalle 12:00 alle 19:30, poi festa, e&#xA;l&#39;ultimo giorno talk dalle 12:00 alle 17:30. Decisamente un setup che si sposa&#xA;bene con l&#39;alcol disponibile :-D.&lt;/p&gt;&#xA;&lt;p&gt;Subito dopo, un altro speaker ci ha informato che le chiavi di accesso wifi&#xA;ricevute alla registrazione ci permettono di usare una bestia con 6 AP/3&#xA;repeater pilotata da un box OpenBSD — vogliono che il pubblico la hacki perché,&#xA;beh, &amp;#8220;you are the Worst Case Scenario.&amp;#8221; :-)&lt;/p&gt;&#xA;&lt;p style=&#34;text-align:center;&#34;&gt;&lt;img src=&#34;https://sindro.me/posts/2011-07-02-ph-neutral-0x7db/ap-tree.jpg&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;&#xA;&lt;p&gt;Poi è stato presentato il divertente video Hacker Hacker:&lt;/p&gt;&#xA;&lt;p style=&#34;text-align:center;&#34;&gt;&lt;iframe width=&#34;100%&#34; height=&#34;400&#34;&#xA;src=&#34;https://www.youtube.com/embed/IZYQILfxHiw&#34; frameborder=&#34;0&#34;&#xA;allowfullscreen=&#34;yay&#34;&gt;&lt;/iframe&gt;&lt;/p&gt;&#xA;&lt;p style=&#34;text-align:center;&#34;&gt;:-D&lt;/p&gt;&#xA;&lt;p&gt;Dopo una prima serata fiacca e non troppo entusiasmante (per la stanchezza),&#xA;vedremo cosa porta il giorno dopo.&lt;/p&gt;&#xA;&lt;p style=&#34;text-align:center;&#34;&gt;&lt;img src=&#34;https://sindro.me/posts/2011-07-02-ph-neutral-0x7db/funny-nhaima.jpg&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;&#xA;&lt;h2&gt;&lt;a href=&#34;http://ph-neutral.darklab.org/talks/sj.html&#34;&gt;Sniffjoke &amp;#8211; un&#xA;toolkit per eludere gli sniffer&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Gli sniffer ad alta capacità usati nelle grandi aziende e sui gateway di&#xA;frontiera nazionali che raccolgono traffico generato dagli utenti per trovare&#xA;pattern potenzialmente &amp;#8220;criminali&amp;#8221; sono oggi generalmente disponibili&#xA;per larghezze di banda fino a 10Gbps, e presto ci saranno appliance che&#xA;elaboreranno flussi da 100Gbps. Sniffjoke, di &lt;a&#xA;href=&#34;http://twitter.com/sniffjoke&#34;&gt;vecna&lt;/a&gt; e &lt;a&#xA;href=&#34;http://www.evilaliv3.org/&#34;&gt;evilaliv3&lt;/a&gt;, è uno strumento che può&#xA;iniettare nelle connessioni &lt;span class=&#34;caps&#34;&gt;TCP&lt;/span&gt; pacchetti estranei che&#xA;ingannano lo sniffer intercettante ma senza effetti significativi sul&#xA;destinatario. Questi pacchetti, per esempio, fanno credere allo sniffer che la&#xA;connessione sia stata resettata anche se non è vero — iniettando un &lt;span&#xA;class=&#34;caps&#34;&gt;RST&lt;/span&gt; con checksum errato o un pacchetto con &lt;span&#xA;class=&#34;caps&#34;&gt;TTL&lt;/span&gt; inferiore di 1 rispetto al conteggio degli hop — oppure&#xA;cercano di consumare la sua potenza di calcolo usando interpretazioni&#xA;vendor-specific note del &lt;span class=&#34;caps&#34;&gt;TCP RFC&lt;/span&gt;. Dettagli: &lt;a&#xA;href=&#34;http://delirandom.net/sniffjoke/&#34;&gt;sito web&lt;/a&gt;, &lt;a&#xA;href=&#34;http://www.slideshare.net/diocanaglia/sniffjoke-04&#34;&gt;slide&lt;/a&gt;, &lt;a&#xA;href=&#34;http://www.wireshark.org/lists/wireshark-dev/200904/msg00343.html&#34;&gt;thread&#xA;su Wireshark&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Roma RSC 2011</title>
      <link>https://sindro.me/it/posts/2011-03-06-rome-rsc-2011/</link>
      <pubDate>Sun, 06 Mar 2011 18:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2011-03-06-rome-rsc-2011/</guid>
      <description>&lt;p&gt;Grazie agli sforzi di &lt;a href=&#34;http://twitter.com/jodosha&#34; target=&#34;_blank&#34;&gt;@jodosha&lt;/a&gt; e sulla scia del&#xA;vecchio evento &lt;del&gt;Javaday&lt;/del&gt;, ora ribattezzato &lt;a href=&#34;http://codemotion.it/&#34; target=&#34;_blank&#34;&gt;codemotion&lt;/a&gt;&#xA;che ha portato a Roma tanti sviluppatori Ruby da Milano, Padova e altre parti&#xA;d&amp;rsquo;Italia — il primo Ruby Social Club &lt;em&gt;ufficiale&lt;/em&gt; a Roma è stato un gran&#xA;successo. Ovviamente, l&amp;rsquo;&lt;em&gt;ufficialità&lt;/em&gt; si misura &lt;strong&gt;solo&lt;/strong&gt; nella quantità di spam&#xA;su Twitter postato a riguardo! :-): i precedenti RSC a Roma &lt;a href=&#34;http://ruby-it.org/pages/Primo&amp;#43;incontro&amp;#43;del&amp;#43;Ruby&amp;#43;Social&amp;#43;Club&amp;#43;a&amp;#43;Roma&#34; target=&#34;_blank&#34;&gt;risalgono al&#xA;2006&lt;/a&gt;&#xA;organizzati dagli attuali membri di &lt;a href=&#34;http://mikamai.com/&#34; target=&#34;_blank&#34;&gt;mikamai&lt;/a&gt; e altri&#xA;meetup promossi da &lt;a href=&#34;http://twitter.com/jeko&#34; target=&#34;_blank&#34;&gt;@jeko&lt;/a&gt; &lt;a href=&#34;https://www.ruby-forum.com/search?query=ruby&amp;#43;social&amp;#43;club&amp;#43;roma&#34; target=&#34;_blank&#34;&gt;nel&#xA;2007&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Quello che conta è che c&amp;rsquo;è una community, c&amp;rsquo;è passione, e c&amp;rsquo;è voglia di&#xA;condividere conoscenza — non importa chi organizza gli incontri, l&amp;rsquo;importante è&#xA;che si facciano :-).&lt;/p&gt;&#xA;&lt;p&gt;L&amp;rsquo;evento è stato semplice e diretto — prima qualche birra, poi la mia&#xA;presentazione su RVM e gli interpreti Ruby, poi quella di Luca che ha annunciato&#xA;il suo progetto &lt;a href=&#34;http://minege.ms/&#34; target=&#34;_blank&#34;&gt;minege.ms&lt;/a&gt; e dopo il &lt;strong&gt;vero&lt;/strong&gt; social&#xA;networking :-). Ho rivisto &lt;a href=&#34;http://twitter.com/gravityblast&#34; target=&#34;_blank&#34;&gt;@gravityblast&lt;/a&gt; dopo&#xA;tanto che non ci vedevamo, ho conosciuto il gruppo&#xA;&lt;a href=&#34;http://programmersinpadua.it/&#34; target=&#34;_blank&#34;&gt;PIP&lt;/a&gt; e ho incontrato&#xA;&lt;a href=&#34;http://twitter.com/svarione&#34; target=&#34;_blank&#34;&gt;@svarione&lt;/a&gt;,&#xA;&lt;a href=&#34;http://twitter.com/punkmanit&#34; target=&#34;_blank&#34;&gt;@punkmanit&lt;/a&gt;,&#xA;&lt;a href=&#34;http://twitter.com/leonardoperna&#34; target=&#34;_blank&#34;&gt;@leonardoperna&lt;/a&gt;,&#xA;&lt;a href=&#34;http://twitter.com/riggasconi&#34; target=&#34;_blank&#34;&gt;@riggasconi&lt;/a&gt;,&#xA;&lt;a href=&#34;http://twitter.com/ogeidix&#34; target=&#34;_blank&#34;&gt;@ogeidix&lt;/a&gt; e altre persone in gamba. Inoltre,&#xA;abbiamo passato del gran bel tempo insieme, mettendo su un weekend davvero&#xA;sgangherato e divertente. Ovviamente, enormi kudos alla macchina di&#xA;&lt;a href=&#34;http://twitter.com/nhaima&#34; target=&#34;_blank&#34;&gt;@nhaima&lt;/a&gt; — che ci ha instancabilmente portato in&#xA;giro per Roma per due giorni :-)&lt;/p&gt;&#xA;&lt;p&gt;Ora, in attesa del prossimo meetup, &lt;strong&gt;grazie&lt;/strong&gt; a tutti quelli che hanno&#xA;partecipato, che mi hanno offerto birre e, ultimo ma non meno importante, grazie&#xA;a &lt;a href=&#34;http://twitter.com/etapeta&#34; target=&#34;_blank&#34;&gt;@etapeta&lt;/a&gt; per avermi portato in tempo&#xA;all&amp;rsquo;incontro — sei il vero eroe :-).&lt;/p&gt;&#xA;&lt;div style=&#34;width:100%; text-align:center;&#34;&gt; &lt;iframe&#xA;src=&#34;https://www.slideshare.net/slideshow/embed_code/key/MjVIa6uAKD9ASk&#34;&#xA;width=&#34;100%&#34; height=&#34;500&#34; frameborder=&#34;0&#34; marginwidth=&#34;0&#34; marginheight=&#34;0&#34;&#xA;scrolling=&#34;no&#34; allowfullscreen&gt;&lt;/iframe&gt; &lt;/div&gt;</description>
    </item>
    <item>
      <title>*BSD su un MacMini 4,1? Neanche per sogno. :-(</title>
      <link>https://sindro.me/it/posts/2011-01-04-bsd-onto-a-macmini-4-1-no-way/</link>
      <pubDate>Tue, 04 Jan 2011 18:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2011-01-04-bsd-onto-a-macmini-4-1-no-way/</guid>
      <description>&lt;img src=&#34;https://sindro.me/posts/2011-01-04-bsd-onto-a-macmini-4-1-no-way/mini-daemon.png&#34; style=&#34;float: right&#34; /&gt;&#xA;&lt;p&gt;Ho passato gli ultimi due giorni a cercare di configurare il Mac Mini in alluminio (rev. 4,1)&#xA;come &lt;span class=&#34;caps&#34;&gt;NAS&lt;/span&gt; server casalingo con storage crittografato, e&#xA;volevo metterci un sistema &lt;span class=&#34;caps&#34;&gt;BSD&lt;/span&gt;. C&#39;è già un&#xA;OpenBSD embedded sul gateway soekris, e un compagno sarebbe stato&#xA;carino. :-)&lt;/p&gt;&#xA;&lt;p&gt;Indovinate un po&#39;, non c&#39;è verso:&lt;/p&gt;&#xA;&lt;ul&gt; &lt;li&gt;FreeBSD 8.1 non completa il processo di boot, a causa di &lt;a&#xA;href=&#34;http://wiki.freebsd.org/AppleMacbook&#34;&gt;un bug nel chipset &lt;span&#xA;class=&#34;caps&#34;&gt;SATA&lt;/span&gt;, &lt;span class=&#34;caps&#34;&gt;NV MCP89&lt;/span&gt;&lt;/a&gt;;&lt;/li&gt;&#xA;&lt;li&gt;FreeBSD 8.2-RC1 fa il boot ma, a causa dello stesso bug, non riconosce nessun&#xA;drive &lt;span class=&#34;caps&#34;&gt;SATA&lt;/span&gt; né nessun dispositivo &lt;span class=&#34;caps&#34;&gt;USB&lt;/span&gt;&#xA;umass;&lt;/li&gt; &lt;li&gt;NetBSD 5.1 fa il boot senza problemi, gestisce i&#xA;dischi &lt;span class=&#34;caps&#34;&gt;SATA&lt;/span&gt; tramite il driver generico pciide (niente &lt;span&#xA;class=&#34;caps&#34;&gt;DMA&lt;/span&gt;, quindi piuttosto lento) ma, sfortunatamente, non gestisce&#xA;il controller ethernet &lt;span class=&#34;caps&#34;&gt;BCM57762&lt;/span&gt;. Ho provato con&#xA;patch veloci e sporche per &lt;a&#xA;href=&#34;http://code.bsd64.org/cvsweb/netbsd/src/sys/dev/pci/if_bge.c&#34;&gt;portare il&#xA;driver bge al livello di -current&lt;/a&gt;, ma niente da fare: il &lt;span&#xA;class=&#34;caps&#34;&gt;MII&lt;/span&gt; link detection funziona, la scheda trasmette ma&#xA;non riceve. Anche il controller sdmmc funziona con -current ma non&#xA;con la 5.1-RELEASE. L&#39;&lt;span class=&#34;caps&#34;&gt;ACPI&lt;/span&gt; funziona correttamente;&lt;/li&gt;&#xA;&lt;li&gt;OpenBSD 4.8 fa il boot, accede ai drive &lt;span class=&#34;caps&#34;&gt;SATA&lt;/span&gt;&#xA;senza &lt;span class=&#34;caps&#34;&gt;DMA&lt;/span&gt;, e riconosce la scheda di rete bge, ma&#xA;mostra lo stesso identico comportamento di NetBSD 5.1 col driver di -current;&lt;/li&gt;&#xA;&lt;li&gt;DragonFlyBSD 2.8.2 non entra nemmeno in kernel mode, sospetto&#xA;a causa di bug &lt;span class=&#34;caps&#34;&gt;ACPI&lt;/span&gt;;&lt;/li&gt; &lt;li&gt;PureDarwin non mi ha&#xA;ispirato granché, a causa dei tanti &lt;a&#xA;href=&#34;http://www.puredarwin.org/blockers&#34;&gt;problemi bloccanti&lt;/a&gt;.&lt;/li&gt; &lt;/ul&gt;&#xA;&lt;p&gt;Tutti supportano lo storage crittografato, ho tirato su un disco &lt;a&#xA;href=&#34;http://netbsd.gw.com/cgi-bin/man-cgi?cgd+4+NetBSD-5.0&#34;&gt;NetBSD &lt;span&#xA;class=&#34;caps&#34;&gt;CGD&lt;/span&gt;&lt;/a&gt; senza problemi su dk wedge; FreeBSD ha gli&#xA;interessanti strumenti &lt;a&#xA;href=&#34;http://www.freebsd.org/doc/handbook/disks-encrypting.html&#34;&gt;gbde(8) e&#xA;geli(8)&lt;/a&gt; basati su GEOM che non ho potuto testare, mentre OpenBSD&#xA;supporta la crittografia tramite una &lt;a&#xA;href=&#34;http://www.openbsd.org/cgi-bin/man.cgi?query=softraid&amp;amp;sektion=4&#34;&gt;personality&#xA;softraid&lt;/a&gt;. Purtroppo, il supporto per l&#39;hardware Apple, ormai esotico, è&#xA;fuori discussione.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Scoprire le culture del mondo tramite l&#39;autocompletamento di Google</title>
      <link>https://sindro.me/it/posts/2010-09-16-learning-about-world-cultures-via-google-autocomplete/</link>
      <pubDate>Thu, 16 Sep 2010 20:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2010-09-16-learning-about-world-cultures-via-google-autocomplete/</guid>
      <description>&lt;p&gt;Per curiosità, stavo guardando come un browser interagisce col backend di Google&#xA;Instant. Mentre osservavo gli scambi HTTP con Firebug, prima mi sono chiesto&#xA;perché codificano HTML e JS con sequenze di escape &lt;code&gt;\xYY&lt;/code&gt;, poi perché le&#xA;stessissime funzioni JS vengono mandate avanti e indietro ad ogni richiesta, e&#xA;poi mi sono imbattuto nel servizio JSONp &lt;code&gt;google.com/s?q=QUERY&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Dagli una query, e ti restituirà le frasi suggerite correlate che vengono usate&#xA;per costruire il menu sotto la barra di ricerca quando usi i suggerimenti e/o&#xA;Instant (non ho scavato troppo in tutti gli altri parametri).&lt;/p&gt;&#xA;&lt;p&gt;Ad ogni modo, la cosa interessante è che, ovviamente, i suggerimenti sono&#xA;personalizzati per paese. Per mostrare le differenze in modo esplicito,&#xA;chiediamo al servizio la query più semplice possibile, &lt;code&gt;a&lt;/code&gt;:&lt;/p&gt;&#xA;&lt;p&gt;Per l&amp;rsquo;Italia otterrai:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ curl http://www.google.it/s?q=a&#xA;window.google.ac.h([&amp;#34;a&amp;#34;,[[&amp;#34;ansa&amp;#34;,&amp;#34;&amp;#34;,&amp;#34;0&amp;#34;],&#xA;[&amp;#34;alice&amp;#34;,&amp;#34;&amp;#34;,&amp;#34;1&amp;#34;],[&amp;#34;alitalia&amp;#34;,&amp;#34;&amp;#34;,&amp;#34;2&amp;#34;],[&amp;#34;alice mail&amp;#34;,&amp;#34;&amp;#34;,&amp;#34;3&amp;#34;],&#xA;[&amp;#34;apple&amp;#34;,&amp;#34;&amp;#34;,&amp;#34;4&amp;#34;],[&amp;#34;agenzia delle entrate&amp;#34;,&amp;#34;&amp;#34;,&amp;#34;5&amp;#34;],&#xA;[&amp;#34;audi&amp;#34;,&amp;#34;&amp;#34;,&amp;#34;6&amp;#34;],[&amp;#34;aci&amp;#34;,&amp;#34;&amp;#34;,&amp;#34;7&amp;#34;],[&amp;#34;autoscout&amp;#34;,&amp;#34;&amp;#34;,&amp;#34;8&amp;#34;],&#xA;[&amp;#34;atm&amp;#34;,&amp;#34;&amp;#34;,&amp;#34;9&amp;#34;]],&amp;#34;&amp;#34;,&amp;#34;&amp;#34;,&amp;#34;&amp;#34;,&amp;#34;&amp;#34;,&amp;#34;&amp;#34;,{}])&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;hmm, togliamo il JSONp e i parametri:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ curl -s http://www.google.it/s?q=a | ruby -rjson -ne &amp;#39;puts JSON($_[19..-2])[1].map(&amp;amp;:first).join(&amp;#34;, &amp;#34;)&amp;#39;            &#xA;ansa, alice, alitalia, alice mail, apple, agenzia delle entrate, audi, aci, autoscout, atm&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Per gli USA otterrai:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;amazon, aol, att, apple, american airlines, abc, ask.com, amtrak, addicting games, aim&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Regno Unito:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;argos, amazon, asda, asos, autotrader, aa route planner, aol, apple, amazon uk, aqa&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Irlanda:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;aer lingus, aib, argos, amazon.co.uk, argos.ie, asos, aa route planner, amazon, aldi, aib internet banking&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Infine, perché ci sono stato di recente ed è stata un&amp;rsquo;esperienza profonda, Cuba:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;asus, antonio maceo, amor, amigos, ain, antivirus, avira, alba, aduana, as&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Sono sicuro che @nhaima sta sorridendo nel vedere queste parole, perché caspita,&#xA;laggiù cercano davvero un sacco software antivirus (avira è uno di quelli)&#xA;perché è un mondo senza Internet, quindi senza software libero: sei condannato&#xA;a usare roba Windows, e hai quello per cui paghi. Antonio Maceo è stato un eroe&#xA;della rivoluzione del XIX secolo, ed è nel cuore del popolo cubano. Amor,&#xA;Amigos! :-)&lt;/p&gt;</description>
    </item>
    <item>
      <title>Gli spin-off di Panmind presentati al Ruby Social Club Milano</title>
      <link>https://sindro.me/it/posts/2010-08-05-panmind-at-ruby-social-club/</link>
      <pubDate>Thu, 05 Aug 2010 16:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2010-08-05-panmind-at-ruby-social-club/</guid>
      <description>&lt;p&gt;Il 22 luglio 2010, &lt;a href=&#34;http://mikamai.com/&#34; target=&#34;_blank&#34;&gt;Mikamai&lt;/a&gt; ha ospitato un &lt;a href=&#34;http://blog.mikamai.com/2010/07/la-notte-del-ruby-social-club/&#34; target=&#34;_blank&#34;&gt;Ruby Social&#xA;Club a Milano&lt;/a&gt;,&#xA;dove circa 50 persone hanno assistito a cinque talk su Ruby, sviluppo web e&#xA;startup. Sono stato contento di essere uno degli speaker, e ho presentato un&#xA;insieme di plugin Rails che &lt;a href=&#34;http://mind2mind.is/&#34; target=&#34;_blank&#34;&gt;noi&lt;/a&gt; abbiamo estratto dal&#xA;nostro ultimo (e più grande) progetto:&#xA;&lt;a href=&#34;http://panmind.org/&#34; target=&#34;_blank&#34;&gt;Panmind&lt;/a&gt; (leggi di più nella &lt;a href=&#34;http://panmind.org/about&#34; target=&#34;_blank&#34;&gt;pagina&#xA;about&lt;/a&gt;), rilasciati come Open Source su&#xA;&lt;a href=&#34;http://github.com/Panmind&#34; target=&#34;_blank&#34;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;La presentazione è divisa in due parti: la prima spiega &lt;strong&gt;perché&lt;/strong&gt; dovresti&#xA;seguire il sano principio di ingegneria del software di scrivere codice modulare&#xA;e a responsabilità separate, e poi &lt;strong&gt;come&lt;/strong&gt; potresti (e dovresti) estrarlo dalla&#xA;tua applicazione Rails disaccoppiando la configurazione e preparando il rilascio&#xA;Open Source, scrivendo documentazione &lt;strong&gt;E&lt;/strong&gt; presentando a un evento Ruby così,&#xA;&lt;strong&gt;si spera, qualcun altro scriverà i test unitari! :-)&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Abbiamo rilasciato un plugin &lt;a href=&#34;http://github.com/panmind/ssl_helper&#34; target=&#34;_blank&#34;&gt;SSL helper&lt;/a&gt;&#xA;che implementa dei filtri (come &lt;code&gt;ssl_requirement&lt;/code&gt; di Rails) ma anche degli&#xA;helper per le named route: basta con &lt;code&gt;&amp;lt;%= url_for :protocol =&amp;gt; &#39;https&#39; %&amp;gt;&lt;/code&gt;!&#xA;Avrai qualcosa come &lt;code&gt;plain_root_url&lt;/code&gt; e &lt;code&gt;ssl_login_url&lt;/code&gt; — come se fossero&#xA;integrati nel framework.&lt;/p&gt;&#xA;&lt;p&gt;Poi, un plugin semplicissimo per &lt;a href=&#34;http://github.com/panmind/bigbro&#34; target=&#34;_blank&#34;&gt;Google&#xA;Analytics&lt;/a&gt;, con supporto &lt;code&gt;&amp;lt;noscript&amp;gt;&lt;/code&gt;, un&#xA;paio di helper per i test e un&#xA;&lt;a href=&#34;http://github.com/Panmind/bigbro/blob/master/js/jquery.analytics.js&#34; target=&#34;_blank&#34;&gt;embrione&lt;/a&gt;&#xA;di framework JS per Analytics — si spera che evolva in un plugin jQuery&#xA;completo. Poi, un&amp;rsquo;interfaccia&#xA;&lt;a href=&#34;http://github.com/Panmind/recaptcha&#34; target=&#34;_blank&#34;&gt;ReCaptcha&lt;/a&gt;, con supporto alla validazione&#xA;AJAX, e infine un&amp;rsquo;interfaccia &lt;a href=&#34;http://github.com/Panmind/zendesk&#34; target=&#34;_blank&#34;&gt;Zendesk&lt;/a&gt;&#xA;per Rails.&lt;/p&gt;&#xA;&lt;p&gt;Abbiamo rilasciato anche altro codice sull&amp;rsquo;&lt;a href=&#34;http://github.com/Panmind&#34; target=&#34;_blank&#34;&gt;account GitHub di&#xA;Panmind&lt;/a&gt;, incluso il bel &lt;a href=&#34;http://github.com/Panmind/jquery-ajax-nav&#34; target=&#34;_blank&#34;&gt;AJAX Navigation&#xA;Framework&lt;/a&gt; che implementa tutto il&#xA;codice boilerplate per la navigazione AJAX ultra-veloce dei&#xA;&lt;a href=&#34;http://panmind.org/search&#34; target=&#34;_blank&#34;&gt;contenuti&lt;/a&gt; e dei&#xA;&lt;a href=&#34;http://panmind.org/tour/collaborate&#34; target=&#34;_blank&#34;&gt;progetti&lt;/a&gt; di Panmind.&lt;/p&gt;&#xA;&lt;p&gt;La presentazione segue: puoi scaricarla in PDF (nessun &lt;a href=&#34;https://sindro.me/posts/2010-08-04-on-the-iphone-pdf-and-kernel-exploit&#34;&gt;exploit, lo&#xA;giuro!&lt;/a&gt;) &lt;a href=&#34;https://sindro.me/posts/2010-08-05-panmind-at-ruby-social-club/Panmind_at_Ruby_Social_Club_Milano.pdf&#34;&gt;da questo&#xA;link&lt;/a&gt;&#xA;o visualizzarla/commentarla su Slideshare&#xA;&lt;a href=&#34;http://www.slideshare.net/panmind/panmind-open-source-releases-presented&#34; target=&#34;_blank&#34;&gt;qui&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <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>Rails3: Better, Faster, Stronger</title>
      <link>https://sindro.me/it/posts/2009-06-04-rails3-better-faster-stronger/</link>
      <pubDate>Thu, 04 Jun 2009 00:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2009-06-04-rails3-better-faster-stronger/</guid>
      <description>&lt;div style=&#34;float:left; margin:5px 10px 0 0;&#34;&gt;&lt;img style=&#34;display:inline-block&#34;&#xA;src=&#34;https://sindro.me/posts/2009-06-04-rails3-better-faster-stronger/rails3-harder-better-faster-stronger.png&#34;&#xA;/&gt;&lt;/div&gt;&#xA;&lt;p&gt;Per chi capisce l&#39;italiano (e se stai leggendo questa versione, direi di sì), ho appena &lt;a&#xA;href=&#34;http://therubymine.com/2009/06/04/rails3-better-faster-stronger/&#34;&gt;pubblicato&#xA;un articolo&lt;/a&gt; su &lt;a href=&#34;http://therubymine.com/&#34;&gt;therubymine.com&lt;/a&gt; sulla&#xA;prossima release del framework &lt;a href=&#34;http://rubyonrails.com/&#34;&gt;Ruby on Rails&lt;/a&gt;,&#xA;la versione 3.0: la grande novità è la fusione con un altro web framework Ruby, &lt;a&#xA;href=&#34;http://merbivore.com/&#34;&gt;merb&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Buona lettura! :-)&lt;/p&gt;&#xA;&lt;p&gt;&lt;big&gt;&lt;a href=&#34;http://web.archive.org/web/20100125191434/http://therubymine.com/2009/06/04/rails3-better-faster-stronger/&#34;&gt;http://therubymine.com/2009/06/04/rails3-better-faster-stronger/&lt;/a&gt;&lt;/big&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Il modo migliore per iniziare una nuova giornata</title>
      <link>https://sindro.me/it/posts/2009-05-26-the-best-way-to-begin-a-new-day/</link>
      <pubDate>Tue, 26 May 2009 10:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2009-05-26-the-best-way-to-begin-a-new-day/</guid>
      <description>&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;XFS internal error XFS_WANT_CORRUPTED_RETURN at line 295 of file fs/xfs/xfs_alloc.c.  Caller 0xc018066c&#xA; [&amp;lt;c017fed0&amp;gt;] xfs_alloc_fixup_trees+0x1b0/0x2e0&#xA; [&amp;lt;c018066c&amp;gt;] xfs_alloc_ag_vextent_near+0x31c/0x9c0&#xA; [&amp;lt;c018066c&amp;gt;] xfs_alloc_ag_vextent_near+0x31c/0x9c0&#xA; [&amp;lt;c0180187&amp;gt;] xfs_alloc_ag_vextent+0xf7/0x100&#xA; [&amp;lt;c01824fe&amp;gt;] xfs_alloc_vextent+0x35e/0x420&#xA; [&amp;lt;c019015d&amp;gt;] xfs_bmap_alloc+0x80d/0x12b0&#xA; [&amp;lt;c0111254&amp;gt;] try_to_wake_up+0xa4/0xc0&#xA; [&amp;lt;c02cf248&amp;gt;] schedule+0x308/0x5c0&#xA; [&amp;lt;c01939c4&amp;gt;] xfs_bmapi+0x514/0x1470&#xA; [&amp;lt;c0130069&amp;gt;] find_lock_page+0x29/0xe0&#xA; [&amp;lt;c013013c&amp;gt;] find_or_create_page+0x1c/0xb0&#xA; [&amp;lt;c01d9116&amp;gt;] kmem_zone_zalloc+0x26/0x50&#xA; [&amp;lt;c01a2296&amp;gt;] xfs_dir2_grow_inode+0xf6/0x3c0&#xA; [&amp;lt;c01b57a6&amp;gt;] xfs_iget_core+0x326/0x5a0&#xA; [&amp;lt;c0163315&amp;gt;] alloc_inode+0xd5/0x170&#xA; [&amp;lt;c01b978b&amp;gt;] xfs_idata_realloc+0x3b/0x160&#xA; [&amp;lt;c01a3e2d&amp;gt;] xfs_dir2_sf_to_block+0xad/0x680&#xA; [&amp;lt;c0137882&amp;gt;] cache_grow+0xe2/0x150&#xA; [&amp;lt;c01aa27b&amp;gt;] xfs_dir2_sf_addname+0x9b/0x110&#xA; [&amp;lt;c01a1c51&amp;gt;] xfs_dir2_createname+0x131/0x140&#xA; [&amp;lt;c01d9116&amp;gt;] kmem_zone_zalloc+0x26/0x50&#xA; [&amp;lt;c01cebcb&amp;gt;] xfs_trans_ijoin+0x2b/0x80&#xA; [&amp;lt;c01d4967&amp;gt;] xfs_create+0x407/0x6c0&#xA; [&amp;lt;c017e766&amp;gt;] xfs_acl_vhasacl_default+0x36/0x50&#xA; [&amp;lt;c01df8f4&amp;gt;] linvfs_mknod+0x2c4/0x390&#xA; [&amp;lt;c01a1d62&amp;gt;] xfs_dir2_lookup+0x102/0x110&#xA; [&amp;lt;c01228b8&amp;gt;] in_group_p+0x38/0x70&#xA; [&amp;lt;c01ba9a6&amp;gt;] xfs_iaccess+0xc6/0x1a0&#xA; [&amp;lt;c0157cb7&amp;gt;] permission+0x97/0xd0&#xA; [&amp;lt;c0158f94&amp;gt;] __link_path_walk+0xda4/0xe90&#xA; [&amp;lt;c0157cb7&amp;gt;] permission+0x97/0xd0&#xA; [&amp;lt;c015984c&amp;gt;] vfs_create+0x9c/0x120&#xA; [&amp;lt;c015a00b&amp;gt;] open_namei+0x58b/0x5e0&#xA; [&amp;lt;c014aa9d&amp;gt;] filp_open+0x2d/0x50&#xA; [&amp;lt;c014ac70&amp;gt;] get_unused_fd+0x50/0xc0&#xA; [&amp;lt;c0157ae7&amp;gt;] getname+0x67/0xb0&#xA; [&amp;lt;c014ad9c&amp;gt;] sys_open+0x3c/0x80&#xA; [&amp;lt;c0102867&amp;gt;] sysenter_past_esp+0x54/0x75&#xA;&#xA;xfs_force_shutdown(hda8,0x8) called from line 1091 of file fs/xfs/xfs_trans.c.  Return address = 0xc01e2c5c&#xA;Filesystem &amp;#34;hda8&amp;#34;: Corruption of in-memory data detected.  Shutting down filesystem: hda8&#xA;Please umount the filesystem, and rectify the problem(s)&#xA;xfs_force_shutdown(hda8,0x1) called from line 353 of file fs/xfs/xfs_rw.c.  Return address = 0xc01e2c5c&#xA;printk: 12 messages suppressed.&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Gia&amp;rsquo;, farei l&amp;rsquo;umount di &lt;code&gt;/var&lt;/code&gt;, se questa macchina non facesse da &lt;code&gt;act_as_router&lt;/code&gt; e non avesse &lt;code&gt;pppd&lt;/code&gt; che non molla il lock su &lt;code&gt;/var/run/pppd2.tdb&lt;/code&gt;&amp;hellip;&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;pppd   222 root  mem   REG    3,8    88080525 /var/run/pppd2.tdb (path dev=0,0 inode=34)&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ovviamente &lt;code&gt;kill 222 ; pppd call dsl-provider&lt;/code&gt; non funziona. &lt;strong&gt;BLEAH&lt;/strong&gt;. Mettiamoci un router davanti&amp;hellip; configura, port forward, e si ricomincia&amp;hellip; poi &lt;code&gt;fdisk /dev/hdc&lt;/code&gt; per ricreare la struttura delle partizioni sul nuovo hard disk, &lt;code&gt;mkfs.xfs&lt;/code&gt; su tutte le nuove partizioni, &lt;code&gt;mount /dev/hdcX /target&lt;/code&gt;, &lt;code&gt;pax -r -w -p e /{bin,boot,dev,etc,home,initrd,lib,media,root,sbin,srv,tmp,usr,var} /target&lt;/code&gt;&amp;hellip; aspetta un sacco per la copia perche&amp;rsquo; ci sono settori danneggiati sul disco sorgente, &lt;code&gt;chroot /target&lt;/code&gt;, &lt;code&gt;vi /etc/lilo.conf&lt;/code&gt; e sostituisci &lt;code&gt;boot=/dev/hda&lt;/code&gt; con &lt;code&gt;boot=/dev/hdc&lt;/code&gt;, lancia &lt;code&gt;lilo -v&lt;/code&gt; mentre sei nel chroot, verifica &lt;code&gt;/etc/fstab&lt;/code&gt;, e finalmente &lt;code&gt;shutdown&lt;/code&gt; per rimuovere il disco guasto e riavviare&amp;hellip; ripristinando &lt;code&gt;lilo.conf&lt;/code&gt;. evvai!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Facebook Developer Garage 2009, Milano (Italia)</title>
      <link>https://sindro.me/it/posts/2009-04-26-facebook-developers-garage-2009-milan-italy/</link>
      <pubDate>Sun, 26 Apr 2009 23:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2009-04-26-facebook-developers-garage-2009-milan-italy/</guid>
      <description>&lt;div style=&#34;float:left; margin:8px 10px 4px 0;&#34;&gt;&lt;img src=&#34;https://sindro.me/posts/2009-04-26-facebook-developers-garage-2009-milan-italy/logofb.jpg&#34;/&gt;&lt;/div&gt;&#xA;&lt;p&gt;Questo e&#39; il mio resoconto del primo &lt;a&#xA;href=&#34;http://fb.mikamai.com/programma/&#34;&gt;facebook developer garage&#xA;italiano&lt;/a&gt;, tenutosi a Milano il &lt;a&#xA;href=&#34;http://www.facebook.com/event.php?eid=70473476888&#34;&gt;23 aprile 2009&lt;/a&gt;,&#xA;e ospitato da &lt;a href=&#34;http://mikamai.com/&#34;&gt;mikamai&lt;/a&gt;. La mattina e&#39; stata&#xA;dedicata alle sessioni per sviluppatori, il pomeriggio a quelle di marketing&#xA;&amp;#38; comunicazione. Alcuni video dell&#39;evento sono disponibili &lt;a&#xA;href=&#34;http://qik.com/istintoweb&#34;&gt;qui&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h1&gt;Mattina: sessione sviluppatori&lt;/h1&gt;&#xA;&lt;p&gt;Il primo talk e&#39; stato tenuto da &lt;a&#xA;href=&#34;http://www.facebook.com/people/James-Leszczenski/4800348&#34;&gt;James&#xA;Leszczenski&lt;/a&gt;, ingegnere di Facebook, che ha presentato la visione, la&#xA;missione e i valori della &lt;a&#xA;href=&#34;http://developers.facebook.com/connect.php&#34;&gt;piattaforma connect&lt;/a&gt;.&#xA;Interessante, oltre al talk in se&#39;, per la partecipazione del pubblico: la&#xA;platea era profondamente interessata a sapere &lt;a&#xA;href=&#34;http://wiki.developers.facebook.com/index.php/Authenticating_Users_with_Facebook_Connect&#34;&gt;quali&#xA;informazioni si ottengono&lt;/a&gt; da Facebook, &lt;a&#xA;href=&#34;http://wiki.developers.facebook.com/index.php/Facebook_Connect_Policies&#34;&gt;come&#xA;gestirle&lt;/a&gt;, e quali strumenti connect fornisce per &lt;a&#xA;href=&#34;http://wiki.developers.facebook.com/index.php/Linking_Accounts_and_Finding_Friends&#34;&gt;collegare&#xA;identita&#39; e trovare amici&lt;/a&gt; su un sito web abilitato.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a name=&#34;continue&#34;&gt;&lt;/a&gt; Piu&#39; tardi ho avuto occasione di chiedere a &lt;a&#xA;href=&#34;http://www.facebook.com/people/James-Leszczenski/4800348&#34;&gt;James&lt;/a&gt; se&#xA;FB fosse incline o meno ad adottare &lt;a href=&#34;http://openid.net/&#34;&gt;OpenID&lt;/a&gt;&#xA;come metodo di autenticazione: ha detto che connect e OpenID permettono&#xA;entrambi agli utenti di avere credenziali di login uniche per accedere a piu&#39;&#xA;siti, ma connect permette anche di sfruttare la potenza del social graph di&#xA;Facebook per consentire agli utenti di comunicare e condividere informazioni.&#xA;Quindi, la risposta breve e&#39; &amp;#8220;no&amp;#8221;. Allora gli ho proposto di&#xA;implementare OpenID su FB stesso, cosi&#39; che connect potesse diventare davvero&#xA;un superset di OpenID, ma ha risposto che &amp;#8220;come azienda, queste sono&#xA;decisioni difficili e non posso dare una risposta adesso&amp;#8221;. Comprensibile&#xA;:).&lt;/p&gt;&#xA;&lt;blockquote&gt; &lt;strong&gt;&lt;span class=&#34;caps&#34;&gt;AGGIORNAMENTO&lt;/span&gt;&lt;/strong&gt;: il 27&#xA;aprile 2009, TechCrunch riporta di &lt;em&gt;aver sentito&lt;/em&gt; che Facebook &lt;a&#xA;href=&#34;http://www.techcrunch.com/2009/04/27/facebook-first-big-site-to-really-embrace-openid/&#34;&gt;abbraccera&#39;&#xA;OpenID&lt;/a&gt; come mezzo per autenticare gli utenti. Ottime notizie, in attesa di&#xA;una dichiarazione ufficiale da Facebook! :) &lt;/blockquote&gt;&#xA;&lt;p&gt;Il secondo talk e&#39; stato tenuto da &lt;a href=&#34;http://acinapura.com/&#34;&gt;Vincenzo&#xA;Acinapura&lt;/a&gt;, che ha descritto gli strumenti di base per creare&#xA;un&#39;applicazione sulla piattaforma Facebook. Ha esplorato le tecnologie che ci&#xA;stanno dietro (&lt;a&#xA;href=&#34;http://wiki.developers.facebook.com/index.php/XFBML&#34;&gt;&lt;span&#xA;class=&#34;caps&#34;&gt;XFBML&lt;/span&gt;&lt;/a&gt;, &lt;a&#xA;href=&#34;http://wiki.developers.facebook.com/index.php/FQL&#34;&gt;&lt;span&#xA;class=&#34;caps&#34;&gt;FQL&lt;/span&gt;&lt;/a&gt;, &lt;a&#xA;href=&#34;http://wiki.developers.facebook.com/index.php/FBJS&#34;&gt;&lt;span&#xA;class=&#34;caps&#34;&gt;FBJS&lt;/span&gt;&lt;/a&gt;), i principali &lt;a&#xA;href=&#34;http://wiki.developers.facebook.com/index.php/Anatomy_of_a_Facebook_App&#34;&gt;punti&#xA;di integrazione&lt;/a&gt; all&#39;interno della piattaforma (notifiche, publisher, ...) e&#xA;ha mostrato codice d&#39;esempio per implementare alcuni dei tag &lt;span&#xA;class=&#34;caps&#34;&gt;FBML&lt;/span&gt; piu&#39; usati (&lt;code&gt;fb:comments&lt;/code&gt;,&#xA;&lt;code&gt;fb:share&lt;/code&gt;, &lt;code&gt;fb:feed&lt;/code&gt;, &lt;a&#xA;href=&#34;http://wiki.developers.facebook.com/wiki/FBML&#34;&gt;e cosi&#39; via&lt;/a&gt;).&#xA;Infine ha ricordato l&#39;importanza di automatizzare il deploy delle applicazioni,&#xA;e ha suggerito di usare &lt;a href=&#34;http://www.capify.org/&#34;&gt;capistrano&lt;/a&gt; per&#xA;farlo.&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>Il bordo lampeggiante offuscato</title>
      <link>https://sindro.me/it/posts/2009-02-20-the-blinking-border/</link>
      <pubDate>Fri, 20 Feb 2009 04:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2009-02-20-the-blinking-border/</guid>
      <description>&lt;p&gt;Questo e&amp;rsquo; il pezzo di codice Javascript offuscato che implementa il bordo rosso&#xA;e carica &lt;a href=&#34;https://www.google.com/analytics&#34; target=&#34;_blank&#34;&gt;Google Analytics&lt;/a&gt; sul &lt;a href=&#34;https://segmentation-fault.core-dumped.info/&#34; target=&#34;_blank&#34;&gt;sito&#xA;Segmentation Fault&lt;/a&gt;:&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:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;theLoadSequenceToRunAfterTheDocumentHasBeenLoaded&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;&#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 blinking border&#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:#66d9ef&#34;&gt;function&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;t&lt;/span&gt;){&lt;span style=&#34;color:#75715e&#34;&gt;// (C) 2009 vjt &amp;lt;segmentation-fault@core-dumped.info&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:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;$&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;_&lt;/span&gt;){&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt;(document.&lt;span style=&#34;color:#a6e22e&#34;&gt;getElementById&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#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;ee&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:#a6e22e&#34;&gt;$&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;n&amp;#39;&lt;/span&gt;),&lt;span style=&#34;color:#a6e22e&#34;&gt;$&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;s&amp;#39;&lt;/span&gt;),&lt;span style=&#34;color:#a6e22e&#34;&gt;$&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;w&amp;#39;&lt;/span&gt;),&lt;span style=&#34;color:#a6e22e&#34;&gt;$&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;e&amp;#39;&lt;/span&gt;)],&lt;span style=&#34;color:#a6e22e&#34;&gt;e&lt;/span&gt;,&lt;span style=&#34;color:#a6e22e&#34;&gt;_&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;;&lt;span style=&#34;color:#a6e22e&#34;&gt;setInterval&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt;(){&lt;span style=&#34;color:#66d9ef&#34;&gt;for&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;i&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;ee&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;length&lt;/span&gt;;&lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;e&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;ee&lt;/span&gt;[&lt;span style=&#34;color:#f92672&#34;&gt;--&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;]) ;&lt;span style=&#34;color:#a6e22e&#34;&gt;_&lt;/span&gt;) {&lt;span style=&#34;color:#a6e22e&#34;&gt;e&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;className&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;e&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;className&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&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:#e6db74&#34;&gt;&amp;#39;b&amp;#39;&lt;/span&gt;;}},&lt;span style=&#34;color:#a6e22e&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;08&lt;/span&gt;); &lt;span style=&#34;color:#75715e&#34;&gt;/* .oOo.oOo.oOo. ^^^^^ -*** * *** *** *******- **/&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:#ae81ff&#34;&gt;4&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;15&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;16&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;23&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;42&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; Math.&lt;span style=&#34;color:#a6e22e&#34;&gt;PI&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt; Math.&lt;span style=&#34;color:#a6e22e&#34;&gt;E&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;42&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;/*166.81*/&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;// Google analytics&#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:#66d9ef&#34;&gt;try&lt;/span&gt;{&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;pt&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_gat&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;_getTracker&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;UA-1123581-3&amp;#34;&lt;/span&gt;); &lt;span style=&#34;color:#a6e22e&#34;&gt;pt&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;_trackPageview&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;catch&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;$aMarvellousErrorThatWontBeDisplayedOnTheUserBrowserAtAll&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;// end of theLoadSequenceToRunAfterTheDocumentHasBeenLoaded routine&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Per me sembra una melodia contorta, o una poesia complicata. E&amp;rsquo; ingegneria&#xA;malvagia, lo so. Ma mentre lo scrivevo, provavo esattamente la stessa&#xA;sensazione di quando scrivevo versi in rima. Le parole di&#xA;&lt;a href=&#34;http://whytheluckystiff.net/&#34; target=&#34;_blank&#34;&gt;_why&lt;/a&gt; sono assolutamente pertinenti qui:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;finche&amp;rsquo; i programmatori non smetteranno di comportarsi come se l&amp;rsquo;offuscamento&#xA;fosse moralmente pericoloso, non saranno artisti, solo ragazzini che non&#xA;vogliono che il loro cibo si tocchi.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;Puoi vedere il codice con l&amp;rsquo;evidenziazione della sintassi su&#xA;&lt;a href=&#34;https://gist.github.com/vjt/67277&#34; target=&#34;_blank&#34;&gt;github&lt;/a&gt;, oppure con la funzione &amp;ldquo;Visualizza&#xA;sorgente&amp;rdquo; del tuo browser mentre sei sul &lt;a href=&#34;https://segmentation-fault.core-dumped.info/&#34; target=&#34;_blank&#34;&gt;sito&#xA;segfault&lt;/a&gt;. :)&lt;/p&gt;</description>
    </item>
    <item>
      <title>Come creare un mirror statico del sito opensource.org</title>
      <link>https://sindro.me/it/posts/2009-02-10-how-to-mirror-a-static-copy-of-the-opensource-org-website/</link>
      <pubDate>Tue, 10 Feb 2009 18:08:34 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2009-02-10-how-to-mirror-a-static-copy-of-the-opensource-org-website/</guid>
      <description>&lt;p&gt;Attualmente mantengo il &lt;a href=&#34;http://opensource.antifork.org/&#34; target=&#34;_blank&#34;&gt;mirror italiano&lt;/a&gt; del&#xA;sito web della &lt;a href=&#34;http://opensource.org/&#34; target=&#34;_blank&#34;&gt;Open Source Initiative&lt;/a&gt;, e oggi mi sono&#xA;reso conto che lo script che avevo scritto qualche mese fa non stava facendo&#xA;bene il suo lavoro&amp;hellip; perche&amp;rsquo; i file CSS non venivano scaricati affatto,&#xA;causando un rendering del sito piuttosto sgradevole.&lt;/p&gt;&#xA;&lt;p&gt;Per fare il mirror di opensource.org sto usando il caro vecchio &lt;a href=&#34;http://www.gnu.org/software/wget/&#34; target=&#34;_blank&#34;&gt;GNU&#xA;Wget&lt;/a&gt; con -r &amp;ndash;mirror e compagnia bella.&#xA;Mentre il buon vecchio &lt;strong&gt;wget&lt;/strong&gt; scarica tutti i prerequisiti di ogni pagina&#xA;definiti nel sorgente HTML, non supporta le regole CSS @import e non scarica le&#xA;immagini referenziate nei CSS con le regole url().&lt;/p&gt;&#xA;&lt;p&gt;Comunque, niente che non si possa risolvere con un po&amp;rsquo; di regex-fu: ecco&#xA;perche&amp;rsquo; &lt;a href=&#34;http://gist.github.com/61474&#34; target=&#34;_blank&#34;&gt;condivido lo script&lt;/a&gt; che sto usando&#xA;attualmente per fare il mirror del sito opensource.org, sperando che generi un&#xA;nuovo mirror o qualche spunto su come fare meglio questo lavoro :).&lt;/p&gt;&#xA;&lt;p&gt;Lo script: &lt;a href=&#34;http://gist.github.com/61474&#34; target=&#34;_blank&#34;&gt;&lt;code&gt;update_opensource_mirror.sh&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Buon divertimento! :)&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>
    <item>
      <title>Far funzionare davvero(tm) il CCacheServer Kerberos Ticket su OSX</title>
      <link>https://sindro.me/it/posts/2008-11-12-making-the-ccacheserver-kerberos-ticket-server-actually-work-tm-on-osx/</link>
      <pubDate>Wed, 12 Nov 2008 21:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2008-11-12-making-the-ccacheserver-kerberos-ticket-server-actually-work-tm-on-osx/</guid>
      <description>&lt;p&gt;Se ti stai chiedendo &lt;strong&gt;perché&lt;/strong&gt; il demone &lt;code&gt;CCacheServer&lt;/code&gt;, che tiene in memoria&#xA;i ticket Kerberos ottenuti tramite &lt;code&gt;kinit(1)&lt;/code&gt;, NON parte&amp;hellip; è a causa di un&#xA;bug &lt;strong&gt;strano&lt;/strong&gt; riguardante il &lt;code&gt;LimitLoadToSessionType&lt;/code&gt; specificato nel .plist&#xA;dell&amp;rsquo;agent, che si trova in&#xA;&lt;code&gt;/System/Library/LaunchAgents/edu.mit.kerberos.CCacheServer.plist&lt;/code&gt; sui sistemi&#xA;OSX 10.5.&lt;/p&gt;&#xA;&lt;p&gt;Devi semplicemente commentare queste due righe:&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-plaintext&#34; data-lang=&#34;plaintext&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;key&amp;gt;LimitLoadToSessionType&amp;lt;/key&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;string&amp;gt;Background&amp;lt;/string&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;E poi o fai&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;launchctl load /System/Library/LaunchAgents/edu.mit.kerberos.CCacheServer.plist&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;oppure riavvii il sistema ;).&lt;/p&gt;&#xA;&lt;p&gt;CCacheServer verrà poi istanziato quando fai un kinit:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ kinit&#xA;Please enter the password for vjt@DOMAIN.LOCAL:&#xA;&#xA;$ klist&#xA;Kerberos 5 ticket cache: &amp;#39;API:Initial default ccache&amp;#39;&#xA;Default principal: vjt@DOMAIN.LOCAL&#xA;&#xA;Valid Starting     Expires            Service Principal&#xA;11/12/08 20:59:35  11/13/08 06:59:14  krbtgt/DOMAIN.LOCAL@DOMAIN.LOCAL&#xA;    renew until 11/19/08 20:59:35&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Il bug è strano perché la chiave &lt;code&gt;LimitLoadToSessionType&lt;/code&gt; dovrebbe in realtà&#xA;istruire launchd ad avviare automaticamente il demone e farlo girare una volta&#xA;per &lt;a href=&#34;http://developer.apple.com/technotes/tn2005/tn2083.html#TABLAUNCHAGENTSUBTYPES&#34; target=&#34;_blank&#34;&gt;ogni utente&#xA;loggato&lt;/a&gt;,&#xA;quando kinit ne richiede i servizi. Ma se la chiave è impostata nel &lt;code&gt;.plist&lt;/code&gt;,&#xA;un launchctl load su di esso fallisce con &amp;ldquo;nothing found to load&amp;rdquo;. Assurdo!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Inviare i messaggi di commit git a Lighthouse in batch</title>
      <link>https://sindro.me/it/posts/2008-10-22-pushing-git-commit-messages-to-lighthouse-in-a-batch/</link>
      <pubDate>Wed, 22 Oct 2008 15:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2008-10-22-pushing-git-commit-messages-to-lighthouse-in-a-batch/</guid>
      <description>&lt;p&gt;Se usi l&amp;rsquo;integrazione con Lighthouse fornita da GitHub, dalle pagine &amp;ldquo;Admin&amp;rdquo;&#xA;del tuo repository git, potresti esserti imbattuto in un difetto: ogni&#xA;changeset su Lighthouse appare come se fosse stato fatto dall&amp;rsquo;utente Lighthouse&#xA;che ha configurato l&amp;rsquo;integrazione su GitHub.&lt;/p&gt;&#xA;&lt;p&gt;Questo succede perché Lighthouse usa il token API per collegare gli autori dei&#xA;changeset agli utenti LH, e non va bene quando non sei l&amp;rsquo;unico a fare commit :-).&lt;/p&gt;&#xA;&lt;p&gt;Una soluzione semplice è usare un hook post-commit, come descritto&#xA;&lt;a href=&#34;http://github.com/guides/integrating-git-commit-messages-in-lighthouse&#34; target=&#34;_blank&#34;&gt;qui&lt;/a&gt;,&#xA;ma non è soddisfacente perché significa che ogni volta che esegui git commit&#xA;dalla tua console, il messaggio del commit diventa pubblico, e se fai&#xA;&lt;code&gt;--amend&lt;/code&gt; o &lt;code&gt;reset --soft&lt;/code&gt; dell&amp;rsquo;index dovrai andare su Lighthouse a cancellare&#xA;il changeset.&lt;/p&gt;&#xA;&lt;p&gt;Una soluzione molto più furba è pushare tutte le revisioni modificate quando&#xA;le si pusha su GitHub: ho &lt;a href=&#34;http://gist.github.com/53917&#34; target=&#34;_blank&#34;&gt;modificato l&amp;rsquo;hook post-commit&#xA;originale&lt;/a&gt; e l&amp;rsquo;ho installato accanto al comando&#xA;&lt;code&gt;git&lt;/code&gt; in &lt;code&gt;$(dirname which git)/git-lh&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Questo mi dà un nuovo comando &lt;code&gt;git lh&lt;/code&gt; che recupera la revisione HEAD corrente&#xA;da GitHub usando &lt;code&gt;refs/heads/master&lt;/code&gt; e fa POST di ogni changeset tra quella&#xA;revisione e il tip corrente nel working tree verso Lighthouse.&lt;/p&gt;&#xA;&lt;p&gt;Quindi, se esegui &lt;code&gt;git lh&lt;/code&gt; prima di &lt;code&gt;git push&lt;/code&gt;, ogni modifica che stai&#xA;pushando su GitHub andrà anche su Lighthouse.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;AGGIORNAMENTO&lt;/strong&gt;: Un semplice script bash tipo:&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#!/bin/bash&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git lh &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; git push&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;salvato come &lt;code&gt;git-lh-push&lt;/code&gt; ti risparmia di digitare due comandi quando vuoi fare push :).&lt;/p&gt;&#xA;&lt;p&gt;Buon divertimento!&lt;/p&gt;&#xA;&lt;p&gt;Riferimenti:&lt;/p&gt;&#xA;&lt;p&gt;lo &lt;a href=&#34;http://gist.github.com/53917&#34; target=&#34;_blank&#34;&gt;script git-lh su GitHub&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Rimuovere un link trigger di lightwindow dopo una chiamata AJAX</title>
      <link>https://sindro.me/it/posts/2008-05-21-remove-a-lightwindow-trigger-link-after-an-ajax-call/</link>
      <pubDate>Wed, 21 May 2008 17:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2008-05-21-remove-a-lightwindow-trigger-link-after-an-ajax-call/</guid>
      <description>&lt;p&gt;Ecco, questo è il risultato di 2 giorni di testate contro il muro con lightwindow:&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;Index: public/javascripts/lightwindow.js, line 444&lt;/code&gt;&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:#a6e22e&#34;&gt;_removeLink&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;removed&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;// remove it from the links array&#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:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;links&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;links&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;reject&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;link&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;link&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;removed&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;href&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;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&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;// remove it from the gallery links array&#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:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;gallery&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;_getGalleryInfo&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;removed&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;rel&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;klass&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;gallery&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;name&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;gallery&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;      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;galleries&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;klass&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;galleries&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;klass&lt;/span&gt;][&lt;span style=&#34;color:#a6e22e&#34;&gt;name&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;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;galleries&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;klass&lt;/span&gt;][&lt;span style=&#34;color:#a6e22e&#34;&gt;name&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;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;galleries&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;klass&lt;/span&gt;][&lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt;].&lt;span style=&#34;color:#a6e22e&#34;&gt;reject&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;link&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;link&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;removed&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;href&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;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&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;  },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Chiama questa funzione dal tuo template .rjs, qualcosa tipo:&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-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;page &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;myLightWindow._removeLink($(&amp;#39;element&amp;#39;).down(&amp;#39;a.lightwindow&amp;#39;));&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Più dettagli a seguire, quando questo lavoro sarà completo ;).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Odissea 10.5.2: un piccolo viaggio tra i servizi e componenti di Mac OS X</title>
      <link>https://sindro.me/it/posts/2008-02-15-10-5-2-odissey-a-small-journey-in-mac-os-x-services-and-components/</link>
      <pubDate>Fri, 15 Feb 2008 00:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2008-02-15-10-5-2-odissey-a-small-journey-in-mac-os-x-services-and-components/</guid>
      <description>&lt;p&gt;Beh, sono davvero contento di OSX 10.5.2. Anche se non sono uno di quelli che&#xA;ha insultato Apple per la barra dei menu traslucida che a tutti fa schifo&amp;hellip;&#xA;anzi, a me piace. Non mi interessa il tool di TM nella barra dei menu, perché&#xA;non ho (ancora) comprato la fighissima Time Capsule, mi piace lo spinner nel&#xA;menu Airport e, soprattutto, apprezzo molto gli aggiornamenti al&#xA;&lt;code&gt;BluetoothSCOAudioDriver.kext&lt;/code&gt; che pilota il mio auricolare bluetooth.&lt;/p&gt;&#xA;&lt;p&gt;Spotlight sembra anche più veloce ad ogni aggiornamento, e sono un utente&#xA;pesante di Spotlight, quindi questo mi rende davvero felice. Grazie ingegneri&#xA;Apple!&lt;/p&gt;&#xA;&lt;p&gt;Ma torniamo al tema: perché odissea? Perché seguendo i &lt;a href=&#34;https://sindro.me/posts/2008-01-31-how-to-keep-your-apple-notebook-battery-healthy/&#34;&gt;miei consigli sulla&#xA;batteria&lt;/a&gt;,&#xA;sono riuscito a far SPEGNERE il mio MacBook2,1 mentre era al 74% della fase&#xA;&amp;ldquo;Scrittura file&amp;rdquo; del combo update&amp;hellip; risultato: un sistema completamente&#xA;distrutto, come ogni geek potrebbe immaginare :). Apple aveva aggiornato&#xA;alcune librerie, e al riavvio semplicemente niente funzionava, e la console&#xA;Darwin era piena di &lt;strong&gt;tonnellate&lt;/strong&gt; di messaggi di errore.&lt;/p&gt;&#xA;&lt;p&gt;Il tipico fanb^Wutente Apple avrebbe semplicemente archiviato e reinstallato&#xA;il sistema, ma ehi, io sono un geek orgoglioso! So per esperienza che le&#xA;situazioni di disaster recovery sono le migliori per imparare qualcosa su un&#xA;sistema operativo, perché devi aiutare il sistema ad avviarsi, tirando su i&#xA;servizi a mano, e trovare un modo per riapplicare il combo update senza usare&#xA;la comoda interfaccia Aqua.&lt;/p&gt;&#xA;&lt;p&gt;Per fortuna, su OSX ogni GUI ha la sua controparte CLI, seguendo le migliori&#xA;&amp;ldquo;linee guida UNIX&amp;rdquo; di separazione degli interessi e architettura ben&#xA;progettata. Inoltre, OSX porta questo approccio un passo avanti, seguendo i&#xA;migliori principi di ingegneria del software, dove le funzionalità sono&#xA;implementate nei Framework e sia la GUI che la CLI le utilizzano. Ben fatto!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Come mantenere in salute la batteria del tuo notebook Apple</title>
      <link>https://sindro.me/it/posts/2008-01-31-how-to-keep-your-apple-notebook-battery-healthy/</link>
      <pubDate>Thu, 31 Jan 2008 00:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2008-01-31-how-to-keep-your-apple-notebook-battery-healthy/</guid>
      <description>&lt;p&gt;3 semplici regole:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;NON lasciare il caricatore collegato quando la batteria è carica, neanche quando vai a dormire.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;LASCIA che si scarichi completamente: quando lo usi aspetta che arrivi allo 0%, quando vai a dormire lascialo lì; quando ti sveglierai e lo aprirai, un bel resume da suspend to disk ti darà il buongiorno. OSX FTW.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Monitorala e fai vedere i contatori di performance di OSX ai tuoi amici (immagini per gentile concessione di&#xA;&lt;a href=&#34;http://www.coconut-flavour.com/coconutbattery/&#34; target=&#34;_blank&#34;&gt;CoconutBattery.app&lt;/a&gt; e System&#xA;Profiler.app)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://sindro.me/posts/2008-01-31-how-to-keep-your-apple-notebook-battery-healthy/healthy_battery_2.png&#34; alt=&#34;Salute della batteria&#34;&gt;&#xA;&lt;img src=&#34;https://sindro.me/posts/2008-01-31-how-to-keep-your-apple-notebook-battery-healthy/healthy_battery_cycle_count.png&#34; alt=&#34;Cicli della batteria&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>urllib2 di Python2.4 rotto di default su Solaris Express 5.11</title>
      <link>https://sindro.me/it/posts/2008-01-25-python2-4-s-urllib2-broken-by-default-on-solaris-express-5-11/</link>
      <pubDate>Fri, 25 Jan 2008 00:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2008-01-25-python2-4-s-urllib2-broken-by-default-on-solaris-express-5-11/</guid>
      <description>&lt;p&gt;Mentre installavo allegramente i prerequisiti per compilare un&amp;rsquo;applicazione su&#xA;&lt;a href=&#34;http://sun.com/software/solaris&#34; target=&#34;_blank&#34;&gt;Solaris 11&lt;/a&gt;, ho apprezzato il fatto di&#xA;trovare &lt;a href=&#34;http://selenic.com/mercurial&#34; target=&#34;_blank&#34;&gt;Mercurial&lt;/a&gt; già installato nel sistema&#xA;base&amp;hellip; tranne per un GROSSO problema: la digest authentication era rotta. Ho&#xA;fatto un &lt;code&gt;tcpdump&lt;/code&gt; del traffico scambiato tra il client Mercurial e il server&#xA;CGI e ho visto che non veniva inviato nessun header Authorization, e&#xA;ovviamente il server si rifiutava di servire il repository hg.&lt;/p&gt;&#xA;&lt;p&gt;Prima di reinstallare Python, magari da sorgente e sostituendo l&amp;rsquo;installazione&#xA;di default oppure tenendo affiancate due versioni diverse, con le conseguenti&#xA;seccature e sporcizia nel sistema, ho provato un patch davvero minuscolo a&#xA;urllib2.py che&amp;hellip; con mio divertimento, ha risolto il problema:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;--- urllib2.py~ Fri Jan 25 02:35:59 2008&#xA;+++ urllib2.py  Fri Jan 25 03:27:52 2008&#xA;@@ -815,7 +815,7 @@&#xA;             auth_val = &amp;#39;Digest %s&amp;#39; % auth&#xA;             if req.headers.get(self.auth_header, None) == auth_val:&#xA;                 return None&#xA;-            req.add_unredirected_header(self.auth_header, auth_val)&#xA;+            req.add_header(self.auth_header, auth_val)&#xA;             resp = self.parent.open(req)&#xA;             return resp&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Non sono un ca**o di esperto Python (ma il linguaggio è interessante), quindi&#xA;non chiedetemi PERCHÉ funziona: ho semplicemente seguito il commento di&#xA;&lt;code&gt;add_header&lt;/code&gt; che diceva &amp;ldquo;questo metodo è utile per aggiungere header di&#xA;autenticazione&amp;rdquo; e ho sostituito il metodo &lt;code&gt;unredirected_header&lt;/code&gt; con il primo.&#xA;Non ho proprio idea del perché con urllib2 di Python2.5 &amp;ldquo;tutto funziona&amp;rdquo; anche&#xA;con quel metodo; qualcosa deve essere rotto da qualche altra parte. Un diff&#xA;tra le due urllib non mi ha dato niente, dovrei davvero imparare Python prima&#xA;o poi.&lt;/p&gt;&#xA;&lt;p&gt;Non ho trovato nessuna informazione googlando parole chiave come &amp;laquo;solaris&#xA;&amp;ldquo;http {authorization,authentication}&amp;rdquo; {urllib2,python} {broken,not working}&#xA;mercurial&amp;raquo; (shell interpolation intesa), quindi spero che questo post sia&#xA;utile a qualcuno ;).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Active Gibberish</title>
      <link>https://sindro.me/it/posts/2008-01-22-active-gibberish/</link>
      <pubDate>Tue, 22 Jan 2008 00:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2008-01-22-active-gibberish/</guid>
      <description>&lt;p&gt;&lt;strong&gt;AGGIORNAMENTO: non ti serve questo codice, perché a partire dalla versione 2.2 di Rails il supporto alla localizzazione è integrato.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;localizzazione-dei-messaggi-di-errore-di-active-record&#34;&gt;Localizzazione dei messaggi di errore di Active Record&lt;/h2&gt;&#xA;&lt;p&gt;Oggi ho dovuto rispondere a una delle domande su cui ogni sviluppatore Rails&#xA;non anglofono prima o poi inciampa&amp;hellip; come localizzare i messaggi di errore di&#xA;AR per mostrarli in modo decente a un cliente che non parla inglese ;).&lt;/p&gt;&#xA;&lt;p&gt;Prima di tutto, grazie all&amp;rsquo;eccellente plugin gibberish di&#xA;&lt;a href=&#34;http://errtheblog.com&#34; target=&#34;_blank&#34;&gt;defunkt&lt;/a&gt; e al modo in cui gli errori di validazione di&#xA;AR sono esposti, il compito è stato portato a termine in modo semplice e&#xA;pulito, senza mettere troppo le mani negli internals di AR.&lt;/p&gt;&#xA;&lt;p&gt;Ho cominciato traducendo ogni messaggio di errore predefinito di AR, con questo&#xA;file di traduzione in &lt;code&gt;lang/it.yml&lt;/code&gt;:&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-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Active Record errors&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;#&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;ar_accepted&lt;/span&gt;:     &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;deve essere accettato&amp;#34;&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;ar_not_a_number&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;non è un numero&amp;#34;&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;ar_blank&lt;/span&gt;:        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;è un campo obbligatorio&amp;#34;&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;ar_empty&lt;/span&gt;:        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;è un campo obbligatorio&amp;#34;&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;ar_inclusion&lt;/span&gt;:    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;non è nella lista dei valori validi&amp;#34;&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;ar_too_long&lt;/span&gt;:     &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;è troppo lungo (massimo %d caratteri)&amp;#34;&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;ar_exclusion&lt;/span&gt;:    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;è riservato&amp;#34;&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;ar_too_short&lt;/span&gt;:    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;è troppo corto (minimo %d caratteri)&amp;#34;&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;ar_invalid&lt;/span&gt;:      &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;non è valido&amp;#34;&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;ar_wrong_length&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;è errato, dovrebbe essere di %d caratteri&amp;#34;&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;ar_confirmation&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;non corrisponde&amp;#34;&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;ar_taken&lt;/span&gt;:        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;esiste già&amp;#34;&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;# This one is not a default key, but I use it in my validations&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;ar_greater_zero&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;deve essere maggiore di zero&amp;#34;&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;e quattro righe in &lt;code&gt;config/environment.rb&lt;/code&gt;:&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-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;Gibberish&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;current_language &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;:it&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;ActiveRecord&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;Errors&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;default_error_messages &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;ActiveRecord&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;Errors&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;default_error_messages&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;inject({}) {&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;h, (key, string)&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;    h&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;update(key &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; string&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ar_&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;#{&lt;/span&gt;key&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;intern&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;) &lt;span style=&#34;color:#75715e&#34;&gt;# &amp;lt;em&amp;gt;Gibberish magic&amp;lt;/em&amp;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;La prima riga imposta semplicemente l&amp;rsquo;italiano (:it) come lingua predefinita,&#xA;l&amp;rsquo;inject costruisce un nuovo hash &lt;code&gt;error_messages&lt;/code&gt; usando Gibberish per&#xA;tradurre quelli predefiniti. Ho nominato ogni chiave di errore AR nel mio file&#xA;di traduzione con il prefisso &amp;ldquo;ar_&amp;rdquo;, per evitare possibili conflitti futuri di&#xA;chiavi. Infine, l&amp;rsquo;array di AR viene sovrascritto con quello appena costruito.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Estrarre dati dalla cache di Apple Safari</title>
      <link>https://sindro.me/it/posts/2008-01-20-extracting-data-from-apple-safari-s-cache/</link>
      <pubDate>Sun, 20 Jan 2008 00:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2008-01-20-extracting-data-from-apple-safari-s-cache/</guid>
      <description>&lt;p&gt;Cinque minuti fa ho sovrascritto il nuovissimo e fiammante foglio di stile CSS&#xA;che implementa la combinazione di colori attuale, perché volevo ripristinare&#xA;quello originale e metterlo in un nuovo tema per questo sito, così che chi&#xA;apprezzava il vecchio tema potesse continuare a usarlo. Ma, come il più&#xA;principiante degli amministratori di sistema, ho decompresso i file originali&#xA;dall&amp;rsquo;archivio di backup SOPRA quelli attuali&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;Safari in soccorso! Ogni elemento nella cache di Safari è memorizzato in un&#xA;database SQLite3 che si trova in &lt;code&gt;~/Library/Caches/com.apple.Safari&lt;/code&gt;,&#xA;andiamo a vedere com&amp;rsquo;è strutturato:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt; 13:54:42 vjt@voyager:~/Library/Caches/com.apple.Safari$ sqlite3 Cache.db &#xA;SQLite version 3.5.1&#xA;Enter &amp;#34;.help&amp;#34; for instructions&#xA;&#xA;sqlite&amp;gt; .tables&#xA;cfurl_cache_blob_data       cfurl_cache_schema_version&#xA;cfurl_cache_response      &#xA;&#xA;sqlite&amp;gt; .schema cfurl_cache_response &#xA;CREATE TABLE cfurl_cache_response(&#xA;  entry_ID INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE,&#xA;  version INTEGER,&#xA;  hash_value INTEGER,&#xA;  storage_policy INTEGER,&#xA;  request_key TEXT UNIQUE,&#xA;  time_stamp NOT NULL DEFAULT CURRENT_TIMESTAMP);&#xA;&#xA;sqlite&amp;gt; .schema cfurl_cache_blob_data&#xA;CREATE TABLE cfurl_cache_blob_data(&#xA;  entry_ID INTEGER PRIMARY KEY,&#xA;  response_object BLOB,&#xA;  request_object BLOB,&#xA;  receiver_data BLOB,&#xA;  proto_props BLOB,&#xA;  user_info BLOB);&#xA;&#xA;sqlite&amp;gt; select * from cfurl_cache_response limit 3;&#xA;1|0|1897220634|0|http://..../|2008-01-19 11:10:33&#xA;2|0|-662909776|0|http://..../|2008-01-19 11:10:33&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Wow. Impressionante. Ecco perché adoro i prodotti Apple: sono così ben&#xA;strutturati che puoi liberamente ispezionarli e usare le loro risorse per&#xA;qualsiasi compito imprevisto tu debba completare&amp;hellip; anche per rimediare ai tuoi&#xA;stessi errori ;). Ed è anche stimolante, perché devi rimboccarti le maniche e&#xA;trovare la soluzione esplorando un prodotto software costruito splendidamente.&lt;/p&gt;&#xA;&lt;p&gt;Per farla breve, ogni URL nella cache è memorizzato nel campo &lt;code&gt;request_key&lt;/code&gt;&#xA;della tabella &lt;code&gt;cfurl_cache_response&lt;/code&gt;, mentre nel campo &lt;code&gt;receiver_data&lt;/code&gt; della&#xA;tabella &lt;code&gt;cfurl_cache_blob_data&lt;/code&gt; ci sono i dati effettivi. Ora possiamo cercare&#xA;il foglio di stile CSS del tema bbs che abbiamo sovrascritto:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Come compilare python2.5 su SCO_SV</title>
      <link>https://sindro.me/it/posts/2008-01-16-how-to-compile-python2-5-on-sco_sv/</link>
      <pubDate>Wed, 16 Jan 2008 00:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2008-01-16-how-to-compile-python2-5-on-sco_sv/</guid>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;Devi avere PTH installato, e forse altre librerie.&lt;/li&gt;&#xA;&lt;li&gt;Testato su &lt;code&gt;SCO_SV os507 3.2 5.0.7 i386&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Se hai UDK, lancia:&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-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ CFLAGS&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;-I/usr/local/include -belf&amp;#39;&lt;/span&gt; LDFLAGS&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;-L/usr/local/lib&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ./configure --with-threads --with-pth --disable-shared --disable-ipv6&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#xA;&lt;li&gt;Aggiungi &lt;code&gt;/usr/local/include&lt;/code&gt; a &lt;code&gt;BASECFLAGS&lt;/code&gt; nel &lt;code&gt;Makefile&lt;/code&gt; (autocrap fa schifo).&lt;/li&gt;&#xA;&lt;li&gt;Patcha &lt;code&gt;Modules/ctypes/_ctypes_test.c&lt;/code&gt; mettendo un &lt;code&gt;#ifdef HAVE_LONG_LONG&lt;/code&gt; attorno alle funzioni che usano &lt;code&gt;PY_LONG_LONG&lt;/code&gt; (suggerimenti: righe &lt;code&gt;384&lt;/code&gt; e &lt;code&gt;318&lt;/code&gt;).&lt;/li&gt;&#xA;&lt;li&gt;Patcha &lt;code&gt;Objects/longobject.c&lt;/code&gt; e alla riga &lt;code&gt;817&lt;/code&gt; metti la macro &lt;code&gt;IS_LITTLE_ENDIAN&lt;/code&gt; prima del blocco &lt;code&gt;#ifdef HAVE_LONG_LONG&lt;/code&gt;, e metti &lt;code&gt;_PyLong_FromSsize_t&lt;/code&gt; e &lt;code&gt;_PyLong_FromSize_t&lt;/code&gt; dopo il blocco &lt;code&gt;HAVE_LONG_LONG&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Se hai GCC, lancia:&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-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ CFLAGS&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;-I/usr/local/include&amp;#39;&lt;/span&gt; LDFLAGS&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;-L/usr/local/lib&amp;#39;&lt;/span&gt;            &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ./configure --with-threads --with-pth --disable-shared --disable-ipv6&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sia con UDK che con GCC:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Modifica &lt;code&gt;pyconfig.h&lt;/code&gt; e commenta il define di &lt;code&gt;socklen_t&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Modifica &lt;code&gt;Modules/socketmodule.c&lt;/code&gt; e alla riga 226 aggiungi &lt;code&gt;|| defined(SCO5)&lt;/code&gt; per definire &lt;code&gt;INET_ADDRSTRLEN&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Lancia &lt;code&gt;make&lt;/code&gt; (o &lt;code&gt;gmake&lt;/code&gt; se preferisci)&lt;/li&gt;&#xA;&lt;li&gt;Rimarrai senza &lt;code&gt;_curses.so&lt;/code&gt;, &lt;code&gt;_curses_panel.so&lt;/code&gt;, &lt;code&gt;_locale.so&lt;/code&gt; e &lt;code&gt;readline.so&lt;/code&gt; se usi GCC, e anche senza &lt;code&gt;pyexpat&lt;/code&gt;, &lt;code&gt;elementtree&lt;/code&gt; e &lt;code&gt;sha512&lt;/code&gt; se usi UDK.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;      __   ____  __ __  ____     __&#xA;      \ \ / /  \/  |  \/  \ \   / /&#xA;       \ V /| |\/| | |\/| |\ \ / / &#xA;        | | | |  | | |  | | \ V /_ &#xA;        |_| |_|  |_|_|  |_|  \_/(_)&#xA;&lt;/code&gt;&lt;/pre&gt;&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-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;vjt@os507 ~/Python-2.5.1-vjt&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; $ python&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Python 2.5.1 &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;r251:31337, Sep &lt;span style=&#34;color:#ae81ff&#34;&gt;13&lt;/span&gt; 2007, 22:40:33&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:#f92672&#34;&gt;[&lt;/span&gt;GCC 4.2.1&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; on sco_sv3&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Type &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;help&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;copyright&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;credits&amp;#34;&lt;/span&gt; or &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;license&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; more information.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt;&amp;gt;&amp;gt; import socket&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt;&amp;gt;&amp;gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&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-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;vjt@os507 ~&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; $ hg clone http://code.wuhrer.thc/hg/Antani&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;destination directory: Antani&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;http authorization required&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;!! YAY! :D&lt;/p&gt;</description>
    </item>
    <item>
      <title>Come fare il backup con Time Machine su una condivisione di rete</title>
      <link>https://sindro.me/it/posts/2007-11-02-how-to-backup-with-time-machine-on-a-network-share/</link>
      <pubDate>Fri, 02 Nov 2007 00:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2007-11-02-how-to-backup-with-time-machine-on-a-network-share/</guid>
      <description>&lt;p&gt;&lt;em&gt;Ingredienti&lt;/em&gt;: Debian, Netatalk, Avahi, un po&amp;rsquo; di trucchetti.&lt;/p&gt;&#xA;&lt;h2 id=&#34;passo-1-ricompilare-netatalk-con-supporto-ssl&#34;&gt;Passo 1: Ricompilare Netatalk con supporto SSL&lt;/h2&gt;&#xA;&lt;p&gt;Ricompila Netatalk con il &lt;a href=&#34;http://www.blackmac.de/archives/58-Make-Netatalk-talk-to-Leopard-Mac-OS-X-10.5.html#extended&#34; target=&#34;_blank&#34;&gt;supporto SSL&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Puoi tranquillamente ignorare la roba del &amp;ldquo;.passwd&amp;rdquo;, perché afpd usa PAM per l&amp;rsquo;autenticazione degli utenti.&lt;/p&gt;&#xA;&lt;p&gt;Suggerimento: Disabilita i gestori del protocollo atalk in &lt;code&gt;/etc/default/netatalk&lt;/code&gt; per un avvio più veloce:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# Set which daemons to run (papd is dependent upon atalkd):&#xA;ATALKD_RUN=no        # appletalk protocol&#xA;PAPD_RUN=no          # printer sharing daemon (printers are soooo &amp;#39;90s)&#xA;CNID_METAD_RUN=yes   # don&amp;#39;t remember but is needed, rtfm!&#xA;AFPD_RUN=yes         # you will always need this&#xA;TIMELORD_RUN=no      # my time lord&amp;#39;s name is &amp;lt;a href=&amp;#34;http://openntpd.org&amp;#34;&amp;gt;openntpd&amp;lt;/a&amp;gt;&#xA;A2BOOT_RUN=no        # boot? nah! :P&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;passo-2-crea-una-condivisione-per-i-dati-di-backup-di-time-machine-aggiungendo-ad-es&#34;&gt;Passo 2: Crea una condivisione per i dati di backup di Time Machine, aggiungendo ad es.&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# path         name           perms     charset&#xA;/some/where/tm &amp;#34;Time Machine&amp;#34; allow:vjt volcharset:&amp;#34;UTF8&amp;#34; &#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;in &lt;code&gt;/etc/netatalk/AppleVolumes.default&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;passo-3-fai-comparire-il-server-afpd-nel-finder&#34;&gt;Passo 3: Fai comparire il server AFPD nel Finder&lt;/h2&gt;&#xA;&lt;p&gt;Scarica il file di servizio avahi, mettilo in &lt;code&gt;/etc/avahi/services&lt;/code&gt; e ricarica avahi con &lt;code&gt;/etc/init.d/avahi-daemon reload&lt;/code&gt; (&lt;em&gt;scusate, i link originali sono rotti&lt;/em&gt;).&lt;/p&gt;&#xA;&lt;h2 id=&#34;passo-4-configura-il-backup-di-time-machine&#34;&gt;Passo 4: Configura il backup di Time Machine&lt;/h2&gt;&#xA;&lt;p&gt;Ti servono due file sulla condivisione di rete AFP: .com.apple.timemachine.supported e un dot-file che prende il nome dal MAC address della tua en0. Per crearlo, il modo più semplice è collegare un disco USB/Firewire, rinominarlo con il nome della condivisione di rete desiderata (specificata nel file AppleVolumes) e abilitare Time Machine su di esso.&lt;/p&gt;&#xA;&lt;p&gt;Poi, copia il file .00&amp;hellip; dal disco esterno nella tua home directory, espelli il disco, monta la condivisione di rete dal Finder e copia il file lì.&lt;/p&gt;&#xA;&lt;p&gt;Infine, fai un touch di &lt;code&gt;.com.apple.timemachine.supported&lt;/code&gt; sulla condivisione di rete e riapri le preferenze di Time Machine: la dimensione del tuo volume di backup dovrebbe essere uguale alla dimensione della condivisione di rete :).&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
