Accueil > > > CODE DE HAMMING (4,8) : TRANSMISSION DE DONNÉES SANS ERREUR [CONSOLE]
CODE DE HAMMING (4,8) : TRANSMISSION DE DONNÉES SANS ERREUR [CONSOLE]
Information sur la source
Description
Les données ne sont pas assurées contre leur éventuelle modification lors du transport. Cela présente un risque du point de vue de l'intégrité des informations. L'astuce de la méthode est de découper les données en blocs (de 4 bits) qui seront transformés en blocs de 8 bits. Le HammingIn fait donc 4 bits et le HammingOut 8 bits. Le HammingOut est constitué des 4 bits du HammingIn suivis de 4 bits de controle d'intégrité. Le transport a alors lieu, les données se modifient et on récupère un flux de paquets de 8 bits. A chaque captation, par une méthode en XOR, on extrait une empreinte caractéristique qui permet de retrouver le bit modifié dans le paquet. Il suffit alors de corriger le paquet, et on refait l'opération. Mais si la signature est vide, alors le paquet offre ses 4 premiers bits en guise de message et de proche en proche s'effectue un rappatriement de données avec correction du signal. Bien que rudimentaire sur 4 bits, la méthode reste la même sur de plus gros bitages. Mais quoi qu'il en soit, c'est vraiment surprenant. Pour d'autres explications, j'ai après cherché quelques liens, si cela peut intéresser. Des explications pour les goûts : http://cermics.enpc.fr/polys/oap/node52.html htt p://www.irisa.fr/armor/lesmembres/cousin/Enseignem ent/Reseaux-generalites/Cours/3-2.htm http://mathw orld.wolfram.com/HammingCode.html http://www.ee.un b.ca/tervo/ee4253/hamming.htm http://web.usna.navy .mil/~wdj/book/node123.html http://www.mth.pdx.edu /~caughman/thesis.pdf#search='hamming code'
Source
- program Hamming;
- uses SysUtils;
-
- (* ========================================================= *)
- (* *)
- (* Méthode de Hamming: transmission de données sans erreur *)
- (* © Tanguy Altert, http://altert.family.free.fr/ *)
- (* *)
- (* Août 2005 *)
- (* *)
- (* ========================================================= *)
-
- {$APPTYPE Console}
-
- const BPower : array[0..7] of byte = (1, 2, 4, 8, 16, 32, 64, 128);
- BinChar : packed array[boolean] of char = '01';
- Separator = '=============================================';
-
- type THData = string[8];
-
- var Texte : string;
-
- Orn : byte;
- BinMem : string;
- BinBuff : string;
- BinDump : string;
- BinHamg : string;
-
- ModifCount : integer;
-
- HammingIn : array[1..4] of boolean;
- HammingOut : array[1..8] of boolean;
-
- idx, pw : integer;
- bool : boolean;
- s : string;
- WillRepair : boolean;
-
- (***************************************************************************)
- (* Cette partie simule un correspondant distant recevant les données. *)
- (* Le corps principal du programme n'est pas censé pouvoir modifier *)
- (* directement les variables suivantes (d'où l'utilisation de procédures *)
- (* telles que SetRepair. Cela simule des conversations sur un réseau. *)
-
- var PackCount, ErrorCount : integer;
- HMsg : string;
- DoRepair : boolean;
-
- procedure RevTransf;
- begin
- HammingIn[1]:=HammingOut[1] xor HammingOut[2] xor HammingOut[5];
- HammingIn[2]:=HammingOut[3] xor HammingOut[4] xor HammingOut[6];
- HammingIn[3]:=HammingOut[1] xor HammingOut[3] xor HammingOut[7];
- HammingIn[4]:=HammingOut[2] xor HammingOut[4] xor HammingOut[8];
- end;
-
- procedure SetRepair(State:boolean);
- begin
- DoRepair:=State;
- end;
-
- procedure Init;
- begin
- PackCount:=0;
- ErrorCount:=0;
- DoRepair:=false;
- HMsg:='';
- end;
-
- procedure Send(Data:THData);
- var Sgn : byte;
- EBit : byte;
- i : integer; //la variable de boucle doit être locale
- label ReCheck;
- begin
- inc(PackCount);
-
- //CONVERTISSONS LE SIGNAL REÇU EN TABLEAU DE BOOLÉENS
- for i:=1 to 8 do
- HammingOut[i]:= Data[i]='1';
-
- ReCheck:
- RevTransf;
-
- //REPÉRONS LA SIGNATURE (EN BINAIRE INVERSÉ)
- Sgn:=0;
- for i:=1 to 4 do
- Sgn:=Sgn+ Ord(HammingIn[i]) * BPower[i-1];
-
- //CORRECTION DU SIGNAL [1, 2, 4, 8, 16, 32, 64, 128]
- case Sgn of
- 0 {0000}: EBit:=0; //le signal est OK !
- 1 {1000}: EBit:=5;
- 2 {0100}: EBit:=6;
- 4 {0010}: EBit:=7;
- 5 {1010}: EBit:=1;
- 6 {0110}: EBit:=3;
- 8 {0001}: EBit:=8;
- 9 {1001}: EBit:=2;
- 10 {0101}: EBit:=4;
- else EBit:=0; //pas de correction possible
- end;
-
- if EBit>0 then
- begin
- inc(ErrorCount);
- WriteLn(' Erreur sur le bit N°',EBit,' du paquet N°',PackCount,' envoyé');
- if DoRepair then
- begin
- HammingOut[EBit]:=not HammingOut[EBit]; //le HammingIn a juste servi comme détecteur d'erreur et pas comme le décompilé du HammingOut
- goto ReCheck;
- end;
- end;
-
- //MÉMORISATION DU PAQUET
- for i:=1 to 4 do
- HMsg:=HMsg+ BinChar[HammingOut[i]];
- end;
-
- procedure Final;
- var i : integer;
- begin
- WriteLn('Le correspondant a reçu ',PackCount,' paquets, soit ',8*PackCount,' bits.');
- case ErrorCount of
- 0: WriteLn('Aucune erreur n''a été détectée.');
- 1: WriteLn(ErrorCount,' erreur a été détectée.');
- else WriteLn(ErrorCount,' erreurs ont été détectées.');
- end;
- WriteLn;
- WriteLn('Le message binaire reçu est :');
- WriteLn(HMsg);
- WriteLn;
- WriteLn('Il correspond au message original suivant :');
-
- //ON DECODE LE DUMP BINAIRE
- BinBuff:=HMsg;
- Texte:='';
- repeat
- BinMem:=Copy(BinBuff,1,8);
- Orn:=0;
- for i:=1 to 8 do
- Orn:=Orn + BPower[i-1]*StrToInt(BinMem[i]);
- Texte:=Texte + Chr(Orn);
- Delete(BinBuff,1,8);
- until BinBuff='';
- WriteLn(Texte);
- end;
-
- (* *)
- (* *)
- (* *)
- (**************************************************************************)
-
- label ReDo;
- begin
- //TITRE
- WriteLn('Méthode de Hamming : transmission de données sans erreur');
- WriteLn(Separator);
- WriteLn;
-
- //SAISIE DU TEXTE
- ReDo:
- SetRepair(false);
- WriteLn('Saisissez le texte à transmettre virtuellement :');
- ReadLn(Texte);
-
- //DUMP BINAIRE
- BinDump:='';
- for idx:=1 to Length(Texte) do
- begin
- Orn:=Ord(Texte[idx]);
- for pw:=0 to 7 do
- BinDump:=BinDump + BinChar[Orn and BPower[pw]>0];
- //ATTENTION: c'est un dump binaire inversé, c'est à dire que 2^0 se trouve à gauche et 2^7 à droite
- end;
- WriteLn;
- WriteLn(Separator);
- WriteLn('L''anti-dump binaire associé est :');
- WriteLn(BinDump);
-
- //TRAITEMENT DU SIGNAL
- BinHamg:='';
- BinBuff:=BinDump;
- repeat
- //on traite les données par 4 bits (c'est pourquoi on a dumpé en binaire)
- BinMem:=Copy(BinBuff,1,4);
- for idx:=1 to 4 do
- HammingIn[idx]:= BinMem[idx]='1';
-
- //transformation mathématique
- HammingOut[1]:=HammingIn[1];
- HammingOut[2]:=HammingIn[2];
- HammingOut[3]:=HammingIn[3];
- HammingOut[4]:=HammingIn[4];
- HammingOut[5]:=HammingIn[1] xor HammingIn[2];
- HammingOut[6]:=HammingIn[3] xor HammingIn[4];
- HammingOut[7]:=HammingIn[1] xor HammingIn[3];
- HammingOut[8]:=HammingIn[2] xor HammingIn[4];
-
- //constitution du signal de sortie et effacement du premier paquet de 4 bits situé au début
- for idx:=1 to 8 do
- BinHamg:=BinHamg + BinChar[HammingOut[idx]];
- Delete(BinBuff,1,4);
- until BinBuff='';
-
- WriteLn;
- WriteLn('Le signal de Hamming associé est :');
- WriteLn(BinHamg);
-
- //Naturellement, le dump de Hamming est deux fois plus lourd que le dump binaire.
- //Il reste quand même un avantage: il est possible de réparer le signal s'il y a
- //des erreurs, ce que ne permet pas un simple dump binaire.
-
- //POSSIBILITE DE MODIFIER LE DUMP
- WillRepair:=false;
- WriteLn;
- WriteLn('Le but de ce code est de détecter les erreurs de transmission.');
- WriteLn('Vous pouvez modifier quelques bits de Hamming, mais vous allez');
- WriteLn('vous faire griller lors de la réception (sauf s''il y a');
- WriteLn('compensation des erreurs)...');
- WriteLn;
- Write ('Voulez-vous modifier des bits ? (oui/non) ');
- ReadLn(s);
- if LowerCase(s)='oui' then
- begin
- WriteLn;
- WriteLn('Tapez "-1" pour arrêter. Sachez qu''il y a ',Length(BinHamg),' bits dans le message...');
- ModifCount:=0;
- bool:=false;
- repeat
- Write(' Bit N°');
- ReadLn(idx);
- if (idx=-1) or (idx>Length(BinHamg)) then
- bool:=true
- else
- begin
- BinHamg[idx]:=BinChar[not boolean(StrToInt(BinHamg[idx]))];
- inc(ModifCount);
- end;
- until bool;
- WriteLn;
- WriteLn(ModifCount,' bits du signal ont été modifiés...');
- WriteLn;
- WriteLn(Separator);
- WriteLn('Le signal de Hamming est maintenant celui-ci :');
- WriteLn(BinHamg);
-
- if ModifCount>0 then
- begin
- WriteLn;
- WriteLn('Vous avez la possibilité d''activer le correcteur d''erreur.');
- Write ('Souhaitez-vous le faire ? (oui/non) ');
- ReadLn(s);
- WillRepair:= LowerCase(s)='oui';
- end;
- end;
-
- //ENVOI DU MESSAGE
- WriteLn;
- WriteLn(Separator);
- Init;
- SetRepair(WillRepair);
- BinBuff:=BinHamg;
- repeat
- Send(Copy(BinBuff,1,8));
- Delete(BinBuff,1,8);
- until BinBuff='';
-
- //FINALISATION DU TRAITEMENT ET PURGE DE LA MEMOIRE
- WriteLn;
- WriteLn(Separator);
- Final;
- BinMem:='';
- BinBuff:='';
- BinDump:='';
- BinHamg:='';
-
- //POSSIBILITE DE RECOMMENCER
- WriteLn;
- WriteLn(Separator);
- Write('Souhaitez-vous recommencer ce test très convaincant ? (oui/non) ');
- ReadLn(s);
- if LowerCase(s)='oui' then
- begin
- for idx:=1 to 5 do
- WriteLn;
- goto ReDo;
- end;
- end.
program Hamming;
uses SysUtils;
(* ========================================================= *)
(* *)
(* Méthode de Hamming: transmission de données sans erreur *)
(* © Tanguy Altert, http://altert.family.free.fr/ *)
(* *)
(* Août 2005 *)
(* *)
(* ========================================================= *)
{$APPTYPE Console}
const BPower : array[0..7] of byte = (1, 2, 4, 8, 16, 32, 64, 128);
BinChar : packed array[boolean] of char = '01';
Separator = '=============================================';
type THData = string[8];
var Texte : string;
Orn : byte;
BinMem : string;
BinBuff : string;
BinDump : string;
BinHamg : string;
ModifCount : integer;
HammingIn : array[1..4] of boolean;
HammingOut : array[1..8] of boolean;
idx, pw : integer;
bool : boolean;
s : string;
WillRepair : boolean;
(***************************************************************************)
(* Cette partie simule un correspondant distant recevant les données. *)
(* Le corps principal du programme n'est pas censé pouvoir modifier *)
(* directement les variables suivantes (d'où l'utilisation de procédures *)
(* telles que SetRepair. Cela simule des conversations sur un réseau. *)
var PackCount, ErrorCount : integer;
HMsg : string;
DoRepair : boolean;
procedure RevTransf;
begin
HammingIn[1]:=HammingOut[1] xor HammingOut[2] xor HammingOut[5];
HammingIn[2]:=HammingOut[3] xor HammingOut[4] xor HammingOut[6];
HammingIn[3]:=HammingOut[1] xor HammingOut[3] xor HammingOut[7];
HammingIn[4]:=HammingOut[2] xor HammingOut[4] xor HammingOut[8];
end;
procedure SetRepair(State:boolean);
begin
DoRepair:=State;
end;
procedure Init;
begin
PackCount:=0;
ErrorCount:=0;
DoRepair:=false;
HMsg:='';
end;
procedure Send(Data:THData);
var Sgn : byte;
EBit : byte;
i : integer; //la variable de boucle doit être locale
label ReCheck;
begin
inc(PackCount);
//CONVERTISSONS LE SIGNAL REÇU EN TABLEAU DE BOOLÉENS
for i:=1 to 8 do
HammingOut[i]:= Data[i]='1';
ReCheck:
RevTransf;
//REPÉRONS LA SIGNATURE (EN BINAIRE INVERSÉ)
Sgn:=0;
for i:=1 to 4 do
Sgn:=Sgn+ Ord(HammingIn[i]) * BPower[i-1];
//CORRECTION DU SIGNAL [1, 2, 4, 8, 16, 32, 64, 128]
case Sgn of
0 {0000}: EBit:=0; //le signal est OK !
1 {1000}: EBit:=5;
2 {0100}: EBit:=6;
4 {0010}: EBit:=7;
5 {1010}: EBit:=1;
6 {0110}: EBit:=3;
8 {0001}: EBit:=8;
9 {1001}: EBit:=2;
10 {0101}: EBit:=4;
else EBit:=0; //pas de correction possible
end;
if EBit>0 then
begin
inc(ErrorCount);
WriteLn(' Erreur sur le bit N°',EBit,' du paquet N°',PackCount,' envoyé');
if DoRepair then
begin
HammingOut[EBit]:=not HammingOut[EBit]; //le HammingIn a juste servi comme détecteur d'erreur et pas comme le décompilé du HammingOut
goto ReCheck;
end;
end;
//MÉMORISATION DU PAQUET
for i:=1 to 4 do
HMsg:=HMsg+ BinChar[HammingOut[i]];
end;
procedure Final;
var i : integer;
begin
WriteLn('Le correspondant a reçu ',PackCount,' paquets, soit ',8*PackCount,' bits.');
case ErrorCount of
0: WriteLn('Aucune erreur n''a été détectée.');
1: WriteLn(ErrorCount,' erreur a été détectée.');
else WriteLn(ErrorCount,' erreurs ont été détectées.');
end;
WriteLn;
WriteLn('Le message binaire reçu est :');
WriteLn(HMsg);
WriteLn;
WriteLn('Il correspond au message original suivant :');
//ON DECODE LE DUMP BINAIRE
BinBuff:=HMsg;
Texte:='';
repeat
BinMem:=Copy(BinBuff,1,8);
Orn:=0;
for i:=1 to 8 do
Orn:=Orn + BPower[i-1]*StrToInt(BinMem[i]);
Texte:=Texte + Chr(Orn);
Delete(BinBuff,1,8);
until BinBuff='';
WriteLn(Texte);
end;
(* *)
(* *)
(* *)
(**************************************************************************)
label ReDo;
begin
//TITRE
WriteLn('Méthode de Hamming : transmission de données sans erreur');
WriteLn(Separator);
WriteLn;
//SAISIE DU TEXTE
ReDo:
SetRepair(false);
WriteLn('Saisissez le texte à transmettre virtuellement :');
ReadLn(Texte);
//DUMP BINAIRE
BinDump:='';
for idx:=1 to Length(Texte) do
begin
Orn:=Ord(Texte[idx]);
for pw:=0 to 7 do
BinDump:=BinDump + BinChar[Orn and BPower[pw]>0];
//ATTENTION: c'est un dump binaire inversé, c'est à dire que 2^0 se trouve à gauche et 2^7 à droite
end;
WriteLn;
WriteLn(Separator);
WriteLn('L''anti-dump binaire associé est :');
WriteLn(BinDump);
//TRAITEMENT DU SIGNAL
BinHamg:='';
BinBuff:=BinDump;
repeat
//on traite les données par 4 bits (c'est pourquoi on a dumpé en binaire)
BinMem:=Copy(BinBuff,1,4);
for idx:=1 to 4 do
HammingIn[idx]:= BinMem[idx]='1';
//transformation mathématique
HammingOut[1]:=HammingIn[1];
HammingOut[2]:=HammingIn[2];
HammingOut[3]:=HammingIn[3];
HammingOut[4]:=HammingIn[4];
HammingOut[5]:=HammingIn[1] xor HammingIn[2];
HammingOut[6]:=HammingIn[3] xor HammingIn[4];
HammingOut[7]:=HammingIn[1] xor HammingIn[3];
HammingOut[8]:=HammingIn[2] xor HammingIn[4];
//constitution du signal de sortie et effacement du premier paquet de 4 bits situé au début
for idx:=1 to 8 do
BinHamg:=BinHamg + BinChar[HammingOut[idx]];
Delete(BinBuff,1,4);
until BinBuff='';
WriteLn;
WriteLn('Le signal de Hamming associé est :');
WriteLn(BinHamg);
//Naturellement, le dump de Hamming est deux fois plus lourd que le dump binaire.
//Il reste quand même un avantage: il est possible de réparer le signal s'il y a
//des erreurs, ce que ne permet pas un simple dump binaire.
//POSSIBILITE DE MODIFIER LE DUMP
WillRepair:=false;
WriteLn;
WriteLn('Le but de ce code est de détecter les erreurs de transmission.');
WriteLn('Vous pouvez modifier quelques bits de Hamming, mais vous allez');
WriteLn('vous faire griller lors de la réception (sauf s''il y a');
WriteLn('compensation des erreurs)...');
WriteLn;
Write ('Voulez-vous modifier des bits ? (oui/non) ');
ReadLn(s);
if LowerCase(s)='oui' then
begin
WriteLn;
WriteLn('Tapez "-1" pour arrêter. Sachez qu''il y a ',Length(BinHamg),' bits dans le message...');
ModifCount:=0;
bool:=false;
repeat
Write(' Bit N°');
ReadLn(idx);
if (idx=-1) or (idx>Length(BinHamg)) then
bool:=true
else
begin
BinHamg[idx]:=BinChar[not boolean(StrToInt(BinHamg[idx]))];
inc(ModifCount);
end;
until bool;
WriteLn;
WriteLn(ModifCount,' bits du signal ont été modifiés...');
WriteLn;
WriteLn(Separator);
WriteLn('Le signal de Hamming est maintenant celui-ci :');
WriteLn(BinHamg);
if ModifCount>0 then
begin
WriteLn;
WriteLn('Vous avez la possibilité d''activer le correcteur d''erreur.');
Write ('Souhaitez-vous le faire ? (oui/non) ');
ReadLn(s);
WillRepair:= LowerCase(s)='oui';
end;
end;
//ENVOI DU MESSAGE
WriteLn;
WriteLn(Separator);
Init;
SetRepair(WillRepair);
BinBuff:=BinHamg;
repeat
Send(Copy(BinBuff,1,8));
Delete(BinBuff,1,8);
until BinBuff='';
//FINALISATION DU TRAITEMENT ET PURGE DE LA MEMOIRE
WriteLn;
WriteLn(Separator);
Final;
BinMem:='';
BinBuff:='';
BinDump:='';
BinHamg:='';
//POSSIBILITE DE RECOMMENCER
WriteLn;
WriteLn(Separator);
Write('Souhaitez-vous recommencer ce test très convaincant ? (oui/non) ');
ReadLn(s);
if LowerCase(s)='oui' then
begin
for idx:=1 to 5 do
WriteLn;
goto ReDo;
end;
end.
Conclusion
Vous pouvez toujours aller visiter http://altert.family.free.fr/
Historique
- 17 décembre 2005 15:57:45 :
- - Mise à jour des mots clé
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
probleme de codage [ par layachi ]
j'ai un probleme on deux tables 1-concernant la filiére 2-prenent ces données de cette filliere lorsque on choisi une filiére et quand on presse sur u
Comment éviter les erreurs de clé en SQL [ par Jenojen ]
Bonjour,J'aimerais savoir comment éviter d'enregistrer deux fois les mêmes données lorsqu'on passe par le SQL. En gros j'ai un bouton derrière lequel
Port com [ par templeofboom ]
Bonjour dans le cadre du dev d'une petite appli pour piloter un module de commande de relais, je doit envoyer des informations sur le port série.
récupérer les données d'un TDriveComboBox [ par li ]
comment récuperé chaque disc noté dans un DriveComboBox1 et les stoquer dans une variable merci davance pour votre aide
Probl avec BlockRead [ par christophedlr ]
Bonjour à tous, Je voudrais lire des informations d'en un fichier avec un BlockRead, mais mon probl, c'est que je n'arrive pas à récup
Trapper TOUTES les erreurs [ par grosdave653 ]
Bonjour,Je voudrais mettre en place un systeme qui prend une capture d'ecran et enregistre celle-ci lorsqu'il se produit une erreur quelconque dans un
Controler un microphone client/serveur [ par Francky23012301 ]
Bon voila, question gratuite. Autrement dit je payerai personne. Pas la peine d'insister. Bon j'explique le Mic Mac : vous avez un serveur et un clien
Grille en delphi [ par furax13 ]
bonjour,je dois développer en delphi une interface pour une dizaine de fichiers csv.Pour accélerer le développement de l'IHM, j'aimerai
Passer d'une fiche à l'autre en validant les données saisies [ par Fiorrita ]
Je travaille sur une petite interface qui consiste en un ensemble de masques de saisie pour ma base de données. Et j'ai deux problèmes que j
DBGRID avec hierarchie comme un treeview [ par richarddum ]
salut, Je voudrais pouvoir hérarchiser les données comme sur un treeview, avec une case + - pour afficher ou cacher les données enfant
|
Derniers Blogs
[TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES[TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES par gpommier
Suite à la session que j'ai présenté sur WebMatrix 2, vous pouvez trouver les slides ici, ainsi que les démos en packages nuget : démos1 et démos2 J'en profite pour remercier chaleureusement tous ceux qui sont venus très nombreux à cette sess...
Cliquez pour lire la suite de l'article par gpommier [SHAREPOINT] LES SESSIONS TECHDAYS 2012.[SHAREPOINT] LES SESSIONS TECHDAYS 2012. par Patrick Guimonet
Voici donc pour ceux qui n'ont pas pu venir, ou ceux qui n'ont pas pu toutes les suivre la liste des sessions SharePoint aux TechDays 2012, que je mettrais à jour dès que les liens des vidéo seront disponibles. Ou ici : http...
Cliquez pour lire la suite de l'article par Patrick Guimonet TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE !MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE ! par Vko
Hier durant une session dédiée aux Techdays 2012, j'ai eu le plaisir d'annoncer la sortie de la Béta 2 de Mishra Reader. C'est quoi ? Pour les utilisateurs, c'est une vraie expérience de lecture de flux RSS sur Windows. Rien à voir avec les produit...
Cliquez pour lire la suite de l'article par Vko [FRAMEWORK 4] LES TASKS ET LE THREAD UI[FRAMEWORK 4] LES TASKS ET LE THREAD UI par fathi
Je viens de passer quelques temps au TechDay's et j'ai pu voir pas mal de session intéressante. Par contre une chose m'a un peu étonné lors de certaines de ces sessions qui abordaient les améliorations du framework .NET (donc le 4.5) : en gros, bea...
Cliquez pour lire la suite de l'article par fathi
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|