20160915

How to require autoload in vendor or outside vendor folder

Sometimes when you create a package for composer and want to create some example code you need to execute those examples as an standalone package or once included in a vendor folder of another project.

Use this simple trick in your example php files to require autoload in any location.

$autoload_location=__DIR__.'/../vendor/autoload.php';
if (!is_file($autoload_location)) $autoload_location='../../../autoload.php';
require_once $autoload_location;



20160101

Post resum 2015

Com sempre sense editar...


Gadgets of the year (comprats o regalats):
iPhone 6s

Samarretes del any:
Heisenberg
Easypromos

Friky coses guays:
Sled Dogs Snowskates
Emulador d'Amiga FE-UAE per Mac
Ulo

Jocs als que m'he viciat aquest any:
Star Wars: Commander
Finalizer, super transformation - Mame
Monument Valley

Grups guays que he descobert aquest any:
Crystal fighters
Wolf Alice
Metric
Courtney Barnett
Viet Cong
Trementina
León Benavente
Sur la planche - la femme
Hazte Lapón
Bastante
War paint
L.A.
Los Punsetes
El último vecino
Torres
Gente Joven
Indigo Girls

Millors concerts als que he anat:
Ride al PS15
Belle and Sebastian al PS15
Florence and the Machine al FIB15
Sr. Chinarro on the roof
Crystal fighters al FIB15 i al BAM
Los Punsetes al BAM
Mishima al BAM
Mourn al BAM
Sr. Chinarro i Leon Benavente a la Capsa
Johanna Newsom al Barts
Sr. Chinarro al Heliogabal
Kings of Convenience al Apolo


Millors pelis que he vist:
Fight Club al phenomena al cine!
Big Hero 6
La Reunion
Primos
Closer
Olvidate de mí
Birdman
Frank
The imitation game
Relatos salvajes
Los minions
Del reves
El extraordinario viaje de T.S. Spivet
Ex Machina
El hobbit, la batalla de los cinco ejercitos
When we're young
Francesc Ha
Gone girl (perdida)
Chappie
The interview
Hombres, mujeres y niños
Elliot Smith: Heaven adores you
Automata
Sexo facil, peliculas tristes
Akira
La mecanica del corazon
Quemar despues de leer
Star Wars, el despertar de la fuerza
Los vengadores la era de Ultron

Altres pelis que he vist:
Twix
Indomable (Haywire)
Aprendiz de gigolo
El amanecer del planeta de los simios
Guardianes de la galaxia
Too big to fail
Malditos vecinos
La vida secreta de Walter Mitty
Sex Tape, algo pasa en la nube
Open Windows
1000 maneras de morder el polvo
Al filo del mañana
La obeja Shaun
Zero Charisma
No hay dos sin tres
Lucy
El calentito
Hacemos una porno?
dos tontos muy tontos 2
Mortdecai
Felices 140
El amor y otras cosas imposibles
50 sombras de grey
Corazones de acero
La montaña rusa
Regression
Eagle eye
Las novias de mis amigos
Barbacoa de amigos

Curts:
Cowboys
2037

Llibres que he llegit i m'han agradat:
La nostalgia feliz, Amelie Nothomb
Condenada, Chuck Palahniuk
Pequeño circo, Nando Cruz
Maldita, Chuck Palahniuck

Comics:

Series a les que m'he enganxat (per ordre d'adiccio):
Versailles s1
Transparent s1 s2
Game of thrones s5
Mozart in the jungle s1
Penny dreadful s2
You're the worst s1
Catastrophe s1

Teatre:

Documentals:
La historia de Frozen
The internet own's boy
Ciutat morta
Print the legend
Las super bacterias
Epidemias, la amenaza invisible
Amy

Sortides al Extranjer:
Benicassim

Millors Hotels als que he anat:
NH a Castello

Millors restaurants:
El xiringuito de l'Escriba
Els Pescadors


20150714

How to send you an email with your mysql slave seconds behind master value

It's dead simple, just schedule a crontab with this line:

mysql -u root -p -e "show slave status \G"|grep Seconds | mail -s "Seconds behind master"


This will query the slave status, grep the most important line and send you an email.

Hope this help

20150612

How to query a memcache top using shell script

In case you want to watch the most important parameters of your memcache installation you can use this basic shell script:

watch "echo stats | nc 127.0.0.1 11211 |grep -v conn_yields |grep -v time|grep -v cmd|grep -v threads \
|grep -v evictions|grep -v reclaimed|grep -v auth|grep -v pointer_size|grep -v accepting_conns \
|grep -v bytes_read|grep -v bytes_written|grep -v badval|grep -v structures|grep -v pid \
|grep -v version|grep -v rusage|grep -v incr|grep -v decr|grep -v listen|grep -v cas \
|grep -v total_connections|grep -v delete|grep -v total_items|grep -v END"

It shows the most important parameters every two seconds ignoring the other ones, you can tune the showed params removing grep -v commands at your will.

Enjoy!


20150107

Resum de l'any 2014

Com cada any publico un resum del que ha estat el 2014 en diferents categoríes, sobretot com a recordatori personal.

No edito gaire perquè els nens estàn a punt de llevar-se :)

Gadgets of the year (comprats o regalats):
Xarxa PLC amb Wifi
Impressora HP Deskjet Wifi

Samarretes del any:
Piedra, papel, tijera, lagarto, spock

Friky coses guays:
mailgun
mandrill
telegram
que seth macfarlane (padre de familia) es productor del nou Cosmos
que el prota de Prison Break es el guionista d'Stoker
Jacob Dhein mola molt
Kibana
red herring (literalment arenque rojo, metaforicament pista falsa)

Jocs als que m'he viciat aquest any:
StarWars Commander

Grups guays que he descobert aquest any:
Desert

Millors concerts als que he anat:
Arcade Fire
Pixies

Millors pelis que he vist:
The wolf of wall street
django unchained
Magnolia
Las brujas de zagarramurdi

Stoker
Un heureux evenement
X-Men days of future past
Lobezno inmortal
Grand Hotel Budapest
Rushmore
La LEGO pelicula
Stockholm
God help the girl
nebraska
¿que hacemos con maisie?
dallas buyers club
La ultima nit de Boris Grushenko
Capitan America, soldado de invierno

Altres pelis que he vist:
ironman 3
Mama
Her
After earth
Movie 43
En llamas
The Cabin in the woods
Battleship
Lincoln
Oblivion
Si fuera facil
In time
Sinister
Elyseum
Ilusion
Ruby Sparks
Jobs
The Internship
El profesional, Leon
Pacific Rim
Jackie Brown
SpringBreakers
La vida de Adele
Boogie nights
World War Z
Gravity
Don Jon
Las ventajas de ser un marginado
La gran familia Española
El Mayordomo
El hombre de acero
Juegos secretos
La lista
Once
Salvajes
La purga
Thor el reino oscuro
Un hombre solitario
Quien mato a bambi
Hannah Arendt
Lio embarazoso
Wallstreet
nymphomaniac 1 i 2
El canguro
Clear History
Una juerga de pelotas
El perfume
Supersalidos
Asalto al poder (Whitehouse down)
La gran estafa americana
Blue Jasmine
robocop 2014
The bling ring
Prisioneros
Agosto
la leyenda del samurai - 47 ronin
Amazing Spiderman 2:  El poder de Electro

Curts:
Voice Over
La rubia de Pinos puente
Validation

Llibres que he llegit i m'han agradat:
Desert

Comics:
Los surcos del azar, Paco Roca
Crisis de ansiedad, Juanjo Saez
Realidad a la piedra, Joaquin Reyes
El otro mar,  Alfonso Zapico
Battle of the atom
Guia del mal padre 2
Manual para padres frikis, año 0
Sansamba
cooltureta
Degenerados

Series a les que m'he enganxat (per ordre d'adiccio):
Fargo s1
Juego de tronos s4
True Detective s1
Downton Abbey s4, s5
Silicon Valley s1
Penny dreadful s1
Halt and catch fire s1
Parenthood s4 s5
The leftovers s1
Portlandia s4
Dates s1
The strain s1
Believe s1
Los 100 s1
Capture s1
The writers room
Gadget man s1

Teatre:
Desert

Documentals:
ComicCon
europe in 8-bits
Mel Brooks, haz ruido
El culo del mundo
The punk singer
La mentira de Lance Armstrong
We steal secrets: La historia de Wikileaks
Donald Rumsfeld: certezas desconocidas
InRealLife (La Red)
Los 90: la decada que nos conecto
There will be dragons

Sortides al Extranjer:
EuroDisney
Madrid

Millors Hotels als que he anat:
Desert

Millors restaurants:
Bacoa
Osmosis
El cau del pescador
Els pescadors
Gorria
Le 58


20141016

Patching poddle bug in Apache

If you use HTTPS with Apache in Ubuntu or other Linux flavor it's very feasible that you have SSL v3 enabled, and then be vulnerable to the poddle bug.

To prevent Apache to use SSL v3 you can add those lines (in bold) to your typical SSL config in the Virtual host affected.

--------------------------
  SSLEngine on

  SSLProtocol All -SSLv2 -SSLv3

  SSLCertificateFile    /etc/ssl/certs/xxxx.com.crt
  SSLCertificateKeyFile /etc/ssl/private/xxxx.com.key
  SSLCACertificateFile  /etc/ssl/certs/CA.xxxx.com.crt
------------------------

And of course restart Apache!

Note: In recent versions is recomended to add this lines too, but read the full info in the link below for more info.

SSLCipherSuite          ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
SSLHonorCipherOrder     on
SSLCompression          off


Check very fast your configuration with this geotrust tool https://ssltools.geotrust.com/checker/views/certCheck.jsp

Or you can check all kinds of SSL problems with this Qualys great but slower tool:

https://www.ssllabs.com/ssltest/

More general information about this problem in: http://askubuntu.com/questions/537196/how-do-i-patch-workaround-sslv3-poodle-vulnerability-cve-2014-3566


20140927

Ultimate guide to patch ShellShock in old Ubuntus

I've recently have to patch 28 ubuntu servers in our company, in theory it's an easy procedure but, you know, when you're dealing with old systems that have not been updated for years it can get a little more complicated.

Looking for the solution in different posts I've compiled my own recipe.

First of all, how to know if you're vulnerable?

Run this:
env X="() { :;} ; echo busted" `which bash` -c "echo completed"


OK output:
/bin/bash: warning: X: ignoring function definition attempt
/bin/bash: error importing function definition for `X'
completed

KO output, must be PATCHED!:
busted
completed

The easiest way to update in Ubuntu is using aptitude:

apt-get update
apt-get install --only-upgrade bash

If for any reason this method don't work (outdated sources.list or pointing to old-releases or whatever), you can update bash rebuilding from source, this method should work for other Linux flavors but I've only tested in Ubuntus.

It's easy to update from source following this recipe:

cd /src
wget http://ftp.gnu.org/gnu/bash/bash-4.3.tar.gz

for i in $(seq -f "%03g" 0 25); do wget http://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-$i; done
tar zxvf bash-4.3.tar.gz
cd bash-4.3
for i in $(seq -f "%03g" 0 25);do patch -p0 < ../bash43-$i; done
./configure --prefix=/usr --bindir=/bin --sbindir=/sbin --sysconfdir=/etc && sudo make && sudo make install

Remember to re-check the initial command to see if the problem has vanished.

Sources for this post:

20140907

Cómo modificar el tmpdir de mysql y no tener problemas de permisos al reiniciar el servicio #ubuntu #apparmor #mysql #tmpdir


Estos días me he encontrado con problemas por falta de espacio en el /tmp al hacer consultas pesadas con ordenaciones o group-bys que generaban mucho espacio temporal, por defecto el servidor venía con 2Gbs en /tmp pero con una tabla de 2 millones de registros no podia hacer algunas consultas y me fallaban por falta de espacio en /tmp.

Al intentar cambiar la variable tmpdir del my.cnf me aparecia un error al reiniciar el mysql que evitaba que arrancase (de mal en peor).

El error que me encontraba era:

/usr/sbin/mysqld: Can't create/write to file '/mnt/sdb1/tmp/ib05T1js' (Errcode: 13)
140907 10:50:18  InnoDB: Error: unable to create temporary file; errno: 13

Al final el culpable era el apparmor que define ciertos directorios donde puede escribir el mysql y otros procesos críticos del sistema.

En este mini-tutorial además aprovecharemos para crear un temporary filesystem para mejorar la eficiencia de los sorts de mysql.

NOTA: No hay garantía de que funcione! sólo lo he probado con un ubuntu 12.04 y es probable que se tengan que modificar detalles para otros sistemas.

En resumen, la idea es modificar el directorio tmpdir de mysql utilizando un temporary filesystem en un disco secundario y solucionando los problemas que da el apparmor.

Vamos a asumir que tenemos montado un filesystem en un disco secundario con poca carga /mnt/sdb1

Primero crearemos un directorio tmp en este filesystem:

cd /mnt/sdb1
mkdir -p tmp

Le damos permisos adecuados:

chmod 0777 tmp
chown mysql:mysql tmp

Obtenemos el id de grupo y de usuario de mysql:

id mysql

Editamos el /etc/fstab e incluimos la linea:

tmpfs /mnt/sdb1/tmp tmpfs rw,gid=110,uid=105,size=4G,nr_inodes=10k,mode=0700 0 0

OJO: utilizar el gid y el uid obtenidos en el paso anterior y definir size al valor que nos interese, en el ejemplo 4G (4 Gigas)

Re-montamos los filesystems:

mount -a

Editamos la configuración del tmpdir de mysql (/etc/mysql/my.cnf), parametro tmpdir:

tmpdir=/mnt/sdb1/tmp

Este es el punto crítico ya que si reiniciamos en este punto y tenemos el apparmor activado nos dará error ya que el apparmor no tiene el direcotio /mnt/sdb1/tmp como permitido para mysql.

Editamos el fichero de configuración de apparmor para mysql /etc/apparmor.d/local/usr.sbin.mysqld añadimos estas dos líneas al final:

/mnt/sdb1/tmp/ r,
/mnt/sdb1/tmp/** rw,

Reiniciamos el apparmor:

service apparmor reload

Ahora ya podemos reiniciar el mysql sin problemas:

service mysql restart


Espero que os sirva!

20140828

Com utilitzar les cues de missatges natives de UNIX amb PHP

Si mai us heu trobat el problema de registrar visualitzacions a objectes que teniu en base de dades però no voleu penalitzar el rendiment fent un UPDATE cada vegada que un usuari entra al detall d'aquest objecte, una manera molt fàcil de millorar el rendiment es fer servir cues de missatges. La pàgina de detall només registre el hit a la cua i després tenim un batch per anar processant els hits dels últims minuts.


En concret amb PHP la solució més simple es utilitzar les cues de sistema operatiu, es tant fàcil com:


Enviar visualitzacions d'ids a una cua:
// 12345 es el número de cua de procés, ha de ser un número que només utilitzem nosaltres per comunicar els diferents processos.
$queue=msg_get_queue(12345);
msg_send($queue, 1, $id);



Consumir la cua (ho farem en un cron, per tant si trobem el final de la cua sortim):


$queue = msg_get_queue(12345);
$msg_type = NULL;
$msg = NULL;
$max_msg_size = 512;
while (msg_receive($queue, 1, $msg_type, $max_msg_size, $msg))
{
  //do your business logic here and process this message!
  //finally, reset our msg vars for when we loop and run again
  $msg_type = NULL;
  $msg = NULL;
  // Si ja no tenim missatges deixem de processar
  $stats=msg_stat_queue($queue);
  if ($stats['msg_qnum']===0) break;
}



Una manera de veure els missatges que hi han a les cues es utilitzant la comanda de sistema ipcs, en concret:
ipcs -q


Pots sofisticar tant com vulguis la logica, pots jugar amb el $msg_type per enviar i consumir diferents tipus de missatges i el $msg pot ser qualsevol objecte (serialitzat automàticament).

Per provar si el teu sistema operatiu permet utilitzar les cues des de PHP pots fer servir aquest script de test:


echo "Creamos cola\n";
$queue=msg_get_queue(11111);
echo "Insertamos en cola\n";
msg_send($queue, 1, 'hola');
echo "Obtenemos estadisticas de la cola\n";
$stats=msg_stat_queue($queue);
print_r($stats);

echo "Obtenemos mensajes de la cola\n";
$msg_type = NULL;
$msg = NULL;
$max_msg_size = 512;
while (msg_receive($queue, 1, $msg_type, $max_msg_size, $msg)) 
{
echo "Message pulled from queue - $msg \n";
$stats=msg_stat_queue($queue);
//print_r($stats);
if ($stats['msg_qnum']===0) break;
}
echo "Finalizado\n";



La salida si todo es correcto debería ser:

------------
Creamos cola
Insertamos en cola
Obtenemos estadisticas de la cola
Array
(
    [msg_perm.uid] => 0
    [msg_perm.gid] => 0
    [msg_perm.mode] => 438
    [msg_stime] => 1409301612
    [msg_rtime] => 0
    [msg_ctime] => 1409301612
    [msg_qnum] => 1
    [msg_qbytes] => 16384
    [msg_lspid] => 48299
    [msg_lrpid] => 0
)
Obtenemos mensajes de la cola
Message pulled from queue - hola
Finalizado
-----------


Més informació:
Comanda ipcs
Tutorial1
Tutorial2




Happy coding!

20140328

Cómo hacer miniaturas de una web desde Ubuntu

UPDATE: EN UBUNTU 14.04 HE TENIDO QUE HACER UN PAR DE CAMBIOS PARA QUE FUNCIONE:
- En lugar de instalar libicu48 se debe instalar libicu52, o sea:
apt-get install libicu52
- El make petará porque se tienen que incluir unas clases adicionales, ir al fichero CutyCapt.hpp y añadir estas lineas al principio antes de hacer el make.
#include
#include

#include

En este post quiero explicar como realizar un screenshot de una URL cualquiera utilizando un software gratuito y de código abierto que funciona de maravilla.

Vamos a usar CutyCapt, en concreto vamos a ver la instalación y ejecución en Ubuntu.
























Primero vamos a instalar librerias de soporte varias, entre ellas Subversion para descargar CutyCapt de su repositorio y xvfb que nos permitirá lanzar una instancia de XWindows de manera muy sencilla.

apt-get install subversion libqt4-webkit libqt4-dev g++ xvfb libicu48 

Descargamos CutyCapt de su repositorio de subversion (posicionarse primero en el directorio donde lo queramos instalar):

svn co svn://svn.code.sf.net/p/cutycapt/code/ cutycapt 

Instalamos:

cd cutycapt/CutyCapt 
qmake
make 


Ya estamos listos para usarlo!

 Ejemplo de comandos:

xvfb-run --server-args="-screen 0, 1024x768x24" ./CutyCapt --url=http://www.omatech.com --out=omatech.png 
xvfb-run --server-args="-screen 0, 1024x768x24" ./CutyCapt --url=http://www.easypromosapp.com --out=easypromos.png 

Podemos jugar con los distintos parámetros como la resolución de pantalla y por supuesto la url y el fichero y formato de salida.

Con estas sencillas instrucciones puedes montar un generador de thumbnails de urls con muy poco esfuerzo via línea de comandos.

Puedes adaptar fácilmente estas instrucciones a tu propia versión de Linux, creo que CutyCapt incluso funciona para Windows.

 ¡A disfrutar!

Más información sobre CutyCapt en su web: http://cutycapt.sourceforge.net/