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/

20140202

Playing with the Marvel API in PHP

This sunday afternoon I've been trying the new marvel.com API.

As a huge fan of the house of the ideas I think this can be a great tool for developers around the world.

If you're new to the API you must connect to marvel developers developer.marvel.com and sign in and request an API key.

Once you get your private and public keys you can try the API, there are methods for getting comics, characters, creators and much more.

You can use this little sample to see the working of the API if you're a PHP coder.

You can see a live demo here marvel.omatech.com this simply shows 100 characters per page and let you select the page in the top links, you can browse all the Marvel characters in only 40 lines of code.

20140101

Presentació de l'iPhone SDK (esdikey)

(post del 2008 que se'm va quedar en drafts)

Aquesta nit no podía dormir i com que sabía que hi havia la presentació d'Apple del nou SDK per l'iPhone, m'he decidit a veure el vídeo de presentació.

JA NO PODRE DORMIR !

Increible, un SDK amb accés a totes les funcionalitats del Sistema Operatiu i les increibles funcionalitats que només trobes en un iPhone:

- Multi-touch interface
- TCP/IP integrat
- 3D Engine
- Posibilitat de localitzar-te
- Accés a la API del accelerometer (moviment espaial, tipus Wiimote)
- SQLLite integrat

A més el SDK es gratuit, pots baixar-te'l i començar a programar JA!

També han pressentat una especie de tenda on podras descarregar els programes (sempre validats per Apple). Falta veure si aquest model de distribució de software trionfa o no, pero les característiques son espectaculars.

- Instal.lació i actualització dels programes "over the air" sempre que tinguis connexió
- Els programes gratuits son realment gratuits, si passen el control de qualitat d'Apple, el desenvolupador no ha de pagar res i l'usuari tampoc.
- Els programes de pagament es venen amb un rati de 70-30 (70 pel developer, 30 per Apple)

L'unic fee que han anunciat es un fee de 99$ per entrar dins del developer program, amb la qual cosa crec que donaran support als desenvolupadors, dema mateix, omatech.com s'apuntarà al developer program, no hi ha res a perdre i si molt a guanyar.

Bé, els competidors ja es poden possar les piles:
- Nokia ja cal que espabilis
- Microsoft deixa-ho ja, si en tants anys no t'has fet amb el mercat, ja no ho faras
- Google, potser necessitaras alguna cosa més que un Android per trencar el mercat.

Si encara no era un "believer" avui m'han convençut, l'iPhone arrasarà, es un producte trencador que pot capturar molt "developer mind share" en molt poc temps i aquest cop Microsoft no té ni idea del que li ve a sobre.

Més informació a http://developer.apple.com
Per cert aquí teniu el vídeo que m'ha fet veure la llum

Historic handhelds en els últims 16 anys

Tots els que em coneixeu sabeu que soc un friki dels gadgets tipus PDA o handheld des de fa un munt d'anys, en concret el 2014 farà 16 anys que tinc dispositius d'aquest tipus.

Com a registre personal documento les meves compres:

Palm Personal - 17/04/1998 (29 messos d'us)
Palm Vx - 01/09/2000 (27 messos d'us)
Palm Tungsten T - 05/12/2002 (24 messos d'us)
Palm T|5 - 20/12/2004 (25 messos d'us)
Palm T|X - 05/01/2007 (19 messos d'us)
Palm Centro - 27/07/2008 (22 messos d'us)
Palm Pixi Plus - 25/05/2010 (13 messos d'us)
iphone4 - 10/06/2011 (30 messos d'us)
iphone5c 10/12/2013 (?)

Com veureu l'iPhone4 ha estat el gadget que m'ha durat més, molt aprop de la primera Palm Personal que vaig tenir, l'iPhone4 encara em podia haver durat més pero el canvi a iOS7 l'ha enlentit molt, en canvi el hardware estava en perfecte estat i el guardaré com backup del nou iPhone5c.