Bubble Sweat Bubble

Les périgrinations d'un mec normal dans un monde qui ne l'est franchement pas

Aller au contenu | Aller au menu | Aller à la recherche

23déc. 2008

Classe DateTime de PHP5

Depuis la version 5.1 une nouvelle classe a fait son apparition : DateTime. Cette classe expérimentale dans les versions 5.1 est depuis officiellement incluse depuis les versions 5.2 de PHP. La liste des fonctions disponibles est ici. Il suffit de regarder toutes les fonctions commençant par "date_".

Quelques exemples d'utilisations :

<?php
// crée un nouvel objet DateTime
$d = new DateTime('2008-12-26 23:59:59');
echo $d->format('c');
 
// crée un nouvel objet DateTime à partir d'un timestamp UNIX
$ts = time();
$d = new DateTime('@' . $ts);
echo $d->format('c');
 
try {
    // le constructeur lance une exception si la chaîne de date n'est pas valide
    $d = new DateTime("2008-12-32");
} catch (Exception $e) {
    echo "date non valide";
}
 
// l'appel à date_create ne lance pas d'exception
$d = date_create("2008-12-32");
if ($d === FALSE) {
    echo "date non valide";
} else {
    // date valide
}

J'ai effectué quelques comparaisons avec les fonctions classiques strtotime et date afin de voir si DateTime est ou non plus lente. J'ai donc écrit un script pour tester les temps de réponses d'un appel à la fonction date avec un appel à strtotime ou avec un timestamp puis la même chose en utilisant DateTime. Afin d'avoir des valeurs plus cohérentes, j'ai fait la moyenne sur 1000 itérations à chaque fois. Voici le script utilisé :

$nb_iters = 1000;
$values = array();
echo "with strtotime: ";
for ($i = 0; $i < $nb_iters; $i++) {
    $s = microtime();
    $ts = strtotime('2008-12-25');
    $str = date('c', $ts);
    $e = microtime();
    $values[] = $e - $s;
}
printf("%.06f s\n", array_sum($values) / $nb_iters);
 
$values = array();
echo "without strtotime: ";
for ($i = 0; $i < $nb_iters; $i++) {
    $s = microtime();
    $str = date('c', $ts);
    $e = microtime();
    $values[] = $e - $s;
}
printf("%.06f s\n", array_sum($values) / $nb_iters);
 
$values = array();
echo "with datetime: ";
for ($i = 0; $i < $nb_iters; $i++) {
    $s = microtime();
    $d = new DateTime('2008-12-26');
    $str = $d->format('c');
    $e = microtime();
    $values[] = $e - $s;
}
printf("%.06f s\n", array_sum($values) / $nb_iters);
 
$values = array();
echo "with datetime given a timestamp: ";
for ($i = 0; $i < $nb_iters; $i++) {
    $s = microtime();
    $d = new DateTime("@$ts");
    $str = $d->format('c');
    $e = microtime();
    $values[] = $e - $s;
}
printf("%.06f s\n", array_sum($values) / $nb_iters);

Le résultat obtenu :

with strtotime: 0.000028 s
without strtotime: 0.000012 s
with datetime: 0.000024 s
with datetime given a timestamp: 0.000054 s

Comme on peut le voir, DateTime se révèle plus rapide qu'un appel conjoint de date et de strtotime. En revanche, si l'on possède déjà un timestamp, mieux vaut utiliser directement la fonction date puisqu'elle est deux fois plus rapide. DateTime se révèle donc très intéressant pour gérer des dates au format chaînes. En revanche, et c'est lié au design de DateTime, l'utilisation de cette classe avec un timestamp doit être évitée tant que possible. En effet la classe ne gère pas en natif le passage d'un timestamp à la construction et parse donc la chaîne donnée ce qui donne des temps de construction très lent (le double d'un appel avec une chaîne classique).

25mar. 2008

La killer app du futur sur Mac OS X : un (bon) client pour les mails !

ThunderbirdCeci est la chronique d'une défaite. La mienne en l'occurrence : après cinq mois passés sur Mac je n'ai toujours pas réussi à trouver un logiciel de mails digne de ce nom !

Pour le moment j'utilise Apple Mail mais je ne demande qu'à le quitter...après tout, je ne demande pas grand chose :

  • un support IMAP complet (pour mon gmail :))
  • un support des identités multiples facile à configurer et efficace à l'usage
  • une intégration complète dans le système (ical, carnet d'adresses, ...)

J'utilisais au début Thunderbird mais le manque d'intégration avec le système m'a pousser à le quitter. Surtout pour le carnet d'adresse. Parce que maintenir deux carnets d'adresses sur son ordinateur n'est même pas envisageable à moyen terme. La preuve : j'ai laissé tomber ;)

Voici donc un petit état des lieux de mon expérience sur Mac OS X.

Lire la suite

20mar. 2008

Google Translate API

Google vient de lancer une nouvelle API dédiée à la traduction de textes. Les langues supportées sont les mêmes que celles affichées dans Google Translate.

On a tous fait l'expérience des traductions parfois (souvent) bancales de Google Translate mais là où cette API devient vraiment intéressante c'est qu'elle permet aussi la détection de langue.

Plus d'infos sur la page dédiée de l'API.

20mar. 2008

J'aime pas Olivier Martinez

Sérieusement son jeu d'acteur est au moins aussi mauvais que le reste....
Et une petite compil de tous les sites qui sont d'accord avec moi :

20mar. 2008

Premier bilan 5 mois après mon switch vers l'univers Mac

Cela fait maintenant 5 mois que j'utilise exclusivement un mac pour travailler, surfer, glander...enfin bref pour faire tout ce que je faisais avec mon ordinateur. Le temps est donc venu pour un petit bilan.

Historique

Je viens du monde PC mais sous GNU/Linux. Je n'ai plus utilisé de Windows sur mes PC depuis 8 ans maintenant. Les raisons qui m'ont fait choisir un mac lorsque j'ai renouvelé mon matos :

  • le design
  • architecture Intel (j'aime pas le powerpc ça a toujours été plus lent)
  • système basé sur un Unix (BSD)

Ce qui me faisait peur :

  • le changement (et oui !)
  • le clavier un peu bizarre de prime abord du mac
  • les souris avec un seul bouton

Comme je me déplace parfois et que j'ai besoin de pouvoir travailler quand même j'ai choisi un MacBook Pro 17'' : j'aime bien les grands écrans ;)

Lire la suite

15déc. 2007

Configurer le support GPG pour Thunderbird sous Mac OS X

Un petit tutoriel pour expliquer comment activer le support de GnuPG dans Thunderbird sous Mac OS X parce que je me suis bien pris la tête pour trouver...
  1. Installer gpg et gpg-agent (sudo port install gnupg2 && sudo port install gpg-agent)
  2. Installer l'extension Enigmail pour Thunderbird
  3. Créer un dossier .MacOSX dans votre dossier utilisateur (par exemple /Users/toto/.MacOSX)
  4. Enregistrer dans ce dossier le fichier environment.plist joint à ce post en prenant soint de remplacer "/Users/toto" par "/Users/votre_login"
  5. Enregistrer l'application Gpg-Agent jointe dans votre dossier/Applications
  6. Modifier votre fichier /Users/toto/.profile pour y rajouter la ligne : eval $(cat ~/.gnupg/.gpg-agent)
  7. Dans "Préférences système > Comptes > Ouverture", ajouter le lancement de l'application Gpg-Agent
  8. Redémarrer votre session
  9. C'est gagné !

11nov. 2007

Dissimuler les liens mailto des pages html

Vu sur http://www.alistapart.com/comments/gracefulemailobfuscation/ :

Une technique intéressante pour supprimer les liens mailto sur une page html et donc empêcher la détection des adresses emails par les robots des spameurs.... La technique n'est toute fois pas parfaite (elle ne permet pas de gérer le caractère '+' des adresses emails) mais l'idée est là...

09nov. 2007

Classe php5 pour l'API Fotolia utilisant le Zend Framework

Dans la lignée de mon post précédent, voici le code d'une classe implémentant de façon simple l'API XML-RPC de Fotolia avec le Zend Framework.

Je précise à tout hasard que ce code est livré tel quel et que je ne suis pas responsable de tout problème pouvant survenir de son utilisation.
La licence du code est la licence BSD.
Pour ceux que ça intéresse, cette classe fait l'objet d'une proposition pour intégrer le framework.
Vous pouvez suivre son évolution ici : http://framework.zend.com/wiki/display/ZFPROP/Zend_Service_Fotolia

Lire la suite

08nov. 2007

Utiliser l'API XML-RPC Fotolia en php5

Afin d'utiliser l'api de Fotolia il est nécessaire d'obtenir une clé API.
Si vous n'en avez pas déjà une, il suffit d'aller dans votre compte, section "outils" puis de cliquer sur l'onglet "api".
Une fois que votre clé API aura été validée par l'équipe Fotolia vous pourrez commencer à utiliser leur service xml-rpc.
Lire la documentation sera bien sûr bienvenue !

Lire la suite

07juin 2007

sprintf en Javascript

Javascript ne propose pas en standard de fonction sprintf pourtant si pratique.... Voilà le code de cette fonction trouvée sur http://jan.moesen.nu/ :
// This code is in the public domain. Feel free to link back to http://jan.moesen.nu/
function sprintf() {
if (!arguments || arguments.length < 1 || !RegExp) {
return;
}

var str = arguments[0];
var re = /([^%]*)%('.|0|\x20)?(-)?(\d+)?(\.\d+)?(%|b|c|d|u|f|o|s|x|X)(.*)/;
var a = b = [], numSubstitutions = 0, numMatches = 0;
while (a = re.exec(str)) {
var leftpart = a[1], pPad = a[2], pJustify = a[3], pMinLength = a[4];
var pPrecision = a[5], pType = a[6], rightPart = a[7];

numMatches++;

if (pType == '%') {
subst = '%';
} else {
numSubstitutions++;
if (numSubstitutions >= arguments.length) {
alert('Error! Not enough function arguments (' + (arguments.length - 1) + ', excluding the string)\nfor the number of substitution parameters in string (' + numSubstitutions + ' so far).');
}

var param = arguments[numSubstitutions];
var pad = '';
if (pPad && pPad.substr(0,1) == "'") {
pad = leftpart.substr(1,1);
} else if (pPad) {
pad = pPad;
}

var justifyRight = true;
if (pJustify && pJustify === "-") {
justifyRight = false;
}

var minLength = -1;
if (pMinLength) {
minLength = parseInt(pMinLength);
}

var precision = -1;
if (pPrecision && pType == 'f') {
precision = parseInt(pPrecision.substring(1));
}

var subst = param;
if (pType == 'b') {
subst = parseInt(param).toString(2);
} else if (pType == 'c') {
subst = String.fromCharCode(parseInt(param));
} else if (pType == 'd') {
subst = parseInt(param) ? parseInt(param) : 0;
} else if (pType == 'u') {
subst = Math.abs(param);
} else if (pType == 'f') {
subst = (precision > -1) ? Math.round(parseFloat(param) * Math.pow(10, precision)) / Math.pow(10, precision): parseFloat(param);
} else if (pType == 'o') {
subst = parseInt(param).toString(8);
} else if (pType == 's') {
subst = param;
} else if (pType == 'x') {
subst = ('' + parseInt(param).toString(16)).toLowerCase();
} else if (pType == 'X') {
subst = ('' + parseInt(param).toString(16)).toUpperCase();
}
}

str = leftpart + subst + rightPart;
}

return str;
}

- page 1 de 3