<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xml:base="http://pilgrim.maleo.net/"><id>http://pilgrim.maleo.net/</id><title>pilgrim[.maleo.net]</title><updated>2008-02-08T01:21:19-08:00</updated><link rel="self" href="http://pilgrim.maleo.net/weblog.atom"></link><entry><id>urn:md5:9954b0c865ed6afd0cfb2472c71c4923</id><title><![CDATA[Fonction mail() : envoyer un sujet avec des accents]]></title><updated>2008-02-08T01:21:19-08:00</updated><author><name/></author><link href="2008/02/fonction-mail-envoyer-un-sujet-avec-des-accents" rel="alternate" title="Fonction mail() : envoyer un sujet avec des accents"/><summary type="html">&lt;p&gt;Dans le cadre d'une application web, on peut être amené à envoyer des mails de notification simples et dans ce cas l'utilisation de la fonction &lt;code&gt;mail()&lt;/code&gt; de PHP peut tout à fait suffir. Mais que faire dans le cas où le sujet doit comporter des accents sachant que la fonction utilise - si je ne me trompe pas - un charset anglon-saxon par défault&lt;/p&gt;</summary><published>2008-02-08T01:21:19-08:00</published><category term="php" label="PHP"/><content type="html"><![CDATA[<p>Dans le cadre d'une application web, on peut être amené à envoyer des mails de notification simples et dans ce cas l'utilisation de la fonction <code>mail()</code> de PHP peut tout à fait suffir. Mais que faire dans le cas où le sujet doit comporter des accents sachant que la fonction utilise - si je ne me trompe pas - un charset anglon-saxon par défault.</p>

<p>En cherchant sur Internet, comme toujours, j'ai trouvé une solution simple qui m'a satisfaite, je vous la livre telle quelle :</p>

<pre>
// Message
$recipient  = 'you@example.com';
$subject    = '=?UTF-8?B?'.base64_encode('Sujet : éèàïî').'?=';
$sender     = '"=?UTF-8?B?'.base64_encode('Nom : éèàïî').'?=" &lt;me@example.com&gt;';
$body       = 'Corps du message avec des accents aussi : éèàïî';

// Entêtes du message
$headers    = array();
$headers[]  = 'From: '.$sender;
$headers[]  = 'Content-Type: text/plain; charset=UTF-8; format=flowed;';
$headers[]  = 'MIME-Version: 1.0';
$headers[]  = 'Content-Transfer-Encoding: 8bit';
$headers    = join("\n", $headers);

// Envoi du mail
mail($recipient, $subject, $body, $headers);
</pre>

<p>Ce code utilise l'UTF-8, c'est l'encodage par défaut de tout mon code en général que ca soit pour les fichiers, la base de données ou le "Content-Type" envoyé au navigateur. L'UTF-8 permet de faire des applications qui acceptent et utilisent n'importe quel caractère de n'importe quelle langue et sera en plus l'encodage par défaut pour le PHP6 à venir ce qui est une bonne chose.</p>

<p>Bien sûr, il faut mettre dans dans une fonction pour une meilleure factorisation, si je laisse ce code tel quel, c'est pour mieux en comprendre le mécanisme. Une visite de la documentation de la <a href="http://fr3.php.net/manual/fr/function.mail.php" title="PHP : mail" hreflang="fr">fonction mail()</a> et des commentaires associés apportent de meilleures solutions. On y voit par exemple l'utilisation d'un code tel que celui-ci :</p>

<pre>$subject= mb_encode_mimeheader($subject,"UTF-8", "B", "\n");</pre>

<p>Je n'ai pas poussé mes investigations plus loin à ce niveau mais la lecture de la documentation de la fonction <a href="http://php.net/manual/en/function.mb-encode-mimeheader.php" title="PHP : mb_encode_mimeheader" hreflang="fr"></a> ne pourrait être que bénéfique.</p>

<p>Bon, après si votre application doit faire beaucoup d'envoi de mail (notification mais aussi newsletter, pourquoi pas), il vaut mieux passer par une classe spécifique qui gèrera tous les aspects technique comme celui que nous venons de voir de manière transparente. Je vous conseille l'utilisation de la classe <a href="http://www.phpguru.org/static/htmlMimeMail5.html" title="HTML Mime Mail 5" hreflang="en">HTML Mime Mail</a> de <a href="http://www.phpguru.org/" title="phpguru.org - Free PHP, Javascript and C# code" hreflang="en">phpguru.org</a> mais il en existe d'autres comme <a href="http://pear.php.net/package/Mail" title="PEAR::Mail" hreflang="en">PEAR::Mail</a> ou <a href="http://phpmailer.codeworxtech.com/" title="PHP Mailer - PHP Email Class" hreflang="en">PHP Mailer</a>.</p>]]></content><slash:comments>1</slash:comments></entry><entry><id>urn:md5:0edab00917c9062b184b4d5aa643b187</id><title><![CDATA[Extraire des fichiers d'un installeur .msi]]></title><updated>2008-02-07T01:17:18-08:00</updated><author><name>David Duret</name></author><link href="2008/02/extraire-des-fichiers-d-un-installeur-msi" rel="alternate" title="Extraire des fichiers d'un installeur .msi"/><summary type="html">&lt;p&gt;J'ai eu récemment le besoin d'extraire des fichiers d'une archive .msi (Microsoft Installer) sans installer le logiciel correspondant (il ne me fallait qu'un fichier en particulier). Après avoir fait quelques recherches, voici ce qu'il en résulte.&lt;/p&gt;</summary><published>2008-02-07T01:15:37-08:00</published><category term="logiciels" label="Logiciels"/><content type="html"><![CDATA[<p>J'ai eu récemment le besoin d'extraire des fichiers d'une archive <code>.msi</code> (Microsoft Installer) sans installer le logiciel correspondant (il ne me fallait qu'un fichier en particulier). Après avoir fait quelques recherches, voici ce qu'il en résulte.</p>

<p>Je me suis tout d'abord tourné vers mon logiciel de compression <a href="http://www.7-zip.org/" title="7-zip" hreflang="en">7-zip</a> qui indique sur sa page d'accueil :</p>

<blockquote cite="http://www.7-zip.org/" title="7-zip">
    <p>Unpacking only: RAR, CAB, ISO, ARJ, LZH, CHM, <strong>MSI</strong>, WIM, Z, CPIO, RPM, DEB and NSIS</p>
</blockquote>

<p>Mais en faisant le test, j'ai eu plein de fichiers bizarres et tout en retrouvant certains fichiers connus, ils n'étaient pas nommés correctement et cette série de fichiers n'était donc pas utilisables. Peut-être ai-je fait une fausse manipulation...</p>

<p>Toujours est-il que j'ai fait une recherche sur Internet et que je suis tombé sur l'article « <a href="http://www.myitforum.com/articles/6/view.asp?id=10253" title="VBS Script To Extract A Specified MSI File To A Specified Location" hreflang="en">VBS Script To Extract A Specified MSI File To A Specified Location</a> » qui répond tout à fait à mon besoin : un script VBScript est donné qui vous demande de sélectionner le fichier <code>.msi</code>, un répertoire de destination et qui extrait tous les fichiers dans ce répertoire, on ne peut rêver mieux, j'ai enfin mon fichier !</p>

<p>En fait, en dehors du fait que le script donne une interface à l'opération, la chose la plus interessante est la ligne de commande utilisée :</p>

<pre>msiexec.exe /a &lt;fichier source&gt; /qn TargetDir=&lt;répertoire de destination&gt;</pre>

<p>Il est facile ensuite de se faire un script plus simple (en VBS, batch, PHP CLI) pour que d'un clic droit de la souris, on puisse extraire les fichiers dans un sous-répertoire nommé à partir du nom du fichier, qui se lance ? :-)</p>]]></content><slash:comments>0</slash:comments></entry><entry><id>urn:md5:e8a36a81cd79a4dcdd767ca662894ad8</id><title><![CDATA[Où trouver d'anciennes versions des logiciels web ?]]></title><updated>2008-02-05T04:50:34-08:00</updated><author><name>David Duret</name></author><link href="2008/02/ou-trouver-d-anciennes-versions-des-logiciels-web" rel="alternate" title="Où trouver d'anciennes versions des logiciels web ?"/><summary type="html">&lt;p&gt;Dans le développement web, il nous arrive d'être confronté à un "vieux" serveur, un serveur sur lequelle se trouve de vieilles versions de Apache, MySQL ou PHP qui ne se comportent pas forcément comme les suivantes (je pense surtout à PHP...). Voici une série de liens qui pourra vous être utile si vous êtes confrontés à ce cas.&lt;/p&gt;</summary><published>2008-02-05T04:50:34-08:00</published><category term="developpement-web" label="Développement Web"/><category term="logiciels" label="Logiciels"/><content type="html"><![CDATA[<p>Dans le développement web, il nous arrive d'être confronté à un "vieux" serveur, un serveur sur lequelle se trouve de vieilles versions de Apache, MySQL ou PHP qui ne se comportent pas forcément comme les suivantes (je pense surtout à PHP...). Voici une série de liens qui pourra vous être utile si vous êtes confrontés à ce cas.</p>

<h3>"AMP", archives officielles</h3>

<ul>
    <li>Apache : <a href="http://archive.apache.org/dist/httpd/">http://archive.apache.org/dist/httpd/</a></li>
    <li>MySQL : <a href="http://downloads.mysql.com/archives.php">http://downloads.mysql.com/archives.php</a></li>
    <li>PHP : <a href="http://museum.php.net/">http://museum.php.net/</a></li>
</ul>

<h3>Côté client, les navigateurs</h3>

<p>Côté client, il peut être utile - très utile - de tester dans les versions antérieures des navigateurs, notament pour Internet Explorer : <a href="http://tredosoft.com/Multiple_IE">Multiple IE</a>.</p>

<p>L'utilisation de versions "portables" de certains logiciels peut aussi être d'une grande utilité (pas besoin d'installation) pour les tester, voir à ce propos le site <a href="http://portableapps.com/" hreflang="en">PortableApps.com</a> et principalement la <a href="http://portableapps.com/apps/internet/firefox_portable" title="Mozilla Firefox, Portable Edition" hreflang="en">page dédiée à Firefox</a> avec un lien vers <a href="https://sourceforge.net/project/showfiles.php?group_id=152554&package_id=168825" hreflang="en">toutes les versions portables précédentes</a>.</p>

<p>Pour information, j'avais déjà évoqué le sujet de l'environnement multiple dans les articles précédents :</p>

<ul>
    <li><a href="http://pilgrim.maleo.net/2006/11/tester-php6-facilement-avec-zazouminiwebserver">Tester PHP6 facilement avec ZazouMiniWebServer</a></li>
    <li><a href="http://pilgrim.maleo.net/2006/01/firefox-107-et-firefox-15-en-parallele">Firefox 1.0.7 et Firefox 1.5 en parallèle</a></li>
    <li><a href="http://pilgrim.maleo.net/2005/12/plusieurs-versions-de-php-sur-un-meme-serveur">Plusieurs versions de PHP sur un même serveur</a></li>
    <li><a href="http://pilgrim.maleo.net/2005/11/mysql-4-et-mysql-5-en-parallele-sous-windows">MySQL 4 et MySQL 5 en parallèle sous Windows</a></li>
    <li><a href="http://pilgrim.maleo.net/2004/06/internet-explorer-3x-4x-5x-et-6x-sur-une-meme-machine">Internet Explorer 3.x, 4.x, 5.x et 6.x sur une même machine</a></li>
</ul>

<p>N'hésitez pas à compléter cette liste avec vos propres ressources.</p>]]></content><slash:comments>2</slash:comments></entry><entry><id>urn:md5:3b5067531e8206ee15b204a44c65e2bb</id><title><![CDATA[2008, année charnière]]></title><updated>2008-01-18T03:51:52-08:00</updated><author><name>David Duret</name></author><link href="2008/01/2008-annee-charniere" rel="alternate" title="2008, année charnière"/><summary type="html">&lt;p&gt;Loin des (bonnes) résolutions que l'on formulent chaque année et que l'on fait connaître à tout va mais qui ne sont guère tenues, je vais vous parler de mes projets pour cette nouvelle année ou plutôt de &lt;strong&gt;mon&lt;/strong&gt; projet : passer du statut de salarié au statut de travailleur indépendant.&lt;/p&gt;</summary><category term="general" label="Général"/><published>2008-01-18T03:51:52-08:00</published><content type="html"><![CDATA[<p>Loin des (bonnes) résolutions que l'on formulent chaque année et que l'on fait connaître à tout va mais qui ne sont guère tenues, je vais vous parler de mes projets pour cette nouvelle année ou plutôt de <strong>mon</strong> projet : passer du statut de salarié au statut de travailleur indépendant.</p>

<p>Ca fait un moment que ça me travaille, que ça me titille mais je n'ai jamais osé prendre la décision et passer le cap. C'est chose faite maintenant, j'ai démissionné fin 2007 et j'attaque normalement au mois de février (c'est à dire très bientôt). J'officierai dans le développement de sites internet/extranet/intranet que ce soit au niveau client que serveur et voir pour faire d'autres choses à côté de ça, je n'ai pas encore d'idées précises mais ça viendra, vous serez tenu au courant :)</p>

<p>Je n'avais jamais trop creusé le domaine de la création d'entreprise malgré ce souhait récurrent et là, maintenant que je suis dedans, je me rend compte que c'est un vrai parcours du combattant ! Par quoi commencer, qui rencontrer, où se renseigner, c'est vraiement la jungle...</p>

<p>J'ai finalement commencé par faire une réunion d'information sur la création/reprise d'entreprise à la CCI (Chambre de Commerce et d'Industrie) qui donne des pistes et informations pour bien mener son projet. Je continue la semaine prochaine avec un stage de 5 jours sur la création d'entreprise, nous verrons comment choisir ses statuts juridique, fiscal, les protections sociales, etc.</p>

<p>Pour le moment, je vous souhaite à toutes et tous une <em>excellente année 2008</em>, faîtes en sorte que vos propres projets puissent se faire, qu'ils soient petits ou grands, du moment qu'ils vous apportent satisfation et bonheur !...</p>]]></content><slash:comments>2</slash:comments></entry><entry><id>urn:md5:6e885adf4ac5b796fc4047cd1df2610d</id><title><![CDATA[Générer un mot de passe facilement mémorisable]]></title><updated>2007-10-05T04:03:43-07:00</updated><author><name>David Duret</name></author><link href="2007/10/generer-un-mot-de-passe-facilement-memorisable" rel="alternate" title="Générer un mot de passe facilement mémorisable"/><summary type="html">&lt;p&gt;Développée dans le but de pouvoir générer des mots de passe facilement mémorisables, la fonction &lt;strong&gt;generatePassword()&lt;/strong&gt; se base sur la notion de "pattern" pour retourner un mot de passe "formatté".&lt;/p&gt;</summary><published>2007-10-05T04:03:43-07:00</published><category term="php" label="PHP"/><content type="html"><![CDATA[<p>Développée dans le but de pouvoir générer des mots de passe facilement mémorisables, la fonction <strong>generatePassword()</strong> se base sur la notion de "pattern" pour retourner un mot de passe "formatté".</p>

<h3>Description</h3>

<p>string <strong>generatePassword</strong> ( [string $pattern [, bool $caseless]] )</p>

<p>La fonction <code>generatePassword()</code> est basée sur l'utilisation d'un pattern, c'est à dire une chaîne de caractères qui indique à la fonction quel suite de caractères vous souhaitez voir apparaître dans le résultat final.</p>

<p>Trois types de caractères sont disponibles :</p>

<ul>
    <li><code>c</code> : consonne</li>
    <li><code>v</code> : voyelle</li>
    <li><code>n</code> : chiffre</li>
</ul>

<p>Le pattern par défaut est <code>cvcvnnn</code> ce qui peut vous retourner un résultat comme <q>fibo594</q>.</p>

<p>La fonction <code>generatePassword()</code> peut prendre deux paramètres facultatifs en entrée : le fameux <em>pattern</em> que vous pouvez moduler à souhait, et la <em>sensibilité à la casse</em> c'est à dire que la fonction vous retourne un mot de passe en minuscules exclusivement (comportement par défaut) ou un mélange de majuscules et minuscules.</p>

<h3>Exemples</h3>

<pre>
$password = generatePassword(); // retourne vupa651
$password = generatePassword('ccnnvv') ; // retourne fpao27
$password = generatePassword(null, false); // retourne FiDU439
$password = generatePassword('cvcvcvcv', false); // retourne pIKAlamY
</pre>

<h3>Code source</h3>

<pre>
function generatePassword( $pattern = null, $caseless = true ) {

	if ( empty($pattern) ) $pattern = 'cvcvnnn';
	$characters	= array(
		'c'	=> true === $caseless
				? 'bcdfghjklmnpqrstvwxz'
				: 'bcdfghjklmnpqrstvwxzBCDFGHJKLMNPQRSTVWXZ',
		'v'	=> true === $caseless ? 'aeiouy' : 'aeiouyAEIOUY',
		'n'	=> '0123456789'
	);
	
	$password 	= '';
	for ( $i = 0, $length = strlen($pattern); $i < $length; $i++ ) {
		$password .= substr(
			$characters[substr($pattern, $i, 1)], 
			rand(0, strlen($characters[substr($pattern, $i, 1)]) - 1), 
			1
		);
	} // endif
	
	return $password;

} // end of 'generatePassword()'
</pre>

<p>Comme toujours, n'hésitez pas à me faire part de vos remarques et suggestions quant à l'utilisation et l'amélioration de cette fonction.</p>]]></content><slash:comments>1</slash:comments></entry></feed>
