Entries Tagged 'programmazione' ↓

Anagrafica articoli

C’era una volta un’informatica in cui il costo per byte sia della RAM sia dei sistemi di memorizzazione era notevole. In quell’informatica di una volta i programmatori facevano di tutto per risparmiare anche un singolo byte nei database, ben sapendo che un singolo byte moltiplicato per il numero di record aveva un peso notevole.

L’informatica è cambiata, i costi per byte sono diminuiti e la potenza dei motori di database è aumentata in maniera quasi esponenziale: immaginate solo il lavoro per fare una FULL OUTER JOIN o una semplice UNION con dBase III.

Purtroppo ci sono ancora aziende la cui anagrafica articoli è ferma a metà degli anni ‘90 del secolo scorso, con anagrafiche articoli esposte al pubblico di relativamente pochi caratteri.

Prendiamo, ad esempio, una nota ditta di produzione software il cui quartier generale sta dalla parti di Redmond, WA. Questa simpatica ditta ha descrizioni del tipo

Small Bus Svr Prem 2008 w/SP2 1PK DVD 1-4CPU 5 Clt EN OEM

WHAT?! Questi erano gli stessi che si facevano beffe dell’IBM il cui sistema operativo OS/400 aveva comandi onestamente alieni, tipo WRKACTJ per l’elenco dei processi attivi sul sistema o PWRDWNSYS per fare uno shutdown. Andiamo a pagina 46 e leggiamo la soluzione di quell’appendice alla pagina della sfinge della descrizione: Windows Small Business Server 2008 Premium con Service Pack 2; confezione da 1 DVD; licenza per 1-4 CPU; con 5 licenze client, edizione inglese OEM.

E vi risparmio le descrizioni degli articoli utilizzati per i vari schemi di licenza, che sono ancora più criptiche.

È vero che per chi deve lavorare all’interno e vede tutti i giorni quelle descrizioni è molto più facile la versione compressa, ma costa così tanto avere due descrizioni, una interna e l’altra esposta al pubblico?

Interna: SBS Svr Pre 2008 w/SP2 1PK DVD 1-4CPU 5 Clt EN OEM

Esterna: Small Business Server 2008 with SP2, 1 DVD pack, for 1-4 CPU, 5 Clients included, English OEM edition

Nella seconda versione è anche più facile fare delle ricerche su tutto il testo, cosa non indifferente.

Microsoft non è certo l’unica ad abbandonarsi a pratiche simili e chi è senza peccato scagli il primo hard disk: SYMC ENDPOINT PROTECTION SMALL BUSINESS EDITION 12.0 PER USER BNDL COMP UG LIC ESSENTIAL 12 MESI EXPRESS BAND B

Sia chiaro, questo post non è per niente un’istigazione a scialacquare risorse, ma il consiglio ad usarle quando ci sono e servono, tenendo presente che ci sono persone che devono leggere l’anagrafica articoli una volta al mese, o più raramente, e possibilmente senza doversi imparare un inutile sistema di offuscamento delle informazioni.

Sulle differenze tra i linguaggi di programmazione

Per varie ragioni (che non includono solamente il masochismo) voglio portare una procedurina di monitoraggio che ho scritto in Perl sotto Linux in ambiente Windows.

Volendo usare un linguaggio script nativo in ambiente Windows per evitare di installare programmi di qualsiasi tipo sulla macchina da monitorare, decido di usare la PowerShell.

Prima sorpresa: Microsoft distribuisce un (a suo dire) potente interprete di comandi e di script in cui l’esecuzione degli script è bloccata per default. Vabbè, la cosa si risolve creando (o modificando) la chiave di registro HKEY_Local_Machine\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.Powershell\ExecutionPolicy con valore Unrestricted. Benedetta Microsoft!

Ok, gli script ora sono eseguibili.

Veniamo allo scopo del test: creare uno script che prende una variabile data e la invia ad un server tramite HTTP POST (ovvero simulando la compilazione di un form) e recuperare la risposta del server.

Svolgimento in PERL:
$ua = LWP::UserAgent->new;
$req = (POST "http://pippo", ["campo1" => "valore1", "campo2" => "valore2"]);
$risposta = $ua->request($req);

Svolgimento in PowerShell:
[Reflection.Assembly]::LoadFile(’C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Web.dll’) | out-null
$postData = ‘campo1=valore1&campo2=valore2′
$buffer = [text.encoding]::ascii.getbytes($postData)
[net.httpWebRequest] $req = [net.webRequest]::create(’http://pippo’)
$req.method = “POST”
$req.ContentType = “application/x-www-form-urlencoded”
$req.ContentLength = $buffer.length
$req.TimeOut = 5000
$reqst = $req.getRequestStream()
$reqst.write($buffer, 0, $buffer.length)
$reqst.flush()
$reqst.close()
[net.httpWebResponse] $res = $req.getResponse()
$resst = $res.getResponseStream()
$sr = new-object IO.StreamReader($resst)
$risposta = $sr.ReadToEnd()

E per fortuna che è una shell power!!!

Y2.01K

Dopo averci scherzato tempo fa, pare che il problema della data nei software non sia sparito del tutto.

Il problema dell’anno 2000 era serio, anche se le conseguenze non sarebbero state quelle “previste” dagli “esperti” catastrofisti interrogati dalla stampa, la quale era a caccia più di sensazionalismi che di notizie. In ogni modo, sia con lo sforzo preventivo sia con l’intelligenza degli utilizzatori il problema dell’anno 2000 è stato superato.

Durante il periodo di caccia al baco precedente il primo gennaio 2000, i protocolli di test per verificare il software prevedevano, ovviamente, l’utilizzo di date successive all’anno 2000 nelle normali operazioni del software.  Ok, ma quanto successive al 2000? 2001? 2005? 2010? 2100? 3000?

La risposta esatta era, ovviamente, funzione sia della vita prevista del software sia del tipo di memorizzazione della data, sia della “finestra” di tempo dei dati in archivio.

Immaginiamo che il software abbia solamente due caratteri per l’anno che vanno da 00 a 99. Senza introdurre campi aggiuntivi (di “epoca”), io posso gestire solamente 100 anni. A questo punto, si tira una riga e si assume che se il valore è minore di (ipotizziamo) 50, è una data del nuovo millennio, altrimenti è una data del XX secolo.

Tutto bene, ma se quel software ha una base storica che inizia dal 1921? Nessun problema, si tira la riga al 20, tanto chi mai utilizzerà ancora questo software nel 2020?

Purtroppo sta succedendo (ed è successo proprio a me) che alcuni software abbiano tirato la riga al 9, ovvero se l’anno (a due cifre) è compreso tra 0 e 9 si parla del 2000, altrimenti è il 1900. Qualche giorno fa ho ricevuto da un cliente un export di dati da un software con dei calendari di eventi sia appena passati sia nell’immediato futuro: gli eventi fino al 31/12/2009 hanno la data corretta, quelli successivi sono collocati nel 1910.

Visto che il problema dell’anno 2000 era sentito nel mondo informatico da molti anni prima della fatidica data, è facile che il software in questione sia stato dichiarato Y2K compliant con il solito “trucco della finestra” descritto sopra, pensando che nessuno l’avrebbe più utilizzato nel 2010.

Il primo gennaio 1910 era una sabato, mentre il primo gennaio 2010 sarà un venerdì: se dopodomani qualche software che state utilizzando dirà che è sabato, non avrà semplicemente “perso” un giorno…

Aggiornamento 2/1/2010: SpamAssassin ha un problema con le date nel 2010. Pare che il problema sia stato risolto se usate sa-update.

Aggiornamento 3/1/2010: BusinessDay riporta che In Australia i POS della Bank of Queensland all’inizio del 2010 sono inspiegabilmente saltati al 2016 (via Slashdot).

Aggiornamento 3/1/2010: Gizmodo segnala che i telefoni cellulari con Windows Mobile 6.1 e 6.5 leggono la data degli SMS dopo il 31/12/2009 come 2016.

Aggiornamento 4/1/2010: Anche Syamantec Endpoint Protection Manager ha problemi con le date di quest’anno.

Mi fermo qui con l’elenco. I problemi sono ben di più.

Quand’è la fine del mondo informatico?

Mentre si assiste ad un proliferare di idioti (o profittatori) millenaristi, ci sono (e ci sono state) molte date epocali per l’informatica che potrebbero portare alla fine di piccoli mondi. Quelle passate non hanno, per evidenti ragioni, portato alla fine di nulla di critico, per il fatto stesso che siamo qui a parlarne.

Ecco alcune chicche, con l’aiuto di quelle segnalate da SANS.

  • 1/1/1992 - Gli orologi degli Olivetti M24 tornano al primo gennaio 1984 perché l’orologio interno del computer conta solo fino a 4096 giorni dal primo gennaio 1984. G.Koll ha scritto un’utility da mettere nel CONFIG.SYS per spostare la finestra di altri 4096 giorni, quanto è stato sufficiente per un mio cliente per usare il suo M24 per alcuni anni ancora, ma chi lo usa ancora il 18/3/2003 ha un’amara sorpresa…
  • 9/9/1999 - Sull’onda del futuro problema dell’anno duemila, qualcuno sostiene che i sistemi basati su AS/400 si fermino in questo giorno perché nelle maschere di input viene utilizzato il 9 come marcatore del numero. Peccato che per fermare un AS/400 ci voglia ben altro.
  • 1/1/2000 - Che sia o no l’inizio del nuovo millennio (onestamente: chissenefrega), il mondo ha continuato a funzionare con problemi assolutamente trascurabili. Se questo sia avvenuto grazie o nonostante gli sforzi messi in campo non lo sapremo mai. Peccato.
  • 10/1/2010 10:10:00 - Il momento dell’apocalisse informatica: in binario 1010011010 (rappresentando la data in ISO, omettendo però il millennio) equivale a 666. Tipico esempio di come uno voglia “far venire i conti” con poderose arrampicate su superfici vetrose riflettenti.
  • 12/12/2012 - Presunta fine del computo dei giorni del calendario Maya, una popolazione che aveva costruito un’aritmetica complessa sulla base della superstizione che, se non ci fossero stati numeri per indicare i giorni, il mondo sarebbe finito. Sono finiti male prima i Maya della terra su cui poggiavano i piedi e, comunque, il computo degli anni prevede vari sistemi concentrici di conteggio. Tanta aritmetica per finire abbindolati dai conquistadores spagnoli, ne è valsa la pena? Visto il tambusto che c’è ora su questa superstizione, forse sarebbe stato meglio se gli Spagnoli fossero arrivati prima.
  • 7/2/2036 6:28:16 UTC - L’ultima data esprimibile con l’attuale protocollo ntp, che usa un offset a 64 bit rispetto al 1/1/1900, ma solamente 32 vengono utilizzati per il computo dei secondi.
  • 19/1/2038 3:14:07 UTC - L’ultima data esprimibile tramite i 32 bit con segno dell’epoca UNIX, il cui inizio è il primo gennaio 1970. Diversi tipi o derivati di UNIX hanno diverse date di fine epoca.
  • 31/12/2049 - Dopo questa data i programmi scritti in Clipper 5 potrebbero avere dei problemi. Se li state usando ancora in questa data, avete voi dei problemi.
  • 31/12/9999 - Ultimo anno esprimibile con un numero a quattro cifre.
  • 31/7/31086 2:48:05.47 - Ultima data esprimibile con OpenVMS e Mac OSX.

Ora andate e diffondete il panico. Ricordate che se versate una congrua cifra sul mio conto corrente (coordinate bancarie disponibili su richiesta) potrò fare in modo che la fine del mondo non avvenga.

Ancora sugli errori: connessioni al database

Riprendo di nuovo il tema degli errori, dopo averne parlato la scorsa estate.

Una buona diagnostica degli errori è fondamentale per qualsiasi linguaggio di programmazione, ma nel caso di linguaggi per il web molti dettagli dovrebbero essere tenuti abbastanza nascosti agli utenti quando la procedura va in produzione.

Un esempio tipico è il verificarsi di un problema di connessione al database che impedisce il caricamento dei contenuti di un sito. Per capire cosa sto dicendo provate a cercare su Google la stiringa warning mysql_connect “access denied for user” “using password”; se andate un po’ in là nei risultati cominciate a trovare non più le pagine che descrivono questo errore, ma i siti in cui si verifica questo errore. La visualizzazione sulla pagina del client di questa diagnostica è abbastanza pericolosa perché può rivelare informazioni utili per eventuali attacchi al sito. Ecco due esempi di diagnostica consegnata al browser del visitatore:

Warning: mysql_connect() [function.mysql-connect]: Access denied for user ‘festival’@'localhost’ (using password: YES) in /home/www/if/old/functions.php on line 86

Microsoft OLE DB Provider for SQL Server error ‘80040e4d’ Login failed for user ‘mediamanager’. /V1/Playlist.asx, line 30

Nella prima diagnostica non solo diciamo a tutto il mondo che stiamo utilizzando MySQL, ma riveliamo il nome dell’utente con cui ci connettiamo al database e il path assoluto dei file nel sito web; in questo modo un attaccante che vuole leggere, ad esempio, il file /etc/passwd sa che il path relativo a functions.php è ../../../../../etc/passwd

Se il server HTTP e il linguaggio utilizzato lo prevedono (e di solito lo prevedono), la prima azione da intraprendere è ovviamente la disabilitazione dell’invio di ogni tipo di messaggio al client, limitandosi a tenere un log locale degli errori.

Dal momento che, come nel primo esempio, l’apertura della connessione al server SQL avviene solitamente in un solo punto del programma, per evitare questo tipo di problema è sufficiente testare il valore ritornato dalla funzione di connessione e, in caso di errore, visualizzare una pagina di cortesia in cui si dice che il sito è temporaneamente in manutenzione o qualcosa del genere. Attenzione a mettere la diagnostica dettagliata dell’errore tra commenti HTML come fa, per esempio, Flickr perché non sono l’unico io ad andare a vedere il sorgente HTML di questo tipo di pagine…

Addio Dr. Dobb’s Journal

Per citare una frase classica dei necrologi, il Dr. Dobb’s Journal ci lascia nella forma in cui lo conosciamo dopo lunga e penosa malattia.

Chi ha cominciato a scrivere software alla fine degli anni ‘80 quando le risorse online in Italia erano le aree echo della FidoNet sa che il Dr. Dobb’s Journal costituiva una risorsa notevole, sia per gli articoli, sia per gli inserti pubblicitari che conteneva.

La rivista trattava in maniera molto professionale vari aspetti della programmazione legati ai singoli linguaggi o dedicati alla teoria degli algoritmi. Tramite gli inserti pubblicitari si poteva scoprire che un software o una libreria specifica era più conveniente acquistarla presso il Programmer’s Paradise piuttosto che direttamente dal distributore ufficiale.

Già con l’avvento di Windows 95 la testata si era arroccata su posizioni eccessivamente anti-Microsoft e pro-Java, comportamento che mi ha indotto ad abbandonarne la lettura abituale. Le ultime copie che ho sfogliato erano solamente una sottile ombra della rivista di un tempo.

Da quest’anno la testata chiude per confluire in Information Week e per potenziare la parte online. Auguro al Dr. Dobb’s Journal se non un futuro prospero, quantomeno un futuro migliore di quello che è toccato a OMNI quando ha intrapreso la medesima strada.

Addio Dr. Dobb’s Journal e mille grazie per tutto quello che abbiamo imparato leggendo i tuoi articoli.

HyperB5

HyperB5HyperB5, la risorsa italiana su Babylon 5, si rinnova passando da documenti HTML statici ad un motore di visualizzazione dinamico basato su PHP e MySQL.

La notizia per me è ancora più bella in quanto Steve, il curatore del sito, ha deciso di adottare il motore di visualizzazione di HyperTrek, disponibile gratuitamente con licenza GNU GPL.

Non è certo mia intenzione pormi al livello di gestori di contenuti quali, a titolo di esempio, WordPress o Joomla, in quanto il motore di HyperTrek è assai specifico e ottimizzato per guide su serie televisive. Il motore di HyperTrek manca di un sistema di gestione dei contenuti degno di questo nome, che esiste e fornisco tranquillamente su richiesta ma non è affatto di qualità pubblicabile (ci sto lavorando per metterlo online senza vergognarmi).

Inoltre il motore di HyperTrek non è deliberatamente collaborativo, nel senso che non si basa né sul concetto di wiki dove tutti possono scrivere (e cancellare) né sul concetto di blog dove tutti possono commentare (e spammare). Probabilmente questa è una limitazione, ma non è nemmeno detto che tutti i siti del web debbano sempre e comunque permettere i commenti di ogni visitatore, anche perché chi gestisce il sito potrebbe non avere tempo per vagliare i commenti.

I due punti forti, a mio avviso, del motore sono la modularità con cui si possono costruire le pagine di diverso layout e il fatto che il motore di visualizzazione acceda in sola lettura all’archivio dei dati, rendendo poco efficace qualsiasi tentativo di SQL injection che sfrutterebbe eventuali problemi di sicurezza del motore.

Steve sta ancora lavorando alla conversione delle pagine HTML, lavoro che so essere molto lungo e oneroso. Consiglio ogni tanto di passare a dare un’occhiata alla nuova versione del sito e segnalare eventuali imprecisioni ai gestori, aiuto sempre apprezzato da chi tiene alla qualità dei contenuti di ciò che pubblica.

Apple e Dovecot

Questa mattina nella lettura delle varie mailing list che seguo ho trovato una piacevole sorpresa.

Michael Abbott di Apple ha postato un messaggio nella mailing list di Dovecot in cui annunciava la disponibilità di Apple a contribuire al progetto con alcune patch sviluppate al suo interno e già verificate.

Negli ultimi tempi Apple non è stata un esempio di apertura come tecnologie e piattaforme, ma mi sembra corretto segnalare un comportamento meritevole quando questo si verifica. Troppo spesso le ditte approfittano del software Open Source per ridurre tempi e costi di sviluppo senza, però, attenersi alle regole di questo tipo di distribuzione, ovvero senza contribuire a loro volta ai progetti che sfruttano. L’ultimo esempio di questo comportamento poco corretto sarebbe rappresentato da CISCO (la giustizia americana deciderà), contro cui la FSF ha intentato una causa.

Tornando ad un esempio di comportamento meritevole, Apple ha offerto di contribuire al progetto Dovecot con varie migliorie, quali:

  • permettere ai processi IMAP e POP di gestire client multipli;
  • code di ascolto più lunghe;
  • modifiche per permettere la compilazione su varie piattaforme;
  • sistemi per aggirare bachi noti di OSX;
  • varie correzioni a bachi del software;
  • integrazione con Apple Open Directory;
  • implementazione di un sistema che blocca i client dopo vari ripetuti tentativi di accesso falliti;
  • gestione dei cambiamenti dinamici degli hostname.

Timo Sirainen, l’autore di Dovecot, hamostrato molto interesse per l’offerta di Apple. Con ogni probabilità, le correzioni dei bachi verranno implementate nella versione corrente, 1.1, mentre le nuove caratteristiche verranno aggiunte alla nuova versione 1.2 in fase di sviluppo.

Collaborazioni di questo tipo tra aziende e progetti Open Source ce ne sono molte e sono l’esempio che un modello di sviluppo del software di questo tipo, quando le circostanze lo permettono, non solo è possibile, ma è anche vantaggioso per tutti.

HyperTrek

HyperTrekPiccolo spazio pubblicità.

In agosto ho aggiornato il motore di HyperTrek, che ora è alla versione 2.0. La novità più evidente è il cambio della grafica standard: ho voluto un po’ decostruire l’interfaccia e togliere filetti, sfondi, retini e ammennicoli vari, vuoi perché oramai ce ne sono troppi nei siti, vuoi perché spero che una grafica così leggera sia più fruibile dai dispositivi portatili. La nuova grafica è figlia dell’uso massiccio di DIV e SPAN al posto delle tabelle, che sono state ridotte al minimo indispensabile. Le immagini della nuova grafica sono opera del vulcanico Sat’Rain, impagabile collaboratore del sito. Questa scelta mette a disagio chi usa ancora Internet Explorer 6, ma spero che gli utenti di questo browser pieno di vulnerabilità note a tutto il mondo aggiornino velocemente il loro programma.

L’altra novità è l’introduzione delle skin, ovvero la possibilità di cambiare aspetto dell’interfaccia in tempo reale. Sat’Rain ha disegnato a tempo di record una skin per i nostalgici conservatori amanti della vecchia grafica del sito. e probabilmente altre sono in arrivo. Rimanete sintonizzati.

La pagina delle news è finita nel riciclatore dei byte perché non ricade negli scopi di HyperTrek quello di fornire notizie dell’ultim’ora. Al suo posto ho creato un aggregatore di notizie che controlla ogni ora vari feed RSS dedicati a Star Trek e riporta le ultime notizie sulla pagina principale del sito. Questa soluzione asincrona (il task che scarica e analizza i feed RSS non è quello che visualizza le pagine) permette di eliminare la noiosa attesa che si aveva con la versione precedente quando la pagina di apertura del sito era rallentata dal caricamento delle notizie di altri siti.

Noterete anche che è sparito il parametro ndx dall’URL delle pagine del sito. Nella nuova versione l’indice da visualizzare viene gestito attraverso una sessione PHP. Questo permette di uniformare i link anche a favore dei motori di ricerca. Sempre in tema di uniformità, tutti i link che hanno come destinazione hypertrek.org vengono rediretti su hypertrek.info.

Messaggi di errore

BSOD durante la cerimonia di apertura delle Olimpiadi (fonte: Gizmodo)Si dice che ogni programma non banale contenga almeno una variabile, una struttura di controllo e un baco. Si dice anche che per i programmi prodotti da una ben nota software house questa affermazione sia più vera che per altre software house.

Nei tempi eroici del Clipper ero membro di un gruppo di sviluppatori che lavorava per un progetto per la pubblica amministrazione. Lo sviluppatore leader del gruppo, da cui ho imparato moltissime cose, aveva creato anche una fantastica routine di gestione degli errori, molto informativa e utile per il programmatore che mostrava una bella schermata rossa con caratteri gialli al manifestarsi dell’errore. Questa funzione manda in visibilio lo sviluppatore perché si accorge all’istante dell’errore anche se è lontano dallo schermo e presenta a schermo una reportistica dettagliata. Tutto bene, finché l’applicativo non entra in contatto con quella particolare zona del Mondo degli Utenti nota come Anteprima Per Il Committente. Murphy, sempre all’erta, ci mette lo zampino e si manifesta un bug durante la demo. Fortunatamente la cosa si risolve con un’abile prestidigitazione sulla tastiera (il Committente manco si accorge di cosa sia successo), ma ci insegna una cosa: gli errori fatali non devono annunciare a oves, boves et universa pecora il fatto che ci sia un baco nel nostro software. Mai.

Peggio ancora quando la grafica della schermata di errore diventa nota tanto quanto il brand del software in oggetto. Ulteriormente peggio quando questa schermata è visibile nel momento culminante della cerimonia di apertura delle Olimpiadi.

Gli errori fatali (o exception, o abend o il nome scelto dalla piattaforma che preferite) non sono mai semplici da gestire perché sono situazioni in cui il processore e/o il sistema operativo si trovano in una condizione tale per cui è impossibile continuare e l’unica soluzione consiste nel riportare la macchina ad uno stato noto (reset, per gli amici). In queste situazioni il sistema operativo non si può permettere molti lussi, quindi bisogna eliminare ogni fronzolo, informare l’utente e dirgli con belle parole «Devi spegnere e riaccendere perché è successo un grosso casino. Ah! Se non hai salvato, hai perso quel che stavi facendo».

La chiosa di questo sproloquio è quindi: possibile che Redmond in 14 anni di commercializzazione del kernel di NT (e discendenti) non abbia pensato a qualcosa di meno riconoscibile per le schermate di errore fatale?

Aggiornamento 25/Set/2008: Technologizer ha pubblicato un articolo sui 13 più famosi messaggi di errore dei computer: vale la pena dare un’occhiata.