virtualboxSu Debian, se state utilizzando il kernel 3.7 (presente in experimental) avrete notato che si verifica un problema con il modulo per il kernel di VirtualBox:

root@mirko-lenovo:/home/mirko# /etc/init.d/virtualbox restart
[ ok ] Stopping VirtualBox kernel modules.
[....] Starting VirtualBox kernel modules[....] No suitable module for running k[FAIL found ... failed!
 failed!
root@mirko-lenovo:/home/mirko# dpkg-reconfigure virtualbox-dkms

------------------------------
Deleting module version: 4.1.18
completely from the DKMS tree.
------------------------------
Done.
Loading new virtualbox-4.1.18 DKMS files...
Building only for 3.7-trunk-amd64
Building initial module for 3.7-trunk-amd64
Error! Bad return status for module build on kernel: 3.7-trunk-amd64 (x86_64)
Consult /var/lib/dkms/virtualbox/4.1.18/build/make.log for more information.
[ ok ] Stopping VirtualBox kernel modules.
[....] Starting VirtualBox kernel modules[....] No suitable module for running k[FAIL found ... failed!
 failed!
invoke-rc.d: initscript virtualbox, action "restart" failed.

Andando a guardare il file di log segnalato (/var/lib/dkms/virtualbox/4.1.18/build/make.log), si notano alcuni errori (non riporto il contenuto integrale):

/var/lib/dkms/virtualbox/4.1.18/build/vboxdrv/r0drv/linux/memobj-r0drv-linux.c:1451:38: error: ‘VM_RESERVED’ undeclared (first use in this function)
/var/lib/dkms/virtualbox/4.1.18/build/vboxdrv/r0drv/linux/memobj-r0drv-linux.c:1451:38: note: each undeclared identifier is reported only once for each function it appears in
make[4]: *** [/var/lib/dkms/virtualbox/4.1.18/build/vboxdrv/r0drv/linux/memobj-r0drv-linux.o] Error 1
make[3]: *** [/var/lib/dkms/virtualbox/4.1.18/build/vboxdrv] Error 2
make[2]: *** [_module_/var/lib/dkms/virtualbox/4.1.18/build] Error 2
make[1]: *** [sub-make] Error 2
make: *** [all] Error 2

In attesa di aggiornamenti, si può risolvere utilizzando la versione di VirtualBox presente nei repository della casa madre. Innanzitutto puliamo l’installazione:

apt-get purge virtualbox*

Quindi aggiungete il nuovo repository nel vostro sources.list. Per conoscere il repository corretto, che varia a seconda della versione di Debian (vale anche per Ubuntu), potete guardare qui. Ad esempio, per Wheezy:

deb http://download.virtualbox.org/virtualbox/debian wheezy contrib

Quindi aggiungete la chiave del repository:

# wget -q http://download.virtualbox.org/virtualbox/debian/oracle_vbox.asc -O- | apt-key add -

Aggiornate i repository e reinstallate VirtualBox:

# apt-get update
# apt-get install virtualbox-4.2

Notare che i pacchetti presenti in questo repository hanno nel nome il numero della versione (cioè il pacchetto si chiama virtualbox-4.2 per la versione 4.2) e che in questo caso non è necessario installare né il pacchetto *-dkms (esempio virtualbox-dkms), né il pacchetto *-qt che contiene la gui di amministrazione (esempio virtualbox-qt). Il pacchetto installato da quei repository contiene già tutto il necessario. Lo stesso vale anche per gli altri pacchetti collegati a VirtualBox: noterete che, cercando di installarli, vi chiederà di rimuovere questa versione e installare quella presente nei repository ufficiali di Debian, che però è difettosa.

It seems that CheckGmail has again problems with authentication.

checkgmail_error200

The update (with the -update option) doesn’t work. It seems that you update something, but the result is the same.

On the web there’re suggestions that invite you to launch CheckGmail without the cookies support (-no_cookies option). Actually it works, but many functions are not available.

You can simply fix by downloading and applying this patch:

$ wget http://linuxdeal.com/files/checkgmail.patch
# patch /usr/bin/checkgmail checkgmail.patch

After applying the patch, simply restart CheckGmail.

http://mirkopagliai.it/complotti/

Mi è arrivato qualche settimana fa, l’ho comprato qui. Il venditore è cinese, me l’ha spedito qualche giorno dopo (ho scelto ovviamente FedEx e non le poste cinesi, anche solo per i tempi di consegna), sembra una persona seria e affidabile, inoltre ha buoni feedback. Il prezzo, comprensivo delle spese di spedizione, è stato di 76€, a cui si sono aggiunti 4,5€ per l’adattatore della presa di corrente (cinese, se non sbaglio di tipo “A”, la vedete qui), per un totale quindi di 80,5€.

È comprensivo dei cavi video (tranne vga), dell’alimentatore e del telecomando. Il telecomando è del tipo “televisione” (con qualche funzione in più, adatta al caso) e in giro se ne trova un altro molto, ma molto più carino e più funzionale. Lo vedete qui, dove si vende abbinato al Mele (non so se anche separatamente da qualche parte, cercare “mele a2000 sensor remote”), sul retro ha una tastiera come quella bluetooth che si vende per i cellulari.

Di base monta Android 2.3, ma si può aggiornare con facilità alla versione 4.0 ICS scaricabile da qui. Notare che è disponibile sia una versione “brandizzata” (firmware B), che una “neutral” (firmware C), oltre a quella originale da fabbrica (firmware A). Consiglio ovviamente la seconda (la prima nemmeno l’ho provata).
Android è nella versione per tablet, forse c’è qualche ottimizzazione per il caso (non ne sono sicuro, non avendo nessun tablet), come la “mouse mode” (appare il puntatore del mouse, che si può muovere tramite telecomando) o i pulsanti (del telecomando) assegnabili a determinate scorciatoie.

L’ho scelto per i seguenti punti di forza:

  1. diverse uscite video, hdmi, vga, av. Normalmente questi dispositivi montano solo l’hdmi, al massimo hdmi+av, molto più raramente hdmi+vga. Unico dispositivo, per quello che sono riuscito a trovare io, con tutte e tre le opzioni. Il telecomando ha un tasto per switchare tra le uscite (non è necessario configurare o peggio riconfigurare nulla).
  2. supporto per sata da 2,5″. Anche qui, per quello che mi risulta, è l’unico dispositivo in commercio. Chi ne capisce un po’, sa che differenza corre tra l’usb e il sata vero e proprio;
  3. ethernet+wifi. Il wifi può fare anche da access point. In rete si parla un po’ male dell’ethernet (che è a 10/100Mbps), ma non ho avuto modo di verificare.

Sul sito del produttore si trova una scheda con qualche informazione in più, in rete anche descrizioni più approfondite. Riporto le altre caratteristiche fondamentali:

  1. audio l/r + hdmi + uscita ottica per home theater;
  2. sd interna da 4GB (per il sistema):
  3. ram 512mb in ddr3;
  4. processore ARM cortex A8 a 1Ghz;
  5. 3 usb (2.0);
  6. lettore flash;
  7. hd a 1080p.

Per quanto mi riguarda, visto che prima di scegliere questo o quel modello, ho approfondito i prodotti presenti sul mercato, fermo restando quelli di altra categorie (sono due: quelli tipo chiavetta e quelli tipo box, ovviamente sono due mondi diversi…), non solo il Mele A2000 è caratteristicamente il migliore, ma uno tra i migliori anche per rapporto qualità/prezzo.

Qualche foto che ho fatto:
http://docs.mirkopagliai.it/documents/mele-a2000/20130102_094840.jpg
http://docs.mirkopagliai.it/documents/mele-a2000/20130103_233835.jpg
http://docs.mirkopagliai.it/documents/mele-a2000/20130103_233851.jpg
http://docs.mirkopagliai.it/documents/mele-a2000/20130113_185023.jpg
http://docs.mirkopagliai.it/documents/mele-a2000/20130113_185125.jpg
http://docs.mirkopagliai.it/documents/mele-a2000/20130113_185604.jpg (qui si nota la “mouse mode”)
http://docs.mirkopagliai.it/documents/mele-a2000/20130113_212237.jpg
http://docs.mirkopagliai.it/documents/mele-a2000/20130113_212342.jpg (il telecomando)

Ora vorrei provare a installarci Debian, magari da chiavetta. In rete qualcuno ha già provato a montarci distribuzioni GNU/Linux, con risultati positivi. Per ora io l’ho attaccato alla tv di casa e l’ho datato di un sata da 500GB, così fa da media center (con brillanti risultati).

Dopo aver utilizzato Wine (per qualsiasi necessità) e averlo disinstallato – incluso magari l’avere cancellato anche la directory .wine nella propria home, possono sussistere due tipi di problemi:

  1. il menù di sistema presenta ancora voci di programmi per Windows installati con Wine;
  2. alcune tipologie di file rimangono associate a questi stessi programmi (ad esempio, documenti di testo con il famoso “Blocco note”).

Il primo problema si può facilmente e velocemente risolvere modificando (ovvero cancellando) manualmente le voci residue del menù. Lo stesso dicasi per il secondo, andando a reimpostare in questo caso per tutti i tipi di file l’applicazione preferita (rimane però presente – come alternativa – l’altra, cioè quelle precedentemente presenti e installate da Wine), anche se in questo caso è molto più impegnativa e dispendiosa.

I due problemi sussistono ovviamente (ribadisco, semmai non fosse chiaro) anche se quei programmi non sono più installati e anche se lo stesso Wine non è più installato.

Dopo aver cercato approfonditamente in rete, ho trovato l’unica valida soluzione qui. E quindi, all’interno della propria home:

rm -r .wine
rm -r .local/share/applications/wine*
rm -r .local/share/desktop-directories/wine*

(probabilmente il primo passaggio l’avete già eseguito)

Fatto questo, i due problemi saranno risolti definitivamente.

L’esigenza: in un form ho bisogno di impostare in un campo lo slug della risorsa che sto creando, magari e probabilmente a partire da un altro campo. Ad esempio, creando un articolo o una pagina devo generare lo slug a partire da un campo che potrebbe in questi casi potrebbe essere il titolo.

Un’immagine esplicativa:
Titolo e slug

A questo scopo ho scritto un semplice ed efficace plugin per jQuery, chiamato slugify, che potete scaricare liberamente da qui.

Il funzionamento è molto semplice:

$(function() {
	$().slugify('#title', '#slug');
});

Richiede semplicemente di indicare il campo sorgente e quello di destinazione (valgono le solite regole per i selettori). Bisogna quindi strutturare il form più o meno così:

<form>
	<input type="text" id="title" />
	<input type="text" id="slug" />
</form>

Notare che se non vengono passati sorgente e destinazione, di default utilizzerà “form #title” e “form #slug”. Quindi è possibile anche lanciarlo come:

$(function() {
	$().slugify();
});

(in questo caso utilizzerà ” form #title” e “form #slug”)

$(function() {
	$().slugify('#name');
});

(utilizzerà “#name” e “form #slug”)

Simulando il comportamento di molti CMS e simili, come ad esempio proprio WordPress, slugify:

  1. agisce solo se il campo destinazione (dello slug) è vuoto. In altri termini, se lo slug era già stato impostato (generato o manualmente), non lo aggiorna, a meno che non lo si cancelli del tutto;
  2. genera la destinazione anche a partire dalla destinazione, ovvero verificando che lo slug sia valido e modificandolo se non lo è.

Nel generare lo slug:

  1. vengono sostituite le lettere accentate;
  2. i simboli e lo spazio vengono convertiti in “-“.

Power ToggleSugli ultimi Android (presumibilmente tutti quelli con versione 4.x) manca un widget per il controllo energetico, presente invece nelle precedenti versioni. È vero, ci sono tutte le icone nell’area delle notifiche, che si possono scorrere in orizzontale, ma non è il massimo della comodità, personalmente preferisco il precedente metodo.

Su Google Play si possono trovare numerose alternative. Tra tutte, volevo segnalare Power Toggle, poiché – tra tutte quelle che ho provato, è l’unica ad essere contemporaneamente:

  1. gratuita e senza pubblicità di sorta;
  2. altamente personalizzabile;
  3. gestisce tutti gli aspetti energetici;
  4. funziona (strano a dirsi, ma molti widget non riescono ad esempio a gestire la connessione dati).

Qualche screen. Il widget:

Power toggle widget

Il menù di impostazioni del widget:

Power Toggle impostazioni

AmuleAttualmente, cercando di installare il demone di Amule Adunanza (amule-adunanza-daemon) su Debian Wheezy (ma il problema potrebbe riguardare anche altre versioni di Debian) si ottiene il seguente problema dovuto a dipendenze mancanti:

# aptitude install amule-adunanza-daemon
I seguenti pacchetti NUOVI (NEW) saranno installati:
  amule-adunanza-daemon{b} libcrypto++9{a}
0 pacchetti aggiornati, 2 installati, 0 da rimuovere e 2 non aggiornati.
È necessario prelevare 3199 kB di archivi. Dopo l'estrazione, verranno occupati 9985 kB.
I seguenti pacchetti hanno dipendenze non soddisfatte:
 amule-adunanza-daemon : Dipende: libupnp3 (>= 1.4.3) che è un pacchetto virtuale.
                         Dipende: libwxbase2.8-0 (>= 2.8.10.1) but it is not going to be installed.
Le seguenti azioni permetteranno di soddisfare queste dipendenze:

     Mantenere i seguenti pacchetti alla versione attuale:
1)     amule-adunanza-daemon [Non installato]

Questo accade perché la versione pacchettizzata presente nei repository (il repository di Adunanza) richiede delle dipendenze non più disponibili nei repository ufficiali di Debian. Per risolvere il problema, è momentaneamente necessario ricorrere alla versione più recente, presente sul progetto su Sourceforge.

Semplicemente, installiamo le dipendenze necessarie:

aptitude install libcrypto++9 libupnp6 libwxbase2.8-0

Quindi con il browser apriamo questa pagina, selezioniamo la versione di Debian in uso, poi procediamo fino a visualizzare la lista dei pacchetti disponibili (per Wheezy potete andare direttamente qui). Scarichiamo quindi la versione di amule-adunanza-daemon adatta alla nostra architettura (i386 per 32bit, amd64 per 64bit). Al momento in cui scrivo, sono presenti i pacchetti:

  • amule-adunanza-daemon_2010.1+2.2.6-1wheezy4_i386.deb
  • amule-adunanza-daemon_2010.1+2.2.6-1wheezy4_amd64.deb

Una volta scaricato il pacchetto corretto, portiamoci nella directory e impartiamo il comando di installazione (valido per entrambe le architetture) tramite dpkg:

dpkg -i amule-adunanza-daemon_2010.1+2.2.6-1wheezy4*.deb

A questo punto possiamo procedere con la configurazione come da guida.

DebianI bought a Thinkpad E530 which uses the RTS5229 card reader. The card reader doesn’t work out of the box and in the repositories of Debian there is no driver available. With lspci the card read is seen as:

02:00.0 Unassigned class [ff00]: Realtek Semiconductor Co., Ltd. RTS5229 PCI Express Card Reader (rev 01)

Fortunately the Realtek provides its drivers available here (PCIE RTS5229 card reader driver for Linux, 1.07 version) that you should only compile.

First install everything that is needed to compile the sources:

aptitude install linux-headers-`uname -r` build-essential

Then download and unpack the driver. Inside the folder you will find the README.txt file that explains you how to compile:

1) make
2) make install
3) depmod
4) reboot your computer

Note: Root privilege is required in step 2 and 3

I suggest to you to use checkinstall instead of make install, so in the future you have the deb package already prepared. In this case:

# aptitude install checkinstall
$ make
# checkinstall
# depmod

And eventually reboot the system.

If anything could be useful, I have already prepared a deb package that you can find here (for 3.2.0-3-amd64 kernel) and here (for 3.5-trunk-amd64 kernel) and that it should only work on 64bit systems (I don’t guarantee it).

CakePHPCakePHP works very well if you only use the id to retrieve records in database. The problem is when you want to use more than one method to retrieve the same record, for example both the id and the slug.

Yes, you can use two different actions (for example, viewBySlug() for slugs), you can also give the same url using the routing (look here, route elements with regular expressions), but why not use a single action and make your life easier?

The same action, the same logic, the same view: just understand what is the parameter received from the (user) request and shape the search condition.
You can implement a callback function to determine the correct database field. If the choice is between id and slug simply use is_numeric() function (documentation)!

Just an example:

// app/Controller/YourModelNameController.php
public function view($param = null) {
	//There is a parameter?
	if(empty($param))
		throw new NotFoundException(__('Object does not exist'));

	$data = $this->Post->find('first', array(
		'conditions' => is_numeric($param) ? array('id' => $param) : array('slug' => $param),
		'fields' => array('title', 'text', 'created', 'modified'),
	));

	//Found at least one record?
	if(empty($data))
		throw new NotFoundException(__('Object does not exist'));

	$this->set('data', $data);
}

All this is possible thanks to the line 10:

'conditions' => is_numeric($param) ? array('id' => $param) : array('slug' => $param)

If $param is a number or a numeric string and then if it’s an id, then the search condition will be:

'conditions' => array('id' => '1')

Alternatively, if $param is a string (non-numeric string), the search condition will be:

'conditions' => array('slug' => 'your-post-title')

If you do not understand what happens, I advise you to review the ternary operator. As described in the documentation:

The expression (expr1) ? (expr2) : (expr3) evaluates to expr2 if expr1 evaluates to TRUE, and expr3 if expr1 evaluates to FALSE.

Is this clear?

Note: please do not confuse is_numeric() with is_int() or is_integer() (documentation). The is_int() and the is_integer() function find whether the type of a variable is integer and not a numeric string, as in this case. If you’ll use is_int() or is_integer(), integers passed as parameters (get or post) will be always seen as strings, because they are numeric strings and not integer.

Uno script bash molto semplice che utilizzo per fare il backup di alcune directory dalla mia home (e non solo…) su un disco esterno (/media/archive).

Non starò qui a spiegarne il funzionamento, anche perché mi sembra comprensibilissimo. Mi limito a far notare che:

  1. viene utilizzato rsync. L’assenza dell’opzione –progress fa sì che non venga generato nessun output, l’assenza dell’opzione  –delete evita che vengano cancellati nella destinazione file non presenti nella sorgente (modificare se ritenuto opportuno, avendo sotto mano il manuale di rsync);
  2. la variabile FROM è un array che indica le directory sorgente. Una directory per riga, racchiusa tra apici, come si vede chiaramente;
  3. la variabile TO, invece, indica la directory destinazione;
  4. ho notato che lo script ha difficoltà se i nomi delle sorgenti contengono spazi, anche se agli spazi viene correttamente anteposto il carattere di escape (“\”). Non essendo per me un problema, non ho indagato sulla cosa.
#!/bin/bash

#Directory sorgente
FROM=(
	"/home/mirko/Calibre"
	"/home/mirko/Documentazioni"
	"/home/mirko/Documenti"
	"/home/mirko/Icone"
	"/home/mirko/Pacchetti"
	"/home/mirko/Server"
	"/media/crypted"
)
#Directory destinazione
TO="/media/archive"

#Colori
RED="\e[1;31m" 		# Rosso
GREEN="\e[1;32m" 	# Verde
YELLOW="\e[1;33m" 	# Giallo
Z="\e[0m" 		# Reset!

#Se la directory destinazione è scrivibile
if [ -w $TO ]; then
	#Cicla le directory sorgente
	for i in ${FROM[@]}; do
		#Se la directory sorgente è scrivibile
		if [ -r $i ]; then
			#Se la sincronizzazione è andata a buon termine
			if rsync -az ${i} $TO; then
				echo -e $GREEN"${i} sincronizzata"$Z
			#Altrimenti
			else
				echo -e $RED"${i} non sincronizzata"$Z
			fi
		#Altrimenti
		else
			echo -e $YELLOW"${i} non esiste o non è leggibile"$Z
		fi
	done
#Altrimenti
else
	echo -e $RED"$TO non è scrivibile"$Z
fi

exit 0