20080218

5 Top reasons why “webmasters” do google’s dirty job

If you’re into web development, you may have realized that you’re really working for google every day.Let’s have a look to the different google-tasks performed by a typical webmaster:1. Be kind to the Google search engine2. Google Analytics3. Google Maps4. Google Adsense5. Google Adwords...

read more | digg story

20080202

Com fer un backup incremental en 65 lineas de PERL



Sempre he volgut tenir una manera fàcil de fer backups incrementals de directoris sencers.

Aquest cap de setmana he dedicat un dia (no sencer) a implementar un procés amb els següents requeriments:

- El procés escanejara el directori d'origen i replicarà exactament tot el contingut al directori de destí
- Si pel camí trobem fitxers o directoris ja existents, comprovarem si s'han modificat
- Si el fitxer no s'ha modificat, no el copiem
- Si el directori ja existeix, no el recreem
- El directori d'origen MAI serà modificat pel procés, nomes es permet passar fitxers o directoris al destí, així minimitzem el perill de fer alguna bestiesa

Per mi, es un backup incremental prou bo.


La idea es instal·lar als nous Desktops de la oficina que van sobrats de disc dur, el procés, configurat perquè faci backup de les dues unitats de xarxa que tenim a la oficina i on tots treballem de forma compartida.

Amés una es una unitat de SAMBA que esta mapejada a un Linux de desenvolupament i l'altre es una unitat remota normal i corrent d'un Fileserver amb Windows.

Dilluns crearé un directori de backup per cada unitat de xarxa a cada PC dels nous i provaré el procés, a veure si tinc èxit.

De moment en local em funciona, us explico una mica com ho he fet:

Com sempre diu el Manel, el PERL es molt potent, val a dir que jo sempre modifico la frase per "El PERL es potent, pero PERILLOS!!!"

De totes maneres, aquest matí m'he instal.lat la versió gratuïta el "Active State Perl" el líder en entorn Windows i he començat a rascar, val a dir que fa un any que tinc experiència demostrada en PHP però el PERL és lleugerament diferent i he hagut de canviar una mica el Xip.

Anem a veure com fer un backup incremental d'un directori origen a un directori destí, en nomes 65 línies de PERL (incloent comentaris i sense fer xapusses per compactar codi)

Declaració de variables i d'intencions:

Les primeres línies son molt avorrides, només fem imports i declarem variables...


use strict;
use warnings;
use File::Find;
use File::Copy;
use File::stat;

my $files_copied=0;
my $files_updated=0;
my $dirs_scanned=0;
my $files_scanned=0;
my $dirs_created=0;

my $source = 'c:/apons/';
my $destination = 'd:/apons2/';
print "Anem a copiar tot el contingut de manera incremental de $source a $destination!\n";


$source serà el directori d'origen (recordem que aquest mai es modificarà) i $destination es el directori de destí, només cal que existeixi, el procés ja crearà tota la estructura de directoris per sota d'ell.

Uff, ja portem 15 lineas, no se pas si aconseguirem fer tot això en les 50 que ens queden :)


find(\&Wanted, $source);

print "Dirs scanned: $dirs_scanned, Files Scanned: $files_scanned\n";
print "Dirs created: $dirs_created, Files copied: $files_copied, Files updated: $files_updated\n";


De fet aquí acaba el "main program", ja que la resta esta a la Subrutina "Wanted", en aquestes 3 línies, simplement cridem a la funció find, que recorre tots els fitxers recursivament partint directori indicat pel segon paràmetre, en aquest cas $source, per cada fitxer s'executarà la subrutina Wanted.

El find de PERL (que podem fer servir gracies al use File::Find; de les primeres línies) em recorda bastant a la comanda de UNIX find . -name "$source" -exec Wanted {} \; (sempre salvant les distancies)

Ah, les altres línies son com un resum de les operacions que hem fet, clar, no ?


sub Wanted
{
my $elemento = $_;
my $source_file=$File::Find::name;
my $destination_file=$destination.substr($source_file, length($source)-1);

if (-d $elemento)
{# Es un directori
$dirs_scanned++;
if (-e $destination_file)
{# Ya existia el directori, no fem res
#print "Directorio $destination_file ya creado NO action \n";
}
else
{# No existia el directori, el creem
$dirs_created++;
print "Vamos a crear -> $destination_file\n";
mkdir $destination_file;
}
}


Anem una mica més al gra, vegem el codi de la subrutina Wanted, aquí es on es realment fem la feina.

my $elemento = $_; asigna el fitxer actual que estem tractant a $elemento;

Assignem a $source_file la variable $File::Find::name que conte el nom complet del fitxer (incloent el directori).

A la línia my "$destination_file=$destination.substr($source_file, length($source)-1);" es on substituïm el directori d'origen pel directori destí.

El "if (-d $elemento)" comprova si el fitxer que estem escanejant es un directori, si aquest es el cas, fem el següent

$dirs_scanned++; incrementem les estadístiques.

if (-e $destination_file), si existeix el directori destí no fem res, en canvi al else, incrementem els $dirs_created, printem un missatge i fem un mkdir per crear el directori destí.

Ja portem 40 línies, ai mareta, no se si arribarem, ens queden 25 !!!



if (-f $elemento)
{# Es un fitxer
$files_scanned++;
if (-e $destination_file)
{# El fitxer ja existeix, mirem la data de modificacio
#print "El fichero $destination_file existe, comprobamos si esta actualizado.\n";
my $source_stat = stat($source_file);
my $source_mtime = $source_stat->mtime();
my $destination_stat = stat($destination_file);
my $destination_mtime = $destination_stat->mtime();
if ($source_mtime > $destination_mtime)
{# Efectiviwonder, el fitxer s'ha modificat, el copiem
print "OJITO, algo ha canviat al fitxer origen $source_file, maxaquem el backup\n";
copy($source_file, $destination_file);
$files_updated++;
}
}
else
{# El fitxer de desti no existeix, el copiem
print "El fichero $destination_file NO existe, lo copiamos.\n";
copy($source_file, $destination_file);
$files_copied++;
}
}
}


El primer if "if (-f $elemento)" controla si el fitxer que estem tractant es realment un fitxer.

El segon, controla si el fitxer de destí ja existeix "if (-e $destination_file)", si es així declarem obtenim les propietats del fitxer origen i el fitxer destí amb les següents línies:


my $source_stat = stat($source_file);
my $source_mtime = $source_stat->mtime();
my $destination_stat = stat($destination_file);
my $destination_mtime = $destination_stat->mtime();


La funció stat, la podem fer servir gracies al "use File::stat;" en aquest cas obtenim el mtime (modification time) del fitxer d'origen i del destí.

Posteriorment comprovem si el "$source_mtime > $destination_mtime" si es així hem de maxacar el fitxer de destí sense pietat, ja que està obsolet:


print "OJITO, algo ha canviat al fitxer origen $source_file, maxaquem el backup\n";
copy($source_file, $destination_file);
$files_updated++;


Com veieu hem aprofitat per printar un bonic missatge i incrementar el contador de fitxers actualitzats.

Finalment anem al else, que es quan el fitxer de destí no existeix, llavors simplement copiem el fitxer al destí, printem un missatge i actualitzem les estadístiques.


print "El fichero $destination_file NO existe, lo copiamos.\n";
copy($source_file, $destination_file);
$files_copied++;



Aquí podeu veure un exemple de una execució incremental:


C:\apons>test.pl
Anem a copiar tot el contingut de manera incremental de c:/apons/ a d:/apons2/!
El fichero d:/apons2//lvg200706120451lb.pdf NO existe, lo copiamos.
OJITO, algo ha canviat al fitxer origen c:/apons/test.pl, maxaquem el backup
El fichero d:/apons2//i_want_you_to_learn_perl.jpg NO existe, lo copiamos.
Vamos a crear -> d:/apons2//proves
El fichero d:/apons2//proves/jquery.js NO existe, lo copiamos.
El fichero d:/apons2//proves/provainplace.html NO existe, lo copiamos.
El fichero d:/apons2//proves/provainplace2.html NO existe, lo copiamos.
El fichero d:/apons2//Superman-RedSon/Superman - Red Son 03/RED SON08.JPG NO existe, lo copiamos.
Dirs scanned: 250, Files Scanned: 2653
Dirs created: 1, Files copied: 6, Files updated: 1


No torno a copiar tot el codi complert, perquè son només 65 línies, una mica de entrenament de copy&paste no us anirà malament ;)

Enjoy!

20080117

El meu resum del 2007

Com cada any, intento posar un resum, sempre poc exhaustiu, de les millors coses que he viscut a l'any que ha acabat de finalitzar.

Fa molts dies que ho tinc pendent i aprofito una nit d'insomni per fer-ho.

Ja em perdonareu les faltes perquè aquí no tinc cap corrector a mà.

VAMOS ALLA:

Gadgets of the year (comprats o regalats):
Palm TX
Nokia 6085
Nou GPS bluetooth
TDT USB Pinnacle
Nintendo DS

Samarretes del any:
Pardone moi but your teeth are in my neck, Paul Frank (10e!)
I shack for food, Paul Frank (10e!)

Friky coses guays del 2007:
Twitter
Muchachada nui, NUI! (piticli forever, enjuto, celebrities, mundo viejuno...)
La marcha del algoritmo
Desafio Espanyol Hijo de Puta a Eurovisión 2008
IPSOJobs.com

Coses que he aprés al 2007:
Action Script
Flash Media Server
Una mica de flash
Molt PHP
Molt jquery
MOOOOOOOOOOLT sobre com portar un negoci, o com a mínim, intentar-ho ;)

Jocs als que m'he viciat aquest any:
Wii Sports
Rayman Raving Rabbits
Travian
warhammer 40.000 squad command
Brain Training

Grups que he descobert aquest any:
Laura Veirs
Jose Gonzalez
Raveonettes
Maximo Park

Grups que he redescobert aquest any:
Gorillaz
Family
Hayden

Millors concerts als que he anat:
The Long Blondes
Hayden

Millors pelis que he vist durant aquest any:
Magnolia
Pequeña Miss Sunshine
Bobby
Fur (diario de una obsesión)
Elisabethtown
Elisabeth the golden age
The golden compass


Llibres que he llegit i m'han agradat durant aquest any:
Acido Sulfúrico, Amelie Nothomb
On Intelligence, Jeff Hawkings
Harry Potter and the Deathly Hallows, JK Rowling
Fast Food Nation
Rant, chuck palahniuk
La doctrina del shock, naomi klein

Comics:
El joven Lovecraft
From Hell
persepolis
bordados

Series a les que m'he enganxat (per ordre d'adicció):
Gilmore Girls (s.7)
Scrubs (s.5)
Mentes Criminales (s.2)
Medium (s.4)
CSI (s.7)

Obres de teatre que he vist:
Plataforma, al Romea de Michel Hollebec amb Juan Echanove

Sortides al Extranjer:
Saragossa
Madrid
Paris

Millors Hotels als que he anat:
Desert, el de Paris no va ser gens destacable :(

Millors restaurants:
Santaló 103
Ca la nuri
Au gormand, rue moliere, paris
Els Pescadors
Aqua


Bé segur que em deixo coses pero sino no el publicaré mai...

20071219

El garatge GAYLOR



Aquí tenim les fotos del Parking GAYLOR del carrer Aribau de Barcelona.

La família GAYLOR esta d'enhorabona, els nois de MUCHACHADA NUI, els hi han fet propaganda gratuïta en aquest video.



Frases mítiques:


- Soy GAYLOR
- Pués yo soy GAYER

- A mi me gustan las tortillas, así... revueltas.
- Pues a mí me gustan los bollos !


Finalment s'ha resolt el dubte de si era GAYLOR o GAYLORD !

Un altre foto, amb una vista més general:

20071215

Desconecta tu teléfono fijo !


Acabo de decidir desconectar mi teléfono fijo.


Hechos:
- No tengo display en el teléfono fijo para mostrar si me entran llamadas de números ocultos o normales.
- Últimamente no paro de recibir llamadas de teleoperadoras (sobretodo con ofertas de ADSL, que pesaos)
- Las teleoperadoras hace unos meses que utilizan la táctica de poner un robot de llamadas (llamar y colgar cuando lo coges) para saber los hábitos de conducta de las posibles víctimas
- Dichos robots de llamadas son lo peor del mundo y ponen de una mala leche bestial...
- Acabo de llamar a Telefónica al 1004 y muy amablemente me han ofrecido un servicio de bloqueo de números ocultos por 6 euros de alta + 1,20 euros al mes - Me parece UNA PUTA ESTAFA que: pague por una linea, que esta siendo constantemente bombardeada por empresas de telemárketing, que a su vez pagan a telefónica para ocultar sus números y spamear impunemente a sus propios usuarios y encima tengan el morrazo de intentar cobrarte para bloquear llamadas con números ocultos.
- Si me dijeras, claro, es que no pueden bloquear todos los números ocultos porque técnicamente es imposible, o lo que sea... vale! Pero es que PUEDEN, pero claro, te quieren cobrar por ello, ENCIMA! - Después de explicarme la ESTAFA, la teleoperadora del 1004 me ha preguntado si quería contratar ADSL de Telefónica o IMAGENIO, para FLIPAR !
- También teniendo en cuenta que NI DIOS me llama ya al teléfono fijo (que sólo lo tengo porque es como un impuesto revolucionario de Telefónica por el ADSL)

He decidido que la única solución es la siguente:

Voy a desconectar todos los terminales de teléfono fijo que hay en casa, y por si acaso lo conectaré una vez al día para ver si tengo algún mensaje en el contestador (que amablemente ofrece Telefónica) o por si quiero hacer alguna llamada.

He creado esta campaña en facebook para que todos hagamos lo mismo.

Campaña "Desconecta tu teléfono fijo"

Esta no es una campaña para perjudicar a nadie (sólo a las teleoperadoras, que no me pillarán nunca en casa y espero que me eliminen de sus bases de datos de posibles clientes spameables).

YA SE CANSARAN (que cansinooooooooos) !

20071206

Google Chart API, sorprenent

Google no para de sorprendre'm

Google continua sent una companyia diferent, avui he vist a ajaxian.com una referència al Google Chart API

Es al·lucinant com una API tant potent es pot descriure amb una sola pagina d'HTML de manera clara i meridiana.

Aquí podeu veure un parell d'exemples:


helloWoWWa



helloOMATECH

Trobo a faltar support per POST, com a mínim no esta documentat...


UPDATE:

Ai, mira quina gracia, he fet un petit experiment i sembla que NO rula, el formulari amb method="POST" no funciona, pero amb method GET si.

Test form:


Chart type:
Chart size:
Chart Data:

20071122

Hayden i The National al Apolo

Aquest dissabte passat (17 de novembre del 2007) vaig tenir la sort d'anar al concert de Hayden i The National al Apolo Club.

Hayden es un cantautor mític per nosaltres de Toronto, Canada.

El seu primer single, September, es una de les meves cançons favorites "of all times".

Des que September era un hitazo han passat més de 10 anys, pero encara s'em posa la gallina de piel al sentirla.

Com a curiositat, al concert no va tocar "September" pero de totes maneres va valer molt la pena, i em va recordar vells temps, despres vem sopar un pop excel·lent amb l'Otto al bar del costat del Bagdad i vem acabar la nit prenent uns "Gin Tonics de Hendrix" al Negroni amb ell i la Paula.

Aquí us deixo uns videos gravats al concert i unes quantes fotos.










Hayden a la guitarra i armónica, primer plà

Hayden als teclats

Hayden a la guitarra

Hayden a la guitarra i tocant l'armónica alhora, un crack :)

The National

Lead Guitar i teclista al fons (també era violi) de The National

The National

El cantant de The National (1)

El cantant de The National (2)


PD: He recuperat el "September" a la palm, aixi com un cover de Hayden interpretant "Gouge Away" de Pixies, si "Gouge Away" ja es genial, no ho es menys el cover de Hayden, totalment recomenable !!!

20071120

La Generalitat de Catalunya encarrega enquestes que són fetes en Castellà

Avui m'han fet una enquesta telefònica a l'empresa, ens preguntaven sobre la evolució de les TIC a la nostra empresa, importacions, exportacions, facturació etc.

Fins aquí tot bé.

El problema ve quan m'anuncien que es tracta d'una enquesta de la Generalitat, però la operadora em parla en Castellà i no només això, sinó que davant la meva amable petició a que canvii al Català, m'informa que L'ARGUMENTARI DE LA ENQUESTA ESTÀ EN CASTELLÀ.

Com que la noia no tenia cap culpa, fins i tot m'ha explicat en Català el problema tot i que no era catalano-parlant, jo he accedit a fer la enquesta (en Castellà), però conec molts casos de gent que s'ha negat a fer enquestes en aquestes condicions i no sense raó.

Crec que el problema aquí el té PERSEO, la empresa de enquestes i la Generalitat per no controlar les subcontrates que realitza, que:


  1. No tenen profesionals que siguin capaços de fer un argumentari en català.

  2. No tenen profesionals que siguin capaços de emetre aquest argumentari en català.



Té tela, perquè després diguin que el Castellà esta perseguit !

20071106

How to generate a set of unique random strings in PHP



I'm amazed in my daily work of how useful and easy to use is PHP.

Today I've to generate 1.728 random strings of 9 characters each.

Each string must contain only a subset of alphanumeric characters, no zero, no Ç, no Ñ, etc.

Of course there must no be repeated strings in the 1.728 results.

I've added the constraint, don't repeat the same character inside an string, to avoid, results like "AAAbbbCCC" for example.

Let's code:


function get_result()
{
$valid_chars=array("1", "2", "3", "4", "5", "6", "7", "8", "9"
, "a", "b", "c", "d", "e", "f", "g", "h", "j", "k", "m", "n", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"
, "A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "M", "N", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z");

$result=array_rand($valid_chars, 9);
$result_str='';
foreach ($result as $value)
{
$result_str.=$valid_chars[$value];
}
return $result_str;
}


this easy function does the following, first declare the array of allowed chars in the resulting string $valid_chars, using array_rand we obtain 9 keys to the array randomly generated, for example $result could be {7, 10, 14, 20, 22, 30, 35, 42, 49}

Then we loop through the keys with a foreach and simply obtain the character associated to the key and concatenate to the $result_str string.

Finally the body of the php:


$results=array();

for ($i=0; $i<=2000; $i++)
{
array_push($results, get_result());
}

$results=array_unique($results);

$cont=0;
$results_str='';
foreach ($results as $value)
{
$cont++;
$results_str.=$value.'
';

if ($cont>=1728)
{
break;
}
}
echo $results_str;


In this code we simply loop from 0 to 2000 calling the get_result() function and storing the result in an array.

Then we call the array_unique to avoid duplicated strings (for this reason we have generate a bit more than 1728 results) at this point $results have yet more than 1.728 valid and unique resulting strings.

Finally we loop through the array and break the loop when the limit of 1.728 strings are reached, adding to a resulting string each code, and then output the string.

Enjoy your new randomly generated codes !

20071029

ipsojobs return, devolviendo código a la comunidad

La gente de ipsojobs ha creado una categoría en su blog que se titula ipsojobs-return, que contiene artículos técnicos, tanto en inglés como en castellano sobre how-tos que se han usado en la página ipsojobs.com.

De momento, acaba de aparecer un segundo tutorial, explicando como crear un widget de tipo UWA (Universal Widget API) que se puede utilizar en NetVibes, en iGoogle y en nuestro propio blog.

El anterior artículo hablaba de como zippear y cachear los javascripts y los CSSs de una página para optimizar la descarga de un site.

ipsojobs.com es una bolsa de trabajo on-line especializada en trabajos urgentes y usa un modelo de administración distribuida remunerando a los administradores de cada ciudad utilizando google adsense.