Accueil > > > CRÉER UN PARSEUR LL
CRÉER UN PARSEUR LL
Information sur la source
Description
Les parseurs, vous les utilisez mais vous ne savez pas forcement comment ils marchent. Voici un exemple de parseur ll simple sans lexer : Son fonctionnement est très simple, il commence par consommer la plus petite entité du flux : le caractère avec la fonction readChar, et a partir de là suivent un lot de fonctions qui permettent au fur et a mesure des entités plus complexes comme les nombres, les chaines etc. et ainsi définir les règles de grammaire du parsing. Ce parseur contient deux buffers : le buffer principal qui contient le flux à parser et le buffer de lecture qui contient ce qui a été lu. Il reste extrêmement basique bien entendu ^^
Source
- <?php
- define('BR', '<br />');
-
- define('NO_ERROR', -1);
- define('EMPTY_BUFFER', 0);
- define('INVALID_DIGIT', 1);
- define('INVALID_VARNAME', 2);
- define('VAR_TAG_EXPECTED', 3);
- define('CLOSE_TAG_EXPECTED', 4);
- /*
- * Specifics chars
- */
- define('VAR_TAG', '$');
- define('CLOSE_TAG', ';');
- define('FLOAT_COMMA', '.');
-
- abstract class LLP
- {
- /*
- * Main bufer
- */
- private static $buffer = '';
- private static $bSize = 0;
- /*
- * Read buffer
- */
- private static $readBuffer = '';
- private static $rbSize = 0;
- /*
- * Read cursors
- */
- private static $cursor = 0; # Current
- private static $index = 0; # Global
- /*
- * Prepare will skip following chars
- */
- private static $skip = array
- (
- ' ',
- "\n",
- "\t",
- "\r"
- );
- /*
- * Errors
- */
- private static $errorType = -1;
-
- public static function getError()
- {
- switch (self::$errorType)
- {
- case 0 : $str = 'EMPTY_BUFFER'; break;
- case 1 : $str = 'INVALID_DIGIT'; break;
- case 2 : $str = 'INVALID_VARNAME'; break;
- case 3 : $str = 'VAR_TAG_EXPECTED'; break;
- case 4 : $str = 'CLOSE_TAG_EXPECTED'; break;
- default : $str = 'NO_ERROR';
- }
-
- return 'PARSE_ERROR >> '.$str;
- }
- /*
- * Returns global buffer index
- */
- public static function getIndex()
- {
- return self::$index;
- }
- /*
- * Returns char at index self::$index;
- */
- public static function getCharAtCurrentIndex()
- {
- return self::$buffer[self::$index];
- }
- /*
- * return current buffer index
- */
- public static function getCursor()
- {
- return self::$cursor;
- }
- /*
- * Clean main buffer
- */
- public static function clean()
- {
- self::$buffer = '';
- self::$bSize = 0;
-
- self::$readBuffer = '';
- self::$rbSize = 0;
-
- self::$index = 0;
- self::$cursor = 0;
- }
- /*
- * Rturn main buffer
- */
- public static function buffer()
- {
- return self::$buffer;
- }
- /*
- * Clean Read buffer
- */
- public static function flush()
- {
- $readBuffer = self::$readBuffer;
-
- self::$readBuffer = '';
-
- return $readBuffer;
- }
- /*
- * Print buffers
- */
- public static function cout()
- {
- $out = '';
-
- $out .= '<pre>';
- $out .= 'MAIN_BUFFER >> ';
- $out .= (strlen(self::$buffer) > 0 ? self::$buffer : 'EMPTY').BR;
- $out .= 'READ_BUFFER >> ';
- $out .= (strlen(self::$readBuffer) > 0 ? self::$readBuffer : 'EMPTY').BR;
- $out .= '</pre>';
-
- echo $out;
- }
- /*
- * Prepare for read
- */
- protected static function prepare()
- {
- if (self::$bSize === 0)
- {
- self::$errorType = EMPTY_BUFFER;
- return false;
- }
-
- self::$cursor = 0;
-
- while (in_array(self::$buffer[0], self::$skip)) self::unbufferize();
-
- return true;
- }
- /*
- * Add text to main buffer
- */
- public static function bufferize($str = '')
- {
- if (is_string($str))
- {
- self::$buffer = trim($str.self::$buffer);
- self::$bSize += strlen($str);
-
- return true;
- }
-
- return false;
- }
- /*
- * Eat $size left chars in main buffer
- */
- protected static function unbufferize($size = 1)
- {
- if ($size > 0)
- {
- if ($size <= self::$bSize)
- {
- self::$buffer = substr(self::$buffer, $size, self::$bSize);
- self::$bSize -= strlen($size);
-
- self::$cursor += $size;
- self::$index += $size;
-
- return true;
- }
- return false;
- }
- return false;
- }
-
- /*
- * Private read functions
- */
-
- /*
- * Read $size chars in main buffer and unbuferize them
- */
- protected static function read($size = 1)
- {
- if ($size > 0)
- {
- if ($size > self::$bSize)
- {
- $size = self::$bSize;
- self::$bSize = 0;
- }
-
- self::$readBuffer .= substr(self::$buffer, 0, $size);
- self::$rbSize += strlen($size);
-
- return self::unbufferize($size);
- }
- return false;
- }
- /*
- * Try to read any char in main buffer
- */
- protected static function readChar($char = NULL)
- {
- if (!is_null($char))
- {
- if (self::$buffer[0] !== $char)
- return false;
- }
- return self::read();
- }
- /*
- * Try to read specified digit in main buffer
- */
- protected static function readDigit($digit = NULL)
- {
- if (ctype_digit(self::$buffer[0]))
- {
- if (ctype_digit($digit))
- {
- if (self::$buffer[0] !== $digit)
- return false;
- }
- return self::read();
- }
- return false;
- }
- /*
- * Try to read a int in main buffer
- */
- protected static function readInteger($int)
- {
- if (!ctype_digit($int))
- return false;
-
- $int = strval($int);
- $numSize = strlen($int);
- $i = 0;
-
- while ($i < $numSize)
- {
- if (self::readDigit($int[$i]))
- $i++;
- else
- return false;
- }
-
- return true;
- }
- /*
- * Try to read a float in main buffer
- */
- protected static function readFloat($float = '', $separator = FLOAT_COMMA)
- {
- $float = explode($separator, $float);
-
- return self::readInteger($float[0]) &&
- self::readChar($separator) &&
- self::readInteger($float[1]);
- }
-
- /*
- * Public basic read functions
- */
-
- /*
- * Try to read specified string
- */
- public static function readString($str = '')
- {
- if (!is_string($str))
- return false;
-
- $strSize = strlen($str);
- $i = 0;
-
- while ($i < $strSize)
- {
- if (self::readChar($str[$i]) || self::readDigit($str[$i]))
- $i++;
- else
- return false;
- }
-
- return true;
- }
- /*
- * Read until next pattern
- */
- public static function readNext($str)
- {
- if (!is_string($str))
- return false;
-
- while (!self::readString($str)) ;
-
- if (self::$bSize == 0) return false;
-
- return true;
- }
- /*
- * Read buffer until buffer contain alpha chars
- */
- public static function readAlpha()
- {
- self::prepare();
-
- $count = 0;
-
- while ((ctype_alpha(self::$buffer[0]) && self::readChar())) $count++;
-
- if ($count > 0) return true;
-
- return false;
- }
- /*
- * Read buffer until buffer contain alphanum chars
- */
- public static function readAlphaNum()
- {
- self::prepare();
-
- $count = 0;
-
- while ((ctype_alnum(self::$buffer[0]) && self::readChar())) $count++;
-
- if ($count > 0) return true;
-
- return false;
- }
- /*
- * Try to read a number (int or float)
- */
- public static function readNumber($number)
- {
- self::prepare();
-
- if (strstr($number, FLOAT_COMMA)) return self::readFloat($number);
-
- return self::readInteger($number);
- }
- /*
- * Try to read a word in main buffer
- */
- public static function readWord($str)
- {
- self::prepare();
-
- return self::readString($str);
- }
-
- /*
- * Test patterned read functions
- */
-
- public static function readVar()
- {
- self::prepare();
-
- if (self::readString(VAR_TAG))
- {
- self::prepare();
-
- if (self::readAlpha() && !self::readAlphaNum())
- {
- if (self::readChar(CLOSE_TAG)) return true;
- else self::$errorType = CLOSE_TAG_EXPECTED;
- }
- else
- {
- self::$errorType = INVALID_VARNAME;
- }
- }
- else self::$errorType = VAR_TAG_EXPECTED;
-
- return false;
- }
- }
-
- define('XML_OPEN_NODE', '<');
- define('XML_CLOSE_NODE', '>');
- define('XML_TERMINAL_NODE', '</');
-
- class NodeParser extends LLP
- {
- private static $currentNodeName = '';
- private static $nodeContent = '';
-
- public static function nodeName()
- {
- return self::$currentNodeName;
- }
-
- public static function nodeContent()
- {
- return self::$nodeContent;
- }
-
- public static function openNode()
- {
- if (parent::readString(XML_OPEN_NODE))
- parent::flush();
- if (parent::readAlphaNum())
- self::$currentNodeName = parent::flush();
- if (parent::readString(XML_CLOSE_NODE))
- {
- parent::flush();
- return true;
- }
- return false;
- }
-
- public static function closeNode()
- {
- if (parent::readString(XML_TERMINAL_NODE))
- parent::flush();
- if (parent::readString(self::$currentNodeName))
- parent::flush();
- if (parent::readString(XML_CLOSE_NODE))
- {
- parent::flush();
- return true;
- }
- return false;
- }
-
- public static function node()
- {
- if (self::openNode())
- {
- parent::readAlphaNum();
- self::$nodeContent = parent::flush();
-
- if (self::closeNode())
- {
- return true;
- }
- else
- {
- echo 'CLOSE_NODE_ERROR'.BR;
- }
- }
- else
- {
- echo 'OPEN_NODE_ERROR'.BR;
- }
-
- return false;
- }
- }
-
- LLP::bufferize('public private 4242 42.42 toto42 $titi;');
- LLP::cout();
-
- if (LLP::readWord('public'))
- {
- echo 'Read String : '.LLP::flush().BR;
- }else{ echo 'Read String : FAIL at index '.LLP::getIndex().BR; }
-
- if (LLP::readWord('private'))
- {
- echo 'Read String : '.LLP::flush().BR;
- }else{ echo 'Read String : FAIL at index '.LLP::getIndex().BR; }
-
- if (LLP::readNumber(4242))
- {
- echo 'Read Int : '.LLP::flush().BR;
- }
- else{ echo 'Read Int : FAIL at index '.LLP::getIndex().BR; LLP::cout(); }
-
- if (LLP::readNumber(42.42))
- {
- echo 'Read Float : '.LLP::flush().BR;
- }
- else{ echo 'Read Float : FAIL at index '.LLP::getIndex().BR; LLP::cout(); }
-
- if (LLP::readAlphaNum())
- {
- echo 'Read AlphaNum : '.LLP::flush().BR;
- }else{ echo 'Read AlphaNum : FAIL at index '.LLP::getIndex().BR; }
-
- if (LLP::readVar())
- {
- echo 'Read Var : '.LLP::flush().BR;
- }else{ echo 'Read Var : FAIL at index '.LLP::getIndex().' : '.LLP::getError().BR; }
-
- echo 'Done';
-
- NodeParser::clean();
- NodeParser::bufferize('<toto>titi</toto>');
- NodeParser::cout();
-
- if (NodeParser::node())
- {
- echo 'Read Node : '.XMLParser::nodeName().' with content '.XMLParser::nodeContent().BR;
- }else{ echo 'Read Node : FAIL at index '.XMLParser::getIndex().' : '.XMLParser::getError().BR; }
-
- ?>
<?php
define('BR', '<br />');
define('NO_ERROR', -1);
define('EMPTY_BUFFER', 0);
define('INVALID_DIGIT', 1);
define('INVALID_VARNAME', 2);
define('VAR_TAG_EXPECTED', 3);
define('CLOSE_TAG_EXPECTED', 4);
/*
* Specifics chars
*/
define('VAR_TAG', '$');
define('CLOSE_TAG', ';');
define('FLOAT_COMMA', '.');
abstract class LLP
{
/*
* Main bufer
*/
private static $buffer = '';
private static $bSize = 0;
/*
* Read buffer
*/
private static $readBuffer = '';
private static $rbSize = 0;
/*
* Read cursors
*/
private static $cursor = 0; # Current
private static $index = 0; # Global
/*
* Prepare will skip following chars
*/
private static $skip = array
(
' ',
"\n",
"\t",
"\r"
);
/*
* Errors
*/
private static $errorType = -1;
public static function getError()
{
switch (self::$errorType)
{
case 0 : $str = 'EMPTY_BUFFER'; break;
case 1 : $str = 'INVALID_DIGIT'; break;
case 2 : $str = 'INVALID_VARNAME'; break;
case 3 : $str = 'VAR_TAG_EXPECTED'; break;
case 4 : $str = 'CLOSE_TAG_EXPECTED'; break;
default : $str = 'NO_ERROR';
}
return 'PARSE_ERROR >> '.$str;
}
/*
* Returns global buffer index
*/
public static function getIndex()
{
return self::$index;
}
/*
* Returns char at index self::$index;
*/
public static function getCharAtCurrentIndex()
{
return self::$buffer[self::$index];
}
/*
* return current buffer index
*/
public static function getCursor()
{
return self::$cursor;
}
/*
* Clean main buffer
*/
public static function clean()
{
self::$buffer = '';
self::$bSize = 0;
self::$readBuffer = '';
self::$rbSize = 0;
self::$index = 0;
self::$cursor = 0;
}
/*
* Rturn main buffer
*/
public static function buffer()
{
return self::$buffer;
}
/*
* Clean Read buffer
*/
public static function flush()
{
$readBuffer = self::$readBuffer;
self::$readBuffer = '';
return $readBuffer;
}
/*
* Print buffers
*/
public static function cout()
{
$out = '';
$out .= '<pre>';
$out .= 'MAIN_BUFFER >> ';
$out .= (strlen(self::$buffer) > 0 ? self::$buffer : 'EMPTY').BR;
$out .= 'READ_BUFFER >> ';
$out .= (strlen(self::$readBuffer) > 0 ? self::$readBuffer : 'EMPTY').BR;
$out .= '</pre>';
echo $out;
}
/*
* Prepare for read
*/
protected static function prepare()
{
if (self::$bSize === 0)
{
self::$errorType = EMPTY_BUFFER;
return false;
}
self::$cursor = 0;
while (in_array(self::$buffer[0], self::$skip)) self::unbufferize();
return true;
}
/*
* Add text to main buffer
*/
public static function bufferize($str = '')
{
if (is_string($str))
{
self::$buffer = trim($str.self::$buffer);
self::$bSize += strlen($str);
return true;
}
return false;
}
/*
* Eat $size left chars in main buffer
*/
protected static function unbufferize($size = 1)
{
if ($size > 0)
{
if ($size <= self::$bSize)
{
self::$buffer = substr(self::$buffer, $size, self::$bSize);
self::$bSize -= strlen($size);
self::$cursor += $size;
self::$index += $size;
return true;
}
return false;
}
return false;
}
/*
* Private read functions
*/
/*
* Read $size chars in main buffer and unbuferize them
*/
protected static function read($size = 1)
{
if ($size > 0)
{
if ($size > self::$bSize)
{
$size = self::$bSize;
self::$bSize = 0;
}
self::$readBuffer .= substr(self::$buffer, 0, $size);
self::$rbSize += strlen($size);
return self::unbufferize($size);
}
return false;
}
/*
* Try to read any char in main buffer
*/
protected static function readChar($char = NULL)
{
if (!is_null($char))
{
if (self::$buffer[0] !== $char)
return false;
}
return self::read();
}
/*
* Try to read specified digit in main buffer
*/
protected static function readDigit($digit = NULL)
{
if (ctype_digit(self::$buffer[0]))
{
if (ctype_digit($digit))
{
if (self::$buffer[0] !== $digit)
return false;
}
return self::read();
}
return false;
}
/*
* Try to read a int in main buffer
*/
protected static function readInteger($int)
{
if (!ctype_digit($int))
return false;
$int = strval($int);
$numSize = strlen($int);
$i = 0;
while ($i < $numSize)
{
if (self::readDigit($int[$i]))
$i++;
else
return false;
}
return true;
}
/*
* Try to read a float in main buffer
*/
protected static function readFloat($float = '', $separator = FLOAT_COMMA)
{
$float = explode($separator, $float);
return self::readInteger($float[0]) &&
self::readChar($separator) &&
self::readInteger($float[1]);
}
/*
* Public basic read functions
*/
/*
* Try to read specified string
*/
public static function readString($str = '')
{
if (!is_string($str))
return false;
$strSize = strlen($str);
$i = 0;
while ($i < $strSize)
{
if (self::readChar($str[$i]) || self::readDigit($str[$i]))
$i++;
else
return false;
}
return true;
}
/*
* Read until next pattern
*/
public static function readNext($str)
{
if (!is_string($str))
return false;
while (!self::readString($str)) ;
if (self::$bSize == 0) return false;
return true;
}
/*
* Read buffer until buffer contain alpha chars
*/
public static function readAlpha()
{
self::prepare();
$count = 0;
while ((ctype_alpha(self::$buffer[0]) && self::readChar())) $count++;
if ($count > 0) return true;
return false;
}
/*
* Read buffer until buffer contain alphanum chars
*/
public static function readAlphaNum()
{
self::prepare();
$count = 0;
while ((ctype_alnum(self::$buffer[0]) && self::readChar())) $count++;
if ($count > 0) return true;
return false;
}
/*
* Try to read a number (int or float)
*/
public static function readNumber($number)
{
self::prepare();
if (strstr($number, FLOAT_COMMA)) return self::readFloat($number);
return self::readInteger($number);
}
/*
* Try to read a word in main buffer
*/
public static function readWord($str)
{
self::prepare();
return self::readString($str);
}
/*
* Test patterned read functions
*/
public static function readVar()
{
self::prepare();
if (self::readString(VAR_TAG))
{
self::prepare();
if (self::readAlpha() && !self::readAlphaNum())
{
if (self::readChar(CLOSE_TAG)) return true;
else self::$errorType = CLOSE_TAG_EXPECTED;
}
else
{
self::$errorType = INVALID_VARNAME;
}
}
else self::$errorType = VAR_TAG_EXPECTED;
return false;
}
}
define('XML_OPEN_NODE', '<');
define('XML_CLOSE_NODE', '>');
define('XML_TERMINAL_NODE', '</');
class NodeParser extends LLP
{
private static $currentNodeName = '';
private static $nodeContent = '';
public static function nodeName()
{
return self::$currentNodeName;
}
public static function nodeContent()
{
return self::$nodeContent;
}
public static function openNode()
{
if (parent::readString(XML_OPEN_NODE))
parent::flush();
if (parent::readAlphaNum())
self::$currentNodeName = parent::flush();
if (parent::readString(XML_CLOSE_NODE))
{
parent::flush();
return true;
}
return false;
}
public static function closeNode()
{
if (parent::readString(XML_TERMINAL_NODE))
parent::flush();
if (parent::readString(self::$currentNodeName))
parent::flush();
if (parent::readString(XML_CLOSE_NODE))
{
parent::flush();
return true;
}
return false;
}
public static function node()
{
if (self::openNode())
{
parent::readAlphaNum();
self::$nodeContent = parent::flush();
if (self::closeNode())
{
return true;
}
else
{
echo 'CLOSE_NODE_ERROR'.BR;
}
}
else
{
echo 'OPEN_NODE_ERROR'.BR;
}
return false;
}
}
LLP::bufferize('public private 4242 42.42 toto42 $titi;');
LLP::cout();
if (LLP::readWord('public'))
{
echo 'Read String : '.LLP::flush().BR;
}else{ echo 'Read String : FAIL at index '.LLP::getIndex().BR; }
if (LLP::readWord('private'))
{
echo 'Read String : '.LLP::flush().BR;
}else{ echo 'Read String : FAIL at index '.LLP::getIndex().BR; }
if (LLP::readNumber(4242))
{
echo 'Read Int : '.LLP::flush().BR;
}
else{ echo 'Read Int : FAIL at index '.LLP::getIndex().BR; LLP::cout(); }
if (LLP::readNumber(42.42))
{
echo 'Read Float : '.LLP::flush().BR;
}
else{ echo 'Read Float : FAIL at index '.LLP::getIndex().BR; LLP::cout(); }
if (LLP::readAlphaNum())
{
echo 'Read AlphaNum : '.LLP::flush().BR;
}else{ echo 'Read AlphaNum : FAIL at index '.LLP::getIndex().BR; }
if (LLP::readVar())
{
echo 'Read Var : '.LLP::flush().BR;
}else{ echo 'Read Var : FAIL at index '.LLP::getIndex().' : '.LLP::getError().BR; }
echo 'Done';
NodeParser::clean();
NodeParser::bufferize('<toto>titi</toto>');
NodeParser::cout();
if (NodeParser::node())
{
echo 'Read Node : '.XMLParser::nodeName().' with content '.XMLParser::nodeContent().BR;
}else{ echo 'Read Node : FAIL at index '.XMLParser::getIndex().' : '.XMLParser::getError().BR; }
?>
Conclusion
Cette source est purement didactique ^^
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
menu et chaines de caractères [ par ayor ]
bien le bonjour à tous, je voulais juste poser 2 petites questions : - tout d'abord, sous phpmyadmin, est-il possible de créer des champs de text
Extraire que les MAJUSCULES d'une chaines de caracteres [ par sxvirus ]
Bonsoir,Je cherche à extraire que les MAJUSCULES d'une chaines de caracteres mais je n'y arrive pas.Avez vous une solution , MERCI d'avance.
remplacer strok par ereg [ par apz ]
salut,j'utilise strok pour recuperer des sous-chaines d'une ligne dans un fichier.mais je voulais remplacer le strok (pour eviter les boucles et ainsi
Découpage de chaines [ par stephtbesy ]
Bonjour tout le monde,voilà mon prb... il n'y a pas de fonction lastIndexOf en php.Je souhaiterais en effet prendre juste le nom du fichier que j'uplo
codes des chaines cryptées [ par fado0 ]
bonjour,je cherche un code pour decryptées les chaines numeriques ou un logiciel ou un site ou je peux trouver une réponcemerci de votre aide
comparaison de chaines [ par darkhorkeu ]
Quelqu'un sait-il si la comparaison de chaine: "str1" == "str2" revient au meme que:!strcmp("str1","str2") merci d'avance
Trier Chaines de caractère dans un fichier texte [ par jdaviaud ]
Salut à tous :)Voila, j'aurais besoin d'un peu d'aide car je vois pas trop comment m'y prendre :J'ai un motur de cherche qui stoque tous les termes de
Parsing et performances ... [ par guiguimac ]
bonjour,je viens de reprendre un site web tout en php. son principe est le suivant : les pages html sont préparée sous formes de template que le code
parsing error !?! [ par Arkko ]
c cmt qu'on fait pour pas avoir cet erreur lol Parse error: parse error, unexpected $end in debug.php on line 71
PHP / NuSOAP : Xml parsing error [ par pete87150 ]
Bonjour,J'ai créé un service web tout simple pour tester : [WebService(Description="Bienvenue sur le service Web de démo",Namespace="WordGeneration")]
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|