Category Archives: apple

exporter iPhoto dans des dossiers

iPhoto est bien sympa mais il a des limites, à commencer par le fait qu’il n’exporte pas dans des dossiers. Si on utilise les outils d’exportation on se retrouve avec toutes les photos dans un seul dossier !

grace aux commentaires sur cette page j’ai utilisé le script python suivant qui a fonctionné sur ma configuration :

  • Mac OS 10.6.3 (Snow Leopard), avec le python intégré
  • iPhoto 8.1.2

Je l’ai enregistré dans un fichier nommé “export-iphoto.py” dans le dossier “documents” de l’utilisateur “chris”, puis en lançant le terminal pour l’executer (en réalité je crois qu’on peut se contenter de double cliquer dessus, mais j’aime bien le mode ligne de commande 🙂 ) :

cd /Users/chris/Documents
python export-iphoto.py

Voici le contenu du fichier export-iphoto où il faut bien prendre soint de changer ces 2 lignes
albumDataXml="/Users/YOURUSERNAME/Pictures/iPhoto Library/AlbumData.xml"
targetDir="/Volumes/share/pictures"

export-iphoto.py :

from xml.dom.minidom import parse, parseString, Node
import os, time, stat, shutil, sys

def findChildElementsByName(parent, name):
result = []
for child in parent.childNodes:
if child.nodeName == name:
result.append(child)
return result

def getElementText(element):
if element is None: return None
if len(element.childNodes) == 0: return None
else: return element.childNodes[0].nodeValue

def getValueElementForKey(parent, keyName):
for key in findChildElementsByName(parent, "key"):
if getElementText(key) == keyName:
sib = key.nextSibling
while(sib is not None and sib.nodeType != Node.ELEMENT_NODE):
sib = sib.nextSibling
return sib

albumDataXml="/Users/chris/Pictures/iPhoto Library/AlbumData.xml"
targetDir="/Volumes/FAT/pictures"
copyImg=True #set to false to run with out copying files or creating directories

print "Parsing AlbumData.xml"
albumDataDom = parse(albumDataXml)
topElement = albumDataDom.documentElement
topMostDict = topElement.getElementsByTagName('dict')[0]
listOfRollsArray = getValueElementForKey(topMostDict, "List of Rolls")
masterImageListDict = getValueElementForKey(topMostDict, "Master Image List")

#walk through all the rolls (events)
for rollDict in findChildElementsByName(listOfRollsArray, 'dict'):
rollName = getElementText(getValueElementForKey(rollDict, "RollName"))
print "\n\nProcessing Roll: %s" % (rollName)

#walk through all the images in this roll/event
imageIdArray = getValueElementForKey(rollDict, "KeyList")
for imageIdElement in findChildElementsByName(imageIdArray, 'string'):
imageId = getElementText(imageIdElement)
imageDict = getValueElementForKey(masterImageListDict, imageId)
modifiedFilePath = getElementText(getValueElementForKey(imageDict, "ImagePath"))
originalFilePath = getElementText(getValueElementForKey(imageDict, "OriginalPath"))

sourceImageFilePath = modifiedFilePath

modifiedStat = os.stat(sourceImageFilePath)
basename = os.path.basename(sourceImageFilePath)
year = str(time.gmtime(modifiedStat[stat.ST_CTIME])[0])
targetFileDir = targetDir + "/" + year + "/" + rollName

if not os.path.exists(targetFileDir):
print "Directory did not exist - Creating: %s" % targetFileDir
if copyImg:
os.makedirs(targetFileDir)

targetFilePath = targetFileDir + "/" + basename
iPhotoFileIsNewer = False

if os.path.exists(targetFilePath):
targetStat = os.stat(targetFilePath)

#print "modified: %d %d" % (modifiedStat[stat.ST_MTIME], modifiedStat[stat.ST_SIZE])
#print "target : %d %d" % (targetStat[stat.ST_MTIME], targetStat[stat.ST_SIZE])

#why oh why is modified time not getting copied over exactly the same?
if abs(targetStat[stat.ST_MTIME] - modifiedStat[stat.ST_MTIME]) > 10 or targetStat[stat.ST_SIZE] != modifiedStat[stat.ST_SIZE]:
iPhotoFileIsNewer = True
else:
iPhotoFileIsNewer = True

if iPhotoFileIsNewer:
msg = "copy from:%s to:%s" % (sourceImageFilePath, targetFilePath)
if copyImg:
print msg
shutil.copy2(sourceImageFilePath, targetFilePath)
else:
print "test - %s" % (msg)
else:
sys.stdout.write(".")
sys.stdout.flush()

albumDataDom.unlink()

Mac OS 10.5 & 10.6 : accent manquant dans Helvetica et Helvetica Neue

Sur Leopard et Snow Leopard, les polices systèmes sont restaurées dès qu’on essai de les supprimer.

Ainsi il est sacrément embattant de remplacer les polices Helvetica et Helvetica Neue qui ont pourtant le défaut majeur de ne pas intégrer les accents Français lorsqu’on exporte au format PDF à partir d’Adobe InDesigne, Photoshop, Illustrator…

J’ai trouvé sur la doc fournie par Extensis Universal Type Client (version réseau de Suitecase) une procédure permettant de les supprimer afin de pouvoir enfin les gérer via notre logiciel de gestion des polices :

  1. Ouvrir une session où l’utilisateur est Administrateur sur le Mac concerné
  2. Ouvrir le livre des polices
  3. Choisir “Livre des polices” > “Préférences
  4. Désactiver “M’avertir si les polices système changent
  5. Copier le dossier suivant vers un endroit où il sera en sécurité :
    /System/Bibliothèque/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATS.Framework/Versions/A/Resources/ProtectedFonts
    note : ne jamais supprimer votre copie de sauvegarde du dossier “ProtectedFonts“, pour le cas où vous auriez besoin de ces polices dans le futur
  6. Ouvrir le dossier ProtectedFonts original et y supprimer Helvetica et HelveticaNeue
  7. Entrer un login administrateur lorsqu’il le demande
  8. Ouvrir /System/Bibliothèque/Fonts et y supprimer Helvetica et HelveticaNeue
  9. Ouvrir votre gestionnaire de police (Extensis dans notre cas) et activer EN PERMANENCE vos versions d’Helvetica et Helvetica Neue
  10. Redémarrer votre ordinateur

extensis_helvetica

Explications : le contenu du dossier ProtectedFonts de Leopard et Snow Leopard assure que les polices qui s’y trouvent ne soient jamais supprimé du dossier /System/Library/Fonts . En effet il les restaure aussi vite qu’on essai de les supprimer. Ayant rencontré plusieurs Mac inutilisable après l’effacement de polices du système avant la version 10.5, je suis très content qu’une telle sécurité empêche les graphistes de faire du ménage eux-même.

Malheureusement, il vaudra tout de même qu’une police Helvetica et Helvetica Neue soit toujours disponible (grâce au gestionnaire de police utilisé), sinon le fonctionnement du système n’est pas assuré

Mac OS X : comment ajouter manuellement une imprimante Windows partagée

Ajouter une imprimante Windows sur Mac est très simple quand on peut parcourir les workgroup. Mais lorsque le listage ne fonctionne pas pour quelque raison que ce soit… on est bien embêtée !

Il existe en fait un bouton “Options avancée…” que l’on peut ajouter dans la barre de menu qui permet d’accomplir un ajout manuel. Tout est très bien expliqué sur le site du support d’apple

Mac OS X v10.5 ou ultérieur

  1. Choisissez Préférences Système à partir du menu Apple.
  2. Choisissez Imprimante & Fax à partir du menu Présentation.
  3. Cliquez sur le bouton + pour ajouter une imprimante.
  4. Appuyez sur la touche Contrôle tout en cliquant sur l’icône « Par défaut » (ou toute autre icône de la barre d’outils), puis choisissez Personnaliser la barre d’outils à partir du menu contextuel qui apparaît.
  5. Faites glisser l’icône Options avancées (l’engrenage) dans la barre d’outils.
  6. Cliquez sur Terminé.
  7. Cliquez sur l’icône Options avancées, ajoutée à la barre d’outils.
  8. Choisissez Windows dans le menu contextuel Type.
  9. Dans le champ URL, saisissez l’adresse de l’imprimante suivant l’un des formats ci-dessous :smb://groupe_de_travail/serveur/nom_de_partage
    smb://serveur/nom_de_partage/

printer

printer2

Déplacer Bibliothèque iTunes

Dans les préférences d’iTunes on peut changer l’emplacement où sont stockés les “medias”. Mais finalement ça ne déplace pas l’emplacement où sont stockées les applications ou les sauvegardes de l’iphone.

Si comme nous votre dossier “Mes documents” est limité en espace, cela pose un gros soucis.

L’astruce trouvée ici consiste à :

  • D’abord, fermez iTunes.
  • Ensuite faites votre plus beau couper / coller du dossier iTunes (celui de la bibliothèque pas le programme hein ) vers l’emplacement de votre choix, pour moi une autre partition.
  • Lancer iTunes depuis l’exécutable tout en maintenant SHIFT gauche enfoncé.

Chez nous c’est le dossier Mes Documents\Musique\itunes  au complet que nous avons déplacé vers c:\itunes puis dans les préférences d’itunes nous avons indiqués que les “Médias” doivent être stockés dans c:\itunes\itunes media

Contacts Gmail sur votre carnet d'adresse Mac

Quand on a un iphone/ipod touch ou qu’on a appliqué l’astuce pour activer la synchro gmail on peut utiliser la fonctionnalité de synchronisation des contacts avec GMail.

Malheureusement elle ne se synchronise qu’à chaque synchro itunes. Autant dire jamais si vous n’avez pas d’iPhone ou iPod. Il existe tout de même une commande pour la lancer manuellement à partir du terminal :

/System/Library/PrivateFrameworks/GoogleContactSync.framework/Versions/A/Resources/gconsync –sync com.google.ContactSync –syncmode pullthetruth

Avec cette commande, GMail aura toujours la priorité sur les infos du carnet d’adresse. Cela vous évitera de faire la grave erreur que j’ai faite, j’ai lancé la commande inverse, celle qui remplace le contenu des contacts gmail par votre carnet d’adresse (qui était vide dans mon cas).

/System/Library/PrivateFrameworks/GoogleContactSync.framework/Versions/A/Resources/gconsync –sync com.google.ContactSync –syncmode fast

Il ne reste plus qu’à programmer votre Mac pour lancer automatiquement cette commande toutes les heures, mais avec le mode “refresh”, afin d’avoir une vrai synchro :

crontab -e

et dedans; afin d’excuter à toutes les heures piles notre commande, on y met :

0 * * * * /System/Library/PrivateFrameworks/GoogleContactSync.framework/Versions/A/Resources/gconsync --sync com.google.ContactSync --syncmode refresh --username login@gmail.com --password votre_mot_de_passe

Malheureusement j’ai du inclure le username et le password en claire parce que le crontab ne savait pas le récupérer dans le trousseau :

“2009-06-22 15:00:00.442 gconsync[852:613] failed to retrieve from keychain”

Convertir tous les noms au format Windows

Copier un dossier entier de mac vers pc devient vite un calvaire, en effet la copie est interrompue toutes les secondes pour prévenir qu’un nom de fichier est trop long.

En réalité le problème n’est pas la longueur mais des caractères spéciaux qui sont refusé par windows comme ? * / \ :…. etc

Voici une solution parmi d’autres pour renommer d’un coup tout le contenu d’un dossier. Je l’avais trouvé il y a 2 ans à cette adresse. En tout cas cela fonctionne parfaitement :

Créer un fichier mac2win.pl dont le contenu est :

#!/usr/bin/perl -w

# This script renames all the files supplied as command-line args
# where necessary so that the filename is acceptable to MS Windows
# Cameron Hayne (macdev@hayne.net), June 2004

use strict;

chomp(@ARGV = <STDIN>) unless @ARGV;

# The Microsoft document at
# http://support.microsoft.com/default…b;EN-US;100108
# says that the following characters are not allowed in filenames
# in each of the specified filesystems:
# FAT:   .  ”  /  \  [  ]  |  :  ;  ,  =
# NTFS:  ?  ”  /  \  <  >  |  :  *

# We don’t do anything with the dot (.) since it clearly is allowable
# in spite of what that document says.
# And we don’t do anything with the slash (/) since that character
# will not occur in OS X filenames and modifying it would cause
# troubles when a file path (with directories) is specified.
# The changing of the filenames is done via the ‘tr’ statements below.
# Each occurence of a character in the first curly brackets
# is replaced by the character in the second curly brackets.

foreach my $filename (@ARGV)
{
my $orig_filename = $filename;

$filename =~ tr{\\}{-};
$filename =~ tr{*?}{X};
$filename =~ tr{“><[]|:;,=}{_};

unless ($filename eq $orig_filename)
{
print “About to rename $orig_filename to $filename\n”;
if (-e $filename)
{
print “Oops, there already exists a file named $filename\n”;
print “Skipping the rename – you will have to do it manually\n”;
}
else
{
rename($orig_filename, $filename);
}
}
}

Puis en ligne de commande (dans le terminal donc) :

find /monrep | /rep/mac2pc.pl


Et voila, tous les fichiers sont renommés !

Malheureusement ce script ne remplace pas les / , il ne reste que cela à corriger. Et malheureusement il est très utilisé par les dates.

Nettoyer les fichiers mac cachés sur un partage Windows

La copie et le déplacement de dossiers sur nos serveurs Windows sont un vrai cauchemard à cause des nombreux fichiers caché de mac. Ceci commencent par un point (les dot files).

Je me connecte alors avec mon mac à un lecteur partagé sous windows. Et je lance la commande suivante pour me débarrasser de tous d’un coup :

find /Volume/nom-partage -name “.*” -delete

C’est radicale. Mais aucun fichier commençant par un point n’est nécessaire. On peut imaginer que parfois un .htaccess était important, mais pas dans les cas qui me concernent. On peut toujours faire une recherche avant :

find /Volume/nom-partage -name “.htaccess”

Filevault et Time Machine

Lorsque j’ai perdu un fichier et que je n’ai pas pu le retrouver avec time machine j’ai constaté que la méthode où l’on explore le finder en remontant le temps ne fonctionne pas pour les dossiers cryptés par filevault.

Grace à cette page web, j’ai appris que pour les dossiers cryptés des utilisateurs, il n’était pas possible d’utiliser le mode graphique, il faut passer par le dossier réseau Backups.backupdb qui est automatiquement monté par time machine. Et là on voit un dossier avec le nom de notre machine et à l’intérieur toutes les dates de sauvegarde. C’est très facile à explorer.

Ouf j’ai vraiment cru pendant un instant que toutes ces heures de sauvegarde de timemachine n’avait servi qu’aux parties non cryptées….

Installer Apache, MySQL et PHP sur Mac OS 10.5 avec MacPorts

image-3

On me demande souvent comment installer Apache/Mysql/Php sur Mac. Il faut avouer que les versions déjà présentes dans Mac OS X sont dépassées.

Ce blog nous décrit précisement une solution bien efficace avec MacPorts : Installer Apache, MySQL et PHP sur Mac OS 10.5 avec MacPorts

Il y fait allusion rapidement à MAMP, mais ce logiciel ne nous avait pas convaincu car il oblige à laisser tourner un logiciel et nous n’avions pas pu ajouter les modules que nous souhaitions. MacPorts fonctionnera  plutôt comme un daemon.

MAMP conviendra à quelqu’un qui code “tous les 36 du mois” certainement.

Voici un copier/coller pour le cas où la page ne serait plus joignable :

J’en ai déjà parlé, la version de PHP fournie avec Mac OS X Leopard est assez… épurée : pas de GD ou de PEAR par exemple et la compilation d’extensions ne marchent pas (cf. mon billet sur Runkit). Pour une utilisation (très?) basique de PHP cela suffira mais si vous voulez, par exemple, manipuler des images il faudra utiliser une autre solution…

Parmi les autres solutions possibles, j’ai choisi d’utiliser MacPorts et de compiler “moi-même” PHP. Certains auraient peut-être choisi MAMP qui est une solution plus simple et plus “rapide” mais peut-on compiler des extensions avec ? A priori oui mais je n’en suis pas sûr. L’objectif est aussi de pouvoir installer d’autres packages que le trio Apache-MySQL-PHP et de mettre à jour ces packages très simplement (une ligne de commande).

Pour ceux que cela intéresse, voici la procédure pour installer et configurer Apache-MySQL-PHP avec MacPorts sur Leopard. A noter que je suppose que vous avez déjà installé les “Developper Tools” d’Apple.

Installation de MacPorts

  1. Téléchargez MacPorts sur le site officiel : http://www.macports.org/
  2. Ouvrez l’image disque (.dmg)
  3. Lancez le .pkg et suivez les instructions.
  4. Une fois l’installation terminée, allez dans le terminal et lancez la commande :
    sudo port selfupdate

Installation d’Apache 2.2

  1. Installez Apache 2.2 en exécutant la commande qui suit dans le terminal :
    sudo port install apache2
  2. Une fois l’installation terminée, lancez Apache :
    sudo /opt/local/apache2/bin/apachectl start
  3. Si vous allez à l’adresse http://localhost vous devriez voir “It works!” à l’écran.
  4. Si vous souhaitez qu’Apache soit lancé au démarrage de votre ordinateur, lancez la commande ci-dessous :
    sudo launchctl load -w /Library/LaunchDaemons/org.macports.apache2.plist

Configuration d’Apache 2

Maintenant qu’Apache 2 est installé, nous allons le configurer pour qu’il fonctionne comme la version d’Apache fournie avec Mac OS X Leopard.

  1. Ouvrez le fichier /opt/local/apache2/conf/httpd.conf avec votre éditeur préféré.
  2. Recherchez la ligne
    #Include conf/extra/httpd-userdir.conf

    et enlevez le caractère # au début.

  3. Editez le fichier /opt/local/apache2/conf/extra/httpd-userdir.conf et ajoutez à la fin les lignes ci-dessous :
    #
    # Include user configurations
    #
    Include /etc/apache2/users/*.conf
  4. Si vous souhaitez accéder au manuel d’Apache à l’adresse http://localhost/manual/ :
    1. Editez le fichier /opt/local/apache2/conf/httpd.conf
    2. Recherchez la ligne ci-dessous et enlevez le # au début.
      #Include conf/extra/httpd-manual.conf
  5. Si vous souhaitez afficher la liste des éléments d’un dossier lorsqu’il n’y a pas de fichier index dedans :
    1. Editez le fichier /opt/local/apache2/conf/httpd.conf
    2. Recherchez la ligne la ligne ci-dessous et enlevez le # au début.
      #Include conf/extra/httpd-autoindex.conf
  6. Relancez Apache :
    /opt/local/apache2/bin/apachectl restart

Installation et configuration de Mysql 5

  1. Dans le terminal, lancez la commande suivante :
    sudo port install mysql5 +server
  2. Une fois l’installation terminée, exécutez la commande :
    sudo -u mysql mysql_install_db5
  3. Démarrez le serveur MySQL :
    sudo /opt/local/bin/mysqld_safe5 &
  4. Sécurisez votre installation de MySQL :
    sudo /opt/local/bin/mysql_secure_installation5
  5. Si vous voulez que MySQL soit automatiquement lancé au démarrage, lancez la commande suivante :
    sudo launchctl load -w /Library/LaunchDaemons/org.macports.mysql5.plist

Installation de PHP 5

  1. Lancez l’installation de php5 :
    sudo port install php5 +apache2 +mysql5 +sqlite +pear
  2. Une fois l’installation terminée, créez un fichier de configuration pour php (le php.ini) :
    sudo cp /opt/local/etc/php.ini-dist /opt/local/etc/php.ini
  3. Installez le module php pour Apache :
    cd /opt/local/apache2/modules
    sudo /opt/local/apache2/bin/apxs -a -e -n "php5" libphp5.so
  4. Editez le fichier /opt/local/apache2/conf/httpd.conf, recherchez
    DirectoryIndex index.html

    et remplacez par

    DirectoryIndex index.html index.php
  5. Editez le fichier /opt/local/apache2/conf/httpd.conf et ajoutez à la fin les lignes suivantes :
    # Load the PHP module
    LoadModule php5_module modules/libphp5.so
    
    #
    # Include PHP configurations
    #
    Include conf/extras-conf/mod_php.conf
  6. Relancez Apache : /opt/local/apache2/bin/apachectl -k restart
  7. Vous pouvez maintenant créer dans votre dossier Sites (/Users/votrePseudo/Sites/) un fichier phpinfo.php

Voilà, votre environnement de développement AMP est installé et prêt à acceuillir vos scripts et applications ! Pour aller un peu plus loin, vous pouvez installer phpmyadmin et xdebug, avec MacPorts bien sûr.

Concernant MacPorts, je l’utilise depuis maintenant plusieurs mois et j’en suis très content. J’ai pu installer tous les packages dont j’avais besoin très simplement et sans problème. Je regrette juste de ne pas l’avoir découvert plus tôt…

profile par défaut sur Mac

Sur Mac OS X (dans mon cas Leopard) il est possible de créer un profil par défaut.

Cela signifie que tout nouvel utilisateur (ou l’utilisateur Invité, qui perd toute préférence à chaque nouveau lancement) se retrouvera avec ces préférences lors du premier lancement.

On peut imaginer :

  • un doc et un fond d’écran personalisé
  • les pages d’accueil des navigateurs changées
  • toutes les préférences systèmes déjà configurées
  • les serveurs accessible par Pomme+K déjà rempli
  • Les programmes qui posent des questions aux premiers lancement n’en poseront plus (Toast par exemple)

Pour cela j’ai trouvé ce lien très pratique que j’ai interprété un peu différemment : http://www.michaelsmac.com/modules.php?name=News&file=article&sid=394

  1. Créez un nouveau utilisateur TEMP et personnalisez tout comme vous souhaiteriez que ça le soit pour tous les nouveaux (Doc, préférences systèmes, fond d’écran, pages d’accueil des navigateurs, etc etc)
  2. Lancer le terminal et passez en mode administrateur (login à remplacer par un login administrateur) :
    Guest$ su login
    Password: XXXXXX
    bash-3.2$ sudo -s
    Password: XXXXXXX
  3. Sauvegardez le dossier que nous allons modifier pour le cas où :
    $ cd /System/Library
    $ tar cfz UserTemplateBackup.tar.gz “User Template”
  4. Copiez le fichier .DS_Store du user que vous venez de personnaliser (nous l’avons appelé temp)
    $ cd /Users/temp
    $ cp .DS_Store “/System/Library/User Template/French.lproj/.DS_Store”
  5. Copiez le dossier Library de ce même user
    $ rm -R “/System/Library/User Template/French.lproj/Library”
    $ cp -R Library/ “/System/Library/User Template/French.lproj/Library”

Normalement tout nouvel utilisateur et l’utilisateur Invité auront vos personalisations…

Un soucis ? vous pouvez tout restaurer :

Guest$ su login
Password: XXXXXX
bash-3.2$ sudo -s
Password: XXXXXXX
$ cd /System/Library/
$ rm -Rf “User Template”/
$ tar xfz UserTemplateBackup.tar.gz