Pietro Toniolo

2007-07-26

Strano comportamento di IE7/javascript

Filed under: Software — ptoniolo @ 12:10:08

Su un’applicazione web su cui stiamo lavorando è capitato un errore che può forse far trasparire il meccanismo di funzionamento interno di ie7 nei confronti del codice javascript.

In pratica, una pagina asp.net generava codice html con alcuni blocchi di codice da eseguirsi client-side tra i tag <script>;</script>;. Uno di questi blocchi faceva riferimento ad un oggetto del DOM che nel frattempo era stato fatto sparire. La riga con l’errore diceva qualcosa come:

document.getElementById(“btnChiudi”).click()

e, malgrado quella riga fosse all’interno di un blocco try/catch, il risultato era una messagebox con il messaggio:

Microsoft JScript runtime error: Object doesn’t support this property or method

Il problema era proprio che il bottone btnChiudi era sparito dalla pagina. Ma io mi sarei aspettato che l’errore mandasse l’elaborazione nel ramo catch, invece che buttare fuori una messagebox. Questo è già strano di suo.

Un’altra cosa molto strana è che l’errore viene segnalato su quella pagina .aspx, ma la riga dell’errore era indicata come “42”. Il punto è che, alla riga 42 di quella pagina, anche andando a vedere il codice ricevuto proprio dal browser IE7, quindi andandolo a pescare dalla cache, non c’è nessun codice javascript. Ma… stranamente, se si prendono in considerazione le sole righe della pagina che si trovano tra i tag script, la riga incriminata è proprio la 42! Per questo motivo tra l’altro abbiamo fatto molta fatica a capire quale fosse esattamente l’errore che si presentava. La pagine infatti è modale, e IE non ha gli stessi strumenti di debugging di Firefox!

Apparentemente questo sembrerebbe indicare due cose:

  1. IE7, quando elabora una pagina web, trasferisce il codice javascript in uno “spazio” virtuale, una sorta di pagina code-behind, che contiene il solo codice. Il rendering grafico/html/css della pagina a questo punto viene fatto sul codice html originale, ma l’invocazione di codice dinamico client-side agisce su questa pagina virtuale. Sembra che i tecnici della Micro$oft si siano “dimenticati” di rimappare i numeri di riga per i messaggi di errore, come viene fatto dalle direttive di precompilazione #line del classico c-compiler.
  2. Sembra che alcuni errori siano prodotti in una fase di “compilazione” precedente all’esecuzione vera e propria. Il contesto in cui avviene questa compilazione non tiene conto di eventuali blocchi try/catch. In questo caso il metodo click() veniva evidentemente validato (fallendo) in questa fase di pre-compilazione, mentre avrebbe dovuto generare un errore a run-time, trappato dal successivo blocco catch.

Non posso essere sicuro che l’interpretazione dei fatti che ho esposto rappresenti veramente quello è che effettivamente successo “nella pancia” di IE7, ma gli indizi sembrerebbero portare proprio in quella direzione…

2006-10-12

Orologio del NIST

Filed under: Software — ptoniolo @ 19:52:57

Tutte le volte che devo regolare a mano il clock del PC vado a cercare il sito del Galileo Ferraris, ma è scomodo, e richiede un refresh manuale.

Ebbene, sul sito del NIST, ho trovato questa pagina per l’ora legale, estiva, e quest’altra per l’ora solare, quella invernale.

In pratica i parametri sono il codice della timezone, una lettera per dst o standard, le ore di delta e “java” perché esegua un applet con l’aggiornamento continuo, altrimenti dovete fare il refresh a mano, come con il Galileo Ferraris. Cambiando i parametri potete facilmente vedere le altre timezones.

Oracle DB: unique index su colonne nullable

Filed under: Oracle, Software — ptoniolo @ 19:49:21

Stavo verificando il comportamento di Oracle nel caso di unique indexes su colonne nullable, e finalmente ho capito qual è la logica. Io non la sapevo, e quindi vi rendo partecipi.

Questo brano viene dal Database Concepts della 9.2:

Indexes and Nulls
NULL values in indexes are considered to be distinct except when all the non-NULL values in two or more rows of an index are identical, in which case the rows are considered to be identical. Therefore, UNIQUE indexes prevent rows containing NULL values from being treated as identical.
This does not apply if there are no non-NULL values—in other words, if the rows are entirely NULL.

In pratica il senso è questo. Viene verificata l’unicità dei valori, considerando i valori NULL come veri valori, a meno che le colonne non siano tutte nulle, in tal caso l’unicità non viene verificata.

Un esempio è questo. Se si pone un indice unique su due colonne (a,b), ambedue nullabili, Oracle consente di inserire nella tabella tante righe (NULL,NULL), ma una sola riga (1,NULL).

In qualche modo, mi sembra che questo contrasti con il comportamento delle foreign keys composte da più colonne nullable. In quel caso, la validità della fk viene controllata solo quando tutte le colonne della fk sono non-nulle! Questo significa che se la fk è stato-provincia-città, ci si può mettere dentro ITALIA-BAVIERA-NULL anche se la combinazione ITALIA-BAVIERA non è presente in nessuna delle possibili combinazioni della pk cui si riferisce la fk. Questo comportamento non è molto intuitivo… tenetene conto!

2006-10-5

Firefox e Webdings

Filed under: Software — ptoniolo @ 15:59:04

L’altro giorno stavo cercando di fare una form d’esempio per una demo. Mi serviva visualizzare un prototipo di quello che chiamo N2M, cioè quelle form che consentono di scegliere un insieme di valori spostandoli tra due liste, a destra e a sinistra, con dei bottoni in mezzo, delle freccine.

La soluzione da cui ho preso il modello era stata implementata per Internet Explorer, e per le bitmap dei bottoni usava i caratteri 3,4,7,8 della fonte Windows Webdings. Sono dei triangoli come quelli dei tasti dei registratori, Play, FastForward, Rewind e, diciamo, Reverse. Comodo avere queste iconcine, bello. Peccato che con Firefox non vengano visualizzati, in nessun modo. Ho provato in tutti i modi, uno style inline, un CSS. Niente da fare. Al posto delle icone vedo sempre i numeri.

Dopo una faticosa ricerca, ho finalmente capito il problema. Firefox è molto W3C-compliant, e quindi il ragionamento che fa è questo: mi chiedi di visualizzare il carattere “8”, ma la fonte Webdings visualizza al posto del carattere “8” una bitmap FastForward, quindi non posso “rendere” il carattere in Webdings; quindi scalo alla fonte di seconda scelta, al limite uso il default.

L’unico modo per visualizzare dei caratteri è quello di recuperare il codice Unicode, ammesso che ci sia. In particolare, i triangolini sdraiati del Play e Reverse ci sono, si trovano tra le Geometrical Shapes dei Code Charts di Unicode, sono i caratteri U+25B6 (▶) e U+25C0 (◀); ma i triangoli doppi del FastForward e Rewind non sono stati messi da nessuna parte delle codifiche Unicode (perché poi…).

L’unico modo valido è quello di renderli come bitmap.

Ci sarebbe però uno sporco trucco, che non consiglio, ma che comunque consente di capire un po’ come funziona il motore di rendering di Firefox, Gecko. Il trucco è spiegato qui, fa riferimento a Mozilla ma si può adattare facilmente a Firefox. In pratica consiste nel dire a Firefox di rispettare il formato dei glifi per la fonte Webdings, aggiungendo la riga:
encoding.webdings.ttf = windows-1252
al file:
%FirefoxProgramFolder%\res\fonts\fontEncoding.properties
Dove %FirefoxProgramFolder% dovrebbe essere qualcosa come:
C:\Program Files\Mozilla Firefox oppure C:\Programmi\Mozilla Firefox

Ho provato, e l’effetto è quello. Ovviamente non è una soluzione portabile. Poi ho comunque rimesso le cose a posto…

2006-08-31

cygwin shell: comando pass

Filed under: Cygwin, Software — ptoniolo @ 18:48:01

Ho definito nel mio bin il comando shell:
pass: d2u | tr '\n' '\0' | xargs -r0 "$@"
che, eventualmente con l’appoggio di questo:
lf: ls -AldF "$@"
consente di gestire elegantemente le situazioni con dei file i cui nomi contengono spazi, cosa purtroppo molto frequente negli ambienti basati su Window$.

Provate per esempio:
type -ap vi | pass lf
o ancora:
type -ap procexp.exe | pass lf
o anche:
cygcheck -l time | pass lf

2006-08-29

exiftool

Filed under: Photo, Software — ptoniolo @ 18:28:21

Ho trovato un’utility niente male per leggere e manipolare in modo massivo gli attributi Exif delle foto. La trovate qui.

Si tratta di un’utility command-line, in pratica uno script Perl. La sintassi dei comandi è mostruosa, ma comunque funziona.

In particolare a me è servita perché ho fatto un paio di cazzate:

  • quest’anno mi sono dimenticato di fare sulla mia Canon S80 il passaggio all’ora legale
  • sono stato in Turchia, che ha un’ora in più dell’Italia, e mi sono dimenticato di sistemare l’ora o di cambiare il tipo di time registrato

Mi sono quindi trovato con alcune foto con un’ora meno di quanto avrebbero dovuto mostrare, altre con due. Sia come data del file, che per le varie date registrate nei tag Exif. Con questo strumento, ho messo le foto di cui cambiare la data in una cartella a parte (per poterle manipolare con *.JPG) e ho emesso questi comandi:

	exiftool -AllDates+=1 *.JPG
	exiftool '-DateTimeOriginal>FileModifyDate' *.JPG


in cui il primo cambia tutte le date dei tag Exif di un’ora in più (per le foto della Turchia ho ovviamente fatto -AllDates+=2). I due comandi dati insieme non funzionano: il secondo comando evidentemente prende il tag DateTimeOriginal prima della variazione! Questo aggiusta le date delle foto (IMG_*.JPG) e anche degli stitch (ST?_*.JPG) ma non le date dei filmati. Non so come faccia la vostra Canon, ma la mia, oltre al file .AVI, aggiunge un file di tipo .THM, che in pratica contiene i tag Exif del filmato, ed è modificabile da exiftool. Quindi se avete filmati si deve dare in pasto al programma anche i file *.THM oltre ai *.JPG, e a questo punto manca solo di cambiare la data del file AVI, cosa che con cygwin si può fare con un comando tipo:

	for i in *.THM
	do
		touch -r $i $(basename $i .THM).AVI
	done


Purtroppo, all’interno dei file avi esiste anche un tag DateTimeOriginal, che non viene modificato, dato che exiftool non può scrivere nei file in formato RIFF, perlomeno non in questa versione…

Un’ultima cosa: se volete distribuire le foto in cartelle con la data, potete farlo anche con exiftool:

	exiftool -P '-Directory<DateTimeOriginal' -d %Y-%m-%d *.JPG


So che ci sono molti modi per fare la stessa cosa, ma questo si può fare a command line, quindi è scriptabile eccetera…

Blog at WordPress.com.