FMCorz.info
Le blog d'un geek qui n'en est pas un !

jeudi, octobre 6 2011

Sauvegarder vos bases de données MySQL

Voici un petit script bash que vous placerez dans un cron pour sauvegarder vos bases de données. Pour une exécution toutes les heures, ce script :

  • Garde un historique des modifications heure par heure pour les deux dernières semaines avec rdiff-backup
  • Créer un fichier dump .sql par tables par bases de données
  • Garde un backup journalier compressé avec gzip

Prérequis

Le seul prérequis est rdiff-backup.

Configuration

Il nécessite toutefois un brin de configuration.

  • IGNOREDB : Les bases de données à ignorer séparées par un espace
  • DIR : Le répertoire où sauvegarder les données avec le / final
  • USER : L'utilisateur MySQL
  • PWD : Son mot de passe (peut être vide si aucun)
  • HOST : Le serveur MySQL

Script de sauvegarde MySQL

Certain apprécierons (dont moi-même) moyennement le mot de passe en clair dans le script, mais libre à vous de trouver une autre solution et surtout de créer un utilisateur avec des permissions limitées.

Voici la bête :

#!/bin/bash

# Databases to ignore, separated by a space or pipe
IGNOREDB="mysql information_schema innodb"
DIR='/backup/databases/' 		# With trailing slash
USER='backup'
PWD=''
HOST=''

if [[ -z "$PWD" ]] 
then
	DATABASES=`mysql -h "$HOST" -u$USER -e "SHOW DATABASES;" | tail -n+2` 
else
	DATABASES=`mysql -h "$HOST" -u$USER --password=$PWD -e "SHOW DATABASES;" | tail -n+2` 
fi

IGNOREDB=`echo "$IGNOREDB" | tr ' ' '|'`
DATABASES=`echo "$DATABASES" | grep -v -E "^$IGNOREDB$"`

for DB in $DATABASES; do

	DBDIR="$DIR$DB"
	mkdir -p "$DBDIR"

	if [[ -z "$PWD" ]] 
	then
		TABLES=`mysql -h $HOST -u$USER -e "SHOW TABLES FROM $DB;" | tail -n+2`
	else
		TABLES=`mysql -h $HOST -u$USER -p$PWD -e "SHOW TABLES FROM $DB;" | tail -n+2`
	fi

	TBLDATE=`date +%Y-%m-%d`
	DUMPDIR="$DBDIR/last"
	mkdir -p "$DUMPDIR"

	for TBL in $TABLES; do
		
		TBLFILE="$DUMPDIR/$TBL.sql"
		if [[ -z "$PWD" ]] 
		then
			mysqldump -h "$HOST" -u$USER "$DB" "$TBL" > "$TBLFILE"
		else
			mysqldump -h "$HOST" -u$USER -p$PWD "$DB" "$TBL" > "$TBLFILE"
		fi

	done

	RDIFFDIR="$DBDIR/rdiff"
	mkdir -p "$RDIFFDIR"
	rdiff-backup "$DUMPDIR" "$RDIFFDIR"
	rdiff-backup -v0 --force --remove-older-than 2W "$RDIFFDIR"

	INCRDIR="$DBDIR/increments/$TBLDATE"
	mkdir -p "$INCRDIR"
	cp "$DUMPDIR/"* "$INCRDIR"
	gzip -fq "$INCRDIR/"*

done

samedi, août 27 2011

Condition dynamique sur un modèle associé

Lors d'une association telle que hasMany, il est parfois souhaitable de placer des conditions de recherche sur les données associées. Ceci n'est pas faisable directement.

Prenons par exemple un modèle Post ayant beaucoup de Commentaires. Nous souhaitons récupérer tous les Posts où Fred a posté un commentaire.

Avec le snippet suivant, nous allons utiliser un faux champ 'auteur_commentaire' dans nos conditions et dynamiquement faire le travail pour ne retourner que les résultats souhaités.

function beforeFind($query) {

	$auteur_commentaire = false;
	if (isset($query['conditions']['auteur_commentaire'])) {
		$supplier = $query['conditions']['auteur_commentaire'];
		unset($query['conditions']['auteur_commentaire']);
	} elseif (isset($query['conditions'][$this->alias . '.auteur_commentaire'])) {
		$supplier = $query['conditions'][$this->alias . '.auteur_commentaire'];
		unset($query['conditions'][$this->alias . '.auteur_commentaire']);
	}
	if ($auteur_commentaire) {
		$postIds = $this->Commentaire->find('list', array('conditions' => array('Commentaire.auteur' => $auteur_commentaire), 'fields' => array('id', 'post_id')));
		$query['conditions'][$this->alias . '.id'] = $postIds;
	}
	
	return $query;
}

Concrètement nous analysons si la condition auteur_commentaire existe. Si oui, récupérons tous les IDs de posts associés à cet auteur dans la table des commentaires. Ensuite nous rajoutons à notre recherche initiale la condition stipulant les IDs possibles pour les Post. Ceci fait en toute transparence dans votre modèle.

Attention toutefois qu'en terme de performance cela peut devenir une grosse requête lorsqu'il y a plusieurs dizaines de milliers de post associés.

vendredi, août 19 2011

Gestion des permissions Acl dans CakePHP 2.0

Mettre en place la gestion des Acl est déjà bien complexe, y gérer les permissions aussi. C'est pourquoi j'ai développé un plugin pour CakePHP 2.0 qui vous facilitera la tâche.

N'hésitez pas à me donner vos commentaires, remarques ou bugs découverts.

Les sources et instructions se trouvent sur le dépôt Github suivant :

Download ACL Manager pour CakePHP 2.0

jeudi, août 18 2011

Alias et VirtualFields dans CakePHP

Dans CakePHP 2.0 (beta à la date d'aujourd'hui), avoir des VirtualFields peut générer des erreurs lorsqu'un modèle change d'alias.

Pour remédier à ce problème, voici un petit bout de code à placer dans AppModel.

public function getVirtualField($field = null) {
	if (!empty($field) && $this->isVirtualField($field)) {
		if (strpos($field, '.') !== false) {
			list($model, $field) = explode('.', $field);
		}
		return str_replace('{alias}', $this->alias, $this->virtualFields[$field]);
	} else {
		return parent::getVirtualField($field);
	}
}

Ensuite, spécifiez vos virtualFields de la manière suivante :

var $virtualFields = array(
  'name' => "CONCAT({alias}.first_name, ' ', {alias}.last_name)"
);

Ce qui dynamiquement donnera ceci :

var $virtualFields = array(
  'name' => "CONCAT(User.first_name, ' ', User.last_name)"
);

Edit #1 : Gestion du . dans le nom du champ passé à la fonction.

mercredi, août 25 2010

La page Facebook de Jesus

jesus-facebook-page-preview.png

Et si Jesus Christ avait eu Facebook en son temps !

Source

mardi, août 10 2010

On sait qu'on est geek quand...

C'est là qu'on voit qu'on est geek.

Conversation de nerd

dimanche, juillet 18 2010

Le baraki à la mer

La mer, bel endroit paisible où il fait bon se reposer. C'est aussi l'endroit stratégique pour observer un spécimen belge. Le baraki. Cette espèce s'est éparpillée en Belgique, et même si certains points de regroupement sont évidents il est recommandé de suivre leurs migrations pour les observer.

Pendant les périodes où les enfants et l'homme sont en congés, la femme ne travaillant pas, et où le soleil se montre, les familles de barakis émigrent à la côte belge. J'ai eu l'occasion d'observer un groupe de près dans un transport en commun.

Le baraki se doit toujours d'être accompagné d'une myriade de mioches. Leadés par les enfants turbulents, reconnaissables aux traces de "choco" présentent sur leurs joues, les parents suivent avec les enfants en bas-âge.

J'aperçois la mère. Descriptible comme un assemblement difforme de masse graisseuse dont on distingue un visage surplombé de quelques cheveux... visage qui laissera apparaitre une délicate moustache et quelques poils habituellement répartis à d'autres endroits du corps. Ses jambes ne s'arrêtent pas à ses fesses mais se prolongent jusqu'à ses hanches de manière uniforme. On remarquera aussi, non négligeable, la peau du haut du dos allant du brun au rose bébé suite à une exposition au soleil mal évaluée.

Le baraki aime rigoler. Ils m'ont donné la joie d'admirer leurs échangent de sourire. Celui de la mère est formé de dents (distinction importante !) dont la couleur penche entre le jaune pale et l'orange. Chacune des dents est reliée à la suivante grâce à une jointure constituée d'un dépôt dont seuls les barakis ont le secret.

De l'autre côté de ce sourire appétissant celui de la belle-mère qui s'était préalablement déposée sur deux sièges. Cette dernière répond d'une autre manière en laissant fièrement apparaitre sa dernière incisive. Il faudra se concentrer sur la forme de ses lèvres pour déceler l'expression de son sourire. La belle-mère a perdu la parole, et son fils. En effet, la belle-mère accompagnera volontiers la meute pendant la migration, mais la présence du mari n'est pas toujours requise lors des expéditions quotidiennes. Il préfèrera généralement regarder un film pornographique en vidant un casier.

Ayant probablement perdu la parole en avalant ses dents, la belle-mère ne dira pas un mot durant le trajet. Pour la reconnaitre, cherchez une boule, un regard vitreux cherchant quelque chose sur lequel focaliser son attention et dont les seins s'étalent de tout leur long sur son ventre rond.

Le baraki est toujours accompagné d'une autre meute lorsqu'il émigre. Cette autre meute peut généralement être difficile à reconnaitre car ils tentent de prendre l'apparence du sapiens. Il faudra écouter leur propos pour les identifier.

Je vous invite à les observer par vous-même, rare moment mêlant fascination et profond dégout.

mardi, juillet 13 2010

Ajouter un mois à une date en PHP

Ne criez pas trop vite qu'il s'agit d'une fonction simple ! La fonction strtotime est certainement très intéressante, mais elle ne fait pas tout !

Démonstration

Nous sommes le 15 janvier. J'utilise strtotime("+1 month"), je me retrouve donc au 15 février. Jusque là tout va bien. Mais si nous sommes le 31 janvier...

Dans ce cas, strtotime va renvoyer le 3 mars (selon l'année). Voici une fonction qui prendra en compte le dernier jour du mois suivant si le mois ne comporte pas assez de jours.

Fonction PHP pour incrémenter une date

function getNextDate($type = null, $now = null, $start = null) {

	if (is_null($now)) return false;

	if (!is_numeric($now)) $now = strtotime($now);
	if (!is_null($start) && !is_numeric($start)) $start = strtotime($start);
	
	switch($type) {
		
		/**
		 * Rajouter un mois à $now en tenant en compte que $start est le tout début
		 */
		case "month":
		case "monthly":
			
			if (!is_null($start)) {
				$day = date("j", $start);
			} else {
				$day = date("j", $now);
			}
				
			switch($day) {
				case 29:
				case 30:
				case 31:
					$next = strtotime("next month", mktime(0, 0, 0, date("m", $now), 1, date("Y", $now)));
					$lastDay = date("t", $next);
					$next = mktime(0, 0, 0, date("m", $next), $lastDay, date("Y", $next));
					break;
					
				default:
					$next = strtotime("+1 month", $now);
					break;
			}
				
			break;				
			
	}
	
}

Je n'ai pas encore écrit la suite de la fonction permettant d'obtenir une date futur selon un autre $type, mais ça devrait suffire.

Utilisation

$timestamp = getNextDate($type, $now, $start);

@param String $type Le type de calcul (uniquement month pour l'instant)
@param Int $now Le timestamp de la date à partir de laquelle on calcule la prochaine
@param Int $start La date de départ
@return Int Timestamp de la date retournée

$start est utile lorsque dans une boucle vous cherchez à obtenir plusieurs mois suivants.

Exemple, si vous commencez au 30 janvier. $now sera le 30 janvier, et $start sera null. La date retournée sera le 28 février. Pour la prochaine date vous indiquerez le 28 février comme étant $now, et $start le 30 janvier. Si vous omettez $start, la valeur retournée sera le 28 mars, sinon elle sera le 30 mars.

jeudi, juillet 1 2010

Un film en carton, et pourtant...

Voici une belle façon de faire ses preuves au niveau des effets spéciaux !

Source

mercredi, juin 30 2010

Pensée obscure

Superman
Unique
Idolâtré

Crac !

Incompris
Décomposé
Exterminé

Descend de ton pied d'estal petit enfant,
Tu n'as plus lieu d'y être,
Maintenant plus personne n'en a besoin,
Tu peux redevenir toi-même.

Apprends à vivre,
Non plus à survivre,
Tu as toi aussi une vie,
Et tu mérites de la connaitre.

Du futur tu rattraperas,
Les années passées,
A te mettre de côté,
A accepter.

Affirme-toi,
Crois en toi,
Réussis,
Et perdure !

De ces expériences,
De ces malheurs,
De ces manques,
Tu tireras parti.

Croît enfin,
petit adulte.

Article initialement posté le 21 septembre 2008

vendredi, juin 25 2010

L'iPhone rend dépendant !

Pas vrai ?

iphone-gollum.jpg Mon précieux !

Vous ne regarderez plus les gens qui jouent avec leur iPhone de la même manière !

Source

jeudi, juin 24 2010

WindMaker : Un site soufflé !

Après Pong, voici comment reproduire les conditions venteuses d'une région des Etats-Unis sur un site. Ca sert à rien, mais j'adore !

FMCorz soufflé !

WindMaker

mercredi, juin 23 2010

Un Pong Deluxe !

Bon, j'en fais peut-être un peu trop, mais voilà enfin une utilisation amusante et intéressante des "Popups" !

Jouer à Pong (n'oubliez pas d'autoriser les popups !)

Source

lundi, juin 21 2010

Créer des URLs raccourcies

Vous aussi vous voulez proposer votre système d'URLs raccourcies comme bit.ly ? C'est pas bien compliqué ! Voici un point de départ.

Réduire une chaine de caractères

Lire la suite »

dimanche, juin 20 2010

Redimensionner une image et l'envoyer (Script Nautilus)

Je m'amuse quelque peu avec mon shell ce que je n'avais jamais vraiment pris le temps de faire auparavant. Je sais qu'il existe des tonnes des scripts pour Nautilus, mais j'avais envie de faire le mien, certainement pas optimisé, bourré de bugs, mais on apprend mieux avec du concret qu'avec des pages du manuel !

Envoyer une image redimensionnée avec Nautilus

Lire la suite »

vendredi, juin 18 2010

Thème de Super Mario en Beatbox

Impressionnante prestation de beatboxing de l'air de Super Mario Bros.

Source

jeudi, juin 17 2010

Fatal, le nouveau film de Michaël Youn

fatal.jpg

J'étais plein d'a priori comme tout le monde, c'est vrai que Youn n'a pas toujours un humour qui fait rire (tout le monde). Mais après avoir vu plusieurs bande-annonce et les "5 premières minutes du film", j'ai été conquis !

Critique de Fatal

Lire la suite »

lundi, juin 7 2010

Webmin ou administrer son serveur

Webmin est un utilitaire permettant de faciliter les tâches d'administration les plus courantes de votre serveur.

Installer Webmin

Lire la suite »

dimanche, juin 6 2010

Jessica Biel

69-Jessica_Biel.jpg

dimanche, mai 23 2010

YouTube se fout de ma gueule !

Euh... pourquoi quand j'ai essayé d'ouvrir mon compte YouTube j'ai un joli message d'erreur... du genre "Je me fous de ta gueule" ?!

youtube-entourloupe.jpg

while(1);{"errors": "C'est une entourloupe", "success": false}

Pourtant mon identification s'était bien produite, même si j'ai du chipoter pour voir le média qui était réservé à des utilisateurs "avertis"...

- page 1 de 4