20091210

Tutorial de memcache

Memcache es una extensió de PHP que interactua amb memcached, que a la seva vegada es un daemon de cache en memoria, molt simple, que enmagatzema parells key=>value on value pot ser qualsevol cosa serialitzable amb PHP.

Per instal.lar amb Ubuntu farem el següent:
apt-get install memcached
apt-get install php5-memcache

Reiniciar apache:
/etc/init.d/apache2 restart

Es pot fer un php amb un phpinfo(); per veure si hi ha un apartat memcache

Per veure si esta funcionant el memcached (el daemon):
netstat -tap | grep memcached

Per modificar els parametres de memoria etc. editar /etc/memcached.conf

per exemple, per configurar 300Mbs de memoria disponible per variables a memcached modificarem el flag -m del fitxer de configuració:
-m 300

Reiniciar memcached
/etc/init.d/memcached restart

Per consultar les estadistiques en temps real del memcached:

telnet localhost 11211
>stats

Exemple de output:


Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
stats
STAT pid 4666
STAT uptime 153661
STAT time 1260523656
STAT version 1.2.2
STAT pointer_size 64
STAT rusage_user 4.850000
STAT rusage_system 15.100000
STAT curr_items 16001
STAT total_items 57971
STAT bytes 282532500
STAT curr_connections 1
STAT total_connections 120074
STAT connection_structures 32
STAT cmd_get 120016
STAT cmd_set 57971
STAT get_hits 66178
STAT get_misses 53838
STAT evictions 0
STAT bytes_read 1108602586
STAT bytes_written 1317300490
STAT limit_maxbytes 314572800
STAT threads 1
END


Ara només cal modificar el nostre codi per enmagatzemar rows de la base de dades, durant un cert temps, en aquests exemples, creem una clau $action.'/'.$param1.'/'.$param2 o sigui per exemple 'category/23/1' i el valor serà el resultat de la base de dades (una array de rows).

La instrucció set enmagatzema a memcached:

$mc->set($action.'/'.$param1.'/'.$param2, $rows, 1, 3600);

El primer parametre es la clau, el segon el valor, el tercer si volem comprimir el contingut o no i el quart el temps en segons que tindrem el valor al memcache (1 hora)

La següent vegada que haguem de fer la consulta farem el següent:

$rows=$mc->get($action.'/'.$param1.'/'.$param2);

Si ens retorna null, es que no hi es, pero durant una hora, no ens caldrà repetir la consulta.

Exemples de codi:


function get_last($num=16, $offset=1, $flag = 1)
{
$sql = "SELECT v.*
, p.title portal_title
, p.url portal_url
, p.id portal_id
FROM ep_videos v, ep_portals p
WHERE v.portal_id = p.id
AND v.status = 'O'
ORDER BY v.added DESC
LIMIT ".(($offset-1)*$num).", ".$num;

$action='home';
$param1='1';
$param2=$offset;
$mc=new Memcache;
$cr=$mc->connect('localhost', 11211);
if ($cr)
{// tenim memcached
$rows=$mc->get($action.'/'.$param1.'/'.$param2);
if ($rows==null)
{// no el tenim a cache
$rows=parent::get_data($sql);
$mc->set($action.'/'.$param1.'/'.$param2, $rows, 1, 3600);
}
}
else
{// no tenim memcached
$rows=parent::get_data($sql);
}

return $rows;
}

function get_last_in_category($id, $num=16, $offset=1)
{
$sql = "SELECT v.*
, p.title portal_title
, p.url portal_url
, p.id portal_id
FROM ep_portals p
, ep_videos v
, ep_categories_videos cv
WHERE cv.video_id = v.id
AND cv.category_id = ".$id."
AND v.status='O'
AND v.portal_id = p.id
ORDER BY v.added DESC
LIMIT ".(($offset-1)*$num).", ".$num;

$action='category';
$param1=$id;
$param2=$offset;
$mc=new Memcache;
$cr=$mc->connect('localhost', 11211);
if ($cr)
{// tenim memcached
$rows=$mc->get($action.'/'.$param1.'/'.$param2);
if ($rows==null)
{// no el tenim a cache
$rows=parent::get_data($sql);
$mc->set($action.'/'.$param1.'/'.$param2, $rows, 1, 3600);
}
}
else
{// no tenim memcached
$rows=parent::get_data($sql);
}

return $rows;

//return parent::get_data($sql);
}

function get_last_in_tag($id, $num=16, $offset=1)
{
$sql = "SELECT v.*
, p.title portal_title
, p.url portal_url
, p.id portal_id
FROM ep_portals p
, ep_videos v
, ep_tags_videos cv
WHERE cv.video_id = v.id
AND cv.tag_id = ".$id."
AND v.status='O'
AND v.portal_id=p.id
ORDER BY v.added DESC
LIMIT ".(($offset-1)*$num).", ".$num;

$action='tag';
$param1=$id;
$param2=$offset;
$mc=new Memcache;
$cr=$mc->connect('localhost', 11211);
if ($cr)
{// tenim memcached
$rows=$mc->get($action.'/'.$param1.'/'.$param2);
if ($rows==null)
{// no el tenim a cache
$rows=parent::get_data($sql);
$mc->set($action.'/'.$param1.'/'.$param2, $rows, 1, 3600);
}
}
else
{// no tenim memcached
$rows=parent::get_data($sql);
}

return $rows;

//return parent::get_data($sql);
}

20091030

Genial mail d'activació de mequedouno.com



La gent de mequedouno.com esta apunt d'arrancar, si us voleu apuntar a les alertes per email rebreu aquest cachondo mail d'activació, GENIAL!


VERSION RAPIDA DEL MAIL:

Activa tu cuenta pulsando aquí: [activate link]

VERSION GEEK DEL MAIL:

Morfeo - Me imagino como te has de estar sintiendo, un poco
como Alicia cayéndose por la madriguera del conejo...

uno - Se podría decir así.

Morfeo - Se te nota en los ojos. Tienes la mirada de un hombre
que acepta lo que ve porque está esperando a despertar.
Irónicamente, es bastante cierto. ¿Crees en el destino uno?

uno - No.

Morfeo- ¿Porqué no?

uno - No me gusta la idea de no controlar mi vida.

Morfeo- Sé exactamente de qué estas hablando. Déjame decirte
porqué estás aquí. Estás aquí porque sabes algo. No puedes
explicar ese algo. Pero lo sientes. Lo has sentido toda tu
vida. Este mundo tiene algo raro. No sabes qué es, pero ahí
está. Como una astilla en tu mente... volviéndote loco. Esta
sensación es la que te ha traido a mi. ¿Sabes de qué estoy
hablando?

uno - ¿De ME QUEDO UNO?

Morfeo - ¿Quieres saber lo que es?

uno - Si.

Morfeo - ME QUEDO UNO está por todas partes. A nuestro
alrededor. Incluso aquí, en este mail. Lo ves cuando
miras el correo... o cuando visitas Facebook o Twitter...
cuando enciendes el ordenador. Lo sientes cuando vas
a trabajar... cuando vas de tiendas... cuando
pagas tus impuestos. Es la oportunidad que ponemos
delante de tus ojos para mostrarte la verdad.

uno - ¿Qué verdad?

Morfeo - Que pagas demasiado uno. Como todos, naciste
para pagar demasiado por las cosas. Naciste en una
prisión que no puedes oler, probar ni tocar. Una
prisión... para la mente. Desafortunadamente uno
no le puede decir a cualquiera qué es ME QUEDO UNO.
Necesitas verlo con tus propios ojos. Esta es tu
última oportunidad. Después ya no puede echarte atrás.
Si cierras este mail sin más, la historia acaba, sigues
comprando como siempre y crees lo que tú quieres creer.
Si pulsas este link: [activate link] te quedas en el
País de las Maravillas y te enseñaremos lo profunda que
es la madriguera. Recuerda... sólo te estoy ofreciendo
la verdad. Nada más.

Tu decides.

20091018

The ultimate backup script for web based projectes



The goal of this backup shell script is to take, all the webfiles, config files, crontab and mysqldumps from the source server to a backup server. The backup must be programed daily in the crontab of the source server.

What we exactly do?

First we do a mysqldump for every database we are interested in, we do a different backup for every weekday, we'll have a dbname1.sql for monday, dbname2.sql for tuesday, and so on.

As long as the backup script must be placed in the backup folder, we'll be keeping all the .sql files in the backup folder already.

In a second step we do a gzip of this .sql files

Then we'll generate a crontab.txt in the backup folder with the content of the crontab of the user.

Afterwards we copy the apache configuration files apache2.conf and the whole folder of sites-available

Finally we rsync the files of the webroot folder and the backup folder to the remote server.

The first time you run the script it will take longer because the full webroot folder must be transfered, but the next times it only copy the incremental changes done since last execution.

When you've tested the script you can program a crontab like this:

MAILTO=your_email
00 12 * * * cd backup_folder;./backup.sh



The script (/user/home/backup_folder/backup.sh):


FECHA=`date +%u`
DB=dbname1
echo starting backup $DB $FECHA
mysqldump --user=user --password=password --host=host \
--default-character-set=utf8 $DB > $DB$FECHA.sql
echo done backup $DB $FECHA

DB=dbname2
echo starting backup $DB $FECHA
mysqldump --user=user --password=password --host=host \
--default-character-set=utf8 $DB > $DB$FECHA.sql
echo done backup $DB $FECHA

echo starting to gzip files
gzip -f *.sql
echo done gzip files

echo starting copy of config files
crontab -l > crontab.txt
cp /etc/apache2/apache2.conf .
cp -R /etc/apache2/sites-available .
echo done copy of config files

echo starting rsync with remote host
rsync --verbose --progress --stats \
--exclude "*.log" --exclude "cache_pages/" \
--compress --recursive --times --perms --links \
/var/www remote_user@remote_host:

rsync --verbose --progress --stats --compress \
--recursive --times --perms --links \
/user/home/backup_folder remote_user@remote_host:
echo done rsync with remote host


Line by line explanation:

1. FECHA=`date +%u`
2. DB=dbname1

3. mysqldump --user=user --password=password --host=host \
--default-character-set=utf8 $DB > $DB$FECHA.sql

1. Creates a shell variable with the number of weekday, $FECHA will be 1 for monday, 2 for tuesday and so on.

2. Creates a variable with the name of the database, you must replace for your real database name, for example DB=enterprise_prod

3. mysqldump do a backup of your database in SQL format, replace user, password and host by your real data and be aware of the --default-character-set=utf8 you can use this is your database is in utf8, otherwise remove this option. The last part > $DB$FECHA.sql constructs the name of the .sql file that is generated (in our example enterprise_prod1.sql if it's monday, enterprise_prod2.sql if it's tuesday and so on)

-----------

4. gzip -f *.sql

4. gzip all the .sql files, after the mysqldump we'll have only one .sql file, after this line the .sql file will be transformed into a .sql.gz file (enterprise_prod1.sql.gz for example)

------------

5. crontab -l > crontab.txt
6. cp /etc/apache2/apache2.conf .
7. cp -R /etc/apache2/sites-available .

5. Create a file called crontab.txt with the content of the crontab of the user.
6. Copy the apache config file (change your path as needed)
7. Copy the full folder of sites-available to the backup folder (change your path as needed)

-------------

8. rsync --verbose --progress --stats \
--exclude "*.log" --exclude "cache_pages/" \
--compress --recursive --times --perms --links \
/var/www remote_user@remote_host:

9. rsync --verbose --progress --stats --compress \
--recursive --times --perms --links \
/user/home/backup_folder remote_user@remote_host:

8. Rsync all the files in the document root /var/www (change the document root as needed) recursively and with compression, maintaining the files timestamps and copying links. You can see that I've excluded a couple of things, the .log files and a folder called cache_pages that doesn't need to be backed up. Change the remote user with the name of the remote user (if it's different from the source user) and change remote host with the IP address or the name of the remote server (remote.omatech.com for example)

9. Rsync the backup folder, change the backup folder with the absolute path of your source backup folder.

In the steps 8 and 9, rsync will create in the home of the remote user in the remote server a www folder with the contents of the document root of the source server and a mirroring backup folder.

Notes:
TAKE THIS SCRIPT WITH NO WARANTY, test it line by line carefully.

To avoid rsync to ask for the password of the remote user you must do the following:

Create a ssh key in the source server:

ssh-keygen -tdsa

Press enter to all the questions and take note of the generated file id_dsa.pub (usually in the .ssh folder of the user (beware that the .ssh folder is hidden you must use ls -la to see it)

copy the content of the file to the remote server, to the folder .ssh of the backup remote user to a file named authorized_keys, for example you can do:

Source server:

ssh-keygen -tdsa
// Enter, enter, enter
cd
cd .ssh
cat id_dsa.pub
// Copy all the content shown


Remote server:

cd
cd .ssh
cat >> authorized_keys
// Paste the content copied before
Ctrl+D (to close the file)
cp authorized_keys authorized_keys2
chmod 0600 authorized_keys authorized_keys2
cd ..
chmod 0700 .ssh

20091015

Create the first bracket of a tournament


Bueno tetes, no tinc molt de temps però si algun cop us heu trobat en el cas de com crear un bracket per un torneig, no es del tot trivial.

Us deixo un troç de codi que el seu output es una array on cada element s'ha d'emparellar amb el següent per construir un bracket inicial d'un torneig ben balancejadet (com els de dragonball, vamos)

Evidentment $inicial es el primer jugador i $final es l'ultim, segur que no funciona si no son números de jugadors correctes, com 8,16,32,64... etc.


$inicial=1;
$final=32;
$num_jugadores=$final-($inicial-1);
$emparejamientos=array(1,4,2,3);
$num_jugadores_tmp=4;
while ($num_jugadores_tmp!=$num_jugadores)
{// desdoblabiento
$num_jugadores_tmp=$num_jugadores_tmp*2;
$emparejamientos_tmp=array();
foreach($emparejamientos as $emparejamiento)
{
array_push($emparejamientos_tmp, $emparejamiento);
array_push($emparejamientos_tmp
, ($num_jugadores_tmp+1)-$emparejamiento);
}
$emparejamientos=$emparejamientos_tmp;
}
print_r($emparejamientos);


Resultat per 16 jugadors:

Array ( [0] => 1 [1] => 16 [2] => 8 [3] => 9 [4] => 4
[5] => 13 [6] => 5 [7] => 12 [8] => 2 [9] => 15
[10] => 7 [11] => 10 [12] => 3 [13] => 14 [14] => 6
[15] => 11 )


I després de tractar-ho i simular resultats:

Ronda 1
1: 1 vs. 16 winner=1
2: 8 vs. 9 winner=9
3: 4 vs. 13 winner=13
4: 5 vs. 12 winner=12
5: 2 vs. 15 winner=2
6: 7 vs. 10 winner=7
7: 3 vs. 14 winner=14
8: 6 vs. 11 winner=6

20090927

Fascicles setembre 2009

Aquest es el 6é any que faig la llista de fascícles que han sortit a la tele anunciats durant setembre. Abaix podeu trobar els links als anys anteriors.

Recordeu que encara que existeixin les col·leccions no les apunto si no tenen anunci a la tele.

L'any 2009 es caracteritza per el descents de anuncis, no se si jo miro menys la tele o si realment hi han hagut menys anuncis, judgeu vosaltres mateixos.

Aquí la llista d'aquest any:

  • Punto de cruz
  • Pocoyo
  • Hello Kitty Party
  • Figuras Marvel de coleccion
  • Espinete y Barrio Sesamo
  • La casa de la pradera
  • Biblioteca Star Wars
  • Curso de baile
  • Construye el Titanic
  • Seleccion de joyas literarias juveniles
  • Instrumentos Musicales
  • curso de ingles planeta agostini
  • Curso practico de dibujo y pintura
  • Erase una vez el cuerpo humano
  • zippo colection
  • Curso de Manga y Anime
  • Guia esencial de belleza
  • Mil ideas de ganchillo
  • magic english
  • Seat, la colección


Total: 20

Evolució dels fascícles durant els útlims 6 anys:

Evolucio dels Fascicles


Links als posts sobre fascicles d'anys anteriors:

20090821

Les 57 fotos més frikies del viatge a Japó, Agost del 2009

KONICHIWA!

Aquest Agost hem fet un viatge a Japó, ha estat genial i hem vist moltes coses, més de 1.500 fotos, no us espanteu, he fet una sel.lecció només amb les més frikies.

Sobretot gracies al Jordi que ens va acollir a casa seva i es un mestre en les costums locals.

He classificat les fotos en diferents temàtiques: Toilettes, Papereres, Plastic Food, Take Away Paella, Pantalla tàctil a un bar Japonés, False Friends, Més False Friends, ara marques comercials, Anuncis, Anuncis amb famosos, FREE MASONS, Cartells, Pikachu a la Tokyo Tower, Màquines de menjar, Japanglish, Berto a Nikko, Gelats, GATETES, MONETES, CIERVÉTES, Hello Kitty, Altres.

Here we go!

Toilettes


Flipants els banys Japonesos, OJO, no tots son així, però si aneu a grans magatzems, edificis grans, hotels o museus, podeu trobar-ne i son la OSTIAAAAAAAAAAAAAAA. No em creia lo dels Simpson, però es totalment cert.

Toilette del Hotel de Kyoto

Detall dels botonets, videt, chorrito, potencia de l'aigua, escalfar el seient i MOLT IMPORTANT, el STOP, per parar el chorrito !

Papereres


Aquesta la considero una foto freak perquè a Japó no trobareu papereres, aquesta la vaig trobar a Asakusa. De fet, el lloc més practic per llençar coses es al costat de les màquines de vending de begudes, que estan per tot arreu.

La única paperera de Japó !


Plastic Food


Això si que no es un mite, gairebé tots els locals tenen el menjar de plastic mostrant el que ofereixen i la veritat es que es bastant fidel al resultat final. Així simplifica els problemes idiomàtics, hitatsu ETE (senyalant amb el dit), futatsu ELOTO i palante !

El tete posant amb la plastic food.

Exemple addicional de plastic food.

Més plastic food.

Take Away Paella


A casa el Jordi vem veure aquest folleto, es la ostia veure a Tokyo un folleto de Take Away Paella !

Tot tipus de paella

El millor, posa "Tomala con vino! Delicious PAELLA!"

Pantalla tàctil a un bar Japonés


Vem anar a un bar Japonès i allà tenen una pantalla tàctil hi-tech

Sort que vem anar amb el Jordi, tot estava en kanji.

Detall de la pantalla

De fet la pantalla era wifi i es podia agafar, rollo tablet PC.

Més pantallazos.


False Friends


Sembla mentida però fins i tot amb les poques coses que hi han en angles podem trobar alguns false friends, sinó mireu.

Tot i que es difícil trobar coses en Romanji i angles, algunes son per partir-se, mireu sinó l'estació de tren MAMADA dels Japan Rail ;)

LAPUTA Castel in the Sky, el que va posar el nom ho va fer a posta ? sinó no m'ho crec !

Més False Friends, ara marques comercials


Galetes COLLON

Sucs KAGOME

Sucs KAGOME en ampolla

Cafe MOCO, per si un cas no vem entrar per evitar terrorisme gastronómic


Anuncis


No se pas de que es aquest anunci, sufre en silencio sus hemorroides ?

Anunci tipus Manga de rimmel, no us recorda a la Candy, Candy ?

Aquest anunci suposso que es de loteria, em va fer gracia el tio :)


Anuncis amb famosos



Beyoncé anunciant aigua mineral Crystal Geyser

PEEEEEEEEEEEEEEEEEEEEEEEE (Penelope Cruz) anunciant Nescafe

Dita Von Tesse anunciant Cointreau

Takeshi Kitano, bueno, aquest suposo que no s'ha d'amagar, juga a casa, encara que després de fer el Takeshi's Castle (Humor Amarillo) potser si que té algo que amagar. (ni idea de que estan anunciant)

FREE MASONS


Aquest es l'edifici de la Lògia Masónica, just al costat de la Tokyo Tower

Masonic Power


Cartells



Cartell de ojito amb els cérvols, allà tots els cartells semblen de Manga


Don't use your phone, a tot el metro esta prohibit parlar per telèfon, pots veure la Tele o chatejar o enviar SMS però no parlar, es de molt mala educació. A les zones de seients preferents fins i tot s'ha de desconnectar.

Do it at the beach, no se ben bé a que es refereix, ficar-se mà, anar begut a prop de l'andana ? No m'estranyaria que quan algun Japonès vegi aquest cartell es pensi que anar a la platja es la ostia, pero OJO, allà es trobarà un altre cartell de "Do it at the mountains" o algo així :)

Deixeu sentar a la gent gran i les embarassades, PLEASE !

Les CICADAS o CIGARRAS son omnipresents en tots els parcs i boscos de Japó, es la ostia foten un soroll que et fa pensar permanentment en MIMIC

Cartell que anuncia un bar de gats, d'aquests que pots prendre algo i jugar amb els gats, no es conya que tenen èxit hi havia una cua de la ostia. Pel que sembla 30 minuts -> 500 yens (3,8 euros)

Pikachu a la Tokyo Tower



Hi havia un Pikachu full-size al davant de la Tokyo Tower, els nens l'acosaven bastant, només puc pensar, vaja curro, quina suor per Deu !

Màquines de menjar


Aquestes màquines son la polla, entres al local, marques el plat que vols a la màquina, pagues i dones el tiquet que et surt als empleats i en dos minuts estas menjant un udon o un arrosset excel·lent.

La màquina en questio

Arrós amb pollastre i ou

Udon amb vedella


Japanglish


Els Americans es chotejen bastant de l'angles dels Japonesos (li diuen Japanglish), us poso un parell d'exemples

Cartell vist a Kyoto, davant la estació, anuncia les galeries comercials subterrànies PORTA. Ens deixa perles de l'estil:
- Catching my breath for this good taste
- Delicious stuff is all around here
- I have found my favorite thing
- Things I want to have-there are a lot of them here
- What you want to have is here
- Pleasure to find something
- I'm in a good mood, full of joy

OJO amb el SERCH (sense A)

Berto a Nikko


La veritat es que no he vist mai al tal Berto al programa del Buenafuente (de fet pensava que es deia Beto i tot) però aquí el tenim, quines son les probabilitats que el cosí del Buenafuente es pugi al mateix borreguero que tu per anar fins a Nikko al Japó ?

Per si encara el coneixeu menys que jo, es el de la esquerra, el simpàtic de la part central també era Espanyol i vaig sentir com li deia a la seva novia: "Mira el Berto, el tio más gracioso del mundo". Fins i tot va amenaçar amb saludar-lo !

Semblo un paparazzi.

Aquí un casi primer pla, tirant de zoom.

Gelats


Si busqueu gelats de vainilla i xocolata ho teniu xungo.

Ja veieu les varietats: Green Tea, Sweet Potato, Baked Sweet Potato i Vanilla (i combinacions de dos sabors)

Val la pena arriscar-se :)

GATETES


El Sebastian ens va ajudar a preparar el viatge amb la guia de viatge

Hi han Nekos de totes formes i colors

Aquest estava en una galeria d'art i tot, mola eh ?

MONETES


Una excursió que recomano moltíssim es anar a veure els "Snow Monkeys" a Yudanaka, els monos es banyen en els onsens i es deixen fer fotos espectaculars.

Monete simpàtic.

Monete que es va posar agresiu quan la Eva va intentar passar per on estava ell (La sangre no llego al rio) :)

CIERVÉTES


Nara es famós perquè te uns parcs espectaculars amb gran quantitat de cérvols, pero no tot es tant maco com sembla ...

Aquests cérvols, semblen inofensius però son uns fills de la grandíssima puta, crec que va ser aquest que s'interessa pel meu paquet que em va fotre tres mossegades al cul, REAL TRUE STORY !!!

Hello Kitty


Quantitat de tendes especialitzades en Hello Kitty!









Altres



Potser no es veu molt bé, però aquest es un edifici de Akihabara on tots els aparadors de totes les plantes hi han disfresses rollo sexual, que si la infermera, que si wonder woman, que si chica manga, lolita gotica, lolita normal, bé, ja ho pilleu no ;)

Els Japonesos son uns fans de les cues, aquí un exemple de cues de gent esperant un tren borreguero per tornar de Niiko, tots es fiquen en cua per agafar els seients.

Bé, ja hem acabat. Arigato Saimas a tots !