Ultimamente utilizzare Google Docs da Firefox era diventato decisamente un problema: Il messaggio "A browser error has occurred. Please hold the Shift key and click the Refresh button to try again." continuava a comparire non appena caricavo la pagina. Considerando che quasi tutti i miei documenti di lavoro sono ormai memorizzati su questa piattaforma utilissima e gratuita, la cosa cominciava ad essere un problema...
La soluzione però si è rivelata piuttosto semplice: nella barra dell'indirizzo scrivete "about:config", date l'ok al messaggio che vi invita a fare attenzione alle modifiche che andrete a fare, dopodichè utilizzando il filtro dei valori, digitate:
dom.storage.enabled
A questo punto dovreste esser rimasti con un unico valore, di tipo booleano. Se è settato a False fateci un doppio click sopra, ed il valore cambierà in True. Ora se ricaricherete il documento che vi dava problemi dovreste essere in grado di visualizzarlo correttamente.
Se questa soluzione non dovesse funzionare per voi per qualsiasi motivo, poteve usare il link in alto a destra "Old version" per tornare temporaneamente ad una versione del documento che manca della chat e della capacità di vedere in tempo reale le modifiche effettuate sul documento da eventuali collaboratori, ma che non soffre del problema suddetto.
giovedì 15 luglio 2010
Firefox 3.6 ha problemi con Google Docs, ecco come risolverli
mercoledì 14 luglio 2010
Trigger di eventi con Javascript in Internet Explorer
Esistono molti casi in cui può tornare utile far credere al browser che l'utente abbia compiuto una determinata azione. Supponiamo che in una pagina sia stata definita un'azione che viene eseguita soltanto quando l'utente fa qualcosa, ad esempio, muove il mouse sopra un elemento della pagina o preme un determinato tasto della tastiera. Tramite jQuery possiamo definire senza troppa fatica una funzione che verrà eseguita, ad esempio, ogni qual volta l'utente rilasci (dopo aver premuto) il tasto invio mentre ha il focus in un ipotetico elemento con id "inputId":
Ora, la questione è: cosa succede se per qualsiasi motivo vogliamo che avvenga quanto abbiamo definito come gestore evento per questo evento particolare, ma senza che l'utente debba effettivamente compiere l'azione ad esso associata?
Sempre jQuery ci viene in aiuto, grazie al metodo trigger(), che permette di eseguire le azioni associate all'evento sul, o sugli, elementi selezionati, ad esempio:
il problema, però, è che questo metodo funziona benissimo su qualsiasi browser recente, fatta eccezione per Internet Explorer. Cercando un pò in giro, ho trovato questo utile plugin di jQuery:
http://updatepanel.net/2009/07/09/jquery-fire-event-plugin/
che permette di ovviare al problema manifestato in Internet Explorer. Per le mie necessità ho avuto bisogno di modificarlo leggermente: avevo bisogno di poter personalizzare le proprietà dell'oggetto evento generato dal plugin, prima di farlo propagare al/agli elementi selezionati dall'oggetto jQuery.
Questo il codice del plugin con le mie modifiche:
Che si può poi utilizzare in questo modo per ottenere l'effetto che ci eravamo prefissi all'inizio dell'articolo, ma questa volta ottenendo anche la compatibilità in Internet Explorer (testato in IE8):
$( "#inputId" ).bind( "keyup", function (e)
{
var keyPressed = event.keyCode;
// 13 è il codice che corrisponde al tasto invio;
// è possibile conoscere facilmente il codice di ciascun tasto
// stampando nella console di firebug il valore della variabile keyPressed:
if( console && console.log ) console.log("Premuto tasto con codice: " + keyPressed);
if( keyPressed == 13 )
{
// fai qualcosa se è stato premuto e poi rilasciato il tasto invio
}
});
Ora, la questione è: cosa succede se per qualsiasi motivo vogliamo che avvenga quanto abbiamo definito come gestore evento per questo evento particolare, ma senza che l'utente debba effettivamente compiere l'azione ad esso associata?
Sempre jQuery ci viene in aiuto, grazie al metodo trigger(), che permette di eseguire le azioni associate all'evento sul, o sugli, elementi selezionati, ad esempio:
$( "#inputId" ).trigger( {type: "keyup", keyCode: 13} );
il problema, però, è che questo metodo funziona benissimo su qualsiasi browser recente, fatta eccezione per Internet Explorer. Cercando un pò in giro, ho trovato questo utile plugin di jQuery:
http://updatepanel.net/2009/07/09/jquery-fire-event-plugin/
che permette di ovviare al problema manifestato in Internet Explorer. Per le mie necessità ho avuto bisogno di modificarlo leggermente: avevo bisogno di poter personalizzare le proprietà dell'oggetto evento generato dal plugin, prima di farlo propagare al/agli elementi selezionati dall'oggetto jQuery.
Questo il codice del plugin con le mie modifiche:
$.fn.fireEvent = function(eventType, properties)
{
var e = function(a, b)
{
for(var p in b)
{
a[p] = b[p];
}
return a;
};
if( ! properties )
{
properties = {} ;
};
return this.each(function()
{
if (document.createEvent)
{
var event = document.createEvent("HTMLEvents");
event.initEvent(eventType, true, true);
event = e(event, properties);
return !this.dispatchEvent(event);
}
else
{
var event = document.createEventObject();
event = e(event, properties);
return this.fireEvent("on" + eventType, event);
}
});
};
Che si può poi utilizzare in questo modo per ottenere l'effetto che ci eravamo prefissi all'inizio dell'articolo, ma questa volta ottenendo anche la compatibilità in Internet Explorer (testato in IE8):
$("#inputId").fireEvent( "keyup", {keyCode:13} );
mercoledì 12 maggio 2010
Kubuntu e la finestra "Nuovo dispositivo"
Quando colleghiamo al sistema un nuovo dispositivo in Kubuntu, questo ci mostra una finestra popup dove è possibile scegliere un'azione, come aprire in Dolphin, mostra immagini, e così via. Una delle opzioni a disposizione è "Non fare nulla". Se scegliamo questa opzione, e in più, clicchiamo sulla checkbox "Esegui sempre azione selezionata", tutti i dispositivi dello stesso tipo di quello appena collegato verranno da ora in avanti ignorati dall'automounter.
Cosa succede a livello di file system, e come evitare questo comportamento?
La risposta è in un file nella vostra home directory: ~user/.kde/share/config/medianotifierrc
il contenuto del file suddetto è il seguente:
[Auto Actions]
media/cdwriter_unmounted=#NothinAction
cdwriter_unmounted è, come dicevo prima, il tipo di dispositivo. Nel mio caso si trattava di una "specie" di chiavetta usb, quindi la dizione cdwriter_unmounted non è proprio corretta, ma per fortuna... avevo bisogno di escludere soltanto quel particolare dispositivo dall'automounting!
Comunque sia, se mai avrò bisogno di ripristinare l'automounting per questo tipo di dispositivo, sarà sufficiente rimuovere il file in questione dalla mia home dir o, in alternativa, rimuovere la riga incriminata et voilà, automounting ripristinato.
Cosa succede a livello di file system, e come evitare questo comportamento?
La risposta è in un file nella vostra home directory: ~user/.kde/share/config/medianotifierrc
il contenuto del file suddetto è il seguente:
[Auto Actions]
media/cdwriter_unmounted=#NothinAction
cdwriter_unmounted è, come dicevo prima, il tipo di dispositivo. Nel mio caso si trattava di una "specie" di chiavetta usb, quindi la dizione cdwriter_unmounted non è proprio corretta, ma per fortuna... avevo bisogno di escludere soltanto quel particolare dispositivo dall'automounting!
Comunque sia, se mai avrò bisogno di ripristinare l'automounting per questo tipo di dispositivo, sarà sufficiente rimuovere il file in questione dalla mia home dir o, in alternativa, rimuovere la riga incriminata et voilà, automounting ripristinato.
Blogger: Il dilemma della formattazione del codice
Il primo problema che un programmatore deve affrontare nel momento in cui decide di tenere un blog dove pubblicare le scoperte di ogni giorno è sicuramente quello relativo alla formattazione del codice: senza uno strumento appropriato, è impossibile inserire codice sorgente in una pagina web senza che si perda la formattazione originale.
Su questa pagina: http://www.craftyfella.com/2010/01/syntax-highlighting-with-blogger-engine.html ho trovato un interessante strumento adatto alle mie esigenze. Proviamolo con uno stralcio di codice preso dalla test suite delle API di Facebook per PHP:
Blocco 1
Ottimo, sembra funzionare! Ma come? stando al post linkato sopra, è sufficiente inserire nel template di default di Blogger alcune righe di codice, prima del tag </head>:
Blocco 2
Come potete vedere, oltre a mostrare il codice in modo molto più leggibile, in alto a destra vi vengono anche offerte alcune utili feature extra: un pulsante che permette di copiare il codice direttamente, senza doverlo selezionare a mano dalla pagina (l'effetto è ottenuto tramite uno script flash, quel clipboard.swf che viene richiamato nella penultima riga del blocco 2. Un altro pulsante vi permette di aprire una finestra con il codice senza formattazione, un terzo, vi permette di stampare solo lo spezzone di codice. Piuttosto utile, che ve ne pare? Per ulteriori informazioni, visitate il sito ufficiale di SyntaxHighlighter: http://alexgorbatchev.com/wiki/SyntaxHighlighter
Un'ultimo accorgimento: se nel codice che volete inserire sono presenti caratteri come il segno di minore o di maggiore, ci sono buone probabilità che non verranno mostrati nella pagina. Come fare in questo caso? Ci sono varie possibilità, una è utilizzare un servizio come http://www.opinionatedgeek.com/dotnet/tools/htmlencode/Encode.aspx, gli passate il vostro codice e ve ne restituisce una versione in cui tutti i caratteri che hanno corrispondenti entità in html sono stati sostituiti. Un'altra, la mia favorita: potete utilizzare php direttamente da riga di comando, dopo aver salvato il codice che volete mostrare in un file, ad esempio code.tmp:
Blocco 3
Su questa pagina: http://www.craftyfella.com/2010/01/syntax-highlighting-with-blogger-engine.html ho trovato un interessante strumento adatto alle mie esigenze. Proviamolo con uno stralcio di codice preso dalla test suite delle API di Facebook per PHP:
Blocco 1
public function testIgnoreDeleteSetCookie()
{
$facebook = new Facebook(array(
'appId' => self::APP_ID,
'secret' => self::SECRET,
'cookie' => true,
));
$cookieName = 'fbs_' . self::APP_ID;
$this->assertFalse(isset($_COOKIE[$cookieName]),
'Expect Cookie to not exist.');
$facebook->setSession(null);
$this->assertFalse(isset($_COOKIE[$cookieName]),
'Expect Cookie to not exist.');
}
Ottimo, sembra funzionare! Ma come? stando al post linkato sopra, è sufficiente inserire nel template di default di Blogger alcune righe di codice, prima del tag </head>:
Blocco 2
<link href='http://alexgorbatchev.com/pub/sh/current/styles/shCore.css' rel='stylesheet' type='text/css'/>
<link href='http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css' rel='stylesheet' type='text/css'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCpp.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCSharp.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCss.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJava.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPhp.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPython.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushRuby.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushSql.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushVb.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushXml.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPerl.js' type='text/javascript'></script>
<script language='javascript'>
SyntaxHighlighter.config.bloggerMode = true;
SyntaxHighlighter.config.clipboardSwf = 'http://alexgorbatchev.com/pub/sh/current/scripts/clipboard.swf';
SyntaxHighlighter.all();
</script>
Come potete vedere, oltre a mostrare il codice in modo molto più leggibile, in alto a destra vi vengono anche offerte alcune utili feature extra: un pulsante che permette di copiare il codice direttamente, senza doverlo selezionare a mano dalla pagina (l'effetto è ottenuto tramite uno script flash, quel clipboard.swf che viene richiamato nella penultima riga del blocco 2. Un altro pulsante vi permette di aprire una finestra con il codice senza formattazione, un terzo, vi permette di stampare solo lo spezzone di codice. Piuttosto utile, che ve ne pare? Per ulteriori informazioni, visitate il sito ufficiale di SyntaxHighlighter: http://alexgorbatchev.com/wiki/SyntaxHighlighter
Un'ultimo accorgimento: se nel codice che volete inserire sono presenti caratteri come il segno di minore o di maggiore, ci sono buone probabilità che non verranno mostrati nella pagina. Come fare in questo caso? Ci sono varie possibilità, una è utilizzare un servizio come http://www.opinionatedgeek.com/dotnet/tools/htmlencode/Encode.aspx, gli passate il vostro codice e ve ne restituisce una versione in cui tutti i caratteri che hanno corrispondenti entità in html sono stati sostituiti. Un'altra, la mia favorita: potete utilizzare php direttamente da riga di comando, dopo aver salvato il codice che volete mostrare in un file, ad esempio code.tmp:
Blocco 3
cat code.tmp |
php -r 'while ($line = fgets(STDIN))$output .= htmlentities($line, ENT_NOQUOTES, "UTF-8"); echo $output;'
Iscriviti a:
Commenti (Atom)