installer un environnement apache php mysql sur un mac avec snow leopard

Installer un environnement apache php mysql sur un mac avec snow leopard

On a de la chance sur mac, il y a déjà une partie des outils qui sont installé. C’est le cas pour apache et pour php.

Mais il faut les activer. Voilà mes notes en vrac pour faire cette démarche. C’est pas super propre.. un jour quand j’aurai le temps je ferai mieux 😀

sudo nano /etc/apache2/httpd.conf
décommenter:
#LoadModule php5_module libexec/apache2/libphp5.so
LoadModule php5_module        libexec/apache2/libphp5.so

installer mysql

http://dev.mysql.com/downloads/mysql/5.1.html#macosx-dmg
mysql-5.1.45-osx10.6-x86_64.dmg

installer tout ce qu’il y a sur l’image disque:
– mysql
– le startup item
– le prefpane

Puis activer mysql

Ensuite, il y a plein de warning quand on utilise la fonction strtotime…
Warning: strtotime() [function.strtotime]: It is not safe to rely on the system’s timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected ‘Europe/Berlin’ for ‘CEST/2.0/DST’ instead in /Users/mdespont/Sites/yopyop/include/lib/application.php  on line 49

ici: http://maestric.com/doc/mac/apache_php_mysql_snow_leopard
On nous explique qu’il faut définir la timezone.
A choix une de celle-ci : http://www.php.net/manual/en/timezones.europe.php

Donc pour définir il faut ajouter un php.ini et compléter la ligne timezone en ajoutant le fuseau horaire voulu:

;date.timezone =Europe/Zurich

Puis.. subtilité.. il n’y a pas de php.ini par défaut.. il faut l’ajouter au besoin.. mais dedans les socket par défaut sont faux !!

Donc selon:
http://www.mac4ever.com/articles/creation/1153/php_mysql_sous_snow_leopard_et_xdebug_eclipse/

sudo cp /etc/php.ini.default /etc/php.ini

puis remplacer:
pdo_mysql.default_socket=/tmp/mysql.sock
mysql.default_socket = /var/mysql/mysql.sock
mysqli.default_socket = /var/mysql/mysql.sock

par

pdo_mysql.default_socket=/tmp/mysql.sock
mysql.default_socket = /tmp/mysql.sock
mysqli.default_socket = /tmp/mysql.sock

Donc petit rechercher remplacer: In /etc/php.ini, replace the three occurences of /var/mysql/mysql.sock  by /tmp/mysql.sock

Selon http://stackoverflow.com/questions/1293484/easiest-way-to-activate-php-and-mysql-on-mac-os-10-6-snow-leopard :
to complete your setup or mysql:

sudo vim /etc/profile

add alias

alias mysql=/usr/local/mysql/bin/mysql
alias mysqladmin=/usr/local/mysql/bin/mysqladmin

then set your root password

mysqladmin -u root password ‘yourPassword’

then you can login with mysql -u root -p

Plusieurs virtual hosts pour apache

il faut décommenter la ligne qui permet à apache d’aller lire le fichier
/etc/apache2/extra/httpd-vhosts.conf
Fichier dans lequel j’ai mes virtual hosts.

J’ai les règles de ma réécriture d’url.

Voilà voilà.. tout va bien.. ça marche ! 😀

Reprendre les exemples du fichier exemple: httpd-vhosts-original.conf

#
# Use name-based virtual hosting.
#
NameVirtualHost *:80

#
# VirtualHost example:
# Almost any Apache directive may go into a VirtualHost container.
# The first VirtualHost section is used for all requests that do not
# match a ServerName or ServerAlias in any <VirtualHost> block.
#
<VirtualHost *:80>
ServerAdmin
DocumentRoot « /usr/docs/dummy-host.example.com »
ServerName dummy-host.example.com
ServerAlias www.dummy-host.example.com
ErrorLog « /private/var/log/apache2/dummy-host.example.com-error_log »
CustomLog « /private/var/log/apache2/dummy-host.example.com-access_log » common
</VirtualHost>

 

Installation de Xampp avec la même base de donnée mysql

Il faut télécharger xampp

Pour utiliser la même base de donnée que celle qui a été installé ci-dessus. Il suffit d’utiliser le même socket. Ainsi je crée un lien symbolique.

ln -s /tmp/mysql.sock /Applications/XAMPP/xamppfiles/var/mysql/mysql.sock

Mots-clés IPTC dans une photo

Mots-clés IPTC dans les photos

Une manière intéressante d’organiser ses photos est d’utiliser les mots-clés IPTC présents dans les métadonnées des photos.

Personnellement, j’attribue toujours à mes photos des mots-clés IPTC. Ainsi quand je fais une recherche sur mon mac spotlight est capable de me retrouver les photos.

Quelques mots-clés que j’utilise fréquement:

  • Portrait => pour les photos que l’on utiliserait pour présenter quelqu’un
  • couple => pour les photos que l’on utiliserait pour présenter quelqu’un, mais quand il y a 2 personnes.
  • Group => pour les bonnes photos de groupes. A partir de 3 personne
  • Landscape => les photos de paysage que je mettrai en fond d’écran
  • panorama => les photos panoramique
  • HDR => les photos HDR
  • sourire => les beaux sourire
  • rire => les gens qui rient aux éclat
  • grimace => les gens qui fond des grimaces
  • profile => les gens de profile
  • lunette => les lunettes ou gens à lunettes
  • chapeau => les chapeau ou gens à chapeau. (ou bonnet et casque que j’ajoute en plus)
  • château
  • lever de soleil
  • coucher de soleil
  • montagne
  • lac
  • lune
  • orage
  • arc-en-ciel
  • rivière
  • herbe
  • fleur
  • silhouette
  • reflet
  • arbre
  • neige
  • lumière => quand il y a une lumière particulière
  • affiche => pour ma collection d’affiche politique
  • fontaine
  • gargouille
  • statue
  • tour
  • feu

…. et beaucoup d’autres qui viennent sur le moment..

Mots-clés IPTC et php

Quand je fais une galerie de photo sur le web. Je vais piocher les mots-clés IPTC dans les métadonnées pour afficher des infos sur la photos ou même directement pour créer des albums.

Voici quelques fonctions php que j’utilise pour aller chercher les mots-clés IPTC dans les métadonnées d’une photo.

 

/* Retourne un tableau contenant les mots-clé IPTC contenu dans le fichier de la photos
*
* @return: array() un tableau de string contenant les mots-clé IPTC de la photos
* @param: $imagePath => le chemin d’accès sur le serveur de la photo. (ou une url)
*/
function getIptcKeywordsFromFile($imagePath){

$size = getimagesize ($imagePath, $info);
if(is_array($info)) {
if (isset($info[« APP13 »])) {
$iptc = iptcparse($info[« APP13 »]);
if (isset($iptc[‘2#025’])) {
return $iptc[‘2#025’];
}else{
return  »;
}
}else{
return  »;
}         
}
}

/* Retourne l’auteur de la photo selon le champ IPTC credit
*
* @return: la valeur du champ iptc credit
* @param: $imagePath => le chemin d’accès sur le serveur de la photo. (ou une url)
*/
function getIptcCreditFromFile($imagePath){

$size = getimagesize ($imagePath, $info);
if(is_array($info)) {   
$iptc = iptcparse($info[« APP13 »]);
return $iptc[‘2#110’][0];            
}
}

Photos verticales

Photos verticales

Cette page à pour but de noter un peu tout ce que je sais sur la gestion de photos verticales.

En effet, je n’ai pas encore tout compris, le comportement est parfois étrange.

En gros, depuis toujours on fait des photos qui ne sont pas carrées ! Donc suivant le sens dans lequel on tourne l’appareil photo, une photo est horizontale ou verticale.

Le plus souvent on fait des photos horizontale vu que notre vision humaine est panoramique. Donc la référence largeur hauteur est basée sur cette vision horizontale.

Donc on peut dire que:

  • une photo horizontale est une photo qui a une largeur plus grande que la hauteur. (l>h)
  • une photo verticale est une photo qui a une largeur plus petite que la hauteur. (l

Jusque là tout le monde est d’accord.

En argentique, on a une film qui dispose d’une surface sensible à la lumière. Cette surface est toujours orientée de la même manière. Il n’est possible de faire que des photos horizontales.

Au moment de développer et tirer les photos, on utilise le même papier et le même traitement de fait sur toutes les photos.

Au moment de regarder sa pile de photo sur papier, on retourne instinctivement chaque photo pour voir les verticales dans le bon sens. Pas de problème.

En numérique. Une photo c’est un assemblage de pixel qui correspondent à la lumière enregistrée par un capteur. Comme le film, le capteur est fixe. Il prend toujours les photos en horizontal.

Puis les photos sont transférée de la mémoire de l’appareil photo à la mémoire d’un ordinateur. Au moment de regarder les photo sur un ordinateur, les photos sont toute dans le même sens: horizontale. Donc pour regarder les photos, comme avec la pile de photo papier on retourne la photo.

Pour simplifier un visionnage ultérieur des photos, il est possible d’enregistrer le sens dans lequel est la photos. Pour ce faire, il y a 2 méthodes:

  • définitivement ré-ordonner les donnée de la photo pour qu’elle s’affiche avec des dimension différente et donc une orientation différente.
  • placer une information dans le fichier qui dit au logiciel de retourner la photo au moment de l’afficher.

Historiquement c’est la première méthode qui est la plus courante. Elle demande des ressources une fois et pas à chaque affichage pour retourner la photo. C’est la méthode traditionnelle. Elle a pour inconvénients de devoir réécrire un fichier existant, et cette manipulation est souvent source de problème de perte d’information.

En effet, actuellement, il y a de plus en plus de méta-données dans une photo et le risque de les perdre est grand suivant les logiciels utilisé pour réécrire les images. De plus, la qualité est souvent difficile à régler.

La seconde méthode tend à se répendre de plus en plus. En effet, nous avons des machines rapides qui arrivent facilement à retourner les photos à la volée au moment de l’affichage.

Mais surtout, ce sont les appareils photos numériques qui se sont perfectionnés. De plus en plus, ceux-ci sont équipés d’un capteur de position qui permet d’indiquer l’orientation d’une photo directement dans le fichier au moment de sa création. L’appareil photo est, par rapport à l’ordinateur qui va afficher l’image, un ordinateur lent. Il est donc plus facile pour l’appareil photo d’écrire une indication sur l’orientation de l’image que de ré-ordonner complètement les données de la photos pour la retourner.

Ainsi, il existe dans les photos, des méta-données, des données sur des données… Pour les caractéristiques techniques c’est la norme EXIF qui est utilisée. C’est un format dans lequel chaque appareil photo va enregistrer les réglages et les conditions dans lesquelles la photos est prise.

L’orientation de la photo est donc enregistrée dans un des champs de données exif le champ: orientation.

D’après les spécifications EXIF, le champ orientation contient une valeur numérique de 1 à 8. La signification explique suivant cette valeur, où se trouve visuellement dans l’image le début des donnée à la ligne 0 et colonne 0, donc le haut à gauche. Le cas horizontal normal correspond à la valeur 1.

  1. la ligne 0 est visuellement en haut de l’image, et la colonne 0 est visuellement à gauche de l’image.
  2. la ligne 0 est visuellement en haut de l’image, et la colonne 0 est visuellement à droite de l’image.
  3. la ligne 0 est visuellement en bas de l’image, et la colonne 0 est visuellement à droite de l’image.
  4. la ligne 0 est visuellement en bas de l’image, et la colonne 0 est visuellement à gauche de l’image.
  5. la ligne 0 est visuellement à gauche de l’image, et la colonne 0 est visuellement le haut de l’image.
  6. la ligne 0 est visuellement à droite de l’image, et la colonne 0 est visuellement le haut de l’image.
  7. la ligne 0 est visuellement à droite de l’image, et la colonne 0 est visuellement le bas de l’image.
  8. la ligne 0 est visuellement à gauche de l’image, et la colonne 0 est visuellement le bas de l’image.

Là ça devient difficile de comprendre le nombre de possibilité. Mais en fait, ça doit tout simplement être, j’ai mon appareil et je le tourne dans un sens avec 4 positions et dans l’autre sens avec 4 positions. Mais il me semble qu’il y a des positions qui sont équivalentes ? Là il me faudrait étudier plus en détail ce que représente les colonnes et lignes.

En simplifiant, ce qu’il faut retenir:

  • 1 = le coin référence ligne 0 colonne 0 est en haut à gauche de la photo. (c’est la position standard horizontale)
  • 8 = le coin référence ligne 0 colonne 0 est en bas à gauche de la photo. (il faut incliner la tête à droite pour voir la photo)
  • 6 = le coin référence ligne 0 colonne 0 est à droite en haut de la photo. (il faut incliner la tête à gauche pour voir la photo)

Les autres position n’arrive pas souvent… je tiens rarement mon appareil photo à l’envers.. et il y a même des positions que je ne comprends pas vraiment !

Donc on va s’en tenir à ce qui est le plus courant. Si je résume, mon logiciel quand il va lire les infos, il doit se dire: je lis la balise exif orientation, si je vois un 1, je ne fait rien de spécial, si je vois un 8 je fais une rotation dans le sens trigonométrique et si je vois un 6 je fais une rotation dans le sens des aiguilles d’une montre.

Détail de la signification des nombres

d’après.. http://owl.phy.queensu.ca/~phil/exiftool/TagNames/EXIF.html

  1. = Horizontal (normal)
  2. = Mirror horizontal
  3. = Rotate 180
  4. = Mirror vertical
  5. = Mirror horizontal and rotate 270 CW
  6. = Rotate 90 CW
  7. = Mirror horizontal and rotate 90 CW
  8. = Rotate 270 CW

Maintenant que la théorie est posée, comment se passe la réalité ?

Sur Mac OSX, les applications suivantes comprennent ces balises de rotation:

  • Aperçu
  • GraphicConverter
  • photoshop

Mais, le plus ennuyeux, quelles sont les applications qui ne comprennent pas:

  • Safari
  • Mail
  • Firefox
  • … en bref… les navigateurs web.
  • indesign

iPhoto, comme expliqué plus bas est un logiciel qui comprend cette balise, mais qui ne veut pas l’utiliser !!! En effet, chaque photo avec une indication exif de l’orientation qui est différente de 1 est réécrite dans une version nativement dans le bon sens.

Sur le web, certainement pour des raisons historiques, les photos sont interprétées de manière brut. On ne tient pas compte des balises.

Automator

Automator permet d’effectuer nombre d’opération en piochant par ci par là dans les applications installées.

GraphicConverter propose plusieurs fonctions. Donc la fameuse rotation jpg sans perte de qualité. En sélectionnant cette fonction, il y a un message qui apparaît: Dans la mesure ou la rotation sans perte réécrit les données EXIF de l’image, vous ne pourrez plus afficher des images ainsi modifiées sur un appareil photo numérique.

Ce message sous entend que ce sont principalement les donnée Exif qui sont modifiées… donc est-ce juste la modification de la balise orientation ??? Réponse après le test:

Réponse… le fichier est bel et bien retourné.. mais c’est une rotation effective des données qui est réalisée! Malgré le message, d’avertissement je n’ai vu aucune modification dans l’exif ! Ce sont les données qui ont été réécrites. Les Méta-données IPTC et exif sont inchangées. Les mots-clés sont gardés et avec les accents. Les ressources ont été vidée, l’aperçu n’est plus là !

Le comportement est quasi identique avec le module d’aperçu: pivoter des images . Le fichier est réécrit et la balise exif orientation n’est pas changée.

Aperçu

Comment se comporte aperçu lorsqu’on lui demande d’ouvrir un photo de lui faire faire une rotation et de sauver le fichier. Réponse:

Aperçu effectue des rotations qui sont une modification de la balise exif orientation. Cependant, au moment de sauver, il réécrit la photo avec des paramètres par défaut. L’IPTC et l’exif sont conservés, mais le fichier a été dans mon cas réécrit et les données sont passées de 1012ko à 720k, au moment de sauver, Aperçu n’est pas capable de sauver uniquement l’exif, il sauve et donc recompresse avec les réglages courants. Pourquoi réécrire toute la photo si seul un champ exif est modifié bouh !

GraphicConverter

Essai de rotation en mode standard, manuel. L’image de base se retourne en mode natif, la balise orientation n’est pas touché. La photos est sauvegardée aux paramètres courants. Le hic, c’est que les mots-clé iptc avec accents se sont fait écrasés, l’encodage n’est vraissemblablement pas le même ! C’est étrange, car le module de rotation sans perte de qualité de GC qui est dans automator ne massacre pas les mots-clés accentuées !!

Si l’on prend une photo qui comporte une orientation, et que je fais sauver sous, elle reste identique. rien ne change. Si je prend la même photos, que je bidouille avec des outils (juste la sélection pour ne rien toucher) et que je sauve la photo. GC la réécrit, et cette fois elle est réécrite verticalement. Les informations EXIF sont réécrite, le champ orientation passe de 8 à 1. Et le champ datetime est mis au temps courant. Il ne reste donc plus que original date time pour savoir le moment de prise de vue.

GC en mode gestionnaire: ce mode comporte des réglage qui peuvent être différents, et c’est le mode que j’utilise le plus, alors voyons comment il se comporte.

Pour une photo qui comporte une balise exif orientation égale à 6, si l’on veut la diffuser sur le web, il faut la redresser en faisant une rotation de 90° dans le sens des aiguilles d’une montre. En effectuant cette manipulation à l’aide du gestionnaire d’image de GC, l’image est véritable retournée en donnée et le champ exif orientation reste inchangé. Cette opération ajoute une incohérence. Les logiciels comprenant la rotation exif à la volée tourne inutilement la photo. Par contre sur le web, c’est tout bon. Les méta-données EXIF et IPTC ne sont pas touchée. Ceci par ce que le gestionnaire est configuré pour utiliser une rotation sans perte et ne pas toucher les champs exif. (fait étrange remarqué, dans le gestionnaire, la vignette est aussi retournée mais dans l’autre sens !?!)

Lors d’un second essai, mais avec un photo dans l’autre sens (et des mots-clés iptc accentués) l’image a aussi été tournée, mais pas la vignette !! Les mots-clés sont restés identique.

Maintenant, essai, avec la même photo source, mais dans les préférences l’option ne pas modifier l’exif n’est pas cochée. Le comportement est bien mais pas top ! L’image est véritablement retournée, l’exif est modifié (ou plutôt pollué.. je vois pas à quoi sert de le modifier, l’exif est surtout utile pour avoir les conditions du moment de prise de vue.) L’exif est modifié, mais pas le champ orientation !!! ce qui est un peu débile, car sinon, pourquoi avoir besoin de modifier l’exif !

En ce qui concerne l’option rotation sans perte de qualité je ne dois pas encore avoir tout compris. Moi je vois dans tout les cas que le fichier est réécrit ! Si le même fichier est retourné dans un sens puis dans l’autre, on retombe sur nos patte (?) mais sinon, la compression effectuée par l’appareil photo et celle refait diffèrent quelque peu !

L’ajout de mots-clés dans un fichier via le gestionnaire semble être bien fait, il ne modifie que les champs exif. Avec l’option ne pas modifier l’exif desactivé. (donc GC a le droit de modifier l’exif) Si j’ajoute 20 caractères comme mots-clés, je vois le fichier grossir de 28 octet. Ce qui restent dans le bon ordre de grandeur. Bien.

iPhoto

Comment ça fonctionne tous ça !!! Version 6.0.6 (ouais chez apple cette applications change beaucoup à chaque fois.) Dans mon cas, je prend mon dossier de photos d’essai que je glisse sur l’icon de iPhoto. A ce moment, iPhoto turbine et j’ai une nouvelle sélection dans la photothèque qui comprend mes photos. Par soucis de propreté, je crée un nouvel album, avec la sélection courante de mes dernières photo. Puis en allant explorer le dossier iPhoto Library, je remarque que les photos sont triées dans 3 dossiers, Data , Modified, et Originals. Data contient les vignettes des photos. Modified contient toutes les photos qui ont été modifiées, c’est à dire qu’une photo verticale qui contient juste le champs exif orientation est réécrite en mode vertical natif. La photo est donc modifiée et se retrouve dans ce dossier. Le plus grave dans l’histoire, c’est les dégâts collatéraux. L’exif est très réduit. Il ne reste que quelques rares champs, comme la date de prise de vue originale (heureusement) et l’IPTC est carrément shooté !. Originals contient des alias sur les photos originales. C’est également le seul liens qu’iphoto a avec les photos horizontales qui n’ont pas été modifiées. Donc, dans ce mode la photothèque est en partie en interne au dossier d’iphoto et en partie en externe !!

Le boulot de massacre des photos est assez bien fait, en effectuant une rotation effective des photos, iphoto ajoute une balise exif orientation. Mais s’il en existe déjà une, il ne la modifie pas, non… il ajoute. Ce qui fait que l’exif est endommagé, certains programmes n’arrivent plus le lire! (la fonction php read_exif_data par exemple) Donc, il y a 2 balises orientation. Génial pour tout compliquer.

De plus, le fichier réécrit est plus lourd que l’original. (1.6Mo passe à 2Mo)

Quand iphoto passe en mode édition, un nouveau fichier est créé dans le dossier modified, même quand ce n’est que de la visualisation en plein écran !!!

Lorsque les mots-clés IPTC des photos non modifiées existes, iPhoto est capable de les reprendre pour les utiliser dans sa propre base de données. Sinon, les mots-clés ne sont pas exporté hors de iphoto. Heureusement qu’un module spotlight permet de rechercher aussi dans iphoto, mais cette méthode rend captif l’utilisateur dans ce logiciel qui comme on vient de l’étudier n’est de loin pas parfait, et même plutôt destructeur d’image !

Malheureusement, aucune modification du côté de la version 7.1 de iPhoto ! … l’interface, s’améliore, mais le moteur n’a pas changé du tout !

PictureSync

PictureSync est un logiciel qui est conçu pour automatiser l’envoi de photo depuis iphoto, aperture, ou un dossier, vers le divers services de photo comme flickr, zoomr, ou en dossier etc….

Ce logiciel est capable de lire un grand nombre d’information exif. L’application est capable de faire des rotations. et surtout de voir le champs orientation et d’agir en conséquence. Lorsque PictureSync fait une rotation, il lit le champ orientation, effectue la rotation et modifie le champs orientation !!! C’est le seul logiciel que je connaisse qui prenne la peine de le faire ! Bien! (le seul bémol est une désaturation des couleurs lors de l’opération !)

PictureSync est conçu pour uploader des photo (sur un site ou dans un dossier) et est capable de faire la rotation et le redimensionnement des photo à la volée au moment de l’upload. Il semble que pour ma photo que j’avais déjà triturée (rotation), tout se passe bien. Pour les photos brut, c’est moins bien, le logiciel me signal une erreur de réécriture de l’exif ! (problème d’accès du dossier de destination ?) Suite à ce problème, j’ai perdu les métadonnées. Demande encore quelques essais !

Sinon, le logiciel permet d’éditer bon nombre de champs de méta-données, ce qui est très intéressant. Il y a également la possibilité de faire du géotagging avec google earth. Intéressant !

Créer une galerie web

Mon intérêt pour ce problème de rotation des photos viens surtout d’une application en particulier qui me pose problème. La création de galerie de photo pour le web.

En effet, j’ai développé une galerie de photo en php qui récupère les mots-clés IPTC dans le but de les afficher comme légende ou titre. De plus cette galerie permet de trier les photos en fonction de leur date de prise de vue qui se trouve dans les données EXIF.

Les photos que je dépose sur le web sont donc soumise à quelques contraintes:

  • l’exif doit être conservé
  • l’IPTC doit être conservé
  • les mots-clés IPTC doivent être encodé en UTF-8
  • les photos verticales doivent être nativement tournée. Le champ exif orientation n’est pas compris par les navigateurs web.

Pour afficher des photos sur le web, je ne les mets jamais en plein résolution, ce serait trop gros. J’ai donc besoin de réduire la taille des photos tout en ne perdant pas les méta-données. De plus, j’ai besoin de retourner en mode natif donnée les photos verticales qui ne comporte que l’indication du champ exif orientation.

Ceci parait simple, mais c’est finalement un casse tête! Et cela se complique encore plus, quand comme je le fais, la sélection de photo a traiter est une liste d’alias. (c’est ainsi que je me fais des albums, des sélections de différents fichier du lot de base.)

Questions…

Dans le cas d’un appareil photo qui n’a pas de capteur de position, est ce que la fonction rotation de l’image de l’application transfert d’image fait une rotation véritable ou est ce qu’elle renseigne la balise exif orientation?

Fonction php pour retourner une photo jpg en fonction du flag exif orientation

/* Retourne les données d’une photo jpg en fonction du flag exif orientation.
*
* Utilise jpgetran pour la rotation sans perte de la photo
* Utilise exiftool pour modifier le flag exif orientation après avoir effectué la rotation. http://www.sno.phy.queensu.ca/~phil/exiftool/
*
* Cette fonction effectue une rotation sans perte. Les données sont réarrangée, mais pas recompressée.
* Cette fonction conserve les métadonnées. (exif, iptc, commentaires, jffif, xmp, etc..)
* Cette fonction ne retourne PAS la vignette exif. Elle reste dans la position originale. Cela influence la vue des vignettes dans graphicConverter, l’aperçu en mode colonne du finder.
* Cette fonction recrée un fichier, donc elle modifie la date de création et modification du fichier. (c’est à cause de jpegtran. Exiftool est souple à ce niveau)
*
* Les commandes utilisées sont sur le principe:
* jpegtran -copy all -rotate 270 -verbose -outfile girafe2.jpg girafe.jpg
* exiftool -orientation=1 -n -overwrite_original_in_place girafe.jpg
*
* @return: rien de particulier.. 😛
* @param: $imagePath => le chemin d’accès de la photo sur le serveur. (pas une url)
*/
function rotateJpgFromExifOrientation($imagePath){

// lire le champ exif orientation
$exif = exif_read_data($imagePath);  // todo: bug quand exif n’est pas là… Warning: exif_read_data(dsc_1783.jpg) [exif_read_data]: Process tag(x0000=UndefinedTa): Illegal pointer offset(x4E20434F + x4E494B4F = x9C698E9E > x02C3) in /Users/mdespont/Sites/yopyop/include/manager/photoManager.php on line 468

if ($exif!=false) {

$orientation =  »; // pour tout les cas non prévu, ou la cas orientatio=1 qui ne demande pas de modification.
$orientation = $exif[‘Orientation’];

// si orientation = 8 => retourne de 270
if ($orientation==’8′) {
$angle = « 270 »;
// si le champ = 6 => retourne de 90
}elseif ($orientation==’6′) {
$angle = ’90’;
}else {
$angle =  »;
}

if (!empty($angle)) {

$nomDossier = dirname($imagePath);  // obtient le nom du dossier. Ex: images/photos/2006/toto/toto.jpg devient images/photos/2006/toto
$nomFichier = basename($imagePath);
$outpoutPath = $nomDossier. »/temp_ ».$nomFichier;

// retourne la photo
$commandeRotation = « /usr/local/bin/jpegtran -copy all -rotate « .$angle. » -outfile « .$outpoutPath. » « .$imagePath; // on suppose que jpegtran est dans le path

//    echo « 
commande rotation: « , $commandeRotation;

$output = array();
$return_var = 0;
exec($commandeRotation, $output, $return_var);

// print_r($output);
//         echo « statut: « ,$return_var;

// place le flag orientation à 1. Ce qui signifie que le flux de donnée est correct. Pas besoin de modifier l’orientation à la volée
// cette option ne sert à rien pour le site web en lui même, mais elle est utile si des gens téléchargent les photos depuis le site web pour les utiliser en local.

$commandeFlagExif = « /usr/bin/exiftool -orientation=1 -n -overwrite_original_in_place « .$outpoutPath;  // -overwrite_original_in_place permet de garder l’icon et les ressources Mac. Si on est sur linux, utiliser: overwrite_original qui est moins gourmand

//        echo « 
commande flag: « , $commandeFlagExif;

$output = array();
$return_var = 0;
exec($commandeFlagExif, $output, $return_var);

// print_r($output);
//         echo « statut: « ,$return_var;

// renommer le fichier temp_photo.jpg  en photo.jpg
rename($outpoutPath,$nomDossier. »/ ».$nomFichier);   
}
}
}

Convertisseur de coordonnées géographiques CH1903 WGS84

Conversion de coordonnées CH 1903 vers WGS84

Sur les cartes suisses on utilise le système de coordonnées CH 1903. De plus en plus en cartographie, on utilise des outils avec le système WGS84. Le système global utilisé par le GPS. Comment changer de système de coordonnées.

Programmes online

Swisstopo fourni sur son site plein de services intéressants:

Autres sources

La théorie de la conversion d’unité selon swisstopo

Conversion de coordonnées WGS84 de notation décimale à sexagésimale

Les coordonnées WGS84 peuvent être données dans plusieurs notation différente. Parfois en notation sexagésimale avec des latitude et longitude en degré, minutes et secondes. Parfois la notation est en degré décimale: tout est en degré et virgules de degré. La notation en degré décimale est celle utilisée par google maps. Ex: lat: 46.94952985143932 long: 6.834204196929932

Code PHP de conversion WGS84 – CH1903

Parfois, il est utile de faire la conversion dans un bout de programme. Ainsi voici les fonctions php qui convertissent des coordonnées wgs84 en CH1903 et inversément.

Ces fonctions on été écrites selon les formules fournies par swisstopo. (dans la théorie ci-dessus)

/**
* converti les coordonnées lat long en wgs84 pour avoir des coordonnées ch1903
* Ex: lat: 46.94952985143932 long: 6.834204196929932 => 553 986/200 005
*
* @return array()  y et x  les coordonnées au format CH1903
* @param latitude en degré décimal
* @param longitude en degré décimal
*/
function getCoordonneeCH1903($lat,$long){
// Les latitudes φ et les longitudes λ sont à convertir en secondes sexagesimales [« ]

// Les grandeurs auxiliaires suivantes sont à calculer (les écarts en latitude et en longitude par rapport à
// Berne sont exprimés dans l’unité [10000″]) :
// φ’ = (φ – 169028.66 « )/10000
//  λ’ = (λ – 26782.5 « )/10000
//
// 3. y [m] = 600072.37
//  + 211455.93 * λ’  
//  – 10938.51 * λ’ * φ’
//  – 0.36 * λ’ * φ’2
//  – 44.54 * λ’3
//
// x [m] = 200147.07
//  + 308807.95 * φ’
//  + 3745.25 * λ’ 2
//  + 76.63 * φ’ 2
//  – 194.56 * λ’ 2 * φ’
//  + 119.79 * φ’ 3

// conversion degré décimal en seconde sexagétimale
// deg = 60 * minutes
// minutes = 60 * seconde
// =>deg = 3600 * seconde
$lat = $lat * 3600;
$long = $long * 3600;

// latitude:  φ =>lat  ( φ’ =>lat2)
$lat2 = ($lat – 169028.66)/10000;

// longitude:  λ =>long  ( λ’ =>long2)
$long2 = ($long – 26782.5)/10000;

$y = 600072.37 + (211455.93 * $long2) – (10938.51 * $long2 * $lat2) – (0.36 * $long2 * ($lat2*$lat2)) – (44.54 * ($long2*$long2*$long2));
$y = round($y);

$x = 200147.07 + (308807.95 * $lat2) + (3745.25 * $long2*$long2) + (76.63 * $lat2*$lat2) – (194.56 * $long2*$long2 * $lat2) + (119.79 * $lat2*$lat2*$lat2);
$x = round($x);

return array(‘y’=>$y,’x’=>$x);  // 600000,200000
}

/**
* converti les coordonnées ch1903 en latitude et longitude du système wgs84.
* Calcul selon: http://geomatics.ladetto.ch/swiss_projection_fr.pdf
* Pour des altitudes positives, les 2 systèmes sont équivalents au mètre près. Donc on n’en tient pas compte dans cette fonction.
* Ex: 553 986/200 005 => lat: 46.949532367683 long: 6.8342057996687
*
* @return array()  lat et long  les coordonnées au format wgs84 en notation degré décimale: 46.951081111111,7.4386372222222
* @param x (nord) à indiquer en m au format: 200000
* @param y (est) à indiquer en m au format: 600000
*/
function getCoordonneeWGS84($x,$y){

// 1. Les coordonnées en projection y (coordonnée est) et x (coordonnée nord) sont à convertir dans le
// système civil (Berne = 0 / 0) et à exprimer dans l’unité [1000 km] :
//  y’ = (y – 600000 m)/1000000
//  x’ = (x – 200000 m)/1000000

// 2. La longitude et la latitude sont à calculer dans l’unité [10000″] :
// λ’  = 2.6779094
//  + 4.728982 * y’
//  + 0.791484 * y’ * x’
//  + 0.1306 * y’ * x’2
//  – 0.0436 * y’3

// φ’  = 16.9023892
//  + 3.238272 * x’
//  – 0.270978 * y’ 2
//  – 0.002528 * x’ 2
//  – 0.0447 * y’ 2 * x’
//  – 0.0140 * x’ 3

// h [m] = h’ + 49.55
// – 12.60 * y’
// – 22.64 * x’

//
// 3. La longitude et la latitude sont à convertir dans l’unité [°] :
// λ = λ’ * 100 / 36
// φ = φ’ *100 / 36

$y2 = ($y-600000)/1000000;
$x2 = ($x-200000)/1000000;

// longitude:  λ =>long  ( λ’ =>long2)
$long2 = 2.6779094 + (4.728982 * $y2) + (0.791484 * $y2 * $x2) + (0.1306 * $y2 * $x2*$x2) – (0.0436 * $y2*$y2*$y2);

// latitude:  φ =>lat  ( φ’ =>lat2)
$lat2 = 16.9023892 + (3.238272 * $x2) – (0.270978 * $y2*$y2) – (0.002528 * $x2*$x2) – (0.0447 * $y2*$y2 * $x2) – (0.0140 * $x2*$x2*$x2);   

// conversion en °
$long = $long2 *100/36;
$lat = $lat2 *100/36;

return array(‘lat’=>$lat,’long’=>$long);  //pour y=600000, x=200000 => 46.951081111111,7.4386372222222
}

Pour ceux que la cartographie intéresse, je recommande de lire aussi tout ce que j’ai écrit à propos de l’outil de cartographie libre OpenStreetMap.

Optimisation de sites php mysql

Optimisation de site php mysql

D’une manière générale, le php est rapide a exécuter, mais les connexions entre les hôtes est lente.  0,1 s pour tout le script php par rapport à 0.2s par connexion avec mysql.

 

Mysql

  • mettre les valeurs à NOT NULL si on sait qu’elle vont l’être.. pas besoin de lire le bit pour savoir avant d’aller piocher la valeur.
  • utiliser char à la place de varchar. Char est moins gourmand en CPU car il n’a pas besoin de calculer la taille du champ pour aller au suivant. On fait donc le choix que le coût CPU est plus important que le coût mémoire. Car avec varchar on économise un petit peu de mémoire. Si un champ d’une table est variable, toute la table l’est !!  Un champ text est un champ variable !
  • mettre des index sur les champs utilisés fréquemment pour des recherches. C’est très bien en lecture, mais éviter de mettre des index sur des champs qui doivent être écrit souvent. C’est très lent.
  • éviter select * être plus précis.
  • utiliser limit 1 si l’on est certain d’avoir besoin que d’un enregistrement. Ainsi Mysql stop la recherche et ne va pas tenter de trier les données.. Genre le break.
  • utiliser des nombres plutôt que des string pour faire les jointures !  Comparer des nombres en en gros 2 fois plus rapide que de comparer une chaîne de 3 caractères !  après c’est encore pire.

PHP

  • éviter la fonction in_array() remplacer par un isset() sur les clés d’un tableau. Pour mettre les valeurs d’un tableau dans des clés utiliser array_ fill_ keys. Les clés d’un tableau sont des tables de hachage donc très rapide.
  • ne pas utiliser require_once();  require() ou include() sont beaucoup plus rapide.
  • utiliser la pré-incrémentation plutôt que la post incrémentation. ++$i est 10% plus rapide que $i++. Zend optimizer le fait pour nous!
  • utiliser les multiples paramètre de echo pour faire des concaténations. echo « toto », Mafonction(), »bleu », getTotot()  est mieux que d’utiliser l’opérateur de concaténation . qui va lui générer plein d’objet temporaire.
  • mettre en cache les variables dans un tableau. Sur une boucle de 10millions d’itérations on gagne 15% de temps CPU. $tableau[‘variable’] oblige php à rechercher la valeur dans le tableau et cette recherche bouffe du temps. Mais c’est tout de même peu.
  • compression ob_gzhandler … gain de 33% de donnée à transferrer.

 

Mythe php

  • écrire  ‘toto’ ou « toto » ne change pas grand chose en performance c’est de l’ordre de 0,01% Donc négligeable !

 

Apache

  • ne pas utiliser mod access.. donc pas de htaccess.. car il va chercher dans tous le dossier jusqu’au parent qui contient un htaccess. (ou limiter le nombre de niveau de hiérarchie)

Maintenance.

  • OPTIMIZE TABLE table   défragmenter de temps en temps les tables.

à creuser..

  • select in est très rapide ?
  • table temporaire plutôt que script php

Référence