Archivio

Archivio per la categoria ‘Programmazione’

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 Nessun commento

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 Nessun commento

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

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

Sencha, la svolta!

30 ottobre 2010 2 commenti

Logo SenchaNegli ultimi mesi, con tante web app da realizzare e poco tempo per farle mi sono messo alla ricerca di un qualcosa che potesse fornirmi gli strumenti idonei a procedere con velocità. In particolare cercavo qualcosa per mostrare i dati, una griglia in cui mostrare i dati, poterli ordinare, spostare, paginare ed anche, all’occasione, editare. Durante le ricerche capito sul sito di ExtJs, ora Sencha, e scopro non solo una griglia che fa tutto quello che mi serve ma un intero ed enorme framework che praticamente, con l’ultima versione, ha tutti i componenti necessari costruire un’applicazione web.

Non solo, proprio nei giorni in cui muovevo i primi passi per scoprire questo framework, è stato rilasciato Ext Designer, un software multi-piattaforma, che permette con il semplice Drag & Drop di creare gli elementi dell’interfaccia grafica dell’applicazione, utilizzando i componenti di ExtJs.

Incredibile, posso creare un’intera interfaccia senza scrivere una riga di html o css, fantastico proprio quello che cercavo. Menu, finestre, form e griglie, tutto in modo semplice, coerente e lineare e non solo, controlli avanzati sui campi, data_store, combobox, data_grid insomma tutto!

Ho fatto la scelta, uso ExtJs!

L’apprendimento non è semplice, bisogna entrare nei meccanismi del framework e scoprirne le funzionalità davvero vastissime, nei prossimi giorni pubblicherò qualche tutorials su come usare Ext Designer per realizzare velocemente un’applicazione.

Ext Designer

Arriva il Magic Mouse!

21 ottobre 2009 Nessun commento

Ieri Apple ha presentato molti nuovi prodotti fra cui una nuova gamma di iMac che finalmente abbandonano il processore core duo per portatili per abbracciare in nuovi intel core i5 e i7 e un nuovo macbook anch’esso ora dotato di guscio unibody. La novità però più bella secondo me è il nuovo Magic Mouse!

Apple Magic Mouse

Apple Magic Mouse

Il nuovo mouse è in assoluto il primo mouse Multi Touch della storia. In sostanza Apple ha deciso di trasferire l’esperienza Multi Touch di iPhone prima e di iPod Touch e MacBook Pro dopo anche nei sistemi desktop. Dal design essenziale ed elegante il Magic Mouse elimina tutto il superfluo, niente filo, niente tasti ne, tanto meno, rotelline che si sporcano e si inceppano. Per gestire i comandi è sufficiente usare le “gesture” tipiche dei dispositivi Touch che gli utenti iPhone conoscono molto bene.

Apple Magic Mouse

Apple Magic Mouse

Come al solito Apple riesce sempre a tirare fuori un prodotto unico e rivoluzionario, ora attendiamo di averlo a disposizione per una prova sul campo.

E’ possibile acquistare il Magic Mouse sullo store on-line per 69 €

Ciao

Categorie:Programmazione Tag: ,

Caratteri, capiamoci qualcosa!

16 settembre 2009 Nessun commento

Sposto sul blog questo vecchio articolo che avevo pubblicato un pò di tempo fa!

Uno dei problemi che spesso si incontra sviluppando pagine web con PHP e MySLQ è quello dei caratteri, soprattutto quelli accentati o quelli aprticolari come l’euro €.

Il tutto dipende da errori di conversione fra diversi charset, infatti, spesso inconsapevolmente, il programmatore principiante non presta attenzione a questo aspetto durante lo sviluppo lasciando le impostazioni di default che spesso non coincidono.

Il database MySQL per esempio imposta come charset di default il latin1 mentre il web server solitamente utilizza utf-8. Durante questa conversione si possono creare delle imprecisioni che portano alla mancata visualizzazione dei caratteri.

Come risolvere il problema?

Semplice basta impostare tutto come utf-8 che è il charset consigliato dal w3c.

Allora per prima cosa impostate il vostro editor per scrivere con il charset utf-8.

Inserite in ogni pagina html, xhtml quale charset viene utilizzato con la seguente direttiva:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

Quando create il database MySQL specificate come default charset utf-8 e come collation utf-8_general_ci.

Bisogna poi infine fare attenzione ad un aspetto critico. MySQL usa come default charset latin1 anche per il client e la connessione, queste opzioni sono configurate nelle variabili del server.

Potete procedere in due modi:

  • Modificate i valori di default del server MySQL ma fate attenzione perché ciò influisce sui database e le applicazioni precedenti.
  • Eseguire seguenti due query subito dopo la connessione:

SET NAMES utf8
SET CHARACTER_SET utf8

Assicuratevi che anche il web server utilizzi il charset uft-8.

Ho fatto svariate prove e non ho avuto problemi con moltissimi caratteri sia in inserimento sul database che il lettura, se avete ulteriori informazioni per completare questo piccolo articolo inviatemele pure e le pubblicherò col vostro nome.