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”.



Mesurer l’intensité du signal wifi sur Mac avec iStumbler

20 11 2011

Si vous utilisez un ordinateur Apple, vous aurez sans doute remarqué que la petite icône Wifi en forme de quart de cercle dans la barre du Finder, à côté de l’heure, affiche un peu n’importe quoi.

Parfois elle affiche entièrement en noir, comme si le signal était d’excellente qualité, puis vous vous déconnectez, et là impossible de se reconnecter, signal trop faible.

Heureusement, il éxiste une petite application très sympathique qui permet justement d’afficher l’intensité des réseaux wifi que vous captez, ça s’appelle iStumbler et ça se télécharge ici.



Headers PHP utiles

11 11 2011

Si vous utilisez le langage PHP, vous êtes sans doute amenés de temps à autre à définir des headers.

Voici donc une petite liste de headers avec parfois la version sans charset (ANSI par défaut), et la version Unicode UTF-8 :

<?php
# Header PHP JSON
header('Content-type: application/json');
header('Content-type: application/json; charset=utf-8');

# Header PHP Texte brut
header('Content-Type: text/plain');
header('Content-Type: text/plain; charset=utf-8');

# Header PHP HTML
header('Content-type: text/html');
header('Content-type: text/html; charset=utf-8');

# Header PHP CSS
header('Content-type: text/css');

# Header PHP Image JPEG
header('Content-Type: image/jpeg');

# Header PHP XML
header('Content-Type: text/xml');
header('Content-Type: text/xml; charset=utf-8');
?>

Enjoy ;)