Skip to Content

Claudio Cicali – Web Developer and Solution Architect

Articoli

Ultimi miei 3 articoli su Edit di HTML.it

Montare volumi ext2 e ext3 su OSX

Una delle (tante) cose che mancano a chi per qualsiasi motivo si trova a passare da un Linux a un OSX è la mancanza del supporto a file system diversi da HFS+ e FAT32. Il paradigma è sempre lo stesso di Apple: che tutto funzioni per gli utenti normali, mentre i power user si arrangino. Nel mio caso l’esigenza era quella di far vedere al sistema (anche in sola lettura) un hard disk esterno USB sul quale avevo dei backup fatti da Ubuntu.

Premetto che le operazioni che seguono le ho sperimentate su Snow Leopard (10.6). Non ho idea se e come funzionino le cose su altri OSX.

È molto semplice; servono due cose:

  • MacFUSE, sviluppato da un googler; è un’implementazione del modulo kernel OSX per FUSE e serve come layer di compatibilità tra il kernel (dove normalmente risiedono i driver dei file system) e l’implementazione FUSE di un qualsiasi file system (che a questo punto non necessità di essere sviluppato nativamente a livello kernel).
  • FUSE-ext2; MacFUSE aggiunge solo il supporto generico ai fie system terze parti, ovvero il framework FUSE and that’s it. Serve anche l’implementazione vera e propria del file system, interfacciato al framework. Questo appunto è il mestiere di quest’altro pacchetto

Non so se sono stato particolarmente fortunato, però una volta installati i due pacchetti OSX mi ha automaticamente montato il disco e la partizione ext3 ivi presente. Altrove si parla di procedure di mount da fare a mano…


Un font decente per il terminale di OSX

Non sono esattamente un font freak, ma di sicuro il terminale del mio sistema operativo deve usare un font praticamente perfetto (secondo i miei canoni). In questo contesto, il font di default del terminale di OSX è orribile. Dopo aver scartato tutti i monospace preinstallati, sono tornato al buon vecchio Terminus, lo stesso che uso sui miei GNU/Linux. Pare però che il Terminus “standard” con OSX non vada molto d’accordo.

Ecco come fare (clicca sull’immagine per vedere il risultato finale):

  • da questo post di jeramey si accede al link per scaricare il font in questione, modificato per OSX. Si tratta del TerminusMedium.
  • una volta scaricato si apre con FontBook e lo si installa
  • dai settings del terminale si cambia il font scegliendo Terminus tra All Fonts.
  • scegliete 14pt come dimensione e 1.07 come Character Spacing (a vostro gusto, questo è quello che funziona per me)
  • disattivate l’antialias del testo
  • riavviate il terminale (OSX applica un po’ a caso le modifiche ai font. Se non si riavvia l’applicazione spesso le modifiche non si apprezzano)

Togliere il R: da Outlook 2007 in italiano

Aggiornamento: Gaspar mi ha mandato le istruzioni per Outlook 2010 in una comoda immagine.

Caro utente Outlook in italiano: se mi vuoi un po’ di bene – ma vuoi comunque continuare ad usare quell’orribile programma di posta elettronica – fai per favore questo piccolo sforzo: sono veramente 2 minuti del tuo prezioso tempo. Farai di me un uomo felice (e per te non cambierà niente). Grazie!

Poi, sempre sull’argomento, della serie “se ne impara sempre una”:

Often mistaken for being an abbreviation of “reply”, “re” is the ablative singular form of “res, rei” (a Latin noun meaning “thing, matter”), the indicator Re: stands for “In this matter”, or “With regard to”

Su Friendfeed, Angelo mi fa notare che esiste anche un altro approccio: convincere Thunderbird a “capire” gli R: e compagnia bella. Lo trovate su mozillazine.


Usare VirtualBox per sviluppare su OSX

Giusto un paio di giorni fa sono entrato in possesso di un bellissimo MacBook Pro. La mia attività principale, nell’utilizzo di un computer, è lo sviluppo di applicazioni web. Dopo aver installato tutto il necessario lato client (ah, il software libero… ma di questo parlerò più avanti) rimaneva tutta la parte “server” ovvero, nella fattispecie, PHP, MySQL e Apache.

Quando mi sono posto il problema della loro installazione, partivo da questi prerequisiti:

  • su quei servizi ho bisogno di avere la massima flessibilità. Devo poter decidere la loro versione, le eventuali estensioni, dove mettere i dati, i permessi, i virtual host, eccetera eccetera
  • il deploy delle nostre applicazioni avviene sempre su server linux, per cui mi piaceva continuare ad usare una Ubuntu come macchina di sviluppo per non avere sorpresine in fase di deploy
  • questo OSX è puro e vergine e non ho nessuna voglia di incasinarlo con installazioni non… “standard”
  • i vari MAMP, distribuzioni buffe di PHP e MySQL, sono roba per ragazzi (per non parlare di quello che arriva direttamente con OSX) :)

Detto questo rimaneva da scegliere il sistema di virtualizzazione ma ovviamente (costo, libertà, solite cose) la scelta è caduta su VirtualBox.

Installarci Ubuntu è stata una passeggiata di salute: avevo l’immagine ISO di una 9.10 su una pennetta USB e dopo aver creato una macchina virtuale ho montato la ISO all’interno del suo CD (senza neanche toglierla dalla chiavetta USB) e l’installazione è partita.

Anche la rete è stata vista subito e da Ubuntu ho installato tutto il necessario. Anche qui tutto allegro e banale.

A questo punto dovevo condividere una directory tra OSX e Ubuntu. L’idea appunto è quella di usare OSX per programmare, fare debug con i browser, magari un po’ di grafica e usare la macchina virtuale Ubuntu per servire l’applicazione via Apache. Avrei dunque condiviso la directory Sites di OSX con Ubuntu (che sarebbe poi diventata la base di tutti i miei virtual host di sviluppo).

Lato OSX è stato facile: si dichiara direttamente da VirtualBox che esiste uno “shared folder”, dandogli il path locale e un nome (questa configurazione è per singola macchina virtuale). Nel mio caso il nome è stato proprio “Sites”.

In Ubuntu occorre montare da qualche parte questa directory “esportata”. Non esistono però sistemi automagici per farlo, afaik. L’operazione è fattibile direttamente tramite mount, configurando /etc/fstab. Nel mio caso ho aggiunto la seguente riga al file (dopo aver creato la directory Sites nella mia home):

Sites /home/claudioc/Sites vboxsf uid=1000,gid=1000,exec 0 0

A questo punto un bel sudo mount Sites e siete a posto (successivi riavvii della macchina virtuale useranno l’fstab e non ci sarà bisogno di intervenire manualmente). Credo si possa fare anche in modo di che il mount sia permesso ad un utente qualsiasi usando il parametro “user” della riga di mount, ma non ho indagato oltre.

A questo punto si è presentato il primo problema: non è possibile creare link simbolici dalla macchina guest. In pratica, da Ubuntu, non si possono creare link simbolici su un file system montato con vboxsf. Non si può: è proprio un limite riconosciuto. È tuttavia possibile fare il contrario: ovvero creare un link simbolico in quella directory dal sistema ospite (nel mio caso OSX). In tal caso il link simbolico sarà visto, da Ubuntu, come un normale file (non so se questo fatto possa avere o meno conseguenze strane…). Per certe configurazioni questo rimane comunque uno show stopper. Speriamo che nelle versioni successive di vbox il limite sia superato.

Passo successivo era quello di testare il funzionamento di apache di Ubuntu da OSX, accedendo da un browser di OSX all’indirizzo IP del server embedded. Il funzionamento (me illuso) sembrava scontato… e invece niente da fare. Eccoci al secondo problema.

Non appena viene installata una macchina virtuale con supporto di rete, questa viene configurata per uscire in modalità NAT. Questo vuol dire che da vbox viene assegnato un IP privato all’interfaccia di rete della macchina virtuale la quale poi userà la macchina ospite come gateway. Il tutto viene configurato automaticamente e trasparentemente.

Un ifconfig di Ubuntu mi aveva rilevato l’IP del serverino Ubuntu (10.0.2.15). Da OSX riuscivo a fare ping a quell’indirizzo, ma qualsiasi altro servizio sembrava stranamente non attivo. Questo dettaglio (il ping…) è quello che mi ha fatto sprecare più tempo in assoluto. Si dà il caso, ho realizzato più tardi, che non era assolutamente possibile che io potessi fare ping al 10.0.2.15! Eppure succedeva. La cosa buffa infatti è che quell’indirizzo esisteva, sì, ma… nella rete di Fastweb. Non apparteneva dunque al mio server embedded, ma a chissà chi :)

Se il guest è in modalità NAT, l’host non può vedere i suoi servizi di rete. Period.

Un’altra possibilità sarebbe stata quella di configurare il sottosistema di rete di Ubuntu a lavorare in modalità “bridge”, ovvero fare in modo che usando OSX come ponte (appunto…) questa entrasse direttamente nella rete di OSX ricevendo dunque un IP dal dhcp server usato dallo stesso OSX. Per fare questo avrei dovuto associare l’interfaccia di rete di Ubuntu ad un’interfaccia di rete fisica di OSX (per esempio Airport). Ma così non andava bene: io volevo che le due macchine, quella fisica e quella virtuale, potessero colloquiare anche quando nessuna connessione esterna fosse attiva.

In pratica quello che mi serviva era la possibilità di poter uscire su internet con Ubuntu, quando una connessione fosse presente, ma comunque poter SEMPRE parlare con l’host OSX usando una sottorete privata.

Questa configurazione è possibile avendo a disposizione DUE schede di rete sulla Ubuntu (operazione da eseguire nei Settings della macchina virtuale, aggiungendo una scheda). La prima scheda è quella che farà parte della sottorete “privata” tra Ubuntu e OSX e va configurata in modalità Host-only. La seconda è quella che ci farà uscire su internet e possiamo configurarla a piacere su NAT o Bridge (Bridge, per me).

La cosa bella, una volta capito il funzionamento, è che il resto è tutto automatico. Fatta ripartire la macchina virtuale Ubuntu, avremo a disposizione due interfacce, una delle quali si troverà nella stessa sottorete di una nuova interfaccia di rete virtuale creata sul sistema host (OSX). Nel mio caso, su OSX, l’interfaccia si chiama vboxnet0.

Maggiori informazioni nel manuale di VirtualBox (pdf).


The new providers discovery for Zend_Tool 1.10

With the recent release of the 1.10 version of the  Zend Framework, they made a subtle change on how Zend_Tool searches its providers. Before 1.10 the loader (aka the provider discover) was set to be the IncludePathLoader class; what that meens is that if you wrote a new provider, all that you needed to do to have Zend_Tool automatically find it was to edit your PHP’s include_path or add your provider’s directory to the ZEND_TOOL_INCLUDE_PATH_PREPEND environment variable.

Now that is history, because (source):

There were many issues for people when Zend_Tool used a scanning approach to finding providers. This caused many issues on all different platforms. Now we’ve opted to go the specify your providers approach.

(beware: the suggested solution in that post is wrong)

So if you ever write a new tool provider remember that there’s no more “auto discovery” by scanning the path. The loader now is the BasicLoader and you have to explicitely tell Zend_Tool where your providers are and how their classes are named. For this to happen, you can use the zf enable config.provider command or use the zf.ini file.

My solution is:

  • create a zf.ini file for your project. This is slighlty different from what the documentation implies; it considers zf.ini to be an hidden file in your $HOME. But this is only a default you can change via the  ZF_CONFIG_FILE env variable
  • put something like basicloader.classes.0 = “Migrations_MigrationProvider” as the first line (that example is the actual class name of my migration tool provider)
  • assure that your class can be loaded, setting ZEND_TOOL_INCLUDE_PATH_PREPEND accordingly

On the same topic you can also read this issue.

As a bonus track, below is a little bash script I use to run my migration tool.

#!/bin/bash

APPPATH=$(readlink -f ..)/app

export ZF_CONFIG_FILE=${APPPATH}/../zf.ini

if [ ! -f ${ZF_CONFIG_FILE} ]; then
  echo "Non trovo zf.ini"
  echo "Forse non stai eseguendo questo programma dalla directory DB?"
  exit -1
fi

if [[ "${ZF_BIN_DIR}" == "" ]]; then
  ZF_BIN_DIR=$(readlink -f ../vendor/Zend)/../../bin
  ZF_BIN_DIR=$(readlink -f ${ZF_BIN_DIR})
fi

if [ ! -f ${ZF_BIN_DIR}/zf.sh ]; then
  echo "Non trovo zf.sh in " ${ZF_BIN_DIR}
  echo "Forse non stai eseguendo questo programma dalla directory DB?"
  exit -1
fi

MIGCLASSDIR=$(readlink -f ../vendor/Renomo/library)

if [ ! -d ${MIGCLASSDIR} ]; then
  echo "Impossibile trovare la directory della classe Migration"
  exit -1
fi

MIGDIR=$(readlink -f migrations)

if [ ! -d ${MIGDIR} ]; then
  echo "Impossibile trovare la directory delle migration"
  exit -1
fi

export ZEND_TOOL_INCLUDE_PATH_PREPEND=${MIGCLASSDIR}

${ZF_BIN_DIR}/zf.sh run migration ${1}

I contenuti di questo sito sono distribuiti con una licenza Creative Commons 2.5 eccetto dove diversamente specificato. Tema WordPress sviluppato da Claudio Cicali; icone del set famfamfam silk e komodomedia. P.IVA: 01712500501

© 2005-2012
Claudio Cicali