Archivio

Archivio per 2011

Lion, Apache lento dopo l’aggiornamento

17 ottobre 2011 Nessun commento

Finalmente oggi ho trovato la soluzione ad un problema piuttosto fastidioso che si era verificato con l’aggiornamento  di Lion, una strana, stranissima lentezza del web server apache. Come vedremo non è poi colpa di apache ma all’inizio a me sembrava colpa sua.

Prima di tutto specifico però come è configurato il mio ambiente di sviluppo web, io ho appunto apache come web server per il test in locale dei siti in via di sviluppo ed utilizzo i vitualhost di apache per identificare  siti locali con il suffisso .local, quindi ad esempio ho www.slweb.local. Ho poi nel file /etc/hosts l’indicazione per risolvere www.slweb.local nell’indirizzo ip locale del mac. Quindi per testare la versione locale di questo sito digito sul browser www.slweb.local.

Il file /etc/hosts, durante la risoluzione dei nomi, viene consultato prima del DNS e per questo motivo è molto rapido e soprattutto permette di ignorare il DNS per il TLD .local. Ma vi è un problema, a quanto pare Os X 1.7 utilizza il TLD .local per alcuni servizi bonjur e questo provoca il rallentamento nella risoluzione dei nomi .local contenuti nel file /etc/hosts. Ecco spiegato il motivo per cui ogni volta che richiedevo una pagina .local il web server apache impiegava oltre 5 secondi per rispondere!

Il modo più semplice per ovviare a questo problema è quello di non usare .local per i siti locali ma un’altra estensione come .dev.

Ho cambiato tutti i virtualhost e il file /etc/hosts con .dev al posto di .local e adesso è tutto super veloce, come prima.

Steve Jobs 1955-2011

6 ottobre 2011 Nessun commento

Steve Jobs

Grazie! È tutto quello che posso dirti, grazie per avermi fatto sognare, per avermi fatto divertire e per avermi fatto lavorare.

Creare file di specifiche dimensioni.

3 ottobre 2011 Nessun commento

Spesso per fare i test di upload/download delle applicazioni web è necessario disporre di file che abbiano precise dimensioni. È possibile creare questi file, molto semplicemente con il comando unix dd, disponibile sia in Linux che in Mac Os X. La sintassi  per creare un file da 1Mb è la seguente:

dd if=/dev/urandom of=filetest_1mb bs=1048576 count=1

Poichè il file è riempito di valori random anche comprimendolo non si ha perdita di dati, rimane delle stesse dimensioni!

gzip filetest_1mb

Produce il file compresso filetest_1mb.gz di 1 Mb esatto.

Il data package di Ext Js 4 – part 1

9 agosto 2011 2 commenti

Il data package di Ext Js 4 è stato completamente riscritto ed introduce moltissime novità. Al centro del data package troviamo Ext.data.Model. Il Model non è altro che la rappresentazione di un certo tipo di dati trattati nella nostra applicazione. Ad esempio un applicazione per la gestione dei clienti ed relativi ordini avremo sicuramente un model che rappresenta il cliente ed un model che rappresenta l’ordine. Il model quindi è essenzialmente composto da un elenco di valori (campi) e alcune informazioni su di essi. Per comprendere meglio definiamo il model Cliente per la nostra applicazione:

Ext.define('Cliente', {
  extend: 'Ext.data.Model',
  fields: [
     { name: 'id_cliente', type: 'int' },
     { name: 'nome', type: 'string' },
     { name: 'cognome', type: 'string' },
     { name: 'email', type: 'string', vtype: 'email' },
     { name: 'telefono', type: 'string' }
  ]
});

Il Model, viene utilizzato unitamente a Ext.data.Store per visualizzare e modificare i dati all’interno della nostra applicazione. Attraverso lo Store è inoltre possibile compiere diverse operazioni come l’ordinamento, la ricerca etc.  Per visualizzare l’elenco dei clienti in un grid panel,  dobbiamo, quindi, definire un Store:

Ext.create('Ext.data.Store', {
    model: 'Cliente',
    proxy: {
        type: 'ajax',
        url : 'clienti.json',
        reader: 'json'
    },
    autoLoad: true
});

In questo Store abbiamo definito un un proxy di tipo AJAX, che carica i dati dall’url specificata in formato json e li interpreta tramite il reader definito. In Ext js 4 possiamo definire svariati tipi locali o remoti di Ext.data.Proxy.

Nell’esempio precedente abbiamo definito il Proxy all’interno dello Store, Est Js 4 ci offre anche un’altro approccio, ovvero la possibilità di definire il Proxy all’interno del Model:

//definisco un modello con il relativo proxy
Ext.define('Cliente', {
  extend: 'Ext.data.Model',
  fields: [
     { name: 'id_cliente', type: 'int' },
     { name: 'nome', type: 'string' },
     { name: 'cognome', type: 'string' },
     { name: 'email', type: 'string', vtype: 'email' },
     { name: 'telefono', type: 'string' }
  ],
  idProperty: 'id_cliente'
  proxy: {
        type: 'ajax',
        api : {
            create  : 'createCliente.php',
    	    read    : 'elencoClienti.php',
    	    update  : 'updateCliente.php',
    	    destroy : 'deleteCliente.php'
        },
        reader: {
             type: 'json',
             root: 'dati'
        },
        writer: {
            type: 'json',
            writeAllFields:true,
            root : 'data',
            encode: true
        }
    }
});

// Uso il proxy definito nel model
Ext.create('Ext.data.Store', {
    model: 'Cliente'
});

Questo approccio offre due vantaggi. Il primo è evidente, tutti gli store che useranno il Model Cliente leggeranno i dati dallo stesso Proxy, non dovremo così definire un Proxy in ogni Store. Il secondo è meno evidente ma altrettanto interessante; possiamo caricare e salvare i dati senza l’uso di un Store.

Prima di vedere come compiere le operazioni sui dati vediamo bene il significato delle varie configurazioni del Model Cliente.

   idProperty: 'id_cliente'

La configurazione serve ad indicare qual’è il campo che identifica univocamente il record, di default questo valore è id se come nel nostro Cliente si è usato un campo diverso da id, si deve necessariamente specificare quale campo riveste la funzione di id, in questo modo il Proxy verificando la presenza di questo valore sarà in grado di stabilire se si tratta di un nuovo record oppure di una modifica ad un record esistente, eseguendo la chiamata ajax corretta.

api : {
   create  : 'createCliente.php',
   read    : 'elencoClienti.php',
   update  : 'updateCliente.php',
   destroy : 'deleteCliente.php'
}

La configurazione api consente di indicare al Porxy quali sono le url da chiamare per ogni singola operazione CRUD (Create, Read, Update, Destroy), se state usando un back end che è in grado di riconoscere le operazioni restful (PUT, POST, GET, DELETE) potete tralasciare api ed usare la configurazione url insieme a la configurazione type: ‘rest’.

reader: {
   type: 'json',
   root: 'dati'
}

Il reader è quello che si occupa di leggere i dati, in questo caso abbiamo specificato che il tipo di dati è json e che i dati veri e propri sono dentro l’array dati. Questo reader si aspetta una risposta json di questo tipo:

{"success":true, "message":"Dati caricati correttamente", "dati":[{record 1},{record 2},...,{record n}]}

Ed infine:

writer: {
   type: 'json',
   writeAllFields:true,
   root : 'data',
   encode: true
}

Il writer si occupa di definire il modo in cui operano le richieste di scrittura sul server remoto. In particolare stiamo indicando che i dati inviati devono essere di tipo json, che bisogna inviare sempre tutti i dati writeAllFields:true (se il framework remoto supporta l’aggiornamento solo dei campi modificati, è possibile saltare questa configurazione che di default è false) e infine che i dati saranno codificati dentro il parametro data dell’azione POST, in php avremo quindi:

$dati = json_decode($_POST['data']);

Come abbiamo detto, possiamo compiere delle operazione sui dati senza l’ausilio dello Store, vediamo:

// Prendiamo un riferimento al modello Cliente
var Cliente = Ext.ModelMgr.getModel('Cliente');

var stefano = Ext.create('Cliente', {
    nome: 'Stefano',
    cognome: 'Perinetti',
    email : 'stefano@prova.com',
    tel: '+39000000000'
});

//Possiamo salvare stefano senza l'uso di uno Store, perché abbiamo definito nel Model tutto il necessario
//per questa operazione
stefano.save({
    success: function(stefano) {
        console.log("Stefano salvato! id_cliente =  "+ stefano.getId());
    }
});

In questo esempio abbiamo creato un nuovo cliente e abbiamo salvato i suoi dati sul server remoto utilizzando un’istanza del Model Cliente senza l’ausilio di uno Store. Da notare che il metodo Ext.data.Model.save() compie due azioni, la prima è di scrittura e la seconda di lettura per ottenere l’id generato probabilmente dal server remoto. Nell’operazione di lettura che avviene su quanto restituito dalla chiamata POST per il salvataggio dei dati sul server, deve quindi essere incluso l’intero record appena salvato con il suo id all’interno dell’array (root: ‘dati’) definito nel Proxy reader. In breve save() si aspetta una risposta simile:

{"success": true, "message":"Record salvato correttamente.", "dati":{"id_cliente":123, "nome":"Stefano" ...}}

Ci sono ancora molte cose da analizzare sul data package vedremo nella seconda parte di questo articolo.

Categorie:Programmazione Tag:

PHP autocomplete con APTANA studio 3

15 luglio 2011 4 commenti

Ciao a tutti, oggi dopo alcuni mesi di malfunzionamento sono riuscito a far funzionare l’auto-completamento del codice PHP  su Aptana Studio 3. Il problema è che Aptana 3 dispone di un proprio editor PHP e Javascript che non supportano le funzionalità avanzate di code assist, come ad esempio l’auto-completamento sulle proprie classi definite nei file del progetto. Questo problema non era presente nello studio 2 e si è verificato sia con i progetti importati dallo studio 2 che con i nuovi. Per risolvere il problema occorre usare l’editor PHP di eclipse ed impostare la natura del progetto come

org.eclipse.php.core.PHPNature

Per fare questo occorre selezionare il progetto nel Project Explorer, cliccare con il destro e selezionare il menu configure->add php support

Add PHP suport

Se si stanno usando anche librerie Javascript come ExtJs o Jquery è opportuno anche selezionare di nuovo configure->Convert to Javascript Project

Add Javascript Support

Si aprirà una finestra con delle opzioni su javascript, confermate pure senza toccare nulla.

Conferma Javascript

Ora possiamo cambiare la natura del nostro progetto, sempre con il destro sul nome del progetto, scegliete Properties. Nella finestra che si apre scegliamo la proprietà Project Natures nella parte sinistra.

Proprietà del progetto

Selezioniamo ed impostiamo la natura del progetto come da figura sottostante.

Project natures select

Bene possiamo cliccare su ok, da ora in avanti le funzionalità di auto-completamento saranno pienamente supportate anche su Aptana 3!

Nota: prima di eseguire questa modifica su tutti i mie progetti, l’apertura di Aptana 3 era lentissima, in particolare ogni volta impegava anche 15 minuti per completare la fase building workspace. Dopo questa modifica è tornato tutto normale! Da capire meglio questa cosa.

Come sempre se vi è stato utile questo articolo, fatemelo sapere con un commento, è anche un modo per capire se devo continuare a scriverli oppure no!

Ciao

Il grande FACCHETTI, pace all’anima sua!

7 luglio 2011 1 commento

C’è una cosa che non sopporto, l’assuefazione degli Italiani allo scandalo! Eh si! Siamo talmente assuefatti dagli scandali che ormai non ci fanno più ne caldo e ne freddo, tant’è che c’abbiamo un capo di governo che viene indagato per sfruttamento della prostituzione e qualcuno che è convinto che la “signorina” è la nipote di Mubarak! Ma passiamo al titolo, Facchetti l’onesto, che riposi in pace per carità ma queste si commentano da sole!

Facchetti : Pronto Paolo sono Facchetti.
Bergamo:Buongiorno Giacinto.
Facchetti: Sto andando allo stadio l’ho detto con i miei di avere con Bertini un certo tatto, una certa disponibilità. L’ho detto con i giocatori, con Mancini e gli altri.
Bergamo:Vedrai che sarà una bella partita.
Facchetti:Va bene.
Bergamo:Viene predisposto a fare una bella partita (il riferimento è all’arbitro Bertini, ndr)
Facchetti: Si, si, va bene.
Bergamo: E’ una sfida che vedrai la vinciamo insieme.
Facchetti: Volevo solo dirti che l’ho fatto (riferendosi al fatto che ha parlato alla squadra per non tenere un atteggiamento sbagliato nei confronti di Bertini, ndr).
Bergamo:Vedrai che le cose andranno per il verso giusto poi la squadra sta ricominciando ad avere fiducia, a fare i risultati, fa morale…

e ancora

Bergamo:Giacinto!
Facchetti: Paolo allora vedi che abbiamo recuperato.
Bergamo:Storico eh storico ieri, mamma mia cosa ho sofferto, non te lo puoi immaginare! Guarda che ormai la partita sembrava compromessa, c’è stata una reazione incredibile.
Facchetti: Sull’uno a zero speravo almeno nel pareggio fino alla fine, ma sul 2-0 non speravo più a niente.
Bergamo:Mamma mia, ma poi gol bellissimi.
Facchetti: Sì sì sì.
Bergamo: Puliti, tranquilli, è stato bravo Bertini sul 2-2 sul contrasto, quel contrasto tra difensore e Martins, che non era niente eh? Bada bene a volte però magari può essere ingannato perché questo cade in maniera plateale (il riferimento è all’azione che porta al gol del 2-2 di Vieri nel recupero, arrivato su assist di Martins, che aveva conquistato il pallone liberandosi in modo falloso di un difensore doriano, ndr)
Facchetti: Devo dire che ho predisposto la tua (incomprensibile) ed in campo sia andato tutto bene?
Bergamo:Sì, sì, sì, ha detto bene.
Facchetti:E’ stato bravo anche Papi e Puglisi mi sono piaciuti.
Bergamo:Specialmente Puglisi ha fatto bene.

e ancora

Bergamo: Senti domenica, ehm mercoledì avevo intenzione di mandarti come assistenti, siccome a Bologna non è una partita scontata secondo me, avevo intenzione di metterti Geminiani e Niccolai che sono due toscani bravi eh??
Facchetti: Bene, Geminiani non l’abbiamo più.
Bergamo: No, no e appunto te lo volevo mandare domenica. Si, scusa, mercoledì c’è questa Coppa Italia che ci interessa ancora e quindi facciamo, e poi ti mando un giovane, siccome volevamo rimettere in pista Gabriele e Palanca avevo intenzione di mandarti Gabriele.
Facchetti:Va bene.
Bergamo:Non è un problema per voi, perché sta facendo bene.
Facchetti:No, no, va bene poi io mi fido di te, sei tu.
Bergamo:Stai tranquillo, stai tranquillo e complimenti per ieri.
Facchetti: Grazie, grazie.

e poi

Facchetti:Guarda che ho guardato, ho guardato lo score di Bertini (quando ha arbitrato l’Inter, ndr) quattro vittorie, quattro pareggi, quattro sconfitte.
Bergamo: Porca miseria, facciamo cinque, quattro, quattro allora, eheheh.
Facchetti:Eheheh.
Bergamo:Ma vittorie però.
Facchetti: Digli che è determinante domani.
Bergamo:Si, no lo devi sentire ora, mi ha chiamato ma non potevo rispondere.
Facchetti:E’ determinante, ha fatto dodici partite, quattro, quattro, quattro.
Bergamo: Una, dici te, una la smuove, ma deve smuovere quella che comincia per V.
Facchetti:Quella giusta, quella giusta, quella giusta.
Bergamo: Sì, ma viene, vedrai, bene, perché è un ragazzo intelligente e ha capito ora come si cammina. C’è voluto un po’ per capire, ma insomma, meglio tardi che mai.

e se ancora non vi basta

Mazzei:Sono in macchina che vado a Coverciano.
Facchetti: Sceglili bene per domenica sera eh…
Mazzei: Il numero 1 e il numero 2, da quello che penso, Ivaldi e Pisacreta.
Facchetti: Ivaldi e Pisacreta.
Mazzei: Eh, sono il numero 1 e il numero 2.
Facchetti: Sì certo, e il numero 1 degli arbitri… (il riferimento è a Pierluigi Collina, che in quei giorni era una richiesta pressante soprattutto di oberto Mancini e che invece quella domenica diresse Chievo- Milan, mentre Inter-Juventus finì a Rodomonti, ndr).
Mazzei: Eh sì, speriamo che ci caschi con questo sorteggio del cavolo, che ci caschi il numero 1.
Facchetti: No, lì non devono fare i sorteggi, ci devono…
Mazzei: Come si fa Giacinto, purtroppo ci vuole fortuna.
Facchetti: Ma dai…
Mazzei:Ti dico la verità, qui un sorteggio lo fa un giornalista, devono studiare una griglia e le possibilità sono più alte.

Siete ancora convinti che Facchetti era un brav’uomo, dall’irreprensibile comportamento?

Se rispondete si è solo perché siete assuefatti come la maggior parte degli italiani, tutto qui!

Società…

24 giugno 2011 Nessun commento

Società...

Categorie:Foto Tag: ,

Installare Centos 5.6 su volumi di oltre 2Tb

8 giugno 2011 Nessun commento

GPTOggi mi è successo di dover installare Centos 5.6 su di un server con 3Tb di storage. Durante l’installazione al momento di creare le partizioni ricevevo un errore strano: “impossibile fare il boot da una partizione GPT”. In sostanza il vecchio MBR supporta volumi di massimo 2Tb quindi se si crea un volume logico maggiore di 2Tb i nuovi server dotati di EFI al posto di MBR utilizzano GPT che ovviamente ha molte meno limitazioni ed è più flessibile. Il kernel di default di Centos 5.6 ha il supporto per GPT tuttavia pare che GRUB non riesca a fare il but da questi volumi.

Come risolvere il problema?

Semplice! con il tools di HP per lo smartarray ho creato un array da 3Tb poi al sue interno ho creato due volumi logici, 1 da un Gb e l’altro grande quanto tutto lo spazio a disposizione entrambi raid 5.

Con questa configurazione il disco da 1Gb viene creato come MBR e l’altro come GPT. Durante l’installazione di Centos 5.6 anaconda partiziona correttamente installando /boot in una partizione di 100Mb del volume da 1Gb e il resto in LVM con due partizioni per swap e /.

Ciao

Phalaenopsis bastiani

19 aprile 2011 2 commenti

Vi mostro la splendida fioritura della mia Phalaenopsis bastiani che ho acquistato l’anno scorso. E’ la sua prima fioritura e devo dire che è stata davvero generosa. Di seguito trovate anche un video realizzato con la tecnica del time lapse. Ho scattato ben 1297 foto, una ogni 30 secondi per registrare l’apertura del fiore. Il video è forse un po’ lento ma è la prima volta che mi cimento con questa tecnica, spero vi piaccia.

Ciao

Phalaenopsis bastiani

Phalaenopsis bastiani