Il forum

Finalmente ho messo su un mezzo forum che rimpiazza per sempre la pagina Off Topo. Non ho il tempo materiale per scrivere un plugin e allora ho recuperato qualcosa di già pronto. In futuro vorrei migrarne i contenuti o chissà… anche se penso che non ci sia niente di più permanente di una soluzione temporanea. Vabbù?

foro

Le regole del forum sono le stesse di tutti i commenti: cerchiamo di non offenderci a vicenda e per il resto tutto fa brodo.

Possibilmente non usate i messaggi privati. Li leggerò in barba alla legge sulla privacy del comune di Paperopoli (di cui sono sindaco, sapevate?) e li cancellerò in quanto mi sembrano inutili e ridondanti.

-quack

Pubblicato giovedì 29 aprile 2010 alle 8:55 PM - 47 commenti so far
Archiviato in: Blog-Tech

Comunicascion of service

Piccola comunicazione di servizio. È cambiato il link al feed RSS. Il nuovo feed RSS è qui.

Alcuni link utili per la migrazione:

Subscribe with BloglinesAdd to Googleaddtomyyahoo4rss-iconOffline/desktop reader

Scappo via da feedburner/google come avevo promesso qualche giorno fa. Il vecchio feed funzionerà ancora per un po’ con l’aggiunta di un promemoria più o meno evidente.

Vedasi quest’immagine:

feed

-quack

P.S. FeedBurner potrebbe metterci un po’ a propagare la ‘modifica’; il feed dei commenti sarà spostato la prossima settimana.

Pubblicato venerdì 12 febbraio 2010 alle 11:37 PM - 2 commenti so far
Archiviato in: Blog-Tech

Tor exit node lookup in ASP.Net

Potrebbe tornare utile a qualcun altro:

using System.Web;

using System.Net;

 

namespace TorHelper

{

    public class TorHelper

    {

        const string TOR_EXIT_IP = "127.0.0.2";

 

        private static string ResolveName(string name)

        {

            string ip = (string) HttpContext.Current.Cache[name];

            if (ip == null)

            {

                ip = ResolveDNS(name);

                HttpContext.Current.Cache[name] = ip;

            }

            return ip;

        }

 

        private static string ResolveDNS(string name)

        {

            try

            {

                IPHostEntry host = Dns.GetHostEntry(name);

                if (host.AddressList.Length == 0)

                {

                    // this should never happen

                    // but throwing an exception is expensive.

                    return null;

                }

                return host.AddressList[0].ToString();

            }

            catch(SocketException)

            {

                // this can happen when the DNS doesn't get resolve

                // and it actually happens for all IP addresses
                // that are
not part of the TOR exit list

                return String.Empty;

            }

        }

 

        public static bool IsTorExitNode(string ipAddress)

        {

 

            try

            {

                string torExitEntry = String.Format(

                   "{0}.{1}.{2}.ip-port.exitlist.torproject.org",

                    ReverseIPOctet(ipAddress),

                   "80",

                    // Domain name is the running

                    // ASP.Net webSite

                    ReverseIPOctet(ResolveName(DomainName)) );

 

                if (ResolveName(torExitEntry) == TOR_EXIT_IP)

                {

                    return true;

                }

            }

            catch (Exception e)

            {

                // log the error

            }

 

            return false;

        }

 

        private static string ReverseIPOctet(string ipAddress)

        {

            string[] octets = ipAddress.Split('.');

            return String.Format("{3}.{2}.{1}.{0}",

               octets[0],
               octets[1],
               octets[2],
               octets[3]);

        }

 

    }

}

Su questo blog i commenti lasciati via Tor finiscono in coda di moderazione insieme a quelli che partono da una subnet ban list. Ed ora il giochino si fa più interessante.

-quack

P.S. il pezzo di codice di cui sopra è rilasciato al pubblico dominio con la licenza SQLite:

May you do good and not evil
May you find forgiveness for yourself and forgive others
May you share freely, never taking more than you give.

Pubblicato giovedì 10 dicembre 2009 alle 8:46 PM - 18 commenti so far
Archiviato in: Blog-Tech, Codice

Graceful Degradation

Qualche giorno fa, a causa di problemi sul server di hosting, lo sfortunato avventore s’è beccato qualche schermata di errore del tipo:

YSODconosciuta anche con il nome di ASP.Net YSOD (Yellow Screen of Death). In un paio di occasioni questo è capitato per una mancata risposta del backend SQL, magari beccato durante un riavvio di manutenzione, altre volte per problemi un po’ più seri come la carenza di spazio libero quando in realtà avevo teoricamente a disposizione più di 99GB rimanenti.

La YSOD è praticamente una schermata di debug utile per lo sviluppatore: nel caso in questione però saranno ormai diversi mesi che non vedo uno YSOD causato da problemi di codice, quindi ho deciso di disabilitarne l’uso in favore di una schermata più simpatica. Per imparare qualcosa ho cercato di fare le cose per bene, perché quando mi prende va a finire che anche per le puttanate son capace di spendere ore ed ore. Il risultato lo si può ammirare in questa pagina:

Gracefully degradeLa cosa più antipatica da realizzare è stato il centraggio della box in primo piano, cosa rivelatasi impossibile tramite CSS e basta. Un po’ di JavaScript + JQuery e la paura e passata; col senno di poi però arrivare a scrivere codice JS per una pagina statica di errore mi sembra pura follia…

-quack

Pubblicato giovedì 24 settembre 2009 alle 12:17 AM - 39 commenti so far
Archiviato in: Blog-Tech

Standard e trasparenza

Ieri giochicchiavo con una piccola feature da inserire in Blogoo che avevo stimato in mezz’ora di research and development (ma poi è andata a finire in leggera contro-tendenza). Volevo fare in modo che nel momento in cui si invia un commento comparisse una finestra trasparente con una ruota che gira stile boot loader di OS X. La parte più difficile dell’impresa è stata trovare la gif animata: l’avevo vista in giro usata come avatar in diversi forum, ma non ne ho mai annotato la URL e ritrovarla è stata una missione quasi impossibile. Come vuole Murphy oggi ho notato una GIF molto simile e a tratti meglio indicata navigando per caso.

Trovata la GIF è stato abbastanza semplice generare il codice JavaScript che implementasse la funzionalità voluta: un bel DIV in primo piano ma nascosto che diventa visibile con il click del pulsante, roba che si trova in giro al primo secondo colpo ravanando su stackoverflow.com.

Le ultime difficoltà le ho trovate implementando il livello di trasparenza in maniera tale che funzionasse con i tre motori di rendering principali e le varie sub-version. Il browser più problematico è stato – manco a dirlo – IE8, che nella modalità di rendering di default non ne voleva proprio sapere di gestire la direttiva. Bingolando tra i forum si trova solo gente incazzata e poca razionalità: se ci penso mi sono incazzato anche io pensando quanto fosse stupido scegliere di non supportare l’opacità così come era disponibile in IE7. La realtà invece è molto più pragmatica: la vecchia sintassi non è “conforme” e lo standard dice chiaramente cosa fare in presenza di tag non conformi e cioè vanno ignorati. I dettagli sono racchiusi in questo post. La cosa che mi ha fatto più riflettere è che la totalità delle lamentele di cui ho letto era critica nei confronti di tale scelta giustificando l’astio con qualche pregiudizio. E mi son reso conto che quanto avevo letto in passato e cioè che molti hanno chiesto a gran voce il supporto agli standard non sapendo neanche quanto di ciò che usassero lo fosse davvero; chi scriveva faceva l’esempio dei bordi arrotondati che “tutti gli altri browser” supportano tranne IE. Esempi che poi sono alla base di test suites come gli (in)famosi Acid Test v. 3.

Morale della favola: non sempre quello che si desidera è quello che si dice di voler desiderare. Si è desiderato a gran voce il pieno supporto degli standard quando in realtà si voleva “un rendering che fosse compatibile quanto più possibile tra i vari browser”.

L’ultimo ostacolo era la mancata animazione della GIF in IE8 su Win7/RC; ho notato subito che era un problema legato al caching delle GIF ed è bastato aggiungere un parametro casuale fasullo alla fine della URL per risolverlo. Questo ad ulteriore supporto del fatto che non ritengo che questo sia il miglior mondo possibile dal punto di vista dell’HTML e dintorni bachi inclusi. Come ci si muove da questo al prossimo (HTML 5? Flash/Gears/SL vNext?) è un problema per niente banale.

-quack

P.S. funziona?

Pubblicato martedì 2 giugno 2009 alle 10:07 PM - 89 commenti so far
Archiviato in: Blog-Tech, Codice