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