Ecco, questo è il risultato di 2 giorni di testate contro il muro con lightwindow:
Index: public/javascripts/lightwindow.js, line 444
_removeLink:function(removed) {
// remove it from the links array
//
this.links=this.links.reject(function(link) {
if (link==removed.href)
returntrue;
});
// remove it from the gallery links array
//
if (gallery=this._getGalleryInfo(removed.rel)) {
klass=gallery[0];
name=gallery[1];
if (this.galleries[klass] &&this.galleries[klass][name]) {
this.galleries[klass][name] =this.galleries[klass][name].reject(function(link) {
if (link==removed.href)
returntrue;
});
}
}
},
Chiama questa funzione dal tuo template .rjs, qualcosa tipo:
Beh, a quanto pare non ho motivo di essere paranoico per la mia età: so ancora
andare in inline come facevo (ogni giorno) quando ero un po’ più giovane :).
Il primo maggio, festa dei lavoratori, Sam mi ha letteralmente trascinato fuori
di casa, lontano dal computer, e siamo andati a pattinare. È stata una
giornata fantastica, abbiamo pattinato un sacco e scattato delle belle
foto.
Ma quelle davvero belle sono state scattate quando ndstr
ci ha beccati. È di gran lunga il miglior fotografo che tu possa incontrare, e
ovviamente il mio preferito (dai un’occhiata al suo sito!).
Anche lui è stato un pattinatore, quindi sa benissimo come e quando scattare
per tirare fuori il massimo dai tuoi trick :). Eccone due, che ritraggono me e
Sam mentre diamo il meglio!
È stato divertente. Davvero divertente. Grazie Sam per avermi portato fuori di casa :D.
Beh, sono davvero contento di OSX 10.5.2. Anche se non sono uno di quelli che
ha insultato Apple per la barra dei menu traslucida che a tutti fa schifo…
anzi, a me piace. Non mi interessa il tool di TM nella barra dei menu, perché
non ho (ancora) comprato la fighissima Time Capsule, mi piace lo spinner nel
menu Airport e, soprattutto, apprezzo molto gli aggiornamenti al
BluetoothSCOAudioDriver.kext che pilota il mio auricolare bluetooth.
Spotlight sembra anche più veloce ad ogni aggiornamento, e sono un utente
pesante di Spotlight, quindi questo mi rende davvero felice. Grazie ingegneri
Apple!
Ma torniamo al tema: perché odissea? Perché seguendo i miei consigli sulla
batteria,
sono riuscito a far SPEGNERE il mio MacBook2,1 mentre era al 74% della fase
“Scrittura file” del combo update… risultato: un sistema completamente
distrutto, come ogni geek potrebbe immaginare :). Apple aveva aggiornato
alcune librerie, e al riavvio semplicemente niente funzionava, e la console
Darwin era piena di tonnellate di messaggi di errore.
Il tipico fanb^Wutente Apple avrebbe semplicemente archiviato e reinstallato
il sistema, ma ehi, io sono un geek orgoglioso! So per esperienza che le
situazioni di disaster recovery sono le migliori per imparare qualcosa su un
sistema operativo, perché devi aiutare il sistema ad avviarsi, tirando su i
servizi a mano, e trovare un modo per riapplicare il combo update senza usare
la comoda interfaccia Aqua.
Per fortuna, su OSX ogni GUI ha la sua controparte CLI, seguendo le migliori
“linee guida UNIX” di separazione degli interessi e architettura ben
progettata. Inoltre, OSX porta questo approccio un passo avanti, seguendo i
migliori principi di ingegneria del software, dove le funzionalità sono
implementate nei Framework e sia la GUI che la CLI le utilizzano. Ben fatto!
NON lasciare il caricatore collegato quando la batteria è carica, neanche quando vai a dormire.
LASCIA che si scarichi completamente: quando lo usi aspetta che arrivi allo 0%, quando vai a dormire lascialo lì; quando ti sveglierai e lo aprirai, un bel resume da suspend to disk ti darà il buongiorno. OSX FTW.
Monitorala e fai vedere i contatori di performance di OSX ai tuoi amici (immagini per gentile concessione di
CoconutBattery.app e System
Profiler.app)
Mentre installavo allegramente i prerequisiti per compilare un’applicazione su
Solaris 11, ho apprezzato il fatto di
trovare Mercurial già installato nel sistema
base… tranne per un GROSSO problema: la digest authentication era rotta. Ho
fatto un tcpdump del traffico scambiato tra il client Mercurial e il server
CGI e ho visto che non veniva inviato nessun header Authorization, e
ovviamente il server si rifiutava di servire il repository hg.
Prima di reinstallare Python, magari da sorgente e sostituendo l’installazione
di default oppure tenendo affiancate due versioni diverse, con le conseguenti
seccature e sporcizia nel sistema, ho provato un patch davvero minuscolo a
urllib2.py che… con mio divertimento, ha risolto il problema:
Non sono un ca**o di esperto Python (ma il linguaggio è interessante), quindi
non chiedetemi PERCHÉ funziona: ho semplicemente seguito il commento di
add_header che diceva “questo metodo è utile per aggiungere header di
autenticazione” e ho sostituito il metodo unredirected_header con il primo.
Non ho proprio idea del perché con urllib2 di Python2.5 “tutto funziona” anche
con quel metodo; qualcosa deve essere rotto da qualche altra parte. Un diff
tra le due urllib non mi ha dato niente, dovrei davvero imparare Python prima
o poi.
Non ho trovato nessuna informazione googlando parole chiave come «solaris
“http {authorization,authentication}” {urllib2,python} {broken,not working}
mercurial» (shell interpolation intesa), quindi spero che questo post sia
utile a qualcuno ;).
AGGIORNAMENTO: non ti serve questo codice, perché a partire dalla versione 2.2 di Rails il supporto alla localizzazione è integrato.
Localizzazione dei messaggi di errore di Active Record
Oggi ho dovuto rispondere a una delle domande su cui ogni sviluppatore Rails
non anglofono prima o poi inciampa… come localizzare i messaggi di errore di
AR per mostrarli in modo decente a un cliente che non parla inglese ;).
Prima di tutto, grazie all’eccellente plugin gibberish di
defunkt e al modo in cui gli errori di validazione di
AR sono esposti, il compito è stato portato a termine in modo semplice e
pulito, senza mettere troppo le mani negli internals di AR.
Ho cominciato traducendo ogni messaggio di errore predefinito di AR, con questo
file di traduzione in lang/it.yml:
# Active Record errors#ar_accepted: "deve essere accettato"ar_not_a_number: "non è un numero"ar_blank: "è un campo obbligatorio"ar_empty: "è un campo obbligatorio"ar_inclusion: "non è nella lista dei valori validi"ar_too_long: "è troppo lungo (massimo %d caratteri)"ar_exclusion: "è riservato"ar_too_short: "è troppo corto (minimo %d caratteri)"ar_invalid: "non è valido"ar_wrong_length: "è errato, dovrebbe essere di %d caratteri"ar_confirmation: "non corrisponde"ar_taken: "esiste già"# This one is not a default key, but I use it in my validationsar_greater_zero: "deve essere maggiore di zero"
La prima riga imposta semplicemente l’italiano (:it) come lingua predefinita,
l’inject costruisce un nuovo hash error_messages usando Gibberish per
tradurre quelli predefiniti. Ho nominato ogni chiave di errore AR nel mio file
di traduzione con il prefisso “ar_”, per evitare possibili conflitti futuri di
chiavi. Infine, l’array di AR viene sovrascritto con quello appena costruito.
Cinque minuti fa ho sovrascritto il nuovissimo e fiammante foglio di stile CSS
che implementa la combinazione di colori attuale, perché volevo ripristinare
quello originale e metterlo in un nuovo tema per questo sito, così che chi
apprezzava il vecchio tema potesse continuare a usarlo. Ma, come il più
principiante degli amministratori di sistema, ho decompresso i file originali
dall’archivio di backup SOPRA quelli attuali…
Safari in soccorso! Ogni elemento nella cache di Safari è memorizzato in un
database SQLite3 che si trova in ~/Library/Caches/com.apple.Safari,
andiamo a vedere com’è strutturato:
Wow. Impressionante. Ecco perché adoro i prodotti Apple: sono così ben
strutturati che puoi liberamente ispezionarli e usare le loro risorse per
qualsiasi compito imprevisto tu debba completare… anche per rimediare ai tuoi
stessi errori ;). Ed è anche stimolante, perché devi rimboccarti le maniche e
trovare la soluzione esplorando un prodotto software costruito splendidamente.
Per farla breve, ogni URL nella cache è memorizzato nel campo request_key
della tabella cfurl_cache_response, mentre nel campo receiver_data della
tabella cfurl_cache_blob_data ci sono i dati effettivi. Ora possiamo cercare
il foglio di stile CSS del tema bbs che abbiamo sovrascritto: