Skip to content Skip to footer

Tutorials

Update Twitter Bootstrap to release 3 in Zend Framework 2

Recently I started a new project based on Zend Framework 2, using Twitter Bootstrap as CSS framework. Some days ago, new Bootstrap v3 was released and introduced a lot of changes and improvements. Because of ZF2 Skeleton Application comes out-of-box with Twitter Bootstap 2, I decided to setup the new project skeleton and update CSS framework to latest available release. In this post, I'll describe the process to update Bootstrap to v3 into a ZF2 project. Please note: I set up the project with Zend Framework 2.2.2 and updated to Twitter Bootstrap 3.0.0-rc1 because, actually, are latest available versions. If time is passed, you should check official documentations to ensure that this procedure is still valid. I'll describe update process assuming that we have a working Skeleton Application deployed following Zend Framework Getting starded guide. First of all, we have to update libraries in public/ folder by accomplish following steps:
  1. Download Twitter Bootstrap library package and unzip it.
  2. Move content of dist/ folder into <project>/public/ folder.
  3. Download Glyphicons package and unzip it.
  4. Copy fonts/ folder into <project>/public/ folder.
  5. Copy css/bootstrap-glyphicons.css into <project>/public/css/ folder.

Fix Hibernation after swap partition resize

Hibernation can be an important feature for many users: it allows people to turn on the PC and get it in the exact state session of when it was turned off (open files, running applications, configurations edited, terminals, etc.). This feature is based on usage of swap partition. In poor words: when user hibernate PC, all content of RAM memory is stored in this partition and is fetched at next startup time. For this reason, the swap partition must be bigger (or at least equal) than RAM size and, in case of RAM update, must be enlarged.

The problem

The problem is that, after a resize operation, swap partition's UUID is modified and initramfs is unable to recognize swap partition. This means that when you try to hibernate your PC, it don't wake up correctly and boots as you turned it off normally.

The solution

The solution is very simple: after swap partition resize operation, let's inform initramfs about new UUID. Let's see how.

Riattivare ibernazione dopo il ridimensionamento della partizione swap

L'ibernazione può essere un funzionalità importante per molti utenti: essa permette di spegnere il PC ed ottenere, alla riaccensione, la sessione nello stesso identico stato di quando è stata arrestata (file aperti, applicazioni caricate, configurazioni modificate, terminali, ecc.). Questa funzionalità si basa sull'utilizzo della partizione di swap. In parole povere: quando l'utente iberna il PC, tutto il contenuto della memoria RAM viene conservato in questa partizione e viene recuperato all'avvio successivo. Per questa ragione, la partizione di swap deve essere più grande (o almeno pari) della dimensione della RAM e, in caso di un aggiornamento di RAM, va ridimensionata.

Problema

Il problema è che, dopo un operazione di ridimensionamento, l'UUID della partizione di swap viene modificato e initramfs non riesce più a riconoscere la partizione swap. Ciò significa che quanto proverete ad ibernare il PC, esso non si riattiverà nel modo corretto e si avvierà come se fosse stato spento normalmente.

Soluzione

La soluzione è molto semplice: dopo il ridimensionamento della partizione di swap, informiamo initramfs riguardo il nuovo UUID. Vediamo come.

Resize multiple images using Linux

Resize an image is a simple operation: there are many software able to do that. The most obvious are Gimp or Photoshop. But what's the right procedure to resize lots of images? Imagine you have to prepare thumbnails for a gallery or resize all images to insert into a presentation or, again, reduce photos to send them by email, etc. Open each image with Gimp or Photoshop and resize them one by one is foolish. How can we perform this operation in a simple way and without stress?

The solution

Use Linux command line. Resize multiple images with Linux is very simple by using ImageMagick suite. First of all, let's install ImageMagick that includes lots of tools to manipulate images. To do that, execute following command in terminal window:

Ridimensionare un gran numero di immagini con Linux

Il problema

Ridimensionare un immagine è un'operazione semplice: esistono molti software in grado di farlo. I più conosciuti sono Gimp e Photoshop. Ma qual'è la giusta procedura per ridimensionare un gran numero di immagini? Immaginate di dover preparare le anteprime per una galleria o di dover ridimensionare tutte le immagini da inserire in una presentazione o, ancora, di dover ridurre delle foto da mandare via email, e così via. Aprire le immagini con Gimp o Photoshop e ridimensionarle una ad una sarebbe una follia. Come si può eseguire questa operazione in modo semplice e senza stress?

La soluzione

Utilizzare la riga di comando di Linux. Ridimensionare più immagini con Linux è molto semplice se si utilizza la suite ImageMagick.

PHP jobs with Gearman and Supervisor

The problem

Often in a PHP project there could be operations that need to be executed asynchronously. Some example are: processing mail queues, indexing data, computation that requires long elaboration time. A common behavior is handle those operations by using cron to execute processes in background. However, using cron requires expedients to avoid cross executions and forces us to implement some specific procedures and mechanism to store data needed to elaborate.

Solution: Gearman + Supervisor

The solution that involves Gearman and Supervisor, instead, don't require any kind of data storage mechanism and supply a very simple way to develop processes in PHP.

Processi PHP con Gearman e Supervisor

Problema

Spesso in un progetto PHP capita di dover eseguire operazioni in modo asincrono. Alcuni esempi sono: lavorazione di code email, indicizzazione di dati, calcoli che richiedono lunghi tempi di elaborazione. Prassi comune è gestire tali operazioni utilizzando cron per eseguire processi in backgroud. Tuttavia, utilizzare cron richiede espedienti per evitare l'accavallemento delle esecuzioni e ci costringe ad implementare procedure specifiche e meccanismi di stoccaggio dei dati necessari per l'elaborazione.

Soluzione: Gearman + Supervisor

La soluzione che concerne Gearman e Supervisor, invece, non richiede alcun meccanismo di data storage e fornisce un modo molto semplice per sviluppare processi in PHP.

Setup Doctrine 2 filters in Zend Framework 2

Scenario

Doctrine filter is a very powerfull tool that can be used to add conditional clauses at SQL level into our Doctrine 2 engine. This means that filters constraints will affect DQL queries, collections, lazy loading, etc. How to setup and use filters in generic conditions is well explained in this article of official Doctrine documentation, but in a Zend Framework 2 project, the same operation is a bit different. So, in this post, we will explain how to configure one or more filters into our Zend Framework 2 projects.

Configurare filtri Doctrine 2 in Zend Framework 2

Scenario

Un filtro di Doctrine è uno strumento molto potente che può essere utilizzato per aggiungere condizioni a livello SQL all'interno del nostro gestore di oggetti Doctrine 2. Ciò significa che i filtri influenzeranno il comportamento di query DQL, collezioni, recupero dati, ecc. Come configurare ed utilizzare filtri in condizioni generali è ben spiegato in questo questo articolo della documentazione officiale di Doctrine, ma in un progetto basato su Zend Framework 2, la stessa operazione è un po' diversa. Così, in questo articolo, vedremo come configurare uno o più filtri nei nostri progetti sviluppati su Zend Framework 2.

Esempio esplicativo

Il seguente esempio è basato su quello riguardante un filtro "locale" mostrato nel manuale di Doctrine. Assumeremo di avere un progetto ZF2 funzionante sviluppato a partire da ZendSkeletonApplication con il modulo DoctrineORMModule configurato (fare riferimento ai manuali ufficiali per raggiungere questo obiettivo). Innanzitutto, abbiamo bisogno di una classe interfaccia da utilizzare come segno distintivo per decidere quali entità saranno influenzate dal filtro. Quindi, se vorremo che un filtro sia applicato ad un'entità dovremo solo fargli implementare tale interfaccia. Ovviamente, possiamo anche utilizzare l'interfaccia per specificare quali metodi implementare nell'entità, se vogliamo. Questo può essere utile e vedremo un esempio in un prossimo articolo.

Get latest LibreOffice in Ubuntu

LibreOffice is actually the most famous Open Source Office Suite. Unfortunately, Ubuntu repositories often doesn't contains latest versions of it. If you like to have your LibreOffice always updated, you can simply execute following commands in your terminal: $ sudo add-apt-repository ppa:libreoffice/ppa $ sudo apt-get update $ sudo apt-get dist-upgrade At the end of the process, simply run LibreOffice from…