RDP d’un windows XP vers un Windows Serveur 2012

juin 17th, 2013

Le client Xp ne permet pas normalement de se connecter à un serveur 2012 en terminal serveur.

Mise à jour

Installer la mise à jour suivante : http://www.microsoft.com/fr-fr/download/details.aspx?id=20609

Faite attention à bien choisir la langue installée car la mise à jour n’est compatible que si les langues de l’os et de la mise à jour sont identiques.

Modification de la base de registre

La sécurité n’est cependant pas mise à jour et deux modification de la base de registre doivent être effectuée avant de pouvoir réaliser une connexion.

Lancer regedit à l’aide de la commande du même nom

  • regedit

La première modification est à réaliser sur la clef

  • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders
  • Ajouter “, credssp.dll” à la clef REG_SZ SecurityProviders
La deuxième modification est à effectuer sur le clef :
  • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa
  • ajouter “tspkg” à la liste de la clef REG_MULTI_SZ Security Packages”

Finalisation

Fermer regedit et redémmarrer l’ordinateur.
Vous pouvez maintenant réaliser une connexion vers un serveur windows 2012.
Author: Nicolas de Marqué Categories: Web Tags:

Mootools, évènements chainés

mai 8th, 2012

Ayant dédiés les deux dernières semaines à Mootools, je me suis décidé à vous écrire
afin de décrire quelques une des techniques simples que je viens de redécouvrir, elles vont
sont peut être déjà connues, si c’est le cas veuillez ne pas m’en vouloir.

Pour résumer, la première technique permet l’utilisation de méthodes statiques ou
d’objets statiques :

var ObjA = new Class({...});
ObjA.fct = function(){...};
ObjA.var = "val";

Tandis que la deuxième technique permet d’utiliser les chaines d’évènements afin de lier des
comportements successifs de nature différentes, sur des objets différents :

var classA = new Class({
	Implements: [Chain, Events],
	initialise: function(element){
		this.element = element
		this.other_element = element.appendChild(new Element('img'))
		//Initialise les évènements permettant d'enchainer et de réinitialiser les functions
		this.addEvent('init_completed:pause(100)', function(){this.callChain()}.bind(this));
		this.addEvent('reinit:throttle(100)', function(){this.clearChain()}.bind(this));
		//Initialisation des effets
		this.morph = new Fx.Morph(this.element, {
			link:'ignore', //Permet de controler l'enchainement
			onComplete: function(){this.callChain()}.bind(this)
		})
		this.move_shutter.chain = this.chain;
	},
	close: function(){
		this.fireEvent('reinit');
		this.chain(
			function(){
				console.log('close_start');
				this.morph.start({'bottom':[this.bottom_shutter, this.element.getHeight()]})
				}.bind(this),
			function(){
				this.element.removeChild(this.container);
				this.callChain();
				}.bind(this)
		);
		this.fireEvent('init_completed');
		return this;
	},
	open: function(){
		this.fireEvent('reinit');
		this.chain(
			function(){
				console.log('open_start');
				this.element.appendChild(this.container); 
				this.callChain();
			}.bind(this),			
			function(){
				this.container.fade('show'); //Cet effet est instantanné,
				                             //sinon, il ne pourrait être utilisé ici sans un wait
				this.callChain();
			}.bind(this),			
			function(){
				//Utilisation d'un effet non prédéfini
				this.element.move({
					duration:'long',
					transition:'bounce:out',
					offset:{x: 10, y: 100},
					onComplete: function(){this.callChain()}.bind(this)});
			}.bind(this)
		);
		this.fireEvent('init_completed');
		return this;
	}
})

L’appel peut ensuite être effectué ainsi :
new ObjA().open().wait(3000).close(); //3000ms est non le temps attendu à la fin de l’animation, mais celui
//commencant juste après l’enregistrement des différentes fonctions ~10ms

Author: Nicolas de Marqué Categories: Web Tags: ,

Twig - Gestion des variables object ou array

mai 3rd, 2012

Twig recherche les variables en effectuant un isset sur la variable puis en recherchant, si l’isset est négatif, une méthode variable(), getVariable(), isVariable() ou __call(). Si aucune de ces méthodes n’est disponible une erreur est émise ou masquer suivant le paramètre strict_variables.

Utilisation des accesseurs intégrés à PHP.

Les accesseurs (manipulateurs/getters) php peuvent être utilisés sous la forme suivante :

class Test{
    private $variable;
    public function __isset($name){
        switch($name){
            case "variable": true;
                  default: return false;
        }
    }
 
    public function __get($name){
        switch($name){
	    case "variable": 
                if( ! isset($this->variable)){
                    $this->traitement();
                }
                return $this->variable;
        }
    }
}

La problématique résultante est que les appels internes vers la variable cible ne seront pas pris en compte. En effet, si à l’intérieur de la classe, un $this->variable est utilisée pour obtenir une variable non encore settée, aucune erreur ne sera émise, sans test. Et vous devrez dupliquer le code afin de lancer les traitement préalables.

Voila pourquoi il est grandement conseillé d’utiliser les accesseurs sous forme de get ou de is. A noter que l’utilisation de call entraine la même problématique.

A noter que si vous ne définissez pas la variable en tant que variable de classe, la problématique n’est plus technique mais organisationnelle. En effet les appels à la variables seront redirigés vers votre function __get, mais vous perdrez la visibilité des variables disponibles en entête.

Cas du ArrayAccess

Bug dans Array access avec extension

If i defined an class implementing ArrayAccess, the public property or method become not allowed for twig.

This behavior is present with extension installed in versions 1.6 and 1.7.

Code to reproduce :

“`php
define ("DEBUG", true);

require_once( __DIR__ . "/Twig/lib/Twig/Autoloader.php");

class Obj implements ArrayAccess{
private $collection = array();
public $var = "var_value";

function __construct(){
$this->collection['test'] = ‘test_value’;
}
public function offsetExists($key){return isset($this->collection[$key]);}
public function offsetGet($key){return $this->collection[$key];}
public function offsetSet($key, $value){throw new \Exception(”Documents souldn’t be write”);}
public function offsetUnset($key){throw new \Exception(”Documents souldn’t be write”);}

}

Twig_Autoloader::register();

$loader = new Twig_Loader_String();
$twig = new Twig_Environment($loader, array(
‘auto_reload’ => DEBUG,
’strict_variables’ => 1,
‘debug’ => DEBUG,
‘optimizations’ => 0,
));

echo “obj.test=”.$twig->render(”{{obj.test}}”, array(’obj’=>new Obj())).”\n”;
echo “obj.var=”.$twig->render(’{{obj.var}}’, array(’obj’=>new Obj())).”\n”;
“`

Result without extension and normally waited:

“`
obj.test=test_value
obj.var=var_value
“`

Result with extension

“`
obj.testtest_value
obj.var
Notice: Undefined index: var in /…/test_controleur.php on line 14

Call Stack:
0.0007 660944 1. {main}() /…/test_controleur.php:0
0.0300 4231496 2. Twig_Environment->render() /…/test_controleur.php:32
0.0328 4272488 3. Twig_Template->render() /…/Twig/lib/Twig/Environment.php:288
0.0328 4314344 4. Twig_Template->display() /…/Twig/lib/Twig/Template.php:250
0.0328 4314656 5. Twig_Template->displayWithErrorHandling() /…/Twig/lib/Twig/Template.php:239
0.0328 4314656 6. __TwigTemplate_57ce66ffa28dd3ec8adabcae87a9fd6b->doDisplay() /…/Twig/lib/Twig/Template.php:265
0.0328 4314872 7. twig_template_get_attributes() /…/Twig/lib/Twig/Environment.php(320) : eval()’d code:19
0.0329 4318080 8. Obj->offsetGet() /…/test_controleur.php:0

Author: Nicolas de Marqué Categories: Web Tags:

Underscores in domain part of a url

avril 17th, 2012

Starting with a discussion on stackoverflow with this post and this other post. I search documentation and rfc  on the underscore availability in URIs. Old rfc (1994 and before) don’t allowed it, i searched others doc and found this URI rfc where it is mentionned that the underscore character isn’t a reserved character.

In fact, this exists a preferred syntax noted here at preferred syntax but the dns documents seems to be more open Host Names and Numbers. The strongest and clearest too description was made by the rfc on url, which forget the preferred to describe the bnf rules preciselly. There is too 2396

At this moment, i tough this not allowed, but maybe, this is not the problem. In fact, while websphere use it :

  • this post mentionned above which speack about internet journal, big site using underscore.
  • microsoft, android use underscores in their hostname.
  • the dns system permit is as well as apache.
Author: Nicolas de Marqué Categories: Web Tags: , ,

Chrome et html5

avril 20th, 2010

Google toujours à la pointe…

Suivant les conseil de mon très aimé professeur Hervé Le Crosnier, j’ai parcouru une présentation réalisée par un ingénieur travaillant chez google :
http://apirocks.com/html5/html5.html#slide1

Dans chrome, cette démonstration est impressionnante de facilité d’utilisation et les richesses d’optimisation sont si nombreuses qu’elles inspirent l’admiration.

…mais continue d’enregistrer vos utilisateurs

J’ai cependant noté que l’api google, à l’instar de son navigateur, piste chacun des visiteurs du site qui l’utilise en imposant un téléchargement de la bibliothèque depuis ses serveurs.

Un rapide coup d’oeil à l’application de can(e)vas m’a aussi permis de voir qu’étonnament c’est yui qui est utilisé dans cette démonstration et cela dans une iframe.

Les dernières avancées d’ie

La poursuite logique a été de chercher un état des lieux relatif à l’implémentation d’HTML5 des différents navigateurs. Et oh, surprise, IE semblerait s’être mis au pas en proposant une plateforme de test, dont les principes directeurs sont l’adaptation aux standards.

Perspectives

Les autres navigateurs étant déjà en conformité[1] avec les normes établies par le w3c, il est possible qu’html5 puisse enfin voir le jour dans une version aboutie avant 2011 (même si pour l’instant courant 2011 voir 2012 est plus probable).

Notes

Dans ma recherche du mot juste, “conformité”, c’est avéré être en discussion avec compliance. Étymologiquement cela se traduirait par :
“avec plaisir” ou en français complaisance.

Je me demande donc comment “avec plaisir” pourrait être le terme adéquat quand on parle de norme. Peut être cela a t’il été choisi pour inciter les personnes devant l’utiliser a trouver du plaisir dans le suivi de certaines normes ou lois.

Cependant, au delà des questions morales ou historiques que cet étymologie soulève, il est indéniable que ce terme laisse prédominé le connoté sur le dénoté, ce qui peut engendrer de réels problèmes linguistiques. Les créateurs, par exemple, perdraient certainement en originalité à utiliser un mot dont l’objet est un respect “amoureux” des pratiques en place.

Author: Nicolas de Marqué Categories: Web Tags:

Un onglet à longueur variable : une balise

février 21st, 2010

Présentation

Au cours d’une formation html/css, nous devions réaliser une copie conforme d’un site web (dont je tairais le nom), celui-ci comportait un onglet actif.

Dans une recherche de la moindre balise, j’ai voulu n’utiliser aucun artifice et laisser cette simple balise dessiner un onglet à largeur modifiable.

La solution

Voici la solution:
test de lien
lien2
Et le code css pour la faire fonctionner:

a.onglet{text-decoration: none; text-transform: capitalize; color: #4d4d4d; text-shadow: 5px 5px 5px #bfbfbf;}
a.onglet:hover {color: #0000ff;}			
a.onglet:after {content: url("http://dev.art.free.fr/wordpress/wp-content/2010/02/top_corner_ne.png"); vertical-align: -5px;}			
a.onglet{ background: url("http://dev.art.free.fr/wordpress/wp-content/2010/02/top_corner_nw.png") no-repeat; padding-left: 20px; padding-top: 7px; line-height: 30px; padding-bottom: 5px; font-size:16px;}

Compatibilité

Cette astuce fonctionne avec :

  • Firefox
  • Opéra
  • IE8
  • Chrome

L’ombre dernière le texte, idem sauf IE.
Pour les autres navigateurs, vos commentaires sont les bienvenus.

Bon développement.

Author: Nicolas de Marqué Categories: Web Tags:

Multigroup design in drupal

septembre 13th, 2009

Un commentaire sur la création de multigroup dans cck

Yes, very good module, i use a version from 10 august, everything works except differents display, i search a solution…

So, i demand me too why multigroup use delta, all works fine with, but, isn’t it really possible to add another field named gid or groupe_delta?

***************************************************************************************************************

This solutions have advantage to :
- don’t touch the delta (one delta by record for one field),
- don’t serialized any data.

One multigroup with different quantification for each field

In the form :

In this, field pen is enabled for just one field, the field color for more one.

vid   delta    gid     pen      vid   delta   gid   color
---------------------------------------------------------
1       0       0      bic1      1      0      0    green
1       1       1      bic2      1      1      1    blue          I have unordered
1       2       2      stab      1      4      2    red           delta2 to see that's
1       3       3      4color    1      3      3    blue          not a problem.
1       4       4      pilot1    1      7      4    blue
                                 1      2      3    red
                                 1      5      3    black
                                 1      6      3    green

If the user destroy the group, a choice is done to clear or not the gid field. If he decide or not to guard gids, the field’s definition is transform to multivalues field (if more than one field).

If he construct another group, a demand from system if a reinit for each field integrated is necessary, if not he can find all the ancients groups (a possibility to rename group).

It can be an option in multigroup to have syncs groups (as now, pseudo unique field who redefine the hook to define the number of fields to one by group line) with advantages to have table style display.

For view to see all group, a join on the gid is necessary like with the delta actually.

***************************************************************************************************************

Multi Group recursivity

The last idea is to have reccursion, it’s more complicated but possible
—————————————————————————————–
So the mains ideas to have a recursion is to have :
- a parent groupe id
- all group have a different id
- all records for one field have a different delta

For the same example :


brand  brandAdresse---------------------------------------------------------Groupe branding information
                articles----------------------------------------------------Groupe articles's families
                     identities---------------------------------------------Groupe articles's identities
                           options------------------------------------------Groupe articles's options
                                             color              ref---------Groupe articles's specifications
bic    elsewhere
       another place
                pen
                     classic
                            with rubber
                                             blue               ref1016
                                             red                ref1013
                                             green              ref1017
                            without rubber
                                             blue               ref1018
                                             red                ref1019
                                             green              ref1015
pilot  elsewhere
                pen
                    smarty
...

We take as rules:
-the vid is identical for all
-the delta is different for all in same field
-the gid is one for one group
-the gpid (parentid refer gid parent)

i use the notation delta-gid-gpid


                          adresse
            brand       Location ref   article        option       colors              ref1            brandref

br_gr  0    bic 0-0-0     refa 0-0-0
br_gr  0                  refc 2-0-0----------------------------------------------------------------------------------------unordered
ar_gr  2                                pen 0-2-0
ar_gr  2                                pen 3-2-0---------------------------------------------------------------------------unordered
op_gr  5                                       with rubber    0-5-2
re_gr  8                                                           blue  0-8-5      ref1496 0-8-5    7zz54155   0-8-5
  idem 9                                                           red   1-9-5      ref1639 1-9-5    6zz78451   1-9-5
  idem 10                                                          green 2-10-5     ref1018 2-10-5   7aa87459  2-10-5
  idem 10                                                          green 8-10-5                      7aa87460 10-10-5-------unordered
op_gr  6                                       without rubber 1-6-2
re_gr  11                                                          blue  3-11-6    ref1012 3-11-6    6zz47854 3-11-6
  idem 12                                                          red   4-12-6    ref1020 4-12-6    7aa65231 4-12-6
  idem 12                                                                          ref1025 5-12-6    7aa65271 5-12-6
  idem 12                                                                          ref1028 6-12-6    7aa65241 6-12-6
  idem 13                                                          green 5-13-6    ref1023 7-13-6    7aa58549 7-13-6
ar_gr  3                                pen 2-3-0---------------------------------------------------------------------------unordered
br_gr  1    pilot 1-1-1   refb 1-1-1
ar_gr  4                                pen 1-4-1
op_gr  7                                       with top       2-7-4
re_gr  14                                                          red   6-14-7    ref1028 8-14-7    1526326 8-14-7
  idem 15                                                          blue  7-15-7    ref1024 9-15-7    1542632 9-15-7

The unordered values have been add after to watch if an add is possible.

Use Cases

Each groupe have an add option.

In the first step, before any data is included, just the higher group is visible, and two links, add “same group” and add “sub group”. In this case add Brand and add Article. The add sub is inactive if less than one field is populate by value in his parent.

If add sub is click, a sub group is populate in memory, a gid incremented and a gpid included : all fields in this group inherit of this values.

If default data for a field or data add by user to a field, a increment delta is create for the field, and the gid and the parent gid are remember (save in the group).

We can move a sub group and attach to another group, by changing any gpid for fields in it (no for fields in sub sub groups).

View Integration

To render in view, each field must have link with parents.

For the exemple of the pen from bic without rubber and green have this :



                                |-------- join-----------|
                                |                        |
bic 0-0-0    refa 0-0-0   pen 0-2-0   without rubber 1-6-2   green 5-13-6    ref1023 7-13-6    7aa58549 7-13-6
      |             |             |                    |                |                 |                  |
      |             |----join-----|                    |-------join-----|                 |                  |
      |----------join-------------|                    |--------------------join----------|                  |
                                                       |--------------------------------------join-----------|

A join is add when add a field to view
- if one of parent field is present.
- if one of children field is present.
- for all join (a child is join to all parents) <- for this i’m not sure, all join, or just one

Groups of multiples values are allowed as normal (with delta) with add a restriction on the gid.

User can filter by group_id each field.

***************************************************************************************************************

I imagine that’s not the first time, that a person propose one of this solutions, and i agree with the others than have this idea before, and support in this direction.

Best Regards,

Nicolas

Author: Nicolas de Marqué Categories: Développement Tags: ,

Lien entre DOM et simpleXml

juin 20th, 2009

Présentation

En Php, il existe une librairie majeure pour la manipulation d’un objet xml, celle-ci s’appelle le DOM (DOMxml en php4).

Cette libraire reprends les spécifications du DOM fourni par le W3C, en ajoutant différentes ressources intéressantes comme la classe DOMDocumentFragment qui permet d’ajouter une chaine de caractères directement dans un document, des extensions permettant d’importer et d’exporter un noeud ou un document entier vers d’autres librairies.
D’autres librairies existent nous nous intéresserons à simpleXML, qui permet de simplifier (;)) un certain nombre d’opérations.
Nous verrons dans cet article quelles relations peuvent être effectuées entre ces librairies et quels bénéfices elles apportent.

Avantage et inconvénient des DOMDocuments

Un DOMDocument est un objet complexe qui nécessite une utilisation très rigoureuse, il est par exemple très difficile de récupérer une page web sans générer avertissements et erreurs. La chaine importée pour le créer doit être absolument formater suivant les standards.
La manipulation est par contre aiser et toutes les fonctions habituelles de parcours (nextSibling, firstChild, parentNode…), de modification (insertBefore, insertAfter, removeChild,…) sont implantées.

Avantage et inconvénient de simpleXML

SimpleXML, quand à elle est une bibliothèque simplifiée, le nombre de fonction est restreint et clair, la création simplifié, l’export aussi. La chaine conserve un formatage même après manipulation. Et chose agréable les conventions php, parcours de tableau, impression temporaire à l’aide de print_r,… sont conservées.
A l’inverse du DOM, les fonctions de manipulations sont malheureusement absentes, les modifications difficiles.

Une utilisation conjointe

Dans un soucis de simplicité et d’efficacité nous pouvons donc utiliser simpleXML pour le chargement et l’export, les lectures, et les ajouts simples. Pour des manipulations plus précises nous utiliserons le DOM, les méthodes et propriétés qui y sont associés.
En voici un exemple sur une insertion d’un noeud :

$xml=simplexml_load_file ("fichier1.xml");
$xml2=simplexml_load_file ("fichier2.xml");
$items=$xml2-&gt;channel-&gt;item;
foreach($items as $item){
    //Importation, création de l'arbre de base et placement sur le noeud cible
    $nodeFirstItem = dom_import_simplexml($xml-&gt;channel-&gt;item[0]);
    //ownerDocument représente le document de type DOMDocument créé
    //à la ligne précédente. true spécifie que les fils sont eux aussi importés
    $importNode=$nodeFirstItem-&gt;
        ownerDocument-&gt;importNode(dom_import_simplexml($item),true);
    //Manipulation de l'arbre par insertion
    $nodeFirstItem-&gt;parentNode-&gt;insertBefore($importNode, $nodeFirstItem);
}

Dans cette exemple nous supposerons que les fichiers fichier1 et fichier2 contenaient respectivement

<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0">
  <channel>
    <title>All About Everything</title>
    <link>http://www.example.com/podcasts/everything/index.html</link>
    <item>
      <title>Shake Shake Shake Your Spices</title>
      <guid>http://example.com/podcasts/archive/aae20050643.m4a</guid>
    </item>
  </channel>
</rss>

et

<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0">
  <channel>
    <title>All About World</title>
    <item>
      <title>Your Spices</title>
      <guid>http://example.com/podcasts/archive/aae20050615.m4a</guid>
    </item>
    <item>
      <title>Another Shake</title>
      <guid>http://example.com/podcasts/archive/aae20050620.m4a</guid>
    </item>
    </channel>
</rss>

L’avantage de cette technique est que les modifications apporter au DOMDocument sont transmises sans aucune fonction supplémentaires à l’objet simpleXML.
Une exemple en suppression de noeud :

$xml=simplexml_load_file("fichier2.xml");
$delNode = dom_import_simplexml($xml-&gt;channel-&gt;item[1]);
$delNode-&gt;parentNode-&gt;removeChild($delNode);

Conclusion

De mon point de vue, la meilleure solution serait une création de classes enfants aux classes du dom, facilitant les manipulations les plus courantes. Cette solution bien que propre et certainement plus saine qu’une utilisation conjointe de deux classes demanderait un temps de développement important.
Ces bibliothèques étant standards, elles sont maintenus par le PHP Group. Cela garantit une évolution suivie et constante tant au niveau des performances que de l’interopérabilité. De plus le temps étant une variable inaltérable, du moins sur notre chère planète bleu, nombre de projet devront conserver une utilisation des bibliothèques standards et il sera souhaitable de recourir aux techniques énoncées plus haut.
Libre à vous de choisir, et bon développement

Author: Nicolas de Marqué Categories: Développement, Web Tags: , ,

Le chargement multiple en PHP

avril 22nd, 2009

La fonction File_get_contents

Afin de charger des pages, la fonction file_get_contents est la plus souvent utilisée. Son avantage est d’être simple, elle ne demande aucune ouverture de flux, permet une récupération directe des données en format texte et tout aussi bien fonctionnel sur un flux distant que local.

Un exemple de code avec file_get_contents

$text_page1=file_get_contents("http://www.unsite.net/unepage.html");
$text_fichier=file_get_contents("/unchemin/unfichier.ext");
$text_ftp=file_get_contents("ftp://nom:passe@unsiteftp/unchemin/unfichier");

Chargement multiple

La problématique

Cependant, l’utilisation de file_get_contents montre sa limite dès que l’on cherche à charger plus de 3 ou 4 fichiers. En effet, le chargement de fichiers doit être réalisé suivant un mode file réalisant chaque chargement l’un après l’autre. Les chargement de fichier distant étant réalisé sur des temps calculable en dixième de secondes, le chargement pourra facilement atteindre la seconde dès 3 à 5 fichiers et la minute à partir de 50 fichiers.
Plusieurs difficultés majeures se présentent donc :

  • un utilisateur n’attendrait pas un résultat devant son navigateur si longtemps
  • la plupart des serveur php public, présente un temps d’execution limité pour chaque script php autour de 45 secondes
  • le temps d’exécution est environ proportionnel au nombre de fichier

La solution multicurl

Curl est un gestionnaire de session distante. La librairie licurl créée par Daniel Stenberg est créé pour se connecter à différents services comme telnet, http, ftp ou nombre d’autres protocole. l’avantage dans notre cas est qu’elle permet de lancer plusieurs processus en parallèle et en tache de fond. Le désavantage est que cet ensemble nécessite une mise en place plus complexe.

Un exemple de code avec curl

/*** Initialisation des connections */
$urls=array("http://google.com", "http://voila.fr",
 "http://altavista.com", "http://kartoo.com");
$i=0;
$multiCurl= curl_multi_init();
foreach($urls as $url){
	$curls[$i] = curl_init();
	curl_setopt($curls[$i], CURLOPT_URL, $url);
	curl_setopt($curls[$i], CURLOPT_HEADER, 0);
	curl_setopt($curls[$i], CURLOPT_RETURNTRANSFER, true);
	curl_multi_add_handle($multiCurl,$curls[$i]);
	$i+=1;
}
/*** Exécute le gestionnaire de connexion */
$running=null;
do {
	curl_multi_exec($multiCurl,$running);
} while ($running > 0);
for($j=0; $j<$i; $j++){
	$page[]=curl_multi_getcontent($curls[$j]);
	curl_multi_remove_handle($multiCurl, $curls[$j]);
}
/*** Ferme les gestionnaires */
curl_multi_close($multiCurl);

La solution popen

Une dernière solution est l’utilisation de popen. Son grand avantage et tout à la fois son inconvénient majeur est la possibilité d’utiliser cette fonction pour toutes les commandes du système accessible à l’interpréteur php. En effet, nombre de serveur ne laisse accessible que peu de fonctions. D’autre part, la mise en place est relativement archaïque et ressemble à l’ouverture fermeture de fichier présente en C.

Un exemple de code avec popen

$urls=array("http://google.com"; "http://voila.fr";
 "http://altavista.com"; "http://kartoo.com");
 
# Lancement des traitement en parallèle
foreach($urls as url){
        $f[]=popen("wget ".$url);
}
 
# Lecture des résultats
for($i=0; $i<count($urls); $i++){
        $str = fgets($f[$i]);
        fclose($f[$i]);
}
Author: Nicolas de Marqué Categories: Web, php Tags: , ,

Java 3D

décembre 1st, 2008

Le composant java 3d permet autant un affichage des classes 3D que

Références
Article sur jdn : http://www.journaldunet.com/developpeur/tutoriel/jav/090828-expliquez-moi-java3d.shtml
Site de téléchargement : https://java3d.dev.java.net/binary-builds.html

Author: Nicolas de Marqué Categories: Web Tags: