On a dit beaucoup de bien (à raison) d'iChat, la nouvelle application de communication directe (ou chat, à prononcer "tchat" si on ne veut pas avoir l'air ridicule dans les conversations mondaines avec Begbeider) intégrée à Mac OS X 10.2. Et pour une fois, je vais en dire (un peu) de mal. En effet, cette application se montre parfois récalcitrante et montre un peu de mésentente avec d'autres fonctions de Mac OS X. En cherchant une solution à certains de ces problèmes, je suis tombé sur plusieurs fonctions très intéressantes de Mac OS X 10.2, dont la création de scripts de shell, une nouvelle commande absolument indispensable (killall) et un addendum pour les menus système fort utile.
Mais voyez plutôt ©Jack Skelington
L'application iChat du dossier Applications est en réalité une interface graphique pour un processus tournant en tâche de fond et appelé iChatAgent. Tiens, tentez donc la commande suivante dans le Terminal pour le constater :
[localhost:~] guillaum% ps auxcww | grep iChat | grep -v grep
Le résultat ne se fait pas attendre :
guillaum 1048 0.0 0.5 25128 2148 ?? Ss 12:07PM 0:00.54 iChatAgent
guillaum 1053 0.0 4.3 569524 16992 ?? S 12:16PM 0:02.23 iChat
Pour décoder, il y a un processus appelé iChatAgent (numéro de process 1048) qui tourne en plus de l'application iChat (numéro de process 1053). Les deux processus ont été lancés par l'utilisateur guillaum et ne contiennent pas de ligne de commande autre.
Vérifiez donc aussi dans Visualiseur d'Applications :

Pourquoi la présence de cet iChatAgent ? Facile : il est utilisé pour donner votre status (disponible, non disponible, en train de vous récurer le nez ) et intercepter les requêtes lorque l'application iChat n'est pas lancée. Donc, la partie "réseau" est gérée par iChatAgent. Mais que se passe-t-il alors
Ça m'est déjà arrivé quelques fois : je sors mon PowerBook de veille, et je ne suis plus visible sur le réseau, alors que les autres me voient. Ou alors, j'essaie de me connecter au réseau AIM, et l'accès m'est refusé sans raison. Bref, y'a un gros schmurtz, ça coince quelque part. Tout cela est fort bizarre Quitter iChat et le relancer ne suffit pas.

Au bout de quelques secondes de recherche, je dégaine donc le Terminal et lance la commande présentée quelques lignes plus haut, et découvre ce fameux iChatAgent. Diantre Je tue donc le process d'un seul coup.
[yoshis-island:~] guillaum% kill -9 1048
Le résultat ne se fait pas attendre :

Eh ben dites donc, c'est ce qui s'appelle se faire éjecter en beauté ! Mais bon, je relance iChat (l'application), et hop, tout le monde réapparait, chic.

Le problème est que ce problème risque de se répéter. Et d'ailleurs, il s'est répété plus d'une fois chez moi. Comment faire donc pour relancer iChat rapidement ?
C'est là que je me suis intéressé à un élément déjà présent dans Mac OS X 10.1 mais passé un peu inaperçu : le menu Script, appelé également Script.Menu.
Si vous ouvrez le dossier Applications, vous trouverez un dossier AppleScript, qui contient lui-même un dossier Script Menu.menu.

Saisissez donc ce dernier, et glissez-le à l'emplacement des menus Système, donc tout à fait en haut à droite de l'écran (à côté de l'horloge, par exemple). Miracle, les icônes font de la place au dossier, et lorsque vous relâchez la souris à l'endroit souhaité, un menu marqué de l'icône d'AppleScript fait son apparition.

Comme vous le constatez, dès installation, ce menu s'avère particulièrement fourni. Il reflète juste le contenu du dossier Scripts à l'intérieur du dossier Bibliothèque (Library en VO) situé à la racine du disque, et ce que vous voyez affiché, ce sont simplement les scripts d'exemple fournis avec Mac OS X (certains sont particulièrement impressionnants, testez par exemple Font Sampler via l'article Info Scripts. Mais il peut également afficher également vos propres scripts ! Cliquez simplement sur l'article Open Scripts Folder, et un nouveau dossier s'affiche.

Il est situé dans le dossier Bibliothèque de votre dossier de départ. Donc, ce menu Script peut afficher le contenu de ces deux dossiers. Sympa, ça, hein ?©Alexandra.
Maintenant, là où ça devient chaud, c'est pour savoir ce qu'on peut mettre dans ce menu Là, je me suis dit "Steve1, il faudrait en fait que tu puisse lancer un AppleScript qui tuerait le processus iChatAgent". Mais il y a un "hic" : iChatAgent n'est pas une application "Mac OS", si j'ose dire. C'est une sorte de "daemon" à la UNIX, c'est à dire, une application tournant en tâche de fond, sans interface sur laquelle on peut agir Et complètement insensible aux AppleEvents envoyés par AppleScript ! Impossible de la quitter via AppleScript, donc.
La solution était donc de tenter de lancer un script AppleScript, qui lui-même lancerait des commandes UNIX au Terminal. Mais je me heurte alors à un deuxième problème : la commande UNIX utilisée pour tuer le processus iChatAgent s'appelle kill. Elle est très efficace, mais possède aussi un gros défaut. Pour l'exploiter, on doit connaitre le PID (numéro de processus) attribué à iChatAgent. Or, ce numéro change à chaque fois que l'agent est relancé ! Dans ce cas, impossible d'utiliser kill Mais coup de bol, Mac OS X 10.2 inclut une nouvelle commande appellée killall. Et avec elle, on peut utiliser un nom de processus plutôt qu'un PID ! Gnark gnark
Voici donc les lignes de commande tapées dans l'Editeur de script :
tell application "Terminal"
do script with command "killall iChat"
do script with command "killall iChatAgent"
do script with command "open /Applications/iChat.app"
delay 10
close every window
end tell
On enregistre sous forme de script compilé dans le dossier Scripts, on lance le script via le menu Scripts et ça fonctionne, ouf.
Mais mais mais ! Il y a un mais (et même trois, ou quatre, c'est selon) : ça oblige à ouvrir 3 fenêtres de shell, ça oblige à fermer toutes les fenêtres même si y'en a d'autres (à la limite, c'est facilement contournable, mais bon ), et ça oblige à lancer le Terminal.
C'est alors que mes copains Laurent et Jean-Philippe m'ont appris un truc sensas : le menu Scripts peut exécuter des scripts de shell.
Lorsque vous démarrez votre Mac, de nombreux scripts sont lancés, par exemple pour activer certaines fonctionnalités comme le firewall intégré. Ces scripts sont lancés directement par la partie UNIX sans interface graphique, et sont nommés scripts de shell (shell scripts). En activant un script de shell, vous pouvez lancer des commandes UNIX très simplement et sans passer par le Terminal.
Allons-y pour la création de votre premier script en shell :

#!/bin/sh
/usr/bin/killall iChat
/usr/bin/killall iChatAgent
open /Applications/iChat.app
Voila, rien de plus.

[yoshis-island:~] guillaum% cd Library/Scripts/
Tapez ls pour regarder le contenu du dossier
[yoshis-island:~/Library/Scripts] guillaum% ls -l
Résultat :
-rw-r--r-- 1 guillaum staff 91 Sep 2 12:07 Relancer_iChat.txt
Et maintenant, on modifie les droits d'accès du fichier avec la commande adaptée, qui est qui est Alors ? Vous savez pas ? Biiiiiiiip, mauvaise réponse, tout est expliqué dans ce magnifique dossier, revenez quand vous aurez fini !
Si vous avez fini ou si vous avez déjà lu le dossier sur les droits d'accès (sage décision), vous savez donc que la commande à utiliser s'appelle chmod et qu'on aurait pu utiliser Batchmod ou un autre logiciel. Mais là, non. On le fait à la dure ;-)
Donc, on ajoute les droits d'exécution pour tous :
[yoshis-island:~/Library/Scripts] guillaum% chmod a+x Relancer_iChat.txt
Résultat :
-rwxr-xr-x 1 guillaum staff 91 Sep 2 12:07 Relancer_iChat.txt
Et voilà le travail ! Il ne reste plus qu'à contempler émerveillé votre iChat entièrement quitter pour être relancé dans la foulée, complètement fonctionnel, via un simple clic dans le menu Scripts.

Avec Jean-Philippe, nous nous sommes rendus compte après plusieurs essais que la fonction de coupe-feu intégrée à Mac OS X 10.2 ne fait pas très bon ménage avec iChat. Le coupe-feu (firewall en français) est ce logiciel sensé bloquer toute communication entrante de l'extérieur vers votre machine lorsque vous êtes connecté à Internet. En clair : il verrouille tous les signals entrants nocifs et ne laisse passer que ce que vous voulez bien. Je passe sur les détails techniques, j'ai la flemme (vous pourrez pas me reprocher d'être honnête :-) ).
Symptômes :
Les réglages du coupe-feu (disponibles dans les Préférences Système -> Partage) autorisent l'ajout d'un port pour laisser circuler les informations pour AIM.

Après de plus amples recherches, on s'est rendu compte avec Jean-Philippe que les ports utilisés lors du transfert de fichiers via AIM étaient tirés aléatoirement. Nous avons alors pu trouver que ces ports étaient variables, et compris entre 48000 et 52000 environ. La solution consiste donc à ouvrir certains ports sur la machine vers laquelle on envoie les fichiers. Les manipulations suivantes doivent donc être faites sur la machine qui reçoit les fichiers, pas forcément sur l'envoyeur !
Donc, si vous avez des soucis lors du transfert de fichiers mais que vous souhaitez quand même conserver le firewall actif pour des ports sensibles, allez dans les réglages du coupe-feu, cliquez sur le bouton Nouveau, puis dans le menu local, choisissez Autre. Donnez accès aux ports 48000 à 53000 en spécifiant l'intervalle 48000-53000, et en donnant comme Description ce que vous souhaitez.

Voila ! Activez votre Firewall si ce n'est déjà fait, et recevez des fichiers via iChat sans sourciller !
Mes remerciements à Laurent Pertois, Jean-Philippe Gramond et Nicolas Seriot pour leur aide sur ce dossier.
1. Oui, je l'avoue, parfois, il m'arrive de me surnommer Steve, en l'honneur de Steve Ballmer, le sympathique et bondissant PDG de Microsoft.