itaeng

Blog

Pubblicato in:ubuntu segnalazioni

Come avere il kernel aggiornato sulle distribuzioni debian compatibili

19OTT2012

Avere un kernel sempre aggiornato, su distribuzioni compatibili con debian ed ubuntu, è molto semplice grazie ai pacchetti che si possono trovare qua:

http://kernel.ubuntu.com/~kernel-ppa/mainline/

E' necessario entrare nella directory del kernel desiderato e scaricare i pacchetti compatibili con la propria architettura (i386 per i processori 32bit o amd64 per quelli a 64bit). Una volta scaricati, sarà sufficiente metterli in un'unica cartella ed installarli con

	dpkg -i *.deb

Il tutto è chiaramente molto semplice, anche troppo... un utente inesperto o alle prime armi dovrebbe evitare cose di questo tipo, perchè non è detto che vada tutto a buon fine e che non ci siano incompatibilità con altre librerie.

Se volessi invece testare un kernel in fase di sviluppo, esiste anche una directory "daily", con i kernel aggiornati giornalmente... In questo caso, aspettati qualche problema :)

Pubblicato in:ubuntu trucchi

Rimuovere tutti i kernel inutilizzati su debian, con un solo comando

19OTT2012

Ecco un comodo comando che serve a cancellare, con una sola linea di codice, tutti i kernel inutilizzati sulla propria linux box:

sudo apt-get remove $(dpkg -l|egrep '^ii  linux-(im|he)'|awk '{print $2}'|grep -v `uname -r`)

Con ubuntu si può fare da interfaccia grafica, da ubuntu tweak... ma così è ancora più comodo no?

Pubblicato in:js segnalazioni

Scrivere un semplice accordion con jQuery

08AGO2012

Mi è recentemente capitato di dover utilizzare un accordion per un semplice menu, con poche voci, per cui non volevo utilizzare jquery-ui o plugin simili. In giro è pieno di articoli che spiegano come creare un accordion ma, vista la facilità con cui si può realizzare una cosa simile, volevo provare a cimentarmi io stesso e soprattutto volevo imparare a creare un plugin, cosa che non ho mai provato a fare.

Il risultato si può vedere su jsFiddle (un ottimo tool per esperimenti di questo tipo) a questo indirizzo: http://jsfiddle.net/WpAXA/.

Analizziamo quello che ho fatto. Tralascio la parte di Html e di Css, che sono davvero banali e mi concentro sul codice javascript:

(function($) {
    $.fn.tinyAccordion = function(options) {

    }
})(jQuery);

Questo è il wrapper che ci permette di creare il nostro plugin. Sfruttando questo, posso eseguire la funzione lanciandola in questo modo:

$('#accordion').tinyAccordion({
    'bookmark': 'h3',
    'content': 'ul'
});

Come hai visto, ho passato delle opzioni che sono 'bookmark' e 'content', rispettivamente per indicare quale elemento deve essere la parte cliccabile dell'accordion (i tag h3) e quali parti devono essere visualizzate o nascoste, a seconda di cosa clicco (i tag ul). Come fare per dire alla mia funzione "Hey! Ti ho passato delle opzioni, usa quelle!", e come fare se invece non le avessi specificate? Ci pensa questo pezzetto di codice:

// valori di default
var config = {
    'bookmark': 'h3',
    'content': 'div'
};
$this = this.selector;
if (options) $.extend(config, options);

In particolare, nella variabile config imposto i valori di default (quelli che verrebbero utilizzati nel caso in cui non li avessi specificati io), mentre l'ultima riga "unisce" gli array delle due variabili. Naturalmente quelle specificate a mano hanno la priorità sulle altre.

E la penultima riga? Quella mi serve per impostare in una variabile qual è il nome dell'elemento per cui deve essere eseguita questa funzione (#accordion, nel mio esempio).

bookmark = $($this + " " + config.bookmark);
content = $($this + " " + config.content);

Come prima, anche qua ho creato delle variabili per sapere su quali elementi devo agire. In particolare, quando javascript eseguirà questo blocco le variabili avranno come valore rispettivamente $("#accordion h3") e $("#accordion ul").

var i = 1;
bookmark.each(function() {
    $this = $(this);
    $this.attr("data-accordion-switch", "el" + i);
    $this.next(config.content).attr("data-accordion-list", "el" + i);
    i++;
});

Gli ultimi preparativi prima del via. In questo blocco cerco tutti gli elementi che corrispondono alla variabile bookmark (te lo ricordo, è $("#accordion h3")), e per ognuno creo un attributo data. Lo stesso valore viene utilizzato per il rispettivo contenuto. Questo serve per creare una corrispondenza fra un bookmark e ciò che dovrà visualizzare o nascondere.

bookmark.on('click', function() {
    $this = $(this);
    var element = $(config.content + '[data-accordion-list="'+ $this.data('accordionSwitch') +'"]');
       
    content.slideUp('fast');
    if (element.is(":hidden")) {
        element.slideDown('fast');
    }
});

Ora viene il bello: il blocco precedente è quello che si occupa di aprire o chiudere i contenuti in base al bookmark che hai cliccato. Tutto li? Tutto li!

La prima riga crea una funzione che viene lanciata ogni volta che clicco su un bookmark. Subito dopo, avrai notato che inizializzo una variabile $this. Di nuovo? Non sono impazzito: questa variabile mi serve solo all'interno di questa funzione (ed esiste solamente li) ed ha uno scopo ben preciso che non è solo la comodità come nel caso precedente: Non tutti sanno, infatti, che ogni volta che utilizzi $(elemento) viene eseguita una funzione di jQuery che scorre il DOM per trovare il riferimento all'elemento corrispondente. Se invece metto il riferimento stesso in una variabile, risparmio questo lavoro al processore. Detto in linguaggio più umano: sfruttare questa tecnica è come creare un indice ad un libro, permettendo al lettore di trovare immediatamente quello che serve senza dover scorrere tutte le pagine. In realtà la differenza in termini di tempo è piccolissima perchè i computer odierni sono veloci, ma è una buona abitudine usare questa tecnica tutte le volte che si può.

Proseguiamo: alla terza riga creo una variabile che, una volta eseguita, avrà un valore simile a $("#accordion ul[data-accordion-list=el1]"). Questo è il selettore del blocco che corrisponde al bookmark che ho cliccato.

Successivamente, eseguo uno slideUp su tutti i contenuti e, se l'elemento selezionato era nascosto al momento deli click, lo faccio visualizzare, se invece era già visualizzato lascio che la funzione precedente lo faccia chiudere.

Ecco l'accordion!

Forse hai notato che prima di chiudere la funzione c'è un 

return this;

Questo non è fondamentale nel nostro esempio, ma è un'altra di quelle cose che è buona norma inserire, quando possibile. Serve infatti a concatenare altre funzioni successivamente alla nostra. Per farti un esempio, parlo di concatenazioni tipo 

$('#accordion').tinyAccordion().azione().altrazione().css(...)

Non è poi così complicato creare un plugin che implementi un accordion, vero?

Pubblicato in:php trucchi

Disabilitare gli errori "deprecated" delle vecchie versioni di cake su php 5.3

28FEB2012

A volte capita di dover mettere mano a vecchi siti sviluppati su cakephp 1.2, e spesso ci si inciampa in noiosi errori "deprecated" dovuti alla differenza di versione di PHP (cakephp 1.2 era scritto per php4, pur girando anche su php5, mentre cakephp 2.0 gira solo su php5.3).

Dopo essere diventato matto per capire come nascondere quei messaggi ho trovato una soluzione che credo sia la migliore, se non altro per la comodità: aggiungere una piccola istruzione in cima al file ./index.php che spieghi a php che gli errori di quel genere deve ignorarli:

if(defined('E_DEPRECATED')) {
	error_reporting(E_ALL & ~E_DEPRECATED);
}
Beh... funziona!
Pubblicato in:cakephp trucchi

Preparare i file .po per tradurre un sito fatto in cakephp

15FEB2012

Recentemente mi è capitato di dover tradurre tutte le stringhe di un sito scritto in CakePHP, ma solo in inglese. Un autentico lavoraccio visto che il sito aveva una miriade di pagine e di funzionalità.

Dalla mia c'era il fatto, e chi usa CakePHP lo sa, che gli strumenti che questo fantasmagorico framework offre sono infiniti.

Fortunatamente il sito era già predisposto per la traduzione, quindi bastava preparare il file .po ed inserirvi le traduzioni. Lo strumento di cui mi sono servito, anche questa volta, è la potentissima console di CakePHP, che con il comando

/var/www/ilmiosito/app$ ./Console/cake i18n

ha cercato (da sola!!) tutte le stringhe traducibili in tutte le sottodirectory dell'applicazione "ilmiosito" (quelle scritte in modo simile a __('Traducimi', true), per intenderci) ed ha salvato il tutto, comodamente, nella directory ./app/Locale nella forma di un file con sintassi gettext, cioè qualcosa di simile a questo:

msgid "Translate me"
msgstr "Traducimi"

... naturalmente, inserire la traduzione nella stringa msgstr rimane compito di chi scrive, non tutto è così automatizzato :)

Comodo, no?