PROJET AUTOBLOG


Idleman

source: Idleman

⇐ retour index

In medio stat virtus

samedi 14 décembre 2013 à 10:50

Honnêtement je ne me rappelle d’où ça vient, peut être Aristote? Socrate ? Justin Bieber ?

On s’en branle, ils sont tous morts (ou du moins on aimerait), mais la maxime reste tellement vrai que j’hésite sérieusement à me la faire tatouer sur la fesse gauche.

Traduit littéralement ça doit donner un truc du genre : “la vertu est au milieu” à comprendre dans le sens :
“Le bon sens est situé aux antipodes des extrêmes”. (okay ça pète vachement plus en latin…)

C’est applicable dans tous les domaines à tout instant de votre vie et quand on y réfléchit un peu on tombe raccord avec le principe dans 99% des évènements qui se présentent.

Social : Trop gentil ? On vous marchera sur les pieds ? Trop méchant, vous finirez tous seul.
Argent : Trop radin? Votre argent ne vous profitera jamais, trop dépensier ? Vous serez sans cesse sur la brèche.
Amour : Trop présent ? Vous l’étoufferez ? Trop distant ? Elle passera a autre chose
Politique : Trop de droite ? Vous négligerez l’aspect humain, trop de gauche ? L’assisto-cratie paralysera votre économie et encouragera les citoyens à dépendre de l’état.
Religion : Trop croyant ? Vous risquez d’être ancré dans le passé, dépendant d’une doctrine, fanatique, prêchi-prêcha, mais ça sera pire si vous ne croyez en rien ni personne: plus d’ancre à laquelle s’accrocher (même inconsciemment) seul avec vous même dans les moments difficiles.
Gastronomie : Trop gourmand ? Vous devenez obèse, problèmes de santé, difficultés relationnelles… Pas assez? Vous passez a côté de l’un des plus grands plaisirs de la vie.
Personnalité : Trop timide ? Vous loupez des occasions de vous faire des amis, des amours, des jobs, des expériences… Trop confiant ? Vous n’écoutez plus que vous, ne vous remettez jamais en questions, devenez arrogant, exubérant voir horripilant.

Etc.. etc..

Sérieusement on peut l’appliquer a plein de cas même ridicules : tu recherches trop de performance sur ton application ? Ton code vas devenir hyper chiant à maintenir (et réciproquement), tu veux qu’il soit trop portable ? Tu pourras y ajouter moins de fonctionnalités, tu veux trop de fonctionnalités ? Tu vas niquer ta performance…

Tu écris des billets trop court sur ton blog, personne ne te comprends, tu en écrit des trop longs..

heuh..ben tu saoule tout le monde avec ta philosophie de comptoir…

bon…
ben bon week end alors… Rire

Bien à vous
Idle

NodeJs ~ 03 : Construction d’un mini projet (partie 1)

samedi 30 novembre 2013 à 19:47

Je voulais me lancer sur un seul tuto expliquant comment créer un petit projet mais plus j’avançais plus il y en avait à dire, aussi ai je scindé mon tuto en trois partie histoire de rendre la rédaction, comme la lecture, plus digeste.

Dans cette partie, nous allons apprendre à créer un serveur http “fonctionnel” avec nodejs et à publier un dossier web à travers ce serveur.

Si je précise “fonctionnel” c’est que, bien que notre serveur soit bien plus aboutis que les tutos de découverte
précédents, il lui manquera encore beaucoup de notions déjà existante dans les serveurs http existants.

En effet le but n’est pas de recréer un serveur http pour nodejs (nous verrons plus tard qu’il en existe déjà des tout fait parfaitement convenables comme express) mais de comprendre la logique de fonctionnement “basique” d’un serveur http tout en s’initiant à la technologie nodejs.
Notre fil conducteur sera un petit projet web qui permettra “d’échanger” du texte, des fichiers, des liens etc… entre membres d’un même groupe de travail.

Comme je suis un type sympa, je fournirais toute la partie ennuyeuse qui ne nous intéresse pas, à savoir la création et l’intégration de l’interface graphique.

Vous pouvez trouver cette interface ICI.

Bien, nous avons notre dossier web, créons maintenant un serveur qui tiens la route !! :)

La structure du projet

Commençons par créer notre dossier projet :

Notre projet vas s’appeler hi! (c’est plus court que hello world) et vas se diviser en deux parties : le serveur http à proprement parler et le dossier de publication www dans lequel vas se trouver notre site web

image

Tout le code serveur sera donc placé dans server.js, conf.json permettra de stocker les constantes de configuration de ce dernier, 404.html sera un exemple d’erreur http, et le contenu du dossier www sera notre projet web (que je vous ai fournis ci dessus).

On retrouve les dossiers habituel d’un site web : css qui contiendra les fichiers de styles css, font qui contiendra les polices (ben oui on vas pas bosser en arial on a quand même plus de classe que ça) un dossier img pour (taddaaaa) les images !! Un dossier js pour le javascript. blablablah!!

Je ne m’étendrais pas sur le squelette en question, je part du principe que vous avez déjà des notions de javascript/css/html/ajax bref le b.a.-ba du site web, le but étant ici de nous concentrer sur nodejs.

La création du serveur

Nous allons créer un “équivalent” d’apache/lighttpd/nginx ou autre en plus light évidemment) que nous avons évoqué en tuto #1 (d’ailleurs j’en profiterais pour donner la réponse à l’énigme de l’image in-affichable Tire la langue)

On vas commencer par le serveur, ouvrons la page server.js et créons notre serveur http comme nous l’avons vu en tuto 1 avec tout de même quelques améliorations

Inclusion de la librairie http permettant de créer un serveur web

http = require('http');

Récupération de la librairie url qui facilite l’analyse de l’url des requêtes reçues

url = require('url');

Récupération de la librairie fs qui permet la gestion de fichiers (écriture, lecture…)

fs = require('fs');

Création d’un serveur http sur un port pris totalement au hasard, le 69.

var httpServer = http.createServer(onRequest);
httpServer.listen(69);

On ne prends pas le port 80 pour une raison pratique : il est souvent déjà pris pas un wamp, un apache ou n’importe quoi d’autre qui tourne sur votre machine.

Dès qu’une requête est reçu sur 127.0.0.1:69, la fonction onRequest (que nous allons écrire) est exécutée et prends pour paramètres un objet requête (ce qui est reçu) et un objet réponse (ce que le serveur vas retourner).

Écrivons maintenant la fonction onRequest qui vas faire tout le boulot de traitement du serveur :

function onRequest(request, response) {

On récupère l’url requise et on la parse pour n’avoir que la partie qui nous intéresse

var pathname = url.parse(request.url).pathname;

On récupère l’extension du fichier requis (html,css,js,jpg…)

var extension = pathname.split('.').pop();

Si l’utilisateur ne spécifie pas de page dans la barre d’adresse, on prend l’index par défaut :’index.html’

if(pathname=='/') pathname = "index.html";

On définis l’entête de réponse au code 200 signifiant : “succès de la requête” et on vas également définir le type mime du fichier de retour (image/jpg pour un jpg, text/css pour un css etc..)

En effet c’est pour cette raison que notre image ne s’affichait pas en tutos 1, car nous tentions de la retourner au format text/hml, chaque fichier publié par notre serveur doit impérativement signaler
son type de contenu au client (le navigateur) sans quoi celui ci sera mal interprété.

On vas donc créer un petit tableau json contenant quelques types mimes que nous allons utiliser :

var mime = {
"css" : "text/css",
"gif" : "image/gif",
"jpg" : "image/jpeg",
"jpeg": "image/jpeg",
"js" : "application/javascript",
"ttf" : "font/ttf",
"png" : "image/png"
}

On retournera donc le bon type mime en fonction de l’extension du fichier, ainsi qu’un code d’en-tête “200″ signifiant que la requête s’est déroulée sans erreur :).

response.writeHead(200, {'Content-Type': mime[extension]});
try {

On tente de lire le contenu du fichier demandé (en ajoutant la racine du dossier client : “www” ) et on le retourne à l’utilisateur

response.end(fs.readFileSync("./www/" + pathname));
}catch(e){

Si la lecture du fichier à échouée on renvoie un code d’erreur 404

response.writeHead(404, {'Content-Type': 'text/html'});

on affiche le contenu de la page 404.html

response.end(fs.readFileSync('404.html'));
}
}

Notre serveur est terminé, nous pouvons dès à présent le lancer!!

Hey mais t’oublis la ptite page 404 que tu appelle en cas d’erreur!! 

C’était pour voir si vous suiviez ! :D

Donc on vas se créer une petite page 404.html au même niveau que le fichier server.js (inutile de la mettre dans le dossier www, c’est une page utilisée par le serveur) :

404.html

<h1>Erreur 404 - Fichier non trouvé</h1>
<p>Pas de bol, réessayez sans les moufles :D</p>

On fait sobre sur ce coup la, parce qu’on s’en fou un peu de la 404 et qu’on veux tester notre serveur :p.

Nous voila enfin avec un serveur opérationnel !

Attends la tu ne vas pas nous laisser avec toutes ces constantes dégueulasses en dur dans le code ?!!!

Okay okay, on vas faire un ptit fichier de config pour stoker tout ça :p, mais c’est vraiment parce que c’est vous (et parce que c’est hyper simple à faire en node :p)

On créé un fichier conf.json au même niveau que “server.js”, dans ce fichier on vas mettre les constantes (numéro de port du serveur, types mimes etc…) au format json :

conf.json

{
"http" :  {
"index": "index.html",
"port": 69,
"www": "./www/",
"mime": {
"css" : "text/css",
"gif" : "image/gif",
"jpg" : "image/jpeg",
"jpeg": "image/jpeg",
"js"  : "application/javascript",
"ttf"  : "font/ttf",
"png" : "image/png"
},
"error" : {
"404" : "404.html"
}
}
}

Et maintenant on vas inclure ce fichier de conf dans notre server.js le plus simplement du monde :

conf = require('./conf.json');

on peut alors se servir de notre objet json de conf dans l’ensemble du serveur :

//Récupération de nos configuration personnalisées
conf = require('./conf.json');
//Inclusion de la librairie http permettant de créer un serveur web
http = require('http');
//Récupération de la librairie url qui facilite l'analyse de l'url des requêtes reçues
url = require('url');
//Récupération de la librairie fs qui permet la gestion de fichiers (écriture, lecture...)
fs = require('fs');

//Création d'un serveur http sur le port spécifié dans conf.json (section http)
//Dès qu'une requête est reçu sur 127.0.0.1:port, la fonction onRequest est exécutée
//et prends pour paramètre un objet requête (ce qui est reçu) et un objet réponse (ce que le serveur vas retourner)
var httpServer = http.createServer(onRequest).listen(conf.http.port);

//Fonction onRequest est exécutée à chaque requête sur le serveur
function onRequest(request, response) {
//On récupère l'url requise et on la parse pour n'avoir que la partie qui nous intéresse
var pathname = url.parse(request.url).pathname;
//On récupère l'extension du fichier requis (html,css,js,jpg...)
var extension = pathname.split('.').pop();
//Si l'utilisateur ne spécifie pas de page, on prend l'index par défaut 'index.html' (spécifié dans conf.json)
if(pathname=='/') pathname = conf.http.index;
//On définis l’entête de réponse au code 200 signifiant : "succès de la requete" et
//on définit le type mime du fichier de retour (image/jpg pour un jpg, text/css pour un css etc..)
//Les types mimes sont définit dans le fichier json conf.
response.writeHead(200, {'Content-Type': conf.http.mime[extension]});
try {
//On lit le contenu du fichier demandé (en ajoutant la racine www spécifiée dans conf.json)
//et on le retour a l'utilisateur
response.end(fs.readFileSync(conf.http.www + pathname));
}catch(e){
//Si la lecture du fichier à échouée on renvoie un code d'erreur 404
response.writeHead(404, {'Content-Type': 'text/html'});
//on affiche le contenu de la page 404.html (chemin spécifiée dans conf.json)
response.end(e+fs.readFileSync(conf.http.error['404']));
}
}

Les tests

On peut enfin tester notre serveur, ouvrons une console de commande et tapons :

cd /chemin/vers/notre/dossier/hi
node server.js

(nb: sous windows vous devrez d’abord taper la lettre du lecteur ou se trouve votre dossier hi, si votre dossier se trouve sur d:\dev\hi! il vous faudra taper “d:” puis cd d:\dev\hi! et enfin node server.js).

nb2: Si vous avez un pare-feu, il est possible que celui ci vous demande si vous voulez débloquer le serveur que vous venez de lancer, vous devez évidemment répondre oui.

Si tout se passe bien la console ne devrait pas être très bavarde, elle se contentera de faire un saut de ligne mais votre serveur sera bien actif, ouvrez un navigateur et tapez l’adresse :

http://127.0.0.1:69

Et tattaaa! Vous arrivez sur notre magnifique squelette de site web avec le css et les images correctement chargées.

Captured

 

Pour stopper le serveur vous pouvez fermer la console ou appuyer sur ctrl+C deux fois (du moins sous Windows, sous linux je ne sais pas).

Pour ceux qui ont loupés un épisode voila les sources complètes ICI

Les améliorations

C’en est finit pour ce tuto, notez bien que nous n’avons fait que parcourir la surface du fonctionnement d’un serveur web, il manque de nombreuses améliorations à apporter, notamment des notions de sécurité et de nombreuses fonctionnalités “classiques” :

Etc..etc… et le plus important : gestion des préprocesseurs, en effet nous retournons la sources de chaque fichier sans la traiter auparavant, ce qui rend impossible l’inclusion de code exécuter coté serveur directement sur nos pages du dossier www.

Ce qui pour le coup nous oblige à mélanger du code applicatif et du code serveur dans le même fichier, ce n’est évidemment pas l’idéal.

Nous pourrions développer cette partie, il suffit de créer une fonction qui traite la source avant de la retourner et qui utilise les expression régulière pour exécuter le code entre <?js et ?> coté serveur par exemple :),  mais ça prendrais un temps monstrueux pour très
peu d’intérêt, d’autant qu’il existe déjà de nombreuses librairies qui s’en chargent, pour cette série de tutos nous nous cantonnerons donc à notre serveur de fortune :), pour les vrai site de production, on verra ensemble comment installer express et deux trois autres librairies indispensables.

NodeJs ~ 1,5 : Installation sous windows

mardi 19 novembre 2013 à 17:54

Ce tutoriel fait partie d’une série, cliquez ici pour accéder au sommaire.

Avant d’aller plus loin dans le tutos nodejs, il me semble pertinent de glisser un mini tuto concernant son installation sur Windows.

Notez que n’ayant rien contre Windows, je suis encore régulièrement dessus et donc que les prochains screen de tutos  seront en conséquences sous Windows, cependant la console NodeJs est identique sous tous les systèmes d’exploitation pour les linuxiens qui suivent ces tutos.

Nb : L’installation sous linux est disponible en tuto 1

Installons

Premièrement, installer le serveur Nodejs, pour cela, filez sur sur le site de nodejs puis cliquez sur le gros bouton install :

image

Si vous êtes bien sur Windows, un .msi devrait être téléchargé, cliquez sur celui ci pour lancer l’installation.

Une fois NodeJs installé, ouvrez une ligne de commande Windows  et tapez “node”, si vous n’avez pas d’erreur, c’est que NodeJs est bien installé.

image

Erreur de PATH

Si vous avez une erreurs de type “node’ n’est pas reconnu en tant que commande interne” c’est que le msi à mal installé la variable d’environnement
NodeJs , pas de panique c’est très simple à faire manuellement :

Récupérez le chemin vers votre installation de NodeJs : chez moi c’est C:\Program Files\nodejs\

Puis cliquez sur

Menu démarrer –> clic droit sur ordinateur –> propriété –> paramètres systèmes avancé –> variables d’environnements

Dans la Variable Path, ajoutez le chemin vers le dossier d’installation NodeJs (pour moi C:\Program Files\nodejs\) pensez au ‘;’ pour séparer le chemin NodeJs des autres chemins déjà dans la variable PATH.

C’est tout ! C’était rapide et sans douleur n’est ce pas ? Ne vous inquiétez pas vous allez d’avantage souffrir dans les prochains tutos (c’est une promesse, vous pisserez du sang par les narines, mais c’est pour votre bien :p).

Notez que l’installateur de NodeJs, dans sa grande sagesse, vous a également installé “npm” aussi nommé “node package manager” qui comme son nom l’indique est un gestionnaire de paquets pour node que nous allons  utiliser tout au long des prochains tutos.

Snippet #24 ~ PHP: Allégez vos classes avec des get/set automatiques

mardi 19 novembre 2013 à 17:17

Lorsque l’on programme en orienté objet sous php, il est courant d’utiliser des objets comme simple “conteneur” d’information, ce qu’en java on appel les POJO (Plain Old Java Object) mais que je me refuse à appeler POPO en PHP pour des raisons plus qu’évidentes :D !

Bref, ces objets ont donc une tripotée d’attributs (souvent privés) auxquels nous avons besoin d’accéder
via des méthodes comme getAttribut1(), setAttribut1(), getAttribut2…

Créer ces méthodes peut être très contraignants et alourdir le code de la classe pour pas grand chose.

Prenons pour exemple une classe utilisateur avec une tripotée d’attribut :

Class User{

private $name,$firstname,$town,$phone,$sex,$hobbies,$avatar,$login,$password,$rank,$state,$fax,$cellphone,$mail;

}

 

Afin d’accéder à ces attributs privés, il vas falloir créer les méthodes get et set pour chacune d’elles soit 2 méthodes par attribut
d’environ 3 lignes pour 14 attributs vous vous retrouvez déjà avec 84 lignes dans la vue simplement pour accéder à vos attributs.

Aussi voiçi un petit snippet permettant de générer dynamiquement ces méthodes (souvent appelées “accesseurs” ou “getter et setter“)
avec une seule méthode de 3 lignes utilisant la fonction magique de php : __call()

Class User{

private $name,$firstname,$town,$phone,$sex,$hobbies,$avatar,$login,$password,$rank,$state,$fax,$cellphone,$mail;

    function __call($m,$p) {
            $v = strtolower(substr($m,3));
            if (!strncasecmp($m,'get',3))return $this->$v;
            if (!strncasecmp($m,'set',3)) $this->$v = $p[0];
    }
}

Vous pourrez alors appeler et définir vos attributs comme si vous aviez tapé les 84 lignes d’accesseurs :

$user = new User();
$user->setName('CARRUESCO'); // Définis  $name = CARRUESCO
echo $user->getName(); // Affiche $name donc affiche CARRUESCO

L’avantage étant que ce snippet ne s’active que si la méthode n’existe pas déjà, aussi
si vous souhaitez créer une méthode getName dans votre classe qui effectue des opérations sur le nom
avant de le retourner :

public function getName(){
    return strtoupper($this->name);
}

Cette fonction sera prise en priorité par la classe.

Le revers de la médaille

Et oui, le petit soucis avec ces snippet, c’est que vos attributs ne sont plus vraiment privés,
puisqu’il sont automatiquement accessibles depuis le snippet, dans certains cas
ça peut être chiant, aussi je vous conseille d’ajouter une petite clause pour définir
les attributs qui ne pourront pas être appelés de cette façon:

Class User{

private $name,$firstname,$town,$phone,$sex,$hobbies,$avatar,$login,$password,$rank,$state,$fax,$cellphone,$mail;
private $private = array('private','rank','avatar');

    function __call($m,$p) {
            $v = strtolower(substr($m,3));
            if (!strncasecmp($m,'get',3) && !in_array($v,$this->private))return $this->$v;
            if (!strncasecmp($m,'set',3) && !in_array($v,$this->private)) $this->$v = $p[0];
    }
}

Dans ce code, tous les attributs seront accessibles en get/set, exceptés $private,$rank et $avatar

Si vous aussi vous avez des ptites techniques pour réduire la taille des classes, lâchez vous dans les commentaires :)

 
Edit: Je profite des débats lancés dans les commentaires pour donner mon point de vue :) (c’est qu’ils
ont l’esprit critiques mes idlenautes :p)

Pourquoi ne pas utiliser les fonction __get et __set ?

Pourquoi utiliser deux fonctions d’accession de 4 lignes chacune quand une seule fonction __call suffit ? :)

Mais sans même tenir compte de la taille, __get et __set ont, selon mon opinion, un gros inconvénients : il n’est pas possible
de définir la forme d’appel. En effet __get et __set appelleront les attributs uniquement sous la forme

$object->attribut = 'toto'

 

Quand la fonction __call permettra (entre autres) de créer les appels sous forme de méthode :

$object->setAttribut('toto');

 

Outre le fait que certains développeurs (dont je fait partie) puissent trouver ça plus harmonieux, c’est aussi plus utile,
l’appel au format méthode permet :

De dissocier un appel d’attribut potentiellement traité d’un appel d’attribut “brut”
De ne pas croire que l’attribut est public (la forme $object->attribut = ‘toto’ pouvant porter à confusion).
Et plus important : de changer l’accessibilité ou le mode de traitement de l’attribut du jour au lendemain sans voir à faire de modifications sur le reste du code

Pourquoi ne pas tous simplement placer tous les attributs en public ?

Cela revient à demander “quel est l’intérêt de mettre les attributs en privés ?”, effectivement il est tout à fait possible de mettre
les attributs en public, cela peut même paraître plus judicieux de prime abord, mais peut causer de gros problèmes lors de la maintenance et
de l’évolutivité du code.

Prenons comme exemple notre classe utilisateur, à l’origine l’attribut
$ville est un string, on effectue aucun traitement dessus, donc on décide de le mettre en public pour y accéder de la manière suivante:

echo $object->ville; //Affiche 'Gradignan';

 

Cela fonctionne parfaitement sans avoir besoin d’accesseur jusqu’au jour ou l’on décide que $ville sera plutot un id faisant référence à une table de ville.

echo $object->ville; //Affiche 8;

 

On souhaite donc effectuer un traitement sur la donnée $ville avant affichage pour obtenir son nom et non son id ce qui permettrait de ne pas avoir à modifier
tous les appels sous la forme $object->ville de l’application, et zut ! Ce n’est plus possible ! Car l’attribut est appelé
directement, aucun traitement n’est possible. On est donc obligé de modifier toutes les formes d’appel de l’application pour passer par une méthode, ce qui revient à taper tout les
accesseurs, ou à utiliser des fonctions magiques comme __call, __get et __set.

En résumé, l’utilisation d’accesseurs en temps que “wrapper” sur des attributs privés devrait à mon sens TOUJOURS être utilisée même dans
le cas ou ce wrapper ne fait à l’origine du projet que retourner l’attribut ou le setter sans traitement préalable, wrapper les attributs
permet une meilleure maintenance évolutive sur ces derniers car il est possible d’effectuer un traitement sur la donnée (ce qui n’est pas
le cas sur un appel d’attribut public) sans avoir à modifier l’ensemble du script, d’ou l’utilité des accesseurs en lieu et place des accès direct d’attributs.

 

Plume, mon nouveau wiki expérimental

lundi 4 novembre 2013 à 07:00

Après présentation de ghost ça fait un peu redondant (voire petit joueur) mais je voulais partager ici ma modeste contribution au monde du wiki.

En effet, après plusieurs années d’utilisation de Blazekiss, j’ai souhaité tenter un wiki from scratch dans la même veine que KISS mais remis au gout du jour à l’aide de techno CSS3 et HTML5 ainsi que quelques concepts “à la mode” parfois bien pratiques (okay pour certains, c’est gadget mais faut bien que je me fasse plaisir de temps en temps).

image

On peut notamment y trouver les principes suivants :

Le script est en revanche mono utilisateur et uniquement compatible sur les navigateurs dignes de ce nom (firefox, chrome …), j’aimerais l’utiliser surtout comme un outil de recherche, afin d’y publier mes pistes et mes bidouilles simplement.

image

Je pense pousser l’aspect stockage et publication de documents multimédias (images, vidéos, sons, codes, PDF…) qui sont trop peu évolués à mon sens sur les scripts existants (processus d’upload lourd et publication limitée souvent à une simple proposition de téléchargement).  J’aimerais aussi proposer un système de partage de mots clés permettant aux wikis Plume traitants de sujets de recherche similaires de se rapprocher, c’est encore au stade d’idée mais je pense qu’il y a moyen de faire des connexions entre les “chercheurs”, histoire de créer naturellement des groupes de recherche, ce serait une sorte de “matchmaker” de plume, mais je me tâte (et c’est assez agréable) sur le bien-fondé de cette idée, qu’en pensez-vous ? :)

L’installation, l’utilisation et le téléchargement de la béta sont dispos sur la page github de Plume.

Ce projet est évidemment secondaire, je  ne compte pas me mettre en mode hamster dessus, mes priorités restant leed, yana et dropcenter, mais si vous souhaitez donner un coup de patte dessus, histoire de faire avancer d’avantage le projet, n’hésitez pas à faire vos pull request sur le dépôt.

Bien à vous.

I.