<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Thibaut Jarosz</title>
	<atom:link href="http://www.thibaut-jarosz.com/feed" rel="self" type="application/rss+xml" />
	<link>http://www.thibaut-jarosz.com</link>
	<description>Expert en technologies Apple</description>
	<lastBuildDate>Fri, 04 May 2012 15:31:26 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Good news everyone!</title>
		<link>http://www.thibaut-jarosz.com/archives/219</link>
		<comments>http://www.thibaut-jarosz.com/archives/219#comments</comments>
		<pubDate>Fri, 04 May 2012 15:31:26 +0000</pubDate>
		<dc:creator>Thibaut Jarosz</dc:creator>
				<category><![CDATA[Divers]]></category>

		<guid isPermaLink="false">http://www.thibaut-jarosz.com/?p=219</guid>
		<description><![CDATA[Et en même temps &#171;&#160;Bad news everyone!&#160;&#187; car c&#8217;est la fin de ce site. Bon, il n&#8217;y avait aucune activité ]]></description>
			<content:encoded><![CDATA[<p>Et en même temps &laquo;&nbsp;Bad news everyone!&nbsp;&raquo; car c&#8217;est la fin de ce site.<br />
Bon, il n&#8217;y avait aucune activité en même temps…</p>
<p>D&#8217;ici deux mois, ce sera entièrement terminé.</p>
<p>Je travaille actuellement à rendre mon outil de verrouillage de session compatible en 64 bits et Mountain Lion. Il ne sortira pas ici mais sur le blog d&#8217;Octiplex : http://blog.octiplex.com/</p>
<p>Je vais très certainement me remettre à rédiger des articles, mais ce sera sur le lien ci dessus.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thibaut-jarosz.com/archives/219/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Changement à venir…</title>
		<link>http://www.thibaut-jarosz.com/archives/209</link>
		<comments>http://www.thibaut-jarosz.com/archives/209#comments</comments>
		<pubDate>Sun, 21 Nov 2010 21:51:08 +0000</pubDate>
		<dc:creator>Thibaut Jarosz</dc:creator>
				<category><![CDATA[Divers]]></category>

		<guid isPermaLink="false">http://www.thibaut-jarosz.com/?p=209</guid>
		<description><![CDATA[Ce site est un peu à l&#8217;abandon depuis un an mais celui ci change ! J&#8217;introduis aujourd&#8217;hui un changement du ]]></description>
			<content:encoded><![CDATA[<p>Ce site est un peu à l&#8217;abandon depuis un an mais celui ci change !<br />
<span id="more-209"></span><br />
J&#8217;introduis aujourd&#8217;hui un changement du site. Changement d&#8217;apparence, mais également de contenu.<br />
A la base, je voulais un site orienté pro, mais j&#8217;abandonne cette idée. Il y aura maintenant un peu tout et n&#8217;importe quoi. Je vais continuer à parler Mac OS X et développement Mac/iOS (j&#8217;ai beaucoup à dire sur ce dernier point qui occupe mes journées depuis un an). Mais je pourrais également parler de d&#8217;autres choses.<br />
Désormais il n&#8217;y aura plus une partie blog et une partie site internet. Tout est de nouveau réuni. blog.thibaut-jarosz.com va donc disparaitre, pensez encore une fois à mettre à jours vos RSS.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thibaut-jarosz.com/archives/209/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iNig-Services » Du bon usage de votre clavier, maitriser les caractères du Mac</title>
		<link>http://www.thibaut-jarosz.com/archives/205</link>
		<comments>http://www.thibaut-jarosz.com/archives/205#comments</comments>
		<pubDate>Sun, 17 Jan 2010 15:13:15 +0000</pubDate>
		<dc:creator>Thibaut Jarosz</dc:creator>
				<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[Système]]></category>
		<category><![CDATA[clavier virtuel]]></category>

		<guid isPermaLink="false">http://blog.thibaut-jarosz.com/?p=205</guid>
		<description><![CDATA[Je voulais le faire depuis plusieurs mois, merci Yoann de l'avoir fait !

<a href="http://blog.inig-services.com/archives/224">iNig-Services » Du bon usage de votre clavier, maitriser les caractères du Mac</a]]></description>
			<content:encoded><![CDATA[<p>Je voulais le faire depuis plusieurs mois, merci Yoann de l&#8217;avoir fait !</p>
<p><a href="http://blog.inig-services.com/archives/224">iNig-Services » Du bon usage de votre clavier, maitriser les caractères du Mac</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thibaut-jarosz.com/archives/205/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Photos de concert de Dionysos</title>
		<link>http://www.thibaut-jarosz.com/archives/200</link>
		<comments>http://www.thibaut-jarosz.com/archives/200#comments</comments>
		<pubDate>Thu, 24 Dec 2009 18:50:24 +0000</pubDate>
		<dc:creator>Thibaut Jarosz</dc:creator>
				<category><![CDATA[Divers]]></category>
		<category><![CDATA[Photos]]></category>

		<guid isPermaLink="false">http://blog.thibaut-jarosz.com/?p=200</guid>
		<description><![CDATA[Un petit cadeau de Noël vous attend dans la rubrique Photos du site !]]></description>
			<content:encoded><![CDATA[<p>Un petit cadeau de Noël vous attend dans la rubrique Photos du site !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thibaut-jarosz.com/archives/200/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Réouvrir la fenêtre principale d&#8217;une application en cliquant dans le Dock</title>
		<link>http://www.thibaut-jarosz.com/archives/175</link>
		<comments>http://www.thibaut-jarosz.com/archives/175#comments</comments>
		<pubDate>Thu, 03 Dec 2009 19:30:19 +0000</pubDate>
		<dc:creator>Thibaut Jarosz</dc:creator>
				<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[Développement]]></category>
		<category><![CDATA[Dock]]></category>
		<category><![CDATA[NSApplication]]></category>
		<category><![CDATA[NSWindow]]></category>

		<guid isPermaLink="false">http://blog.thibaut-jarosz.com/?p=175</guid>
		<description><![CDATA[Lorsque vous développez une application contenant une seule fenêtre principale, lorsque vous fermez celle ci, vous pouvez soit terminer directement l'application, soit laisser l'application tourner et réouvrir la fenêtre en cliquant sur l'icône du Dock. Nous allons ici nous intéresser à ce second cas]]></description>
			<content:encoded><![CDATA[<p>Lorsque vous développez une application contenant une seule fenêtre principale, quand vous fermez celle ci, vous pouvez soit terminer directement l&#8217;application, soit laisser l&#8217;application tourner et réouvrir la fenêtre en cliquant sur l&#8217;icône du Dock. Nous allons ici nous intéresser à ce second cas.<br />
<span id="more-175"></span><br />
Afin de pouvoir réafficher la fenêtre, il faut déjà s&#8217;assurer que celle ci ne soit pas désallouée de la mémoire. Considérons qu&#8217;il existe un outlet &laquo;&nbsp;window&nbsp;&raquo; désignant la fenêtre principale de l&#8217;application. Lors du chargement de l&#8217;interface, nous allons dire à la fenêtre de ne pas effectuer de release sur elle même lorsqu&#8217;elle se ferme. Ainsi, tout son contenu sera sauvegarder.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>awakeFromNib <span style="color: #002200;">&#123;</span>
	<span style="color: #002200;">&#91;</span>self.window setReleasedWhenClosed<span style="color: #002200;">:</span><span style="color: #a61390;">NO</span><span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

<p>L&#8217;étape suivante est de savoir lorsque l&#8217;on clique sur l&#8217;icône du Dock. Dans le delegate de NSApplication, la méthode &laquo;&nbsp;applicationShouldHandleReopen:hasVisibleWindows:&nbsp;&raquo; est appelée lorsque l&#8217;on ouvre l&#8217;application même si elle est déjà ouverte ou lorsque l&#8217;on clique sur l&#8217;icône du Dock. Il faut donc s&#8217;assurer que notre contrôleur soit bien le delegate de l&#8217;application avant de réimplémenter cette méthode. Dans cette réimplémentation, il suffit de dire à la fenêtre de se réafficher :</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">BOOL</span><span style="color: #002200;">&#41;</span>applicationShouldHandleReopen<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSApplication</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>theApplication hasVisibleWindows<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">BOOL</span><span style="color: #002200;">&#41;</span>flag <span style="color: #002200;">&#123;</span>
	<span style="color: #002200;">&#91;</span>self.window makeKeyAndOrderFront<span style="color: #002200;">:</span>self<span style="color: #002200;">&#93;</span>;
	<span style="color: #a61390;">return</span> <span style="color: #a61390;">YES</span>; <span style="color: #11740a; font-style: italic;">// Valeur retournée par défaut</span>
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

<p>Vous pouvez retrouver un code plus complet dans cet exemple d&#8217;application : <a href='/wp-content/uploads/2009/12/ReopenWindow.zip'>ReopenWindow</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.thibaut-jarosz.com/archives/175/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Changement d&#8217;adresse du blog</title>
		<link>http://www.thibaut-jarosz.com/archives/173</link>
		<comments>http://www.thibaut-jarosz.com/archives/173#comments</comments>
		<pubDate>Fri, 13 Nov 2009 22:13:43 +0000</pubDate>
		<dc:creator>Thibaut Jarosz</dc:creator>
				<category><![CDATA[Divers]]></category>

		<guid isPermaLink="false">http://blog.thibaut-jarosz.com/?p=173</guid>
		<description><![CDATA[Attention, il y a du changement dans les noms de domaines. Le blog change d'adresse : <a href="http://blog.thibaut-jarosz.com/">http://blog.thibaut-jarosz.com/</a>. D'ici quelques jours, il y aura du nouveau sur l'ancienne adresse. Pensez à mettre à jours vos flux RSS avant que la redirection ne soit supprimée]]></description>
			<content:encoded><![CDATA[<p>Attention, il y a du changement dans les noms de domaines. Le blog change d&#8217;adresse : <a href="http://blog.thibaut-jarosz.com/">http://blog.thibaut-jarosz.com/</a>. D&#8217;ici quelques jours, il y aura du nouveau sur l&#8217;ancienne adresse. Pensez à mettre à jours vos flux RSS avant que la redirection ne soit supprimée.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thibaut-jarosz.com/archives/173/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>LockSession version 2</title>
		<link>http://www.thibaut-jarosz.com/archives/124</link>
		<comments>http://www.thibaut-jarosz.com/archives/124#comments</comments>
		<pubDate>Mon, 09 Nov 2009 03:46:07 +0000</pubDate>
		<dc:creator>Thibaut Jarosz</dc:creator>
				<category><![CDATA[Divers]]></category>
		<category><![CDATA[LockSession]]></category>

		<guid isPermaLink="false">http://www.thibaut-jarosz.com/?p=124</guid>
		<description><![CDATA[Je viens d'achever la version 2 de l'application LockSession. Rien de nouveau au niveau de l'interface, en revanche le moteur a complètement été revu et optimisé]]></description>
			<content:encoded><![CDATA[<p>Je viens d&#8217;achever la version 2 de l&#8217;application LockSession. Rien de nouveau au niveau de l&#8217;interface, en revanche le moteur a complètement été revu et optimisé.<br />
<span id="more-124"></span><br />
Pour ceux qui ne sont jamais allé dans la rubrique Applications, LockSession est un panneau de préférence système permettant de définir un raccourci clavier pour verrouiller la session.</p>
<p>Pour télécharger LockSession, rendez-vous sur la page <a href="/applications">Applications</a>.</p>
<p>Faites une blague à vos collègues : installez l&#8217;application sur leur machine et définissez cmd+s comme raccourci. À chaque fois qu&#8217;ils voudront enregistrer un fichier leur session se verrouillera… </p>
]]></content:encoded>
			<wfw:commentRss>http://www.thibaut-jarosz.com/archives/124/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Le firmware des Macs</title>
		<link>http://www.thibaut-jarosz.com/archives/102</link>
		<comments>http://www.thibaut-jarosz.com/archives/102#comments</comments>
		<pubDate>Tue, 28 Jul 2009 22:38:58 +0000</pubDate>
		<dc:creator>Thibaut Jarosz</dc:creator>
				<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[Système]]></category>
		<category><![CDATA[bios]]></category>
		<category><![CDATA[efi]]></category>
		<category><![CDATA[firmware]]></category>
		<category><![CDATA[mot de passe]]></category>
		<category><![CDATA[open firmware]]></category>
		<category><![CDATA[password]]></category>

		<guid isPermaLink="false">http://www.thibaut-jarosz.com/?p=102</guid>
		<description><![CDATA[Ces derniers temps, on pouvait voir beaucoup d'articles sur internet parlant du firmware présent dans les Macs. Certains parlaient même d'un problème de sécurité. Qu'en est-il réellement ]]></description>
			<content:encoded><![CDATA[<p>Ces derniers temps, on pouvait voir beaucoup d&#8217;articles sur internet parlant du firmware présent dans les Macs. Certains parlaient même d&#8217;un problème de sécurité. Qu&#8217;en est-il réellement ?<br />
<span id="more-102"></span></p>
<h3>Qu&#8217;est-ce que le firmware ?</h3>
<p>Le firmware est un logiciel, une sorte de mini système d&#8217;exploitation, stocké sur une puce de la carte mère d&#8217;un ordinateur. Lorsque l&#8217;on démarre un ordinateur, le firmware est le premier élément logiciel a démarrer. Il va en premier tester de manière basique le matériel pour ensuite servir de lien entre le système d&#8217;exploitation et le matériel.<br />
Dans l&#8217;univers informatique, le firmware le plus connu est celui développé à la base par IBM : le BIOS (Basic Input Output System). Il est utilisé sur la plupart des PC depuis plusieurs dizaines d&#8217;années. Cependant, sur nos Mac, il n&#8217;y a pas de BIOS. Si vous avez un Mac à processeur PowerPC, vous avez alors de l&#8217;Open Firmware, développé par Sun Microsystem. Les Mac à processeur Intel, quant à eux, possèdent un EFI (Extensible Firmware Interface).<br />
L&#8217;EFI a été créé par Intel pour remplacer le BIOS qui devient maintenant très limité. Cependant, après 10 ans d&#8217;existence, l&#8217;EFI est toujours absent et le BIOS est présent. La faute incombe certainement à Microsoft qui n&#8217;a, jusqu&#8217;à peu, jamais supporté d&#8217;autres firmwares que le BIOS dans ses systèmes grand public. A l&#8217;heure actuelle, seuls Vista SP1 et Seven supportent l&#8217;EFI (mais dans sa version 2 alors que les Mac possède la version 1). De ce fait, comment est-il possible de faire tourner Windows XP ou Vista sur un Mac qui possède de l&#8217;EFI alors que celui ci n&#8217;est pas supporté ? C&#8217;est simple : l&#8217;EFI des Mac émule un BIOS. Windows supportant le BIOS, il peut s&#8217;installer.</p>
<h3>Modifier le comportement de démarrage d&#8217;un Mac</h3>
<p>Au chargement du firmware, celui ci effectue un POST (Power On Self Test). C&#8217;est-à-dire qu&#8217;il va tester le matériel pour vérifier qu&#8217;il n&#8217;y a aucune erreur. Vous aurez ensuite la possibilité de changer le comportement de démarrage du Mac en appuyant sur certaines touches au démarrage. Voici une liste non exhaustive de ces touches et de ce qu&#8217;elles provoquent :</p>
<ul>
<li><b>C :</b> Démarrer sur le CD.</li>
<li><b>N :</b> Démarrer sur le réseau (nécessite un serveur netboot).</li>
<li><b>T :</b> Démarrer en mode Target (le Mac se transforme en disque dur externe).</li>
<li><b>X :</b> Démarrer Mac OS X.</li>
<li><b>Option (Alt) :</b> Lister les volumes sur lesquels on peut démarrer.</li>
<li><b>Shift :</b> Démarrer en Safe Mode (mode sûr qui ne charge que les éléments indispensable).</li>
<li><b>Command + S :</b> Démarrer en mode Single User (mode sans interface graphique où vous avez accès administrateur à tout le système mais par défaut en lecture seule).</li>
<li><b>Command + V :</b> Démarrer en mode Verbose (décrit à l&#8217;écran tout ce que le système effectue au démarrage).</li>
<li><b>Command + Option + P + R :</b> Réinitialiser la PRAM (mémoire qui contient les variables utilisées par le firmware comme le volume sonore).</li>
<li><b>Clic de souris, de trackpad, eject ou F12 :</b> Forcer l&#8217;éjection d&#8217;un CD.</li>
</ul>
<h3>Des problèmes de sécurité dans le firmware ?</h3>
<p>Les touches de modification de démarrage peuvent être très dangereuses. Certains parlent même de problème de sécurité alors que ce sont simplement des fonctionnalités très utiles proposées par Apple. Grâce à ces touches, il est par exemple très simple de démarrer sur le disque d&#8217;installation de Mac OS X et d&#8217;utiliser l&#8217;utilitaire permettant de réinitialiser les mots de passe administrateurs, de démarrer le Mac en mode Target et de le brancher à un autre Mac pour accéder au contenu de tout le disque dur…<br />
Le plus dangereux est certainement le mode Single User car il ne nécessite rien d&#8217;autre que l&#8217;accès au Mac. Dans ce mode, on a un accès total à la machine, mais le disque dur est monté en lecture seule. Cependant, en deux lignes de commandes, il est possible de remonter le disque dur en écriture et supprimer le fichier <i>/var/db/.AppleSetupDone</i> :</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">mount</span> <span style="color: #660033;">-uw</span> <span style="color: #000000; font-weight: bold;">/</span>
<span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>db<span style="color: #000000; font-weight: bold;">/</span>.AppleSetupDone</pre></td></tr></table></div>

<p>La suppression de ce fichier aura pour effet de faire croire au système qu&#8217;il démarre pour la première fois. Il lancera alors l&#8217;assistant de création de compte utilisateur et vous pourrez créer un nouveau compte administrateur.</p>
<h3>Définir un mot de passe au firmware</h3>
<p>Afin de sécuriser le firmware, Apple propose d&#8217;établir un mot de passe sur celui ci. Pour cela, vous aurez besoin du disque d&#8217;installation de Mac OS X. Dans le dossier <i>Applications/Utilities</i> de ce disque, vous trouverez l&#8217;application <i>Firmware Password Utility</i> qui permet de définir, modifier ou retirer le mot de passe du firmware. Cette application peut facilement être lancée depuis le menu <i>Utilities</i> en démarrant le Mac depuis ce disque d&#8217;installation. Vous pouvez cependant lancer l&#8217;application alors que Mac OS X est déjà démarré. Dans ce cas, un nom d&#8217;utilisateur et mot de passe administrateur vous seront demandés.<br />
Attention, l&#8217;application se lancera très certainement avec un clavier AZERTY alors que lorsque le mot de passe sera demandé plus tard, le clavier sera en QWERTY. Dans le panneau <i>International</i> des préférences systèmes, vous pourrez passer votre clavier en QWERTY avant de définir ou changer ce mot de passe. Cela évitera bien des problèmes par la suite.</p>
<p>Le fait d&#8217;avoir définit un mot de passe à provoqué l&#8217;invalidation de la plupart des touches de modification de démarrage. Le mode Verbose, le mode Single User et le Safe Mode seront indisponibles. Le mode Target et le démarrage sur le réseau sont toujours disponibles dans le panneau <i>Disque de démarrage</i> des préférences systèmes. Il sera impossible de réinitialiser la PRAM…<br />
La seule touche de modification toujours disponible est <i>Option</i> qui permet de lister les volumes sur lesquels on peut démarrer. Dans ce cas et uniquement dans ce cas, le mot de passe firmware vous sera demandé avant de lister les volumes. N&#8217;importe quelle autre touche appuyée au démarrage aura pour effet de démarrer sur le système par défaut. Le firmware est donc bien sécurisé.</p>
<p>En ayant un accès physique à la machine, il est cependant possible de supprimer ce mot de passe. Pour cela, il faut retirer la RAM, réinitialiser la PRAM quatre fois d&#8217;affilée puis remettre la RAM en place. Le mot de passe a alors disparu. À ceux qui seraient prêts à crier au scandale, sachez que les PC équipés d&#8217;un BIOS sur lequel on peut définir un mot de passe ont également un problème à ce niveau : en retirant la pile présente sur la carte mère, au bout d&#8217;un certain temps (quelques heures généralement), le BIOS est réinitialisé et perd son mot de passe.</p>
<p><b>N&#8217;oubliez jamais qu&#8217;avec un accès physique à une machine on peut tout faire.</b></p>
]]></content:encoded>
			<wfw:commentRss>http://www.thibaut-jarosz.com/archives/102/feed</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>NSTask : exécutez des fichiers binaires depuis une application</title>
		<link>http://www.thibaut-jarosz.com/archives/96</link>
		<comments>http://www.thibaut-jarosz.com/archives/96#comments</comments>
		<pubDate>Sun, 19 Jul 2009 00:13:56 +0000</pubDate>
		<dc:creator>Thibaut Jarosz</dc:creator>
				<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[Développement]]></category>
		<category><![CDATA[NSTask]]></category>

		<guid isPermaLink="false">http://www.thibaut-jarosz.com/?p=96</guid>
		<description><![CDATA[La classe NSTask permet d'exécuter des fichiers binaires depuis une application en offrant la possibilité de passer des arguments, de rediriger les entrées et sorties vers votre application ou un autre NSTask…]]></description>
			<content:encoded><![CDATA[<p>La classe NSTask permet d&#8217;exécuter des fichiers binaires depuis une application en offrant la possibilité de passer des arguments, de rediriger les entrées et sorties vers votre application ou un autre NSTask…<span id="more-96"></span></p>
<p>Au long de cet article, nous allons tenter d&#8217;exécuter l&#8217;équivalent de la commande suivante :</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #660033;">-1</span> <span style="color: #000000; font-weight: bold;">/</span>Applications<span style="color: #000000; font-weight: bold;">/</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">wc</span> <span style="color: #660033;">-l</span></pre></td></tr></table></div>

<p>Cette commande liste le contenu du dossier /Applications avant de compter le nombre d&#8217;éléments à l&#8217;intérieur.</p>
<p>Nous allons commencer par créer un NSTask qui va lister le contenu du dossier /Applications.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">// Création du NSTask</span>
<span style="color: #400080;">NSTask</span> <span style="color: #002200;">*</span>ls <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSTask</span> alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;
<span style="color: #11740a; font-style: italic;">// Association de la commande &quot;ls&quot; au NSTask en utilisant un NSString</span>
<span style="color: #002200;">&#91;</span>ls setLaunchPath<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;/bin/ls&quot;</span><span style="color: #002200;">&#93;</span>;
<span style="color: #11740a; font-style: italic;">// Passage des différents arguments au travers d'un NSArray contenant des NSString</span>
<span style="color: #002200;">&#91;</span>ls setArguments<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSArray</span> arrayWithObjects<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;-1&quot;</span>, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;/Applications&quot;</span>, <span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;</pre></td></tr></table></div>

<p>Le message <i>setLaunchPath:</i> permet de définir l&#8217;emplacement et le nom du binaire à exécuter (que vous pourrez retrouver avec la commande <i>whereis ls</i> dans le Terminal), tandis que le message <i>setArguments:</i> permet de passer les différents arguments. En ligne de commande, les arguments sont séparés par des espaces. Ici, ils doivent être passés dans différents objets d&#8217;un tableau.</p>
<p>De la même manière, nous allons créer un NSTask pour compter le nombre de lignes retournées par la commande <i>ls</i>.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">// Création du NSTask &quot;wc&quot;</span>
<span style="color: #400080;">NSTask</span> <span style="color: #002200;">*</span>wc <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSTask</span> alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>wc setLaunchPath<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;/usr/bin/wc&quot;</span><span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>wc setArguments<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSArray</span> arrayWithObject<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;-l&quot;</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;</pre></td></tr></table></div>

<p>Nous souhaitons maintenant relier les deux NSTask : la sortie du <i>ls</i> doit être redirigé vers l&#8217;entrée du <i>wc</i>. Pour cela, nous allons utiliser un NSPipe.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">// Création du NSPipe qui passera les informations du &quot;ls&quot; au &quot;wc&quot;</span>
<span style="color: #400080;">NSPipe</span> <span style="color: #002200;">*</span>lsToWcPipe <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSPipe</span> alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;
<span style="color: #11740a; font-style: italic;">// Redirection de la sortie de &quot;ls&quot; sur le NSPipe</span>
<span style="color: #002200;">&#91;</span>ls setStandardOutput<span style="color: #002200;">:</span>lsToWcPipe<span style="color: #002200;">&#93;</span>;
<span style="color: #11740a; font-style: italic;">// Redirection de l'entrée de &quot;wc&quot; sur le NSPipe</span>
<span style="color: #002200;">&#91;</span>wc setStandardInput<span style="color: #002200;">:</span>lsToWcPipe<span style="color: #002200;">&#93;</span>;</pre></td></tr></table></div>

<p>Le message <i>setStandardInput:</i> d&#8217;un NSTask permet de rediriger l&#8217;entrée de ce NSTask vers un autre emplacement (généralement un NSPipe), tandis que le message <i>setStandardOutput:</i> permet de rediriger la sortie.</p>
<p>Il serait maintenant intéressant de récupérer le résultat que retournera le second NSTask. Pour cela, il nous faut un nouveau NSPipe pour récupérer la sortie du NSTask mais également un NSFileHandle qui nous permettra de récupérer le contenu du NSPipe.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">// Création du NSPipe qui récupérera le résultat</span>
<span style="color: #400080;">NSPipe</span> <span style="color: #002200;">*</span>outputPipe <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSPipe</span> alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>wc setStandardOutput<span style="color: #002200;">:</span>outputPipe<span style="color: #002200;">&#93;</span>;
<span style="color: #11740a; font-style: italic;">// Création d'un NSFileHandle qui récupérera les informations du NSPipe</span>
<span style="color: #400080;">NSFileHandle</span> <span style="color: #002200;">*</span>outputFileHandle <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>outputPipe fileHandleForReading<span style="color: #002200;">&#93;</span> retain<span style="color: #002200;">&#93;</span>;</pre></td></tr></table></div>

<p>NSPipe possède deux messages pour gérer son contenu : <i>fileHandleForReading</i> qui retourne un NSFileHandle permettant de lire le contenu du NSPipe et <i>fileHandleForWritting</i> qui retourne un NSFileHandle permettant d&#8217;écrire dans le NSPipe.</p>
<p>Les NSTask sont maintenant initialisés. Nous pouvons les exécuter.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">// Exécution des NSTask</span>
<span style="color: #002200;">&#91;</span>ls launch<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>wc launch<span style="color: #002200;">&#93;</span>;</pre></td></tr></table></div>

<p>L&#8217;exécution des NSTask s&#8217;effectue en appelant le message <i>launch</i> sur ceux-ci.</p>
<p>Nous en avons terminé avec les NSTask. Cependant, le résultat est stocké sous forme de NSFileHandle. Il serait intéressant de l&#8217;avoir sous forme de NSString. Pour cela, nous allons devoir passer par un NSData.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">// Récupération du fichier de sortie dans un NSData</span>
<span style="color: #400080;">NSData</span> <span style="color: #002200;">*</span>outputData <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>outputFileHandle readDataToEndOfFile<span style="color: #002200;">&#93;</span> retain<span style="color: #002200;">&#93;</span>;
<span style="color: #11740a; font-style: italic;">// Transformation du NSData en NSString</span>
<span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>outputString <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> alloc<span style="color: #002200;">&#93;</span> initWithData<span style="color: #002200;">:</span>outputData encoding<span style="color: #002200;">:</span>NSUTF8StringEncoding<span style="color: #002200;">&#93;</span>;
<span style="color: #11740a; font-style: italic;">// Affichage du résultat</span>
NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;%@&quot;</span>, <span style="color: #002200;">&#91;</span>outputString description<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>;</pre></td></tr></table></div>

<p>Le message <i>readDataToEndOfFile</i> de NSFileHandle permet de retourner directement un NSData comprenant tout le contenu du fichier associé. Ensuite, il suffit de créer et initialiser un NSString avec le message <i>initWithData:encoding:</i>. Celui ci permet d&#8217;initialiser le NSString avec le contenu d&#8217;un NSData et en utilisant un certain encodage de caractère, généralement <i>encoding:NSUTF8StringEncoding</i> (UTF-8).</p>
<p>Il ne faut pas oublier la toute dernière étape : la libération des objets. Nous n&#8217;en avons plus besoin, il faut donc penser à décrémenter leur compteur de référence.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">// Libération des objets</span>
<span style="color: #002200;">&#91;</span>ls release<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>wc release<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>lsToWcPipe release<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>outputPipe release<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>outputFileHandle release<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>outputData release<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>outputString release<span style="color: #002200;">&#93;</span>;</pre></td></tr></table></div>

<p>Nous avons maintenant terminé notre application. Pour rappel, voici le code complet :</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">// Création du NSTask &quot;ls&quot;</span>
<span style="color: #400080;">NSTask</span> <span style="color: #002200;">*</span>ls <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSTask</span> alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;
<span style="color: #11740a; font-style: italic;">// Association de la commande &quot;ls&quot; au NSTask en utilisant un NSString</span>
<span style="color: #002200;">&#91;</span>ls setLaunchPath<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;/bin/ls&quot;</span><span style="color: #002200;">&#93;</span>;
<span style="color: #11740a; font-style: italic;">// Passage des différents arguments au travers d'un NSArray contenant des NSString</span>
<span style="color: #002200;">&#91;</span>ls setArguments<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSArray</span> arrayWithObjects<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;-1&quot;</span>, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;/Applications&quot;</span>, <span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
&nbsp;
&nbsp;
<span style="color: #11740a; font-style: italic;">// Création du NSTask &quot;wc&quot;</span>
<span style="color: #400080;">NSTask</span> <span style="color: #002200;">*</span>wc <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSTask</span> alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>wc setLaunchPath<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;/usr/bin/wc&quot;</span><span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>wc setArguments<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSArray</span> arrayWithObject<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;-l&quot;</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
&nbsp;
&nbsp;
<span style="color: #11740a; font-style: italic;">// Création du NSPipe qui passera les informations du &quot;ls&quot; au &quot;wc&quot;</span>
<span style="color: #400080;">NSPipe</span> <span style="color: #002200;">*</span>lsToWcPipe <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSPipe</span> alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;
<span style="color: #11740a; font-style: italic;">// Redirection de la sortie de &quot;ls&quot; sur le NSPipe</span>
<span style="color: #002200;">&#91;</span>ls setStandardOutput<span style="color: #002200;">:</span>lsToWcPipe<span style="color: #002200;">&#93;</span>;
<span style="color: #11740a; font-style: italic;">// Redirection de l'entrée de &quot;wc&quot; sur le NSPipe</span>
<span style="color: #002200;">&#91;</span>wc setStandardInput<span style="color: #002200;">:</span>lsToWcPipe<span style="color: #002200;">&#93;</span>;
&nbsp;
&nbsp;
<span style="color: #11740a; font-style: italic;">// Création du NSPipe qui récupérera le résultat</span>
<span style="color: #400080;">NSPipe</span> <span style="color: #002200;">*</span>outputPipe <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSPipe</span> alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>wc setStandardOutput<span style="color: #002200;">:</span>outputPipe<span style="color: #002200;">&#93;</span>;
<span style="color: #11740a; font-style: italic;">// Création d'un NSFileHandle qui récupérera les informations du NSPipe</span>
<span style="color: #400080;">NSFileHandle</span> <span style="color: #002200;">*</span>outputFileHandle <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>outputPipe fileHandleForReading<span style="color: #002200;">&#93;</span> retain<span style="color: #002200;">&#93;</span>;
&nbsp;
&nbsp;
<span style="color: #11740a; font-style: italic;">// Exécution des NSTask</span>
<span style="color: #002200;">&#91;</span>ls launch<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>wc launch<span style="color: #002200;">&#93;</span>;
&nbsp;
&nbsp;
<span style="color: #11740a; font-style: italic;">// Récupération du fichier de sortie dans un NSData</span>
<span style="color: #400080;">NSData</span> <span style="color: #002200;">*</span>outputData <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>outputFileHandle readDataToEndOfFile<span style="color: #002200;">&#93;</span> retain<span style="color: #002200;">&#93;</span>;
<span style="color: #11740a; font-style: italic;">// Transformation du NSData en NSString</span>
<span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>outputString <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> alloc<span style="color: #002200;">&#93;</span> initWithData<span style="color: #002200;">:</span>outputData encoding<span style="color: #002200;">:</span>NSUTF8StringEncoding<span style="color: #002200;">&#93;</span>;
<span style="color: #11740a; font-style: italic;">// Affichage du résultat</span>
NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;%@&quot;</span>, <span style="color: #002200;">&#91;</span>outputString description<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>;
&nbsp;
&nbsp;
<span style="color: #11740a; font-style: italic;">// Libération des objets</span>
<span style="color: #002200;">&#91;</span>ls release<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>wc release<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>lsToWcPipe release<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>outputPipe release<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>outputFileHandle release<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>outputData release<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>outputString release<span style="color: #002200;">&#93;</span>;</pre></td></tr></table></div>

<p>Pour plus d&#8217;information sur NSTask, n&#8217;hésitez pas à consulter la <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSTask_Class/Reference/Reference.html">documentation d&#8217;Apple</a>.<br />
Vous pouvez également télécharger cet exemple dans une application en ligne de commande : <a href='/wp-content/uploads/2009/07/NSTask-Example.zip'>NSTask Example</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.thibaut-jarosz.com/archives/96/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Création d&#8217;un LaunchAgent</title>
		<link>http://www.thibaut-jarosz.com/archives/85</link>
		<comments>http://www.thibaut-jarosz.com/archives/85#comments</comments>
		<pubDate>Thu, 09 Jul 2009 13:15:37 +0000</pubDate>
		<dc:creator>Thibaut Jarosz</dc:creator>
				<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[Agent]]></category>

		<guid isPermaLink="false">http://www.thibaut-jarosz.com/?p=85</guid>
		<description><![CDATA[Lancez automatiquement un Agent à l'ouverture de session]]></description>
			<content:encoded><![CDATA[<p>Un LaunchAgent est un fichier PLIST permettant de lancer automatiquement un Agent. Remarque : la méthode est la même pour les LaunchDaemon.<span id="more-85"></span></p>
<h3>Où stocker le LaunchAgent ?</h3>
<p>Dans le dossier <em>LaunchAgent</em> présent dans les dossiers <em>Library</em>. Vous avez donc quatre emplacements différents possible pour stocker votre LaunchAgent :</p>
<ul>
<li><strong>~/Library/LaunchAgent/ :</strong> Lance des agents de l&#8217;utilisateur connecté.</li>
<li><strong>/Library/LaunchAgent/ :</strong> Lance des agents disponibles pour tous les utilisateurs.</li>
<li><strong>/Network/Library/LaunchAgent/ :</strong> Lance des agents disponibles sur les réseau (généralement lié à un server Mac OS X).</li>
<li><strong>/System/Library/LaunchAgent/ :</strong> Lance des agents nécessaires au fonctionnement du système (évitez d&#8217;utiliser ce dossier).</li>
</ul>
<h3>Quel nom de fichier utiliser ?</h3>
<p>Seule l&#8217;extension du fichier est obligatoire : <em>plist</em>.<br />
Le reste du nom peut avoir n&#8217;importe quelle valeur. Généralement, on utilise des noms de domaines inversés, comme l&#8217;identifiant des applications ou les noms des fichiers de préférence. Par exemple : <em>com.mycompany.mylaunchagent.plist</em>.</p>
<h3>Que mettre à l&#8217;intérieur du fichier ?</h3>
<p>Trois valeurs sont indispensables au bon fonctionnement du launchagent :</p>
<ul>
<li><strong>Label :</strong> identifiant du launchagent (ex : <em>com.mycompany.mylaunchagent</em>)</li>
<li><strong>ProgramArguments :</strong> tableau contenant l&#8217;exécutable lié à l&#8217;agent puis les différents arguments</li>
<li><strong>RunAtLoad :</strong> booléen devant être à vrai afin de lancer l&#8217;agent à l&#8217;ouverture de session.</li>
</ul>
<p>Par exemple, nous allons créer un Agent stocké dans le dossier <em>/Library/Application Support/MyApp/agent</em> et demandant l&#8217;argument <em>start</em> pour démarrer.<br />
Voici ce que donnerait le fichier à travers l&#8217;application <em>Property List Editor</em> :<br />
<div id="attachment_90" class="wp-caption aligncenter" style="width: 310px"><a href="/wp-content/uploads/2009/07/launchagent.png"><img class="size-medium wp-image-90" title="LaunchAgent" src="/wp-content/uploads/2009/07/launchagent-300x199.png" alt="LaunchAgent" width="300" height="199" /></a><p class="wp-caption-text">LaunchAgent</p></div></p>
<p>En modifiant directement le code XML du fichier, voici le résultat :</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre></td><td class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">&quot;UTF-8&quot;</span><span style="color: #000000; font-weight: bold;">?&gt;</span></span>
<span style="color: #00bbdd;">&lt;!DOCTYPE plist PUBLIC &quot;-//Apple//DTD PLIST 1.0//EN&quot; &quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&quot;&gt;</span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;plist</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;dict<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Label<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>com.mycompany.mylaunchagent<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>ProgramArguments<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;array<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>/Library/Application Support/MyApp/agent<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>start<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/array<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>RunAtLoad<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;true</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/dict<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/plist<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.thibaut-jarosz.com/archives/85/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

