JCKEditor su Joomla 1.5 problemi controllo corpo dell’articolo

Purtroppo ci sono ancora siti che utilizzano Joomla 1.5.x e come ben sapete ormai questa versione non ha più il supporto. L’altro giorno dovendo sostituire l’editor dal JCE al JCKEditor mi sono imbattuto in uno strano errore. In pratica Joomla quando crea un nuovo articolo, controlla se il titolo, categoria e corpo dell’articolo sono stati inserti. Proprio quest’ultimo campo dava dei problemi con il plugin JCKEditor.

Tutte le volte che si creava un nuovo articolo e per “sbaglio” si salvava senza aver scritto il corpo dell’articoloJoomla se ne usciva con un bel ERROR 500. Normalmente, senza il plugin JCKEditor, appariva un popup che ci avvertiva del mancato testo al corpo dell’articolo. Per risolvere questo problemino e far apparire il popup anche con il JCKEditor ho modificato il codice in due file: administrator/components/com_content/admin.content.html.php  e components/com_content/views/article/tmpl/form.php.

1) Dentro il file “administrator/components/com_content/admin.content.html.php” cercate questo codice:

} else if (text == ""){
          alert( "<?php echo JText::_( 'Article must have some text', true ); ?>" );

e sostituitelo con il seguente:

 } else if (typeof(text) == "undefined" || text == ""){
              alert( "<?php echo JText::_( 'Article must have some text', true ); ?>" );

2) Dentro il file “components/com_content/views/article/tmpl/form.php” cercate questo codice:

 } else if (text == '') {
             return alert ( "<?php echo JText::_( 'Article must have some text', true ); ?>");

e sostituitelo con il seguente:

    } else if (typeof(text) == 'undefined' || text == '') {
                return alert ( "<?php echo JText::_( 'Article must have some text', true ); ?>");

Il controllo viene fatto attraverso un JavaScript che è all’interno di questi due file PHP. Di default controlla se la variabile text è vuota e se lo è  fa visualizzare il famoso popup. Purtroppo con JCKEditor la variabile text non risulta vuota ma undefined. Quindi è come se la variabile non è definita e quindi non è ne vuota, ne nulla, ne 0, insomma è di tipo undefined.

La forzatura che ho messo io è quella di controllare se la variabile text è undefined o vuota. Se una delle due risulta vera allora Joomla farà visualizzare il popup.

Ps.: tanto questi siti saranno migrati molto presto,spero, a Joomla 2.5.x o WordPress :) .

Dev Null

“Shell” di Julio C. Neves tradotto in Italiano!

Il 21 Marzo 2012 ho pubblicato una richiesta di aiuto da parte di un pinguino che sta dall’altro capo del mondo. Vi ricordate di Julio C. Neves? No? Beh allora dovete rinfrescarvi la memoria andando a leggere il post che avevo pubblicato “Aiutiamo un pinguino in difficoltà – Julio C. Neves“.

Julio C. Neves ha scritto un libro, Shell “, i cui protagonisti di questo libro sono due Nerd che bevendo birra parlano di Bash. In tutto questo entra in gioco Alberto Taddei, che vista la richiesta di Julio C. Neves, ha preso le redini del progetto andando a tradurre dal Portoghese all’Italiano.

Dopo 1 anno di lavoro, Alberto Taddei ha finalmente tradotto il libro di Julio C. Neves e potete trovarlo direttamente sul Wiki di Julio.

Link al libro Shell “: http://wiki.softwarelivre.org/TWikiBar/WebHome#Libro_della_Shell_in_italiano

Godetevi il libro e se riscontrare degli errori potete tranquillamente commentare qui sotto e riferirò il tutto ad Alberto.

Ringrazio Alberto Taddei per il suo favoloso  contributo :) .

Dev Null

[ Redmine ] Fix Dump encoding MySQL.

A lavoro dovevo importare il database di un vecchio e saggio Redmine verso un altro server per poi migrarlo ad una versione più nuova e potente. Il problema è nato quando dopo aver fatto il dump del database, mi ero accorto che i dati dumpati non erano codificati nel modo giusto. Il solito problema degli accenti e del loro strano a maledetto encoding. Il dump veniva fatto con la codifica latin1 per poi importarlo in un MySQL con encoding UTF-8, ma questo non funzionava benissimo.

Per ovviare questo piccolo problema ho eseguito sia il dump e l’import, aggiungendo delle opzioni.

Comando per il dump:

$ mysqldump -u UTENTE -p --opt --quote-names --skip-set-charset --default-character-set=latin1 NOME_DATABASE > dump.sql

Prima di effettuare l’import ho creato il database con il character set = utf8.

mysql> create database NOME_DATABASE character set utf8;

Comando per l’import dei dati:

$ mysql -u UTENTE -p --default-character-set=utf8 NOME_DATABASE < dump.sql

Facendosi così Redmine non ha sofferto più l’econding dei dati.

Dev Null

IPv6 addrconf: prefix with wrong length 56

In un server ospitato su OVH dando un bel dmesg mi sono accorto di una lunga lista di questi messaggi:

IPv6 addrconf: prefix with wrong length 56
IPv6 addrconf: prefix with wrong length 56
IPv6 addrconf: prefix with wrong length 56
IPv6 addrconf: prefix with wrong length 56
IPv6 addrconf: prefix with wrong length 56
IPv6 addrconf: prefix with wrong length 56
IPv6 addrconf: prefix with wrong length 56
IPv6 addrconf: prefix with wrong length 56
IPv6 addrconf: prefix with wrong length 56
IPv6 addrconf: prefix with wrong length 56
IPv6 addrconf: prefix with wrong length 56

per fortuna nulla di grave ma solo un piccolo errore con il prefisso. All’iterno di /proc esistono, per ogni device, tre diversi file che regolano la configurazione:

  • /proc/sys/net/ipv6/conf/ethX/accept_ra controlla dove l’host utilizza qualsiasi parte dell’autoconfigurazione (modifica anche l’individuazione dei router su on/off);
  • /proc/sys/net/ipv6/conf/ethX/autoconf controlla dove l’host genera un MAC address di base se trova un router;
  • /proc/sys/net/ipv6/conf/ethX/use_tempaddr controlla dove l’host genera un indirizzo random se trova un router;

Per fixare questo problemino bisogna seguire questi semplici comandi:

# ip -6 r l | grep /56

Output

2001:41d0:2:9a00::/56 dev eth1 proto kernel ....
2001:41d0:2:9a00::/56 dev eth5 proto kernel ....

Nel mio caso avevo due schede di rete eth1 e eth5. Subito dopo settiamo a 0 (zero) il file accept_ra.

# echo 0 > /proc/sys/net/ipv6/conf/eth1/accept_ra
# echo 0 > /proc/sys/net/ipv6/conf/eth5/accept_ra

Ultimo comando che bisogna dare è il seguente:

# ip -6 r d 2001:41d0:2:9a00::/56 dev eth1
# ip -6 r d 2001:41d0:2:9a00::/56 dev eth5

Se il tutto è andato per il verso giusto allora ridando il comando:

# ip -6 r l | grep /56

non ci dovrebbe dare nessun output.

Ps.: Ovviamente adattate la guida per i vostri device di rete.

Dev Null

Vedere un film 3D dove non esiste il 3D

L’altro giorno dando qualche ls di troppo ho scoperto di avere un film in mkv con l’unico problema che era per schermi 3D. Ora io non avendo un portatile con schermo 3D in realtà non potevo vedere questo film, ma non mi sono arreso e tramite VLC applicando qualche filtro, qualche modifica e qualche tecnica di Hokuto sono riuscito a venire nell’impresa.

Cosa voglio dire? Vi spiego subito. Avete presente i film fatti per il 3D ma che se li aprite in uno schermo che non ha la tecnologia 3D si vedono flippati in due parti? No ? Be allora procuratevi un film 3D e fate una prova. Ma comunque non andando troppo lontano con il discorso vi mostro come vedevo il film senza aver fatto modifiche al VLC.

Viaggio al centro della terra 3D

Un po’ scomodo da vedere non trovate? Ma grazie al potete e divino VLC possiamo risolvere questo problema attraverso questo luuuuuungo comando:

$ vlc --video-splitter=wall --wall-cols=2 --wall-rows=1 --wall-element-aspect=16:10 --wall-active=1 --monitor-par=1:2 film.mkv

Dopo aver dato questo comando il film ha preso un’altra piega permettendomi di gustarmi il film.

Viaggio al centro della terra 3D

Che ne dite ora, ci siamo no?

Tramite il filtro wall e modellando le sue opzioni sono riuscito ad ottenere il risultato di un NON-3D sul film. Ora posso scaricarmi  vedermi anche i film 3D su uno schermo non 3D.

P.S.: il film in questo era “Viaggio al centro della terra”. Una gran bella cavolata! L’unica cosa che si salvava era la ragazza :) .

Dev Null.

Listare contenuto di una directory escludendo certi tipi di file

Può capitare di dover listare il contenuto di una directory ma di voler escludere, dalla visualizzazione, tutti i file con estensione *.xyz. Ci sono diversi modi per fare questo e ne vedremo solo alcuni.

1) Utilizzando il comando “ls”

Tramite il comando ls possiamo listare il contenuto escludendo quello che non ci interessa. Per far ciò per prima cosa dovremmo abilitare l’opzione extglob che permette di utilizzare la tecnica del pattern matching (vedi man bash ).

Dentro una directory ho i seguenti file

-rw-r--r-- 1 lightuono lightuono    128058 feb 12 21:25 files.zip
-rw-r--r-- 1 lightuono lightuono   1274420 feb 11 22:20 pac-4.5.0.3-all.deb
-rw-r--r-- 1 lightuono lightuono   1178381 feb 11 22:45 pac.zip
-rw-r--r-- 1 lightuono lightuono    521615 feb 12 19:43 server.log

Ora voglio escludere dalla visualizzazione tutti i file con estensione *.zip. Con il comando ls devo fare così:

$ shopt -s extglob
$ ls !(*.zip) -ld

-rw-r--r-- 1 lightuono lightuono   1274420 feb 11 22:20 pac-4.5.0.3-all.deb
-rw-r--r-- 1 lightuono lightuono    521615 feb 12 19:43 server.log

Ho messo l’opzione -d per evitare di guardare il contenuto di ogni directory e di seguire eventuali collegamenti simbolici. Togliendo l’opzione -d, ad ogni directory che incontrerà ci mostrerà il suo contenuto.

2) Utilizzando il comando “grep”

Anche con il comando grep possiamo listare solo quello che ci interessa escludendo quello che non vogliamo. Basandoci sempre sull’esclusione dei file *.zip, possiamo utilizzare la seguente formula:

$ ls -ls | grep -v "\.zip$"

rw-r--r-- 1 lightuono lightuono   1274420 feb 11 22:20 pac-4.5.0.3-all.deb
-rw-r--r-- 1 lightuono lightuono    521615 feb 12 19:43 server.log

3) Utilizzando il comando “find”

Anche con il comando find possiamo listare escludendo quello che vogliamo. Escludiamo di nuovo tutti i file *.zip con la seguente formula:

$ find . -maxdepth 1 -type f \( ! -iname "*.zip" ! -iname "." \)

./pac-4.5.0.3-all.deb
./server.log

Certo come visualizzazione non è il massimo, ma possiamo migliorare:

$ find . -maxdepth 1 -type f \( ! -iname "*.zip" ! -iname "." \) -exec ls -l {} \;

-rw-r--r-- 1 lightuono lightuono 1274420 feb 11 22:20 ./pac-4.5.0.3-all.deb
-rw-r--r-- 1 lightuono lightuono 521615 feb 12 19:43 ./server.log

Ecco qui elecanti tre metodi per poter escludere dei file da una lista. Sicuramente più leggibili il primo e secondo metodo ;)

Dev Null

postdrop: warning: unable to look up public/pickup: No such file or directory.

All’interno di un server stavo provado uno script per l’upgrade di un applicazione ma quando doveva notificarmi via email tutto quello che aveva fatto, dal terminale ho ricevuto questo strano messaggio:

postdrop: warning: unable to look up public/pickup: No such file or directory.

Per risolvere questo errore bisogna, appunto, creare il file pickup all’interno della directory /var/spool/postfix/pubblic. Questo file è di tipo fifo:

” Una «FIFO» è un tipo speciale di file che permette la comunicazione fra processi indipendenti. Un processo apre la FIFO in   scrittura e un altro in lettura, dopo di ché i dati possono muoversi come le solite pipe anonime della shell o di altro. “

I comandi da fare sono i seguenti:

# mkfifo /var/spool/postfix/public/pickup
# /etc/init.d/postfix restart

Dev Null

SELinux impedisce la lettura dei siti web

Benvenuti ad un’altra putanta su SELinux il Super Sistema di Sicureza che blocca anche se stesso. L’altro giorno dopo aver configurato alcuni siti web su un server. Restartando il servizio Apache mi sono accorto che andando su i nuovi siti mi dava Access Denied. Ho pensato subito ad un problema di permessi ( owner / group ) ma questi erano settati giusti. Allora mi è sorto subito il dubbio dello zambino di SELinux.

Guardando un po’ i context tramite il comando ls -lsZ ho potuto notare che il context di quei siti non appartanevo a httpd_sys_content_t ma bensì al context dell’utente con cui avevo copiato i file.

drwxr-x---  www-data www-data user_u:object_r:user_home_t  sitoweb

per poter settare il context giusto ho eseguito questo semplice comando:

# chcon -R -t httpd_sys_content_t /var/www/sitoweb

fixando così il problema.

Dev Null

Apache Mod_proxy ‘[Error] (13)Permission Denied’ Error su CentOS

Oggi a lavoro dopo aver configurato il Proxy_ajp tra Apache e JBoss il VirtualHost non ne voleva proprio di partire. La configurazione andava bene ma cercando un po’ nei log, mi sono imbattuto in questo errore:

[error] (13)Permission denied: proxy: AJP: attempt to connect to 192.x.x.x:8019 failed

Errore al quanto strano dato che anche le regole di Firewall erano settate bene. Al che una lampadina di colpo si accese sopra la mia testa. Il problema del Permission denied era dovuto a SELinux il super Sistema di Policy sulla Sicurezza. Guardando un po’ il suo file di log -> /var/log/audit/audit.log potei notare queste righe:

type=AVC msg=audit(12650396800.305:14): avc:  denied  { name_connect } for  pid=1343 comm="httpd" dest=7009 
scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:port_t:s0 tclass=tcp_socket

Di default gli scripts Apache non hanno il permesso di poter uscire fuori dalla rete il tutto per evitare che un Hacker possa attaccare altre macchine. Purtroppo questa regola impediva il funzionamento del modulo mod_ajp provogando quel Permission Denied. Per fixare questo problemino non ho fatto altro che abilitare la policy httpd_can_network_connect.

# setsebool httpd_can_network_connect 1

Per abilitarla in maniera permanente invece ho utilizzato questo comando:

# setsebool -P httpd_can_network_connect 1

Abilitata la nuova policy il mod_ajp ha spiccato il volo :) .

Dev Null

Progetto Bash. Array – Parte pratica II

Pronti per po’ di pratica con gli Array? Nel post precedente abbiamo parlato della dichiarazione di un Array e delle sue possibili forme. Oggi lavoreremo un po’ con la sua struttura. Farò tanti piccoli esempi proprio per farvi capire come possiamo andare a manipolare un Array.

Ipotizziamo di aver un Array strutturato in questo modo:

array=("uno" "due" "tre" "quattro" "cinque")

Ora voglio sapere:

  1. il numero degli elementi.
  2. il numero delle lettere di ogni stringa.
  3. il numero totale delle lettere.

ecco come posso comporre un piccolo script.

#!/bin/bash

array=("uno" "due" "tre" "quattro" "cinque")

echo "Il totale degli elementi è: ${#array[@]}"

tot=0

for i in ${array[@]}; do
echo "La parola \"$i\" contiene ${#i} caratteri."
tot=$((tot + ${#i}))
done

echo "Il totale dei caratteri è: $tot"

Usando la sintassi ${#NOME_VARIABILE} si calcolerà il numero dei caratteri se questa è una stringa. Come potete vedere nell’esempio, subito dopo la dichiarazione dell’Array ho fatto stampare il numero degli elementi utilizzando il carattere #. Mentre per il totale di caratteri di ogni elementi ho preferito fare un FOR passando ogni elemento dell’Array e calcolando il numero di caratteri.

- Per estrarre degli elementi di un Array possiamo utilizzare:

  • La classica forma: ${array[INDICE]} oppure utilizzando un ciclo.
  • Il passaggio di parametri: ${array[@]:X:Y} dove X (inizio) e Y (fine) saranno dei numeri.
echo ${array[@]:3} # estraggono i numeri che sono successivi all'elemento ${array[2]}

echo ${array[@]:0:3} # estraggo i primi tre numeri.

echo ${array[-1]} # estraggo l'ultimo elemento dell'Array

- Modificare il carattere di ogni stringa in un vettore:

echo ${array[@],} # i primi caratteri di ogni parola si visualizzeranno in minuscolo

echo ${array[@],,} # tutti i caratteri di ogni parola saranno in minuscolo

echo ${array[@]^} # i primi caratteri di ogni parola si visualizzeranno in maiuscolo

echo ${array[@]^^} # tutti i caratteri di ogni parola saranno in maiuscolo

- Rimozione di sottostringhe

echo ${array[@]/uno/} # Elimina la prima occorenza tutti gli elementi.

echo ${array[@]//uno/} # Elimina tutte le occorenze di tutti gli elementi.

- Sostituzione di sottostringe

echo ${array[@]/t/a} # Sostituisce la prima occorenza "t" con la lettera "a".

echo ${array[@]//t/a} # Sostituisce tutte le occorenze "t" con la lettera "a".

Credo di non aver dimenticato nulla. Eventualmente siamo sempre in tempo ad aggiungere :) . Buon Array a tutti!

Dev Null