jeudi 28 juin 2007

Handler, Context et Protocol et programmation asynchrone

Voici une façon de programmer que j'ai appris durant ma période chez Adamentium. Elle est très intéressante car elle permet une bonne mentenance du code, une bonne séparation des tâches possibles entre différents acteurs et un niveau d'interblocage du programme très faible.

Définissons ces termes et ce qu'ils impliquent.

Commençons par le dernier : la programmation asynchrone.

Ce terme indique que l'on conçoit et code son application de manière asynchrone, c'est-à-dire de manière non bloquante : une action qui lance un traitement n'attend pas qu'il se termine, mais le traitement prévient l'action qu'il est fini. C'est un peu principe utilisé dans Swing en Java : toute modification de l'interface graphique se fera le moment voulu et pas en direct au risque de geler l'application tout entière.

Cette programmation, du moins celle que je pratique, est basée sur les trois autres termes : protocol, context et handler.

Explications :
  • protocol : le protocol représente l'ensemble des données échangeables entre deux entités qui communique via ce protocol, les types de ces données et leurs règles et formats d'échanges entre deux objets.
  • handler : un handler est un objet de traitement spécifique d'un protocol donné.
  • context : le context est le conteneur d'informations obéissant au protocol que le handler reçoit à traiter.
L'avantage de ce ménage à trois est que le handler peut se trouver dans un thread différent de celui qui l'utilise étant donné que le traitement du context obéi à un protocol donné.
Ainsi on programme l'application un peu comme un ensemble de bulles indépendantes.

Checksum IP et TCP

Voici des functions permettant de faire le checksum d'entête IP et TCP.

Tout d'abord la fonction de checksum IP :

/*compute internet checksum. thanks to frameip.com*/
static unsigned short ADchecksum(unsigned short *addr, int len)
{

int nleft=len;
int sum=0;
/*short pour pouvoir prendre les données deux par deux (char => 1 byte short => 2 bytes)*/
unsigned short *w=addr;
unsigned short answer=0;

while(nleft>1){
sum+=*w++;
nleft-=2;
}
if(nleft==1){
/*cast en char pour prendre bien que le dernier octet et pas de la merde qui pourrait se trouver après*/
sum +=*((unsigned char *)w);
}
while(sum>>16){
sum = (sum>>16)+(sum & 0xffff);
}
answer=~sum;
return answer;
}



Pour le checksum tcp, il faut une pseudo entête :

/*thanks to www.frameip.com*/
struct ADpseudo_entete
{
unsigned int ip_source; // Adresse ip source
unsigned int ip_destination; // Adresse ip destination
char mbz; // Champs à 0
char type; // Type de protocole (6->TCP et 17->UDP)
unsigned short length; // htons(Entete TCP ou UDP + Data )
}ADpseudo_entete;


Ensuite la fonction de checksum elle-même :

/*compute tcp checksum. thanks to frameip.com*/
static unsigned short ADchecksum_tcp(struct iphdr *iph, struct tcphdr *tcph)
{
struct ADpseudo_entete *pseudo_tcp = malloc(sizeof(struct ADpseudo_entete));

unsigned short check = 0;

char end[2];
int data_length,pseudo_length,total_length;

pseudo_tcp->ip_source = iph->saddr;
pseudo_tcp->ip_destination = iph->daddr;
pseudo_tcp->mbz = 0;
pseudo_tcp->type = IPPROTO_TCP;

/*total length in bytes*/
total_length = ntohs(iph->tot_len) - iph->ihl*4;

pseudo_length = sizeof(struct ADpseudo_entete);
data_length = total_length - tcph->doff*4;

pseudo_tcp->length = htons(total_length);

int data_len = total_length + pseudo_length;
unsigned char donnees[data_len];

memcpy(donnees,(unsigned char*) pseudo_tcp,pseudo_length);
memcpy(donnees+pseudo_length,(unsigned char*) tcph,total_length);

check = ADchecksum((unsigned short*)donnees,data_len);
return check;
}

lundi 25 juin 2007

Pub et référencement

Voici étape par étape une procédure pour avoir un bon référencement et par la suite une bonne utilisation des Google Adwords.
  • Créer le site web :
    Privilégier les pages de textes ciblés, mettre en gras avec la balise strong les mots sur lesquels on souhaite être connu par les internautes ( keywords par la suite ), créer des liens vers des pages internes avec ces keywords
  • Enregistrer le site web :
    Avec les keywords, faire une recherche sur chaque moteur de recherche que l'on souhaite, voir les sites qui apparaissent dans les 10 premiers pages et trouver ce qui permettent de s'enregistrer pour ajouter un lien vers son site. Créer un lien vers son site avec les keywords.
  • Etudier les statistiques d'accès :
    Etudier les statistiques d'accès au site heure par heure et jour par jour, trouver les meilleurs crénaux et créer des adwords google sur ces crénaux pour les keywords en mettant comme budget total à la semaine pas plus que le total d'achat constaté par semaine sans adwords.
  • Répartir le budget sur les jours de manière pondérée :
    Un jour où il y a plus de visites verra son budget plus élevé : on espère avoir plus de clients ce jour là.
  • Affiner mois par mois :
    C'est la période minimum pour voir les effets des pubs. Plus courte, elle ne sert plus à rien car on ne tient pas compte de l'inertie de visites des internautes.

mercredi 6 juin 2007

La planification

Alors la planification, c'est essentiel quand on porte plusieurs casquettes.

Essayons de classer par ordre d'importance les éléments d'une planification utile :

  1. les jalons
  2. les réunions d'avancement
  3. les tâches longues ou d'arrière-plan
  4. les tâches instantanées

Petite explication :

1) les jalons :
Les jalons représentent les dates butoires auxquelles des livrables doivent être produit ou des tâches effectuées et ceci de manière IMPERATIVE.
On ne peut pas faire une bonne planification si on ne se pose pas des jalons qui permettent de motiver les troupes et de monopoliser les ressources au bon moment.
Toute la difficulté, c'est d'arriver à ne pas les poser trop tôt ni trop tard. Et l'une des meilleurs méthodes pour y arriver c'est de connaître son sujet et des définir les durées des tâches instantannées. Pour cela, il faut lire un bon nombre de documentation sur le projet, ce qui existe dans le monde du libre, comment ca été fait, quelles technologies ont été utilisés et planifier en considérant que les gens qui vont s'occuper du projet ont une connaissance moyenne de tout ça.

Une équation type pourrait être :

mon_temps * (nb_personnes - nb_gourou)

Les gourous je pense que c'est vital pour tout projet informatique : ces gens qui ont une connaissance presque exhaustive de tous les sujets dont le commun des mortels n'ont à peine conscience et qui plombe une discussion à un repas en parlant de leur dernière trouvaille sont des mines d'or. Et si il n'y en a aucun il faut déceler celui qui le plus de potentiel et qui est d'accord pour assumer/assurer ce rôle)

2) les réunions d'avancement :
VITAL et chaque début de semaine vers 10h.
Ca permet de faire un point sur les tâches en cours, de revoir les objectifs et les jalons et de prendre en considération l'avis des personnes. Ca valorise le travail et c'est bien.

3)
les tâches longues ou d'arrière-plan :
Si elles sont longues ou d'arrière-plan ce sont les premières que l'on oublie. Donc on les planifie en premier.

4)
les tâches instantanées :
Ce sont les différentes tâches qui permettent d'arriver à la réalisation du jalon. Utiliser la même technique de planification du temps que celle précisée au-dessus.

Bienvenue

Je travaille actuellement dans une société informatique (une start-up) qui produit des logiciels de filtrage d'internet.

Nous avons un produit pour la famille, un produit pour les entreprises et un produit pour les opérateurs téléphoniques/mobiles/adsl.

Partenariat pour être déployé sur des machines IBM, on est actuellement en discussion avec un équipementier pour équiper tout un réseau mobile en filtrage de WAP.

Et nous ne sommes que 5 développeurs.

Forcément, certains d'entre nous ont du s'adapter à plusieurs situations et revétir plusieurs casquettes.

C'est mon cas et j'ai eu envie de ne pas perdre tout ce que j'avais appris pour faire face à ces situations et à faire partager mes connaissances et expériences.

Je vais donc publier assez quotidiennement des avis, des tutoriaux, des questions sur ce blog en espérant ... pas grand chose mais peut être que ca intéresse des gens.