Tag: web

Internet non è il WEB

Ogni giorno sento e leggo persone fare confusione tra “internet” e “web”. Usano il termine “internet” mentre intendono il Web, inconsapevole orribile sineddoche.

Eppure non è un concetto difficile: internet è una rete sulla quale si basa il sistema Web.

State parlando di siti? Allora “web”. State parlando di Facebook? Allora “web”. State parlando di servizi in rete in genere? (email, web, ftp)? Allora “internet”.

La colpa è anche, tremendamente, delle pubblicità fatte male e approssimative. Gli operatori telefonici ti fanno l’offerta per “email e internet” a 20€ al mese.

Mi fa rabbia, potentemente rabbia; l’ignoranza che tutto schiaccia e che non presuppone errori. Se fai notare l’errore ti prendono per scemo (“Ma tanto è uguale, ma tanto hai capito lo stesso, ma tanto… chi se ne frega”).

E no, non vale neanche il discorso “il linguaggio cambia”, perché qui si stanno confondendo termini che in ambito specifico (il mio lavoro, per esempio), hanno significati diversi e tali significati devono rimanere distinti perché stiamo parlando di COSE diverse.

Per cui, per favore, prima di dire “internet” tra un “LOL” e un “Facebook”, pensateci un momento.


Inizializzazione delle variabili JavaScript con l’operatore ||

Il JavaScript permette l’operazione di inizializzazione delle variabili utilizzando l’operatore logico ||. Pur essendo molto comodo, occorre prestare molta attenzione a come lo si usa. Vediamo qualche esempio.

Questa sintassi è utilizzata talvolta in concomitanza con un’altra caratteristica del linguaggio, ovvero quella di non avere una sintassi esplicita per i valori di default dei parametri delle funzioni; in JavaScript, infatti, TUTTE le funzioni sono a numero di argomenti variabile.

In tale contesto il test che si può effettuare è il seguente

foo();

function foo(bar) {
  bar = bar || "test";
  alert(bar);
}

In tal caso vedremo ovviamente un bel alert con “test”.

Purtroppo, e qui sta l’inghippo, l’operatore || è sensibile a tutto ciò che in JavaScript è falsy o truthy, ovvero a tutti quei valori che l’inteprete in fase di test di un’espressione riduce al valore booleano true o false.

foo();
foo(false);
foo(0);
foo(null);
foo("");
function foo(bar) {
  bar = bar || "test";
  alert(bar);
}

In tutti questi casi vedremo spuntare un bel “test” nel messaggio di alert, e probabilmente non è esattamente quello che intuitivamente ci saremmo aspettati.

Se vogliamo fare un test robusto per la presenza o meno del nostro parametro, allora occorre ricorrere al classico (meno elegante e un po’ cervellotico):

function foo(bar) {
  if (typeof bar == 'undefined') {
    bar = "test";
  }
  console.log(test);
}

Da notare una piccola perversione: nel caso in cui “bar” non venga passato (e sia dunque “undefined”), l’inteprete avrà comunque definito il simbolo “bar” per lo scope locale della funzione e non come simbolo globale

Test effettuati su FF 3


PHP ip2long() madness

Capita abbastanza spesso di dover salvare un indirizzo IP in una tabella di database. La teoria e la pratica insegnano quanto sia meglio salvare non la string CHAR(15) dell’IP, ma la sua rappresentazione numerica (si salva spazio, le ricerche sono più pratiche, gli indici velocissimi).

Si dà il caso, poi, che sia MySQL che PHP abbiano delle funzioncine proprio adatte allo scopo. Rispettivamente INET_NTOA, INET_ATON e long2ip() e ip2long(). PostgreSQL ha addirittura un tipo di dato specifico, se non erro.

Il problema è che nei sistemi a 32bit la funzione PHP ip2long() ritorna un intero SIGNED, spesso negativo, mentre nei sistemi a 64bit torna sempre un UNSIGNED.

Se di questa cosa non te ne accorgi, avrai fatto la colonna della tua tabella come normale INTEGER (dunque SIGNED) e tutti i tuoi test funzioneranno alla grande.

Poi passi in produzione a 64bit e la tabella si riempirà di valori molto vicini a 2^31 (ovvero 127.255.255.255).

Soluzione: il campo della tabella lo devi fare INT(11) UNSIGNED e in tabella dovrai sempre scrivere il valore UNSIGNED; per fare questo, un sistema è usare qualcosa come $ip = sprintf(‘%u’,ip2long($ip)) o qualcos’altro di più veloce con l’operatore shift (mai programmato videogiochi, mai preso confidenza con ‘ste robe arcane);

Nota numero uno: INTEGER UNSIGNED e basta mi pare crei un INT(10), non sufficiente. Meglio specificare INTEGER(11) UNSIGNED.

Nota numero due: usare BIGINT non è consigliabile, perché le INET_* non funzionano con quel tipo di dato.


I contenuti di questo sito sono distribuiti con una licenza Creative Commons 2.5 eccetto dove diversamente specificato.

Tema WordPress Punto5 sviluppato da Claudio Cicali; icone del set famfamfam silk e komodomedia.

© 2005-2010
Claudio Cicali