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 variabili.
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
1 year ago
Si sa che i rapporti tra Adobe e Linux sono sempre stati un po’ strani… uno degli effetti collaterali di questo atavico problema sta nel supporto dei vari Flash Player.
Recentemente ho spesso un problema: dopo un po’ che smanetto con il player (frequenti caricamenti di pagine, visto che sto sviluppando un’applicazione flash/ajax) questo dopo due o tre secondi di “play” si pianta.
Ho scoperto che il problema sta banalmente nell’audio; se per qualche motivo il “sottosistema audio” ha dei problemi (non funziona, conflitta, è piantato - le solite problematiche dell’audio sotto Linux), il plugin si comporta in quel modo. Nel mio caso l’inghippo sta nel suspend della macchina… quando questa si riprende, l’audio è sminchiato (problema conosciuto dell’Acer Aspire One - che credevo di aver risolto, e invece…). Logout/Login e va tutto a posto.
Nel frattempo, però (non tutti i mali…), ho avuto modo di trovare una risorsa molto interessante: gli Archived Flash Players, ovvero una directory dove Adobe mantiene tutte le vecchie versioni dei player, dalla 2 alla 10 comprese tutte le sottorelease e tutte le varie architetture (esistono per esempio ben 12 sottoversioni del player 9!).
Una volta scaricato e scompattato l’archivio, per usare una versione piuttosto che un’altra è sufficiente:
- Chiudere Firefox (altrimenti va in crash)
- Copiare la versione che interessa in $HOME/.mozilla/plugins (il file che serve è solo il libflashplayer.so)
- Riavviare Firefox
1 year ago
Oggi ho scoperto che quello che pgpool chiama “parallel query” altri non è che il famigerato shard. Ora mi chiedo: sarà ipotizzabile buttare via MySQL in un Drupal e usare lo sharding sulla tabella dei nodi e delle tassonomie?
Credo che indagherò.
1 year ago
Yet another. E’ pieno, là fuori, di guide all’installazione per cui niente dettagli noiosi. Voglio solo scrivere un po’ quello che ho fatto e che problemi ho avuto
- Ho installato Ubuntu usando la pratica possibilità di creare un device di boot usando una chiavetta USB. Lo si fa direttamente come opzione dal menu “System” di una Live (nota: la chiavetta USB non viene formattata dall’operazione)
- Ho aggiornato il BIOS usando unetbootin per creare un’immagine bootabile di Freedos, sempre usando la chiavetta USB (all’interno della quale ho ovviamente copiato anche i file del BIOS)
- Ho migliorato un po’ il rendering dei font usando questo fonts.conf
- Ho installato i font Microsoft con apt-get install msttcorefonts
- Ho tolto l’idiota blocco sull’asse delle Y delle finestre usando gconfeditor e mettendo a False la chiave /apps/compiz/plugins/move/allscreens/options/constrain_y
- Ho fatto funzionare la scheda Wifi (Atheros 5k) abilitando i backport (basta togliere il commento dalla relativa riga di /etc/apt/sources.list). Poi apt-get install linux-backports-modules-intrepid-generic e infine dalla gestione hardware (System > Administration > Hardware drivers) si disabilita la vecchia e si abilita la 5xxx. A me ha funzionato dopo un paio di reboot (CREDO che l’Acer faccia differenza tra un warm reboot e un cold reboot - ovvero spegni, aspetti un po’, fai ripartire). Qualcuno usa ndiswrapper, ma a me non ha funzionato. Il led non funzionerà comunque (funzionava con il kernel 2.6.24, ora non più)
- Per il sonoro non ho fatto niente e sembra funzionare. Dicono che Skype comunque non vada e occorra aggiornare a mano all’ultima versione di Alsa.
- Ho zittito la ventola usando queste istruzioni (occhio che è necessario avere un BIOS recente e/o modificare a mano il programmino acerfand)
- Il suspend e compagnia bella sembra andare, ma ricordati di configurarlo perché di default quando chiudi lo sportello il power manager fa solo “blank screen”. Inoltre temo proprio che dopo un suspend l’audio smetta di funzionare
- Il video è OK da subito, ma si può migliorare un po’ (vedi questa guida alla voce “VIDEO AND 3D PERFORMANCE”). Occhio che a me una delle opzioni (non so quale, non ho indagato) non mi fa partire X e devo partire in modalità “low resolution”. Quelle che funzionano di sicuro sono Clone, AccelMethod e MigrationHeuristic (nota: se X trova un xorg.conf.restore in /etc/X11 userà quello e non xorg.conf; cancellatelo se rimanete bloccati a bassa risoluzione).
- La webcam fa un po’ schifo ma funziona (apt-get install cheese)
- Il microfono interno non va
- Per salvare un po’ di spazio sullo schermo, ho installato il theme engine Aurora e utilizzo la decorazione per le finestre che si chiama Unity. Aurora te lo devi scaricare ed installare, ma comunque apt-get install gnome-themes-extras non guasta mai. Ah, le icone “Dropline Neu!” sono fighissime.
- Sempre per lo spazio da conquistare, installatevi la preziosa estensione di Firefox “status bar auto hide” e abituatevi a navigare dopo aver premuto F11
Un discorso a parte lo merita il maledetto modem HSDPA della Momo con contratto H3G. Credo di averlo domato e ci ho pure navigato anche se non so se in HSDPA o GPRS (ahi!). Le guide online per farlo funzionare sono praticamente tutte sbagliate, perché con il kernel 2.6.27 il modulo airprime (che tutte dicono di modificare) non esiste più. Il modem comunque viene riconosciuto dai moduli standard e la configurazione di wvdial che si trova a spasso sembra andare bene. Però:
- Il vendor id è corretto (Qualcomm), ma pare che di product id invece ce ne siano a iosa. Il mio è il 0x3100 mentre in tante guide si trova lo 0x6000. Il tuo lo scopri comunque con un lsusb.
- così come viene attivato, il modem pare vada piano, perché viene utilizzato un protocollo non ottimale. Una parziale soluzione (parziale perchè non ci sono dati in giro ma solo voci di corridoio) sembra quella di forzare l’utilizzo del modulo usbserial, passandogli il vendor id e il product id. Qualcosa tipo modprobe usbserial vendor=0x05c6 product=0x3100 . Io non ho ancora provato.
- Pare (pare) che il modulo che attiva il modem non imposti bene i permessi del device /dev/ttyACM0 che è quello che poi serve per parlare con il fottuto modem. Era questo il motivo per il quale cu -l /dev/ttyACM0 non funzionava (no, neanche da root). chmod o+rw al device e finalmente potevo parlare a-tu-per-tu con il modem direttamente con i comandi AT. Per qualche informazione in più su questi comandi, leggi Mario Pascucci che ne sa a pacchi.
- Quella cosa dei permessi, PARE che svegli anche il rincoglionitissimo nuovo NetworkManager di Ubuntu… al successivo riavvio mi ha avvertito del fatto che avevo pronta una connessione broadband… (precedentemente avevo riavviato ALCUNE volte, senza segni di vita)
- Tutte le configurazioni wvdial che si trovano in giro mandano SEMPRE il pin della SIM al modem (AT+CPIN=). Si dà il caso, però, che il mio modem non accetta che tu glielo mandi due volte di seguito (dà ERROR e si ferma il colloquio). Devo capire come girarci intorno (non trovo niente altro che il mitico ATZ per resettarlo, ma CPIN non si resetta).
- Dalla transazione PPP vengono fuori dei DNS che non servono a niente (10.11.12.13 e un altro simile)
Buon divertimento
1 year ago
Quando compilo delle slide, capita spesso che mi occorra inserire del codice (JavaScript, PHP, Python, whatever…) all’interno di esse. Non ho mai capito come fare ad avere quel codice con il syntax highlight. Finora nutrivo una certa invidia per chi riusciva a farlo - probabilmente esiste un sistema di qualche tipo da usare con Keynote. Oggi ho trovato una soluzione veloce per poterlo fare anche con Open Office Impress, il sistema che utilizzo.
Si tratta di una soluzione “aguzza l’ingegno”, niente di spaziale eh. Se qualcuno conosce un sistema migliore, me lo faccia sapere :) (no, l’estensione OOocoder non mi sembra funzionare).
Strumenti:
Come fare:
- Si scrive il codice con il nostro editor preferito. Lo si copia.
- Lo si incolla su Pastie.org e si sceglie il linguaggio e si preme “Paste”
- premi qualche volta ctrl++ per aumentare la grandezza del font, se necessario
- Tasto sinistro sulla iconcina di Screengrab in basso a dx di Firefox. Si sceglie “Copy… -> Selection” (la finestra di Firefox diventa rossastra). Si seleziona la parte con il codice colorato. Rilasciando il tasto del mouse, l’immagine è automaticamente copiata
- Si va in Impress e si fa ctrl-v
Fine :)
1 year ago
Un collega che cura alcuni siti di commercio elettronico nel settore Alta Moda, mi ha raccontato un paio di aneddoti interessanti. Meditate gente, meditate.
- Lancio di un nuovo sito. Un paio di giorni dopo il cliente telefona perché “ci sono problemi”. Sta ricevendo centinaia di telefonate (sono sempre almeno un centinaio) perché le persone non riescono a registrarsi sul sito. Nella form di registrazione, al momento di inserire “Nome utente” e “Password” non sanno quale inserire…
- Altro sito. Viene spedita una newsletter a circa 16000 clienti del Cliente per pubblicizzarne l’apertura. Il giorno dopo il cliente telefona al mio collega perché il sito “non funziona! sta ricevendo centinaia di telefonate!! con questo problema!!!”. Il sito invece funziona benissimo. Il problema, se vogliamo chiamarlo tale, era che la newsletter era stata mandata in formato testo, non in HTML. Il link al sito, dunque, non funzionava se cliccato (a meno di non avere un client furbo). “Se clicco non funziona, allora telefono e mi lamento”.
Darwin, aiutaci tu.
1 year ago
Mi sono piaciute un sacco, e le voglio condividere :)
- Almost dying changes nothing. Dying changes everything. [House]
- I would rather spend my life close to the birds than waste it wishing I had wings [paziente].
- People get what they get. It has nothing to do with what they deserve. [House]
1 year ago
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.
1 year ago