Archives mensuelles : juin 2007

Tester un safari sans Mac

Après quelques recherches sur le sujet « utiliser un Mac quand on en a pas… » J’ai exposé mon problème sur le forum de Macbidouille.

Mes pistes de recherche :

– 1. Emulation d’un Mac sur PC (pour l’instant je galère, mais ça va peut etre se décoincer), projet PearPC, via Virtual server et via VMWare…
– 2. Recherche d’un service de « location en ligne » d’un Mac, genre à l’heure, je paie puis je me branche dessus par VNC ou autre, et je l’utilise pour tester mon appli. Mais je ne sais pas si ça existe
– 3. enfin, l’achat d’un Mac, mais vous comprennez bien que acheter un mac pour l’utiliser 2 heures par mois, ça fait drole…

Voilà le résultat de mes recherches :

 – 1. L’émulation d’un Mac sur PC, ca ne marche pas sur Virtual server, PearPC, le problème c’est la carte réseau et via VMWare, c’est hyper lent, et en quelques minutes, ça plante
 – 2. Service trouvé (après un certain temps de recherche : les mots clés sont : « remote access service for cross-platform testing of web designs. ») browsercam, permet d’avoir un accès en VNC à toutes les config possible pour faire du test sur le web http://www.browsercam.com/Features.aspx. Je n’ai pas testé le service, mais j’ai l’impression que c’est pas mal.
 – 3. Je n’ai pas acheté de Mac…
 – 4. Lors de mes recherches, une autre piste est apparue, une émulation de Safari uniquement (plutôt que de faire tourner le Mac entier… Un safari sur PC, c’est le projet getswift, mais à croire qu’il a été interdit par Apple, j’ai eu un mal fou à le trouver… (il faut chercher « swift_0.2.msi  »  sur google) Ce n’est pas encore au point en tout cas…
 – 5. Enfin, deux bonnes volontés du forum Macbidouille m’ont ouvert leur porte via VNC pendant quelques heures le temps de regler mes problèmes de compatibilité : cool ! Merci à Gauvichounet et à Art !

 – 6 [UPDATE 12 juin 2007] Safari pour Windows, Apple l’a fait ! http://apple.com/safari J’ai testé, ce n’est pas concluant, j’ai l’impression qu’on a le droit actuellement à un nouveau navigateur avec un nouveau problème de compatibilité. Esperons qu’ils vont corriger ça !

Mes problèmes de compatibilité Javascript étaient :

  • Utilisation d’un id identique pour plusieurs div différentes (c’est mal !)
  • L’utilisation d’une ruse qui ne marche pas sous MAC setMinutes(540) mets 9:00 sous PC et 0:54 sous MAC, il faut faire le modulo et la partie entière et utiliser setHours() et setMinutes() sinon, ca plante.
  • Enfin un probleme de style sur la popup etait du à un margin-left que le safari n’apprecie que moyennement…
         //sepStyle += ‘margin-left: 32px;’;
         sepStyle += ‘position:relative;left: 32px;’;

     


Module Assistant de l’application URBA

URBA est une application de réservation de ressources éditée par la société Lucca. Je travaille actuellement sur son dernier module, le module assistant.

Techniquement, c’est un module développé en javascript objet qui utilise l’AJAX pour communiquer avec le serveur. Les disponibilités des participants sont fournies par un serveur MS Exchange ou open Exchange via le protocole Webdav décidement très souple.

[update 10/06/2007]Voilà une nouvelle vidéo en avant première d’une interview faite par ma journaliste preferée ! (vidéo seule)

fonction waitFor Javascript

Dans le cadre d’un développement d’assistant de réservation d’une des application de Lucca dont je vais faire un article prochainement, j’ai eu à gérer un problème javascript qui apparaît surtout quand on utilise le Asynchrone de l’AJAX. En gros, dans certains cas, le contenant devant se remplir de son contenu n’est pas pret quand le contenu arrive ! et il faut attendre un peu, mais sans bloquer le navigateur, que les choses se fassent pour passer à la suite.

La fonction waitfor permet de tenter une action plusieurs fois :

  1.         //waitFor(function(){myState.ParticipantClicked();}, function(){ return $(‘icone_participants’)}, 100, DateAdd(‘s’,1,(new Date()))))
  2.         function waitFor(fonctionAExecuter, condition, interval, fin){
  3.                 if (condition()) fonctionAExecuter();
  4.                 else{
  5.                         if(compareObjDate(fin,(new Date()),‘DIFF’)>0) setTimeout(function(){waitFor(fonctionAExecuter, condition, interval, fin);},interval);
  6.                 }
  7.         }
  8.         //nb = compareObjDate(newDate,(new Date()),’DIFF’)
  9.         function compareObjDate(date_1, date_2, operateur){
  10.             diff = date_1.getTime()-date_2.getTime();
  11.             if (diff>0){
  12.                 date_min = date_2;
  13.                 date_max = date_1;
  14.             }else if (diff<0){
  15.                 date_min = date_1;
  16.                 date_max = date_2;
  17.             }
  18.             if (operateur == ‘MIN’) return date_min
  19.             if (operateur == ‘MAX’) return date_max;
  20.             if (operateur == ‘DIFF’) return (diff==0?diff:diff/Math.abs(diff));
  21.         }
  22.         //DateAdd(‘ms’,100,dateObj))
  23.         //DateAdd(‘d’,1,dateObj))
  24.         function DateAdd(timeU,byMany,dateObj) {
  25.                 var millisecond=1;
  26.                 var second=millisecond*1000;
  27.                 var minute=second*60;
  28.                 var hour=minute*60;
  29.                 var day=hour*24;
  30.                 var year=day*365;
  31.                 var newDate;
  32.                 var dVal=dateObj.valueOf();
  33.                 switch(timeU) {
  34.                         case « ms »: newDate=new Date(dVal+millisecond*byMany); break;
  35.                         case « s »: newDate=new Date(dVal+second*byMany); break;
  36.                         case « mi »: newDate=new Date(dVal+minute*byMany); break;
  37.                         case « h »: newDate=new Date(dVal+hour*byMany); break;
  38.                         case « d »: newDate=new Date(dVal+day*byMany); break;
  39.                         case « y »: newDate=new Date(dVal+year*byMany); break;
  40.                 }
  41.                 return newDate;
  42.         }

Une autre approche consiste à envoyer en parametre d’une premiere fonction, la fonction a éxécuter en retour, mais pour celà, il faut une execution plutot linéaire…

les deux fonctions de gestion de date (compareObjDate et DateAdd) ont été reprises (http://www.codingforums.com/showthread.php?t=3955 et http://www.commentcamarche.net/forum/affich-1987996-javascript-convertir-une-date-et-comparer) et en partie modifiée