PHPMailer sur Windows

17 12 2011

Ah l’envoi de mail() en PHP, une fonctionnalité qui a toujours été un peu foireuse sur les bords.

Petit billet donc pour faire le tour des différentes solutions pour envoyer des emails et les problèmes couramment rencontrés.

PHP est fournis avec une fonction unique permettant d’envoyer des mails : mail().
Son fonctionnement est assez bas niveau, elle est simple à utiliser pour envoyer des emails de base, en texte brut avec un seul destinataire.

Mais quand on veut faire des choses plus complexes (plusieurs destinataires, copies cachées, pièces jointes, multipart texte brute/html, encodage UTF-8…) ça se corse, puisque c’est au développeur de jongler avec les headers, du style :

$headers =	"From: ".$from."\n";
$headers .=	"MIME-version: 1.0\n";
$headers .=	"content-type: text/html; charset=utf-8\n";

Lire la suite »



Script AutoHotKey : ajout date/heure

16 12 2011

Voilà un petit script AutoHotKey (.ahk) maison qui permet d’insérer la date et l’heure courante (ex: 16/12/2011 19:49:57) en appuyant sur la touche Ctrl + ! :

SendMode Input

^!::
	Send %A_DD%/%A_MM%/%A_YYYY% %A_Hour%:%A_Min%:%A_Sec%
return

Créez simplement un nouveau fichier insertDatetime.ahk et placez-y ce code (et installez autohotkey si vous ne l’avez pas).

Bien entendu vous pouvez choisir n’importe quelle combinaison de touche en modifiant le script (cf documentation d’autohotkey).

Pour ceux qui ne connaissent pas, autohotkey est un logiciel de macro fonctionnant avec des script, qui permet d’automatiser des tâches simples. Il est d’ailleurs très utile pour tricher dans certains jeux vidéos ^^ (gachette facile).



Easter Egg dans les codes HTTP !

16 12 2011

Ou le secret du code 418…

Ah j’aime bien les petites blagues à la con qui se cachent dans des applications (comme le about:robots de Firefox), ou dans les jeux (l’annonce de Portal 2 dans les radios de Portal).

Eh ben il y en a même dans les spécifications du protocole HTTP.

En effet, d’après la RFC 2324 du 1er avril 1998, voici à quoi correspond le code HTTP 418 :

418 I’m a teapot
“Je suis une théière”, Hyper Text Coffee Pot Control Protocol.

[Source]



.htaccess phpBB SEO

10 12 2011

Ah je suis en colère !

Gredin, bandit, cercopithèque, bachi-bouzouk, coloquinte à la graisse de hérisson, sombre oryctérop, ectoplasme à roulettes, diplodocus ! [...]

Petite astuce pour ceux qui utilisent phpBB (un moteur de forum en PHP) avec l’excellent mod phpbb SEO, concernant la configuration de l’URL rewriting : Lire la suite »



Paranoid 7

10 12 2011

Habba babba, vous vous souvenez ?

Voilà une autre vidéo à la con, réalisée par Jacl Vale :



UTF-8 c’est pas de la merde en barre

6 12 2011

Si tu lis MrSchnaps depuis longtemps, tu va dire que je raconte n’importe quoi, puisqu’on peut lire le contraire de ce que je vais te dire ici : UTF-8, c’est de la merde en barre !.

Je viens de lire un magnifique article qui explique comment fonctionne l’UTF-8, quelle est la différence entre Unicode et UTF-8, entre UTF-16 et UCS-2, entre le high endian et le low endian, entre l’ASCII, l’ANSI et le Latin-1… enfin tous ces mots que vous avez surement déjà rencontré si vous avez écrit plus de 4 lignes de code dans votre vie.

Attention, je préviens d’avance tous les gros Gaulois qui passeraient par ici, cet article est en anglais (y’a même moyen d’apprendre des mots comme : wimps, guzzling, spells, curse), et puis surtout il y a des blagues sur les Texans !

C’est par là que ça se passe : The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets.

Youpi :)



Il faut être bien esquipé !

4 12 2011

Aujourd’hui petit cours de cuisine Italienne, on va faire des antipasti :

Et n’oubliez pas, il faut l’huile elle est très chaude, que ça bouille bien !



Liste des ports ouverts

30 11 2011

Voilà une petit astuce qui va faire gagner beaucoup de temps à ceux qui auront à galérer avec le réseau (programmation réseau avec des sockets, configuration de serveur web ou FTP…).

Sur windows, ont peut savoir quel programme utilise quel port en utilisant la commande netstat -ano :

netstat -ano

Proto  Adresse locale         Adresse distante       État
TCP    0.0.0.0:80             0.0.0.0:0              LISTENING       4724   (serveur Apache)
TCP    0.0.0.0:135            0.0.0.0:0              LISTENING       788
[...]
TCP    0.0.0.0:10243          0.0.0.0:0              LISTENING       4      (System)
TCP    127.0.0.1:1029         127.0.0.1:1030         ESTABLISHED     2112   (teamviewer)
TCP    127.0.0.1:1030         127.0.0.1:1029         ESTABLISHED     2112   (teamviewer)
TCP    127.0.0.1:3306         0.0.0.0:0              LISTENING       1040   (serveur MySQL)
TCP    127.0.0.1:3770         127.0.0.1:3771         ESTABLISHED     972    (firefox)
[...]
TCP    127.0.0.1:5679         0.0.0.0:0              LISTENING       2972
TCP    192.168.1.30:3889      173.194.66.106:80      TIME_WAIT       0

UDP    192.168.180.1:138      *:*                                    4
UDP    [::]:500               *:*                                    1004
UDP    [::]:3702              *:*                                    3088
[...]

Lire la suite »



Libérer la session PHP pour éviter le freeze

26 11 2011

Aujourd’hui les enfants, on va parler du fonctionnement des sessions en PHP, dans le détail.

Quand un client (navigateur) fait une requête HTTP vers une page de votre site qui utilise les sessions (permettant à vos visiteurs de se connecter avec un compte perso/premium par exemple), il va inclure dans cette requête HTTP, au niveau des headers, un cookie contenant ce qu’on appelle l’identifiant de session.

Exemple :

PHPSESSID=19a04504ad488ef391698e8caf906605

Le nom du cookie (ici PHPSESSID) est d’ailleurs configurable dans le fichier de configuration de votre serveur PHP : php.ini :

; Name of the session (used as cookie name).
session.name = PHPSESSID

Bref, quand le serveur va recevoir cette requête, cet identifiant de session va être utilisé par la fonction session_start() qui va aller charger en mémoire la session (contenant tout un tas de variables que vous avez défini dans les pages précédentes) depuis un fichier. Et ce fichier peut justement être identifié en utilisant l’identifiant de session, tous les fichiers de session se trouvent dans un même répertoire (défini dans php.ini > session.save_path), et sont nommés de la sorte : sess_<identifiant de session>, dans mon exemple, le fichier va s’appeler : sess_19a04504ad488ef391698e8caf906605.

Qu’y a t-il dans le fichier de session ?

Pour comprendre, vous allez créer un petit script PHP tout simple qui démarre la session et va y enregistrer 2 variables : Lire la suite »



Clonage d’objet en .NET (C# ou VB)

23 11 2011

Si vous débarquez en .NET (ou en Java d’ailleurs) et que vous venez d’un bon langage pas casse couille comme PHP ou JavaScript, ça doit vous faire un choc :

Donner un type à ses variables, choisir parmi 36000 structures pour stocker l’information (Array, List, Hasttable, Dictionary, DataTable…), devoir importer des tonnes de trucs pour simplement trier un tableau par ordre décroissant…

Mais le pire, c’est sans doute le passage par référence. En PHP, pour dupliquer une variable (qu’elle soit un simple entier ou un objet très élaboré issu d’une classe que vous avez créé), il suffit d’utiliser = comme pour n’importe quelle affectation :

<?php
$variable_originale = new MaClasse();
$variable_originale->nom = "Variable originale";
$copie = $variable_originale;
$copie->nom = 'Une copie conforme et parfaitement disctince de $variable_originale';

echo $variable_originale->nom; // Variable originale
echo $copie->nom; // Une copie conforme et parfaitement disctince de $variable_originale
?>

Mais en .NET, tout est passé par référence (sauf les types primitifs comme integer, boolean, string… qui eux sont passé par valeur), ça signifie que si vous faites la même chose qu’en PHP ci-dessus, quand vous allez modifier la variable copie, ça va aussi modifie variable_originale. Pourquoi ? Tout simplement parce que copie et variable_originale sont des pointeurs vers la même variable en mémoire, c’est en quelque sorte 2 noms différents pour la même variable.

La solution, pour dupliquer une variable, c’est de créer copie (en appelant le constructeur de MaClasse : copie = new MaClasse()), mais il faut alors recopier un par un la valeur de chaque attribut de variable_originale dans l’attribut de copie homonyme, l’enfer. En général on fait cela en créant une méthode Clone() dans la classe de la variable qu’on veut dupliquer, et en implémentant une interface de clonage comme ICloneable en .NET. C’est au développeur d’implémenter la fonction Clone().

Heureusement, il existe une solution toute bête pour créer une fonction Clone facilement : elle consiste à sérialiser la variable à dupliquer, puis à la desérialiser (ce qui reviendrait à faire un $copie = unserialize(serialize($variable_originale)); en PHP).

Voici donc une fonction permettant de cloner un objet en VB.NET (mais ça marche aussi en C#, il suffit d’adapter la syntaxe) :

Namespace Espace
    <Serializable()> Friend Class AgriVar

        Friend Sub New()
            '[...]
        End Sub

        Public Function Clone()
            Dim memStream As MemoryStream = New MemoryStream()
            Dim bnFormat As BinaryFormatter = New BinaryFormatter(Nothing, New StreamingContext(StreamingContextStates.Clone))
            bnFormat.Serialize(memSteam, Me)
            memStream.Seek(0, SeekOrigin.Begin)
            Return bnFormat.Deserialize(memStream)
        End Function

    End Class
End Namespace

Notez que j’ai écrit <Serializable()> juste devant le nom de ma classe, ne me demandez pas pourquoi, sans ça ça ne marche pas, il se produit une erreur “Le type XXX n’est pas marqué comme sérialisable”.