Info:

twitter

Ultimi commenti: Comment feed

Tags:

Sponsor:

Archivio 2018:

Lug Giu Mag Feb Gen

Archivio 2017:

Dic Nov Ott Mag Apr Mar Feb Gen

Archivio 2016:

Dic Nov Ott Ago Mag Mar Feb Gen

Archivio 2015:

Nov Ott Set Mar Gen

Archivio 2014:

Dic Nov Ott Set Lug Giu Mag Apr Gen

Archivio 2013:

Dic Nov Set Ago Lug Giu Mag Apr Feb Gen

Archivio 2012:

Dic Nov Ott Set Ago Giu Mag Apr Mar Feb Gen

Archivio 2011:

Dic Nov Ott Set Ago Lug Giu Mag Apr Mar Feb Gen

Archivio 2010:

Dic Nov Ott Set Ago Lug Giu Mag Apr Mar Feb Gen

Archivio 2009:

Dic Nov Ott Set Ago Lug Giu Mag Apr Mar Feb Gen

Archivio 2008:

Dic Nov Ott Set Ago Lug Giu Mag Apr Mar Feb Gen

Archivio 2007:

Dic Nov Ott Set Ago Lug Giu Mag Apr Mar Feb Gen

Archivio 2006:

Dic Nov Ott Set Ago Lug Giu Mag Apr Mar Feb Gen
L’Heisenbug perfetto

Pochi giorni fa mi sono riscontrato nel cosidetto Heisenbug perfetto. Di solito gli Heisenbug hanno a che fare con il multi-threading circostanza per cui aggiungere qualche breakpoint al codice sfasa il timing dell’applicazione e per tanto potrebbe causare la scomparsa di un baco sotto osservazione. Nel mio caso non c’era nessun multithreading, ma bastava semplicemente “osservare” il comportamento dell’oggetto misterioso per deviarne il flusso di esecuzione. Ridotto al minimo l’Heisenbug è descritto qui sotto:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace Heisenbug

{

    class MyClass

    {

        bool here;

        public override string ToString()

        {

            string result = here.ToString();

            this.here = true;

            return result;

        }

 

        public MyClass()

        {

            this.here = false;

            // put a breakpoint on the following line

            // and add 'this' to the watch window and

            // then execute

            Console.WriteLine(this.ToString());

        }

    }

 

    class Program

    {

        static void Main(string[] args)

        {

            MyClass c = new MyClass();

            Console.WriteLine(c.ToString());

        }

    }

}

Normalmente l’applicazione scrive False-True sulla console. Se invece si aggiunge un breakpoint nella riga del costruttore indicata e si osserva appunto l’oggetto appena instanziato il risultato diventa True-True. La cosa non è stata banale da individuare perché il tutto era offuscato da qualche altro centinaio di righe di codice e parlandone con il collega pazzo con la capigliatura più caotica della mia ne è nata una questione filosofica: ma il debugger può permettersi davvero di invocare metodi mentre un oggetto è ancora in costruzione? Girerò la domanda a quelli del team di Visual Studio per sapere se il comportamento è documentato (prescritto) da qualche parte.

-quack

Update:

image

Dalla regia mi suggeriscono che questo comportamento può essere disabilitato ed il valore di default in effetti makes sense.

VS – Developer 1-0 e palla al centro

Pubblicato mercoledì 16 dicembre 2009 alle 10:33 PM - 20 commenti so far
Archiviato in: Codice

Fryday

Il Venerdì è considerato il giorno di Fry’s (vedasi) in quanto il negozio in questione pubblica sul giornale locale 4 pagine di offerte in genere tra il mediocre e l’eccezionale. Un esempio di offerta eccezionale era l’SSD Patriot da 32GB a 89$ con 30$ di rebates (in pratica 70$); oltre a questo gli annunci del Venerdì hanno un’altra interessante peculiarità e cioé che sono validi per un’intera settimana a differenza delle 24-48-72h delle inserzioni “normali”.

La cosa buffa è che il giornale locale, dopo un esperimento durato pochi mesi, ha deciso di togliere le inserzioni pubblicitarie dalle pagine online nascondendosi dietro l’idiozia di voler vendere più abbonamenti. Nessuno ha mai capito chi è stato il genio dietro tale trovata, ma questo non ha mai fermato l’opera di uno stuolo di volontari che dietro compenso di Google Ads scannerizza, classifica e pubblica le pagine del Venerdì su un sito dedicato chiamato appunto Fry’s Electronic Ads.

Un evento con probabilità non nulla è quello di scoprire che abbiano deciso di mettere in offerta un prodotto in vendita il Venerdì precedente a prezzo pieno, nel qual caso si è in presenza di un Black Fryday. Data la mia proverbiale sfiga, nomen omen, questa settimana tra rebate e sconto alla cassa hanno deciso di dimezzare il prezzo dello stesso switch KVM che ho comprato domenica scorsa. Teoricamente, data la loro politica, potrei restituire il prodotto e ricomprarlo o semplicemente presentarmi alla cassa per ricevere indietro almeno la quantità di sconto esclusa di rebate. Praticamente in alcuni casi come il mio non ne vale assolutamente la pena. A meno che…

-quack

Pubblicato venerdì 11 dicembre 2009 alle 9:20 PM - 3 commenti so far
Archiviato in: Cazzate

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

Licenze

Non pensavo mi sarebbe mai capitato di imbattermi in una licenza peggiore di quella GPL3 (*) ma invece...

Parto dal presupposto che una possibile suddivisione del software sia quella di software per sviluppo vs. software per “utenti finali”, ove per software di sviluppo si intende tutta quella caterva di applicazioni che servono a generare altro software.

Il software per “utenti finali” di solito ha licenze normali: nessuno si sognerebbe di non consentire all’utente di un Word Processor di stampare o di salvare i file (eccezione: il software shareware/trialware).

Nel mondo dei programmatori invece esiste il concetto di “licenza per sviluppatore” anziché utente: la differenza è subdola ma in alcuni casi diabolica. Supponiamo che il tool sia un compilatore a riga di comando: se Pinco e Pallino scrivono codice, ma è solo Pallino ad usare il tool per compilare, Pinco potrebbe violare la licenza di [non]-uso. Sembra un paradosso ma mi sono imbattuto in una libreria (which shall remain nameless) “royalties free” ma licenziata “per sviluppatore” e che per sviluppatore si intendeva chiunque modificasse l’applicazione. Alla mia richiesta di delucidazioni su cosa significasse “sviluppatore di applicazione” nel contesto royalties free mi hanno risposto seccati chiedendomi se stessi cercando di circumnavigare la licenza; ho chiarito che non mi interessava circumnavigarla ma capire se fosse possibile che “non-sviluppatori” della mia applicazione potessero scriverne template o plugin o se invece tali interventi facessero figurare gli utenti finali come “sviluppatori della mia applicazione”.

La risposta: il silenzio. Contenti loro…

licenza

(l’immagine è rubata da un post a tema di Coding Horror)

-duh

(*) ovviamente il metro di paragone è basato sul mio gusto personale.

Pubblicato giovedì 10 dicembre 2009 alle 6:45 AM - 20 commenti so far
Archiviato in: Software

Chiavetta USB multi boot per Windows

Antefatto: ho deciso di fare l’upgrade a Windows 7 del mediacenter allettato dalla possibilità di installare un sintonizzatore CableCard e guardare anche qualche canale criptato. Avevo preso in considerazione anche di sostituire l’architettura attuale con un Atom per il surriscaldamento estivo e conseguente rumore di ventolame, ma poi ho pensato che i canali criptati hanno bisogno di una CPU robusta per poter essere fruibili normalmente. Ho deciso di visitare Fry’s per approfittare di due offerte “1 day only”: un sistema di raffreddamento liquido Corsair dal prezzo contenuto (56$) e con ottime review e un HD SSD da 32GB grande abbastanza per Windows 7 senza fronzoli ad un prezzo altrettanto decente (50$ dopo rebate), interessante non tanto per le prestazioni ma per il minor apporto di energia cinetica/termica/sonora nel sistema.

L’HD è risultato probabilmente difettoso, in quanto è scomparso completamente dal radar nel mezzo dell’installazione dell’OS; il sistema di raffreddamento invece era abbastanza ingombrante per il case living room friendly della terza versione del mediacenter. È dovuto scattare il cosiddetto pellegrinaggio di ritorno per la restituzione del radiatorone e la sostituzione dell’HD. Ho approfittato per cercare una chiavetta da 4GB da rendere bootabile e verificare alcune teorie sulla lentezza di installazione di Windows su certi sistemi, ma quel giorno era in offerta irrifiutabile venticinquedollaripiùtasse una chiavetta da 16GB. Ho pensato: qualcuno si sarà già posto il problema di creare una chiavetta multiboot (x86, AMD64, se rver, client, ecc.) e che sarebbe tornata molto comoda al posto delle solite 3-4 chiavette per tutti gli OS. Per il raffreddamento ho trovato una soluzione molto più pratica e decisamente meno costosa.

Tornando in topic: è stato un bagno di sangue ma alla fine ce l’ho fatta. In sintesi: bisogna creare più di una partizione usando uno di quei tool che flippa il “removable bit” e ingegnarsi con qualche bootloader abbastanza avanzato da starci nel Master Boot Record ed essere al tempo stesso in grado di giocare al gioco delle tre carte con le partizioni create.

In dettaglio, anche per mia futura memoria, i passi seguiti.

Ingredienti:

Passi, da seguire in ordine religioso:

  1. Installare GRUB sull’MBR della chiavetta usando il GUI installer; la procedura è indicata in dettaglio nella sezione uno di questa guida (in inglese).
  2. Flippare il media bit usando il tool della Lexar (funziona anche su chiavette di marca diversa); rimuovere e reinserire la chiavetta
    Lexar-Flip-Removable-Bit
  3. Creare due o più partizioni a seconda del numero di OS da rendere installabili; nel mio caso 3 (WHS, Win7 x86/64) più una per i dati. La prima partizione va formattata come FAT o FAT32 mentre per le altre si può scegliere anche NTFS
  4. copiare il contenuto dei dischi di installazione su ogni partizione
  5. creare un file di testo con il “nome” della partizione in ogni partizione (es.: WHS.txt; Win7x86.txt; ecc.)
  6. copiare il file grldr nel root folder della prima partizione
  7. creare un file di testo con il nome di menu.lst nel root folder della prima partizione e editarlo usando questo template:

title Windows Home Server
find --set-root /win7x86.txt
hide()
[…]
find --set-root /WHS.txt
unhide ()
chainloader /bootmgr

title Windows 7 x86
find --set-root /WHS.txt
hide ()
[…]
find --set-root /win7x86.txt
unhide ()
chainloader /bootmgr

In pratica: ogni voce di menu si occupa di nascondere tutte le partizioni non interessanti usando i tag file nel punto 5. e di rendere disponibile solo quella da cui fare il boot, che viene settato con il comando chainloader.

L’installazione è stata avviata con successo per tutti i tre OS sul mio laptop e perciò, come sempre in questi casi è garantita:

works-on-my-machine-starburst

-quack

Pubblicato martedì 1 dicembre 2009 alle 10:37 PM - 88 commenti so far
Archiviato in: Cazzate, Hardware