commit 6d65534bc58fc10be696d3e1c2c18c39ddd86430 from: Sylvain Saboua date: Tue Mar 04 19:21:25 2025 UTC initial archive commit - /dev/null commit + 6d65534bc58fc10be696d3e1c2c18c39ddd86430 blob - /dev/null blob + a287d4271207dbf0788fec9a91eba04dbc28426b (mode 644) --- /dev/null +++ .htaccess @@ -0,0 +1,9 @@ +ErrorDocument 404 /autres/error/index.php?erreur=404 +ErrorDocument 403 /autres/error/index.php?erreur=403 +ErrorDocument 500 "Ce site est indisponible. Vous pouvez vous rendre sur une copie du site. +#ErrorDocument 500 /autres/error/index.php?erreur=500 +Options -Indexes +#AddDefaultCharset iso-8859-1 +AddType application/xhtml+xml .php +php 1 +SetEnv PHP_VER 7 blob - /dev/null blob + b9e12f43c782ea3a01fc0358f958e935def2a522 (mode 644) --- /dev/null +++ apropos/accesskeys.php @@ -0,0 +1,39 @@ +'index','href'=>'./','title'=>'Index de la rubrique "A propos de ce site"'); +$head['access'][0]=array('rel'=>'start','href'=>'./','title'=>'Index de la rubrique "A propos de ce site"'); +$titre='Accesskeys'; +require'../autres/source-haut.php'; +include'menu.php';?> +
+

Listes des accesskeys

+

Une accesskey est une combinaison de touches qui permet de naviguer plus rapidement dans le site. C'est une sorte de "raccourci" + vers différentes pages.

+

Comment utiliser une accesskey ?

+

C'est le Webmaster du site qui met ou non des accesskeys vers les différentes parties de son site. + Généralement s'il y en a elles sont signalées quelquepart, ici par exemple pour ce site.
+ Pour utiliser une accesskey et se rendre a la page correspondante, il faut, selon votre navigateur :

+ +

Quelle est la liste des accesskeys de ce site ?

+

Voici la liste des accesskeys du site, accessible depuis chaque page :

+ + + + + + + + + + +
AccesskeyPage correspondante
1Accueil
2News
3Logiciels
4Configurer
5C'est quoi ?
6A propos de ce site
+ blob - /dev/null blob + 39ecc7f9d452c9bd4df35e33320c7b0891016dd3 (mode 644) --- /dev/null +++ apropos/index.php @@ -0,0 +1,13 @@ + +

A propos de ce site

+

Sommaire

+ + blob - /dev/null blob + 1167783ea77287ffc5de0f41a17046193f2e4af7 (mode 644) --- /dev/null +++ apropos/licence.php @@ -0,0 +1,27 @@ +'index','href'=>'./','title'=>'Index de la rubrique "A propos de ce site"'); +$head['access'][1]=array('rel'=>'index','href'=>'./','title'=>'Index de la rubrique "A propos de ce site"'); +$titre='Licence'; +require'../autres/source-haut.php'; +include'menu.php'; +?> +

Licence

+

Le contenu de ce site m'appartenant (pages, images, animations, sons et toutes autres formes de médias) + est sous Licence Creative Commons.

+
+

Selon le contrat by-nc-sa 2.5, vous pouvez :

+ +

A condition de :

+ +

CC Licence Creative Commons
+ By Citer l'auteur original
+ NC Pas d'utilisation commerciale
+ SA Redistribuer cette création avec un contrat identique à celui-ci

+

http://creativecommons.org/licenses/by-nc-sa/2.5/

+ blob - /dev/null blob + f82b1414aeb4391a250c5fd16e4525546cb441d3 (mode 644) --- /dev/null +++ apropos/menu.php @@ -0,0 +1,10 @@ + blob - /dev/null blob + 8a796e4289e09b9f400bd27479c9127e2f0addd9 (mode 644) --- /dev/null +++ apropos/plan.php5 @@ -0,0 +1,4 @@ +';var_dump($sitemap);echo''; +?> blob - /dev/null blob + 11efd4627ac1ce777c0207487e4f05f3e9d72e88 (mode 644) --- /dev/null +++ apropos/stats.php @@ -0,0 +1,160 @@ +LA MISE EN PLACE DE STATISTIQUES ETANT INTERDITE PAR L'HBERGEUR FREE, CETTE PAGE EST SUPPRIMME. + blob - /dev/null blob + 18748286e5b8b4de5db905f87cdfed1a7d48fe60 (mode 644) --- /dev/null +++ autres/compteurvisites.txt @@ -0,0 +1 @@ +0 blob - /dev/null blob + a66bdd00ce7b8cec6ed009aecf238ed0cb987d27 (mode 644) --- /dev/null +++ autres/confidentiel.php @@ -0,0 +1,34 @@ +$nom_robot) + if(strpos($Navigateur,$nom_robot)!==false) + { + $type_user_agent='bot'; + break; + } +foreach($validateurs as $num=>$nom_validateur) + if(strpos($Navigateur,$nom_validateur)) + { + $type_user_agent='validateur'; + break; + } +foreach($sniffers as $num=>$nom_sniffer) + if(strpos($Navigateur,$nom_robot)) + { + $type_user_agent='sniffer'; + break; + } +if($AdresseIP==='212.162.14.235'or $AdresseIP==='88.191.250.14') + $type_user_agent='validateur'; +//de cette facon on sait si c'est un visiteur ordinaire ou pas +$non_visiteur=isset($type_user_agent); +$SQL['MotDePasse']='$[bim]=8'; +$SQL['Identifiant']='sylvain.sab'; +$SQL['NomDeLaBase']='sylvain_sab'; +?> blob - /dev/null blob + fe92d9654824236ce80fe6712cd8933f63121207 (mode 644) --- /dev/null +++ autres/css/accueil.css @@ -0,0 +1,8 @@ +h1{margin:0} +h1 img{height:33px;padding:5px 10px 10px 10px;width:123px} +#accueil{margin:2em 3em} +#menu_accueil{float:left;margin-bottom:0.5em} +#menu_accueil img{margin:0.2em 0.2em 0.2em 0;width:110px;height:36px} +#rect{text-align:center;height:36px;width:200px;float:right} +#rect img{height:15px;display:block;margin:0.5em 0.5em 0.5em -4em;width:80px} +#addr{clear:both;margin-left:10px} blob - /dev/null blob + 5a5457df2d03f4ddf00d0ef7087cab9eb10764fe (mode 644) --- /dev/null +++ autres/css/apropos.css @@ -0,0 +1,10 @@ +body{background-color:yellow;color:inherit} +#menuapropos{float:left;width:15%;border:2px solid blue;padding:1px} +#menuapropos h3{margin:0;padding:1px;text-indent:0} +ul.app{margin:0;padding-left:20px} +#intro{margin-left:17.5%} +h1{margin:0} +#content{margin:auto;width:70%;text-align:center} +.access,.access td,.access th{text-align:center;border:1px solid black} +ul.cc{list-style:url(/img/licence/ccmini.gif)} +ul.app{list-style:url(/img/mini/apropos.gif)} blob - /dev/null blob + b6b0f8d5f4c21d45b5ffdf26378212bb306961f7 (mode 644) --- /dev/null +++ autres/css/cestquoi.css @@ -0,0 +1,2 @@ +p#next{background:gray;border:1px solid #000;color:inherit;line-height:1.2em;padding:10px} +p#next a{margin:5px 0} blob - /dev/null blob + 575fe4c4e6e94678393f8c3d019f850aea66de7a (mode 644) --- /dev/null +++ autres/css/code.css @@ -0,0 +1,47 @@ +/*xHTML*/ +code.xhtml span.dxml{color:purple;font-style:italic} +code.xhtml span.doctype{color:#04b;font-style:italic} +.xhtml span.bal,.html_bal{color:purple;font-weight:700} +.xhtml span.attr,.html_attr{font-weight:700} +.xhtml span.val,.html_val{color:blue} +.xhtml span.com,.html_com{color:green} +/*CSS*/ +code.css span.com{color:gray} +code.css span.elm{color:maroon;font-weight:700} +code.css span.class{color:#b8860b} +code.css span.id{color:#ff1493} +code.css span.pc{color:red} +code.css span.ppt,code.xhtml span.style span.ppt{color:maroon} +code.css span.val,code.xhtml span.style span.val{color:#ec7600} +/*JS*/ +.js_reserv{font-weight:700} +.js_synt{color:green} +.js_obj{color:red} +.js_str{color:blue} +.js_com{color:gray} +.js_num{color:pink} +/*PHP*/ +code.php span.fonction{font-weight:700} +code.php span.synt{background-color:#0ff} +.php_tag{background-color:gray} +.php_reserv{font-weight:700} +.php_synt{color:green} +.php_str{color:olive} +.php_com{color:gray} +.php_num{color:purple} +.php_func{color:brown;border-bottom:1px dotted brown;font-weight:700} +.php_const{font-weight:700} +.php_var{color:blue} +/*PYTHON*/ +.py_com{color:gray} +.py_func{color:orange} +.py_reserv{font-weight:bold} +.py_num{color:purple} +.py_synt{color:green} +.py_str{color:olive} +/*AUTRES ou TOUS*/ +code.xhtml span.attr,code.php span.fonction{font-weight:700} +pre{margin:0.5em 0 0 2.5em;padding:0.25em} +.view-source{margin:0.25em;overflow:auto} +code,pre{background:#ebebeb;color:inherit;font-family:'dejavu sans mono','bitstream vera sans mono',monospace} +pre#view-source,pre.view-source{padding:1em;border:2px solid black;overflow:auto} blob - /dev/null blob + d9765fca759c758d3849be0f1626b086718b750d (mode 644) --- /dev/null +++ autres/css/configwindows.css @@ -0,0 +1,10 @@ +.som{background:#ccc;border:2px solid #000;color:inherit;font:700 1em arial,sans-serif,serif;width:100%} +.som a{background:inherit;color:#000} +.g,.c,.d{width:33%} +.g{text-align:left} +.c{text-align:center} +.d{text-align:right} +.ex{background:#ffc;border:2px solid #000;color:#000;font-weight:700;padding:10px} +table.service{text-transform:capitalize} +table.service thead,.service tfoot{background:#ffc;color:inherit;font-weight:700;text-align:center} +table.service td{padding-left:10px;padding-right:10px} blob - /dev/null blob + 47b2a919b53dae256fb3f0bfd2d2805e13d749af (mode 644) --- /dev/null +++ autres/css/exemplecss.css @@ -0,0 +1,8 @@ +.rouge{background:inherit;color:red} +.bleu{background:inherit;color:blue} +.nomargin{margin-bottom:0} +.nomargintop{margin-top:0} +p#exemplelorem,p#exemple1{background:#000;border-width:4px 4px 4px 8px;border:solid #66c;color:#fff;margin-left:20%} +p#exemplelorem{padding:10px} +p#exemplelorem:first-letter{background:gray;border:2px green solid;color:red;float:left;font:2em 'comic sans ms',serif; +height:4em;margin-right:2px;padding:10px} blob - /dev/null blob + 3265d398bc794771c6338be0d90687bc520c0a12 (mode 644) --- /dev/null +++ autres/css/index.html @@ -0,0 +1,37 @@ + + + + + Valider les CSS + + + + + + + + + + + + + + + + + + + + + +

+ Cette page comporte une balise link par fichier CSS présent sur le site.
+ Pour valider tous les CSS d'un coup, il suffit de vous rendre sur la page suivante :
+ + http://jigsaw.w3.org/css-validator/validator?uri=http://sylvain.sab.free.fr/autres/css/index.html

+ + Cependant, le fichier "mail.css" est volontairement ommis de cette liste, car il comprend quelques propriétés CSS 3 + qui le rendent invalides. +

+ + blob - /dev/null blob + d3281f7ccc4be2492db612218826c84354025557 (mode 644) --- /dev/null +++ autres/css/liens.css @@ -0,0 +1,6 @@ +div{margin:0 3em} +div h2{margin:1em -1.5em} +div h6{margin:0} +p.liste{padding-left:2em;border:1px solid black;margin-left:-2em} +em{display:list-item;font-style:normal;margin-top:10px;text-transform:capitalize} +em a{background:inherit;color:#000} blob - /dev/null blob + 956fcbb106808a58c6b320bb6f923b29045d933f (mode 644) --- /dev/null +++ autres/css/logiciels.css @@ -0,0 +1,6 @@ +div.log{margin-left:2%;margin-top:1em;border:1px solid gray;padding:1%} +div.log h6{margin-bottom:0.5em;margin-top:0} +div.log h6 a{background:inherit;color:#000} +div.log span.log2,div.log span.log2 a{background:inherit;color:#999} +div.log p{margin:0} +div.log img{margin-right:0.5em} blob - /dev/null blob + 5ac67d5f5d124e9d222c68ba0b419a9a8dbe76b6 (mode 644) --- /dev/null +++ autres/css/logos.css @@ -0,0 +1,27 @@ +div.liens,div.img{color:inherit;padding:1em;background:inherit;border:2px solid #000;max-width:95%;width:auto} +div.liens{margin-top:1em} +p.note{background:#ff9;border:2px dashed red;color:inherit;height:20%;padding:10px;width:25%} +div,p.note{font:1em 'comic sans ms',serif;text-align:center;margin:auto} +hr.t20{width:20%} + +img.t512{width:512px;height:512px} +img.t250{width:250px;height:250px} +img.w200{width:200px} +img.w196{width:196px} +img.w192{width:192px} +img.w180{width:180px} +img.w158{width:158px} +img.w128{width:128px} +img.w120{width:120px} +img.w110{width:110px} +img.w88{width:88px} +img.w80{width:80px} + +img.h200{height:200px} +img.h196{height:196px} +img.h192{height:192px} +img.h128{height:128px} +img.h80{width:80px} +img.h60{height:60px} +img.h48{height:48px} +img.h32{height:32px} blob - /dev/null blob + e9cf7a2751b665d76e9298b82c8ec14c5489e9cb (mode 644) --- /dev/null +++ autres/css/logwinamp.css @@ -0,0 +1,4 @@ +table.dl{text-transform:capitalize;width:100%;border-collapse:collapse;margin-top:0.5em} +table.dl th,table.dl td{border:1px solid} +.dl th{background:#ff0;color:inherit;font-size:1.05em;text-align:center} +.dl caption{font-size:1.2em;text-align:left} blob - /dev/null blob + 2d310c533c6604485b2310fd02cc336cf925c270 (mode 644) --- /dev/null +++ autres/css/mail.css @@ -0,0 +1,12 @@ +/*Il y a quelques propriétés CSS 3 dans ce fichier, +d'ou son invalidité. +-moz-border-radius rend les bordures arrondies +dans les navigateurs qui utilisent le moteur de rendu gecko, +entre autres Firefox, mozilla, seamonkeys et camino*/ +form{border:2px solid #000;width:90%} +p#msg,p#adr,p#radio{-moz-border-radius:10px;border:2px solid #ccc;margin-right:10%;padding:10px} +p#msg textarea{border:1px solid #000;height:30em;width:80%} +p#adr input{border:1px solid #000} +p.bt{text-align:center} +p.bt input{-moz-border-radius:5px;border:1px red solid;width:50%} +input:focus,textarea:focus{background:#efefef;color:#000} blob - /dev/null blob + edeb545d5fe470818ac171b8328f36199e0d70f6 (mode 644) --- /dev/null +++ autres/css/news.css @@ -0,0 +1,2 @@ +p{display:list-item} +div#footer p{display:block} blob - /dev/null blob + fe96fc9db4cdb5de9706068720a995bcb1a68cc7 (mode 644) --- /dev/null +++ autres/css/rss.css @@ -0,0 +1,5 @@ +div#parent{margin:20px auto;width:80%} +strong#titresite{font-size:1.4em;font-style:normal;font-weight:700} +strong#description{font-size:1.2em;font-style:normal;font-weight:700} +div.item{border:1px #c8c8c8 solid;clear:both;margin:3px auto;padding:6px 10px;width:90%} +a.nomitem{font-weight:700} blob - /dev/null blob + 19d2a7e6cb229dfcb9ed0efc6387a5969eefbf95 (mode 644) --- /dev/null +++ autres/css/stats.css @@ -0,0 +1,5 @@ +table,caption{margin-right:60%} +caption{color:red;font-weight:bold;text-align:left;margin-top:1em} +table,th{border:2px solid black} +td{border:1px solid black} +.NbrVisites{text-align:right} blob - /dev/null blob + 8aca70b449c1a861ddb2a74f8ddf179672f079a2 (mode 644) --- /dev/null +++ autres/css/styledefaut.css @@ -0,0 +1,67 @@ +html{height:100%;overflow:scroll;direction:ltr;font-size:0.8em} +body{font-family:'Trebuchet ms',Verdana,Arial,Helvetica,sans-serif;padding:10px;border:1px dotted} +/*menu footer*/ +#menu img{padding:1px 0 0 1px} +#menu .m{width:110px;height:36px;} +#menu .d{padding-right:1px;} +#menu .r{padding:0 14px 0 15px;} +#menu .r img, .footer img{width:80px;height:15px;} +#menu{border:2px solid #000;height:99px;margin:auto;text-align:center;width:445px} +#barmen{border:1px solid #000;height:0} +#footer{clear:both;background:gray;border:1px solid #000;color:inherit;margin:auto;text-align:center} +#footer .f{margin:auto 3%} +#footer a:link,#footer a:visited{background:inherit;color:blue} +#footer .lien{margin:4em} +#footer p{margin:1em;padding:0} +#footer #statScript:hover span{color:red} +/*titres*/ +h1{background:url(/img/gradient/rouge.jpg) #9b0020;font-size:1.5em;padding-left:0.5em;text-transform:uppercase} +h2{background:url(/img/gradient/orange.jpg) #ff0500;font-size:1.4em;text-transform:uppercase;padding-left:0.7em;} +h3{background:url(/img/gradient/vert.jpg) #00ac00;font-weight:400;font-size:1.3em;text-indent:1em;text-transform:capitalize} +h4{background:url(/img/gradient/bleu.jpg) #0205cc;font-weight:700;text-indent:1.2em;text-transform:capitalize} +h5{background:url(/img/gradient/gris.jpg) bottom #feffed;font-variant:small-caps;text-transform:capitalize;text-indent:1.5em;color:#fff} +h5:first-letter{font-weight:400;text-transform:uppercase} +h6{font-family:'times new roman',serif;text-transform:capitalize;text-indent:2.5em; + background:url(/img/gradient/jaune.jpg) #feff37;width:auto;} +h1,h2,h3,h4,h5,h6{background-repeat:repeat-x} +h1,h2,h3{border:2px solid #000;font-family:'Comic sans MS',sans-serif} +h4,h5,h6{border:2px solid gray;font-family:Arial,sans-serif} +h1,h2{border:2px solid #000} +/*quevoir*/ +table.quevoir caption{font-size:1.2em;text-align:left;text-transform:capitalize} +table.quevoir,table.quevoir caption{margin-left:2em} +table.quevoir tfoot,table.quevoir thead{background:#3cf;color:#000;font-size:1.1em;text-align:center;text-transform:capitalize} +table.quevoir tbody{text-align:center;text-transform:capitalize} +/*paragraphes*/ +p{margin:2.5%} +p:hover:first-letter{color:red} +p:first-letter,p.pintro:first-letter{font:700 0.9em 'Comic Sans MS',serif;text-transform:uppercase} +.pintro{margin:0 5%;text-indent:10px} +/*liens*/ +a:link{text-decoration:none} +a:hover{background:inherit;color:#000;text-decoration:underline overline} +a:active,a:focus,a:visited:active;a:visited:focus{background:#000;color:#3f3;text-decoration:underline overline} +a:active img,a:focus:img,a:visited:focus img,a:visited:active img{border:1px dotted GRAY} +a:visited{background:inherit;color:#666;text-decoration:none} +.fr:before,a.externe:lang(fr):before,[hreflang|=fr]:before{content:url(/img/mini/flagfr.png)' [fr] '} +.en:before,a.externe:lang(en):before,[hreflang|=en]:before{content:url(/img/mini/flaguk.png)' [en] '} +.de:before,a.externe:lang(de):before,[hreflang|=de]:before{content:url(/img/mini/flagde.png)' [de] '} +.ru:before,a.externe:lang(ru):before,[hreflang|=ru]:before{content:url(/img/mini/flagru.png)' [ru] '} +.externe:after{content:' 'url(/img/mini/externe.png)} +/*images*/ +img{border:0;vertical-align:middle} +img.w80{width:80px} +img.h15{height:15px} +img.t16{width:16px;height:16px} +img.t32{width:32px;height:32px} +img.t48{width:48px;height:48px} +img.t64{width:64px;height:64px} +img.t128{width:128px;height:128px} +img.t256{width:256px;height:256px} +/*autres (corrections)*/ +h1 img{margin:0.3em} +dt{margin-left:2.5%;text-decoration:underline} +hr.barquoi{clear:both;margin-right:50%} +abbr,acronym{cursor:help} +.motcle,strong,em{font-family:Arial,sans-serif} +.motcle{font-weight:700} blob - /dev/null blob + 76046f107e222cbda54d699efd71617143cf89e7 (mode 644) --- /dev/null +++ autres/css/stylefavs.css @@ -0,0 +1,6 @@ +body{font:1em 'Trebuchet MS',Verdana,Arial,Helvetica,sans-serif} +a.d{font-weight:700} +span.l{font-size:0.8em} +span.n{margin-left:3%} +hr.fb{margin:auto;width:80%} +p.note{background:gray;border:1px solid #000;color:inherit;text-align:center} blob - /dev/null blob + 44e7f4f82e2a15a2225f1ef21c1542b41f1136b2 (mode 644) --- /dev/null +++ autres/css/stylemotcle.css @@ -0,0 +1,9 @@ +.code{background:#ccc;border:1px solid #000;color:inherit} +.code1{color:#939;font-weight:700} +.code2{color:#33f} +.codexml{background:#ccc;border:2px solid;color:inherit} +.xml1{color:#c3c;font-style:normal;font-weight:700} +.xml2{color:#939} +.xml3{color:#990} +.xml4{color:#63f} +.code1,.code2,.xml1,.xml2,.xml3,.xml4{background:inherit} blob - /dev/null blob + b576fdc3c25a36e8b1b6472421b04860ae221807 (mode 644) --- /dev/null +++ autres/css/temp.css @@ -0,0 +1,5 @@ +.entete{font:1.1em Arial,serif;text-align:center;text-transform:capitalize;background:#ffc;color:#000} +.taille{text-align:right} +table{text-transform:capitalize;width:100%} +td{padding:2px} +div#animation{text-align:center} blob - /dev/null blob + 0294f0c87b35159ad4f9d6cc1c1d934fa8da96c7 (mode 644) --- /dev/null +++ autres/error/index.php @@ -0,0 +1,76 @@ +une copie que je place en cas de problème.'; + break; + default: + $titre='Erreur 404 : Fichier Introuvable'; + $Erreur='Ce fichier est introuvable. Vérifiez l\'url que vous avez entré.
'."\n\t". + 'Le lien est peut-être mort. L\'erreur à été enregistrée dans la base de données afin que je puisse y remédier.'; + break; + } + $head['css'][0]['filename']='erreur'; + require'../source-haut.php'; + echo'
',"\n", + '

',$titre,'

',"\n", + '

',$Erreur,"\n", + '
',"\n", + ' Retour à l\'accueil : ',"\n", + ' Sylvain.sab',"\n", + '

',"\n", + '
',"\n"; +} +else +{ + $titre='Voir les erreurs'; + require'../source-haut.php';?> + +

Les erreurs du site

+

Quelle erreur voulez-vous voir ?

+ +Il y a eu un problème durant la classification de cette erreur.'; + RequeteSQL($AjoutErreur,$Erreur,'Insertion'); +} +require'../source-bas.php'; +?> blob - /dev/null blob + 54ce6539e1f5ce5b2d03d4efbae441bab15b3681 (mode 644) --- /dev/null +++ autres/redir.php @@ -0,0 +1,52 @@ +'http://download.nullsoft.com/winamp/client/winamp524_full_bundle_emusic-7plus.exe', + 'TraductionWinamp'=>'http://download.nullsoft.com/customize/component/2006/6/14/P/winamp_in_FR_.exe', + 'OGGWinamp' =>'http://download.nullsoft.com/customize/component/2005/1/11/P/Ogg-Vorbis_encoder_v1-1.exe', + 'SkinWMP' =>'http://www.winamp.com/skins/details.php?id=143975'); +//Si la redirection demandée existe +if(array_key_exists($page,$redirections)) +{ + //titre et meta de redirection, puis la page (explications) + $head=' Redirection'."\n".' '."\n"; + $page='

Vous allez être redirigé dans 5 secondes vers le téléchargement.

+

Retour à la notice de winamp

'; + //on affiche la page avec la redirection +?> + + + + + + + + + +

Cette page comporte des liens vers des urls longues, vers lesquelles je redirige au lieu de donner le lien directement. + Ce sont surtout des liens vers des fichiers à télécharger.

+

'.$descriptionUrl[$compte++].'
'."\n".' '; + echo '

'; + require'source-bas.php'; +} +?> blob - /dev/null blob + cf98e0e57f340d7c457d94b3f5d43dde398c4b20 (mode 644) --- /dev/null +++ autres/source-bas.php @@ -0,0 +1,107 @@ +1 requête'; +else + $InfoRequete=''.$NombreDeRequetes.' requêtes'; +echo '
' + //licence CC et fin de page + ?> + + blob - /dev/null blob + 24d2a2d74aa817db092f91b11c0d5697a7f8747a (mode 644) --- /dev/null +++ autres/source-haut.php @@ -0,0 +1,225 @@ +Une erreur est survenue durant la requête :
'. + $erreur.'

'."\n".'

Requête :
'.$requete.'

'."\n".'

Erreur (numéro '; + //pour la durée de la requête + $TempsDebutSQL=array_sum(explode(' ',microtime())); + //on envoie la requête + if($Action==='Recuperation') + $Resultat=mysql_query($requete)or die($MsgErrStandard.mysql_errno().') :'.mysql_error().'

'); + elseif($Action==='Insertion'or $Action==='Modification') + $Resultat=mysql_unbuffered_query($requete)or die($MsgErrStandard.mysql_errno().') :'.mysql_error().'

'); + //temps de fin d'exécution SQL + $TempsTotalSQL+=array_sum(explode(' ',microtime()))-$TempsDebutSQL; + return $Resultat; +} + +if(!isset($charset)) + $charset='iso-8859-1'; + +//si on veut voir ce fichier +if($_SERVER['SCRIPT_NAME']==='/autres/source-haut.php') +{ + $_GET['source']=''; + $titre='Page mère'; +} + +//pour la BDD + $SQL['TitrePage']=$titre; + +require'confidentiel.php'; +/*si on a demandé à voir la source, on modifie le titre + et on empêche les moteurs de recherche d'indexer + (sinon mon site est "référencé en double" dans google...)*/ + if(isset($_GET['source'])) + { + $titre='Code de la page : «'.$titre.'»'; + if($_SERVER['SCRIPT_NAME']!=='/autres/source-haut.php') + $head=''."\n\t". + ''."\n\t"; + $head.=''."\n\t". + ''; + } +/*servir le bon type MIME + if(!function_exists('htmlspecialchars_decode')) + { + function htmlspecialchars_decode($str) + { + return str_replace(array('<','>','&'),array('<','>','&'),$str); + } + }*/ + if(false!==strpos($_SERVER['HTTP_ACCEPT'],'application/xhtml+xml')or $type_user_agent=='validateur'){ + $ContentType='application/xhtml+xml'; + $Doctype='\n". + ''; + ob_start(); + } + else{ + $ContentType='text/html'; + $Doctype=''; + function callback($texte) + { + $in=array(' xml:lang="','xmlns="http://www.w3.org/1999/xhtml"',' />'); + $out=array(' lang="','','>'); + return /*htmlspecialchars_decode(html_entities(*/str_replace($in,$out,$texte);//,ENT_NOQUOTES),ENT_NOQUOTES); + } + ob_start('callback'); + } + header('Content-Type:'.$ContentType.';charset=',$charset); +/************ +//affichage de la page*/ + echo $Doctype,"\n",'',"\n",'',"\n\t", + /*Balise pour empêcher l'indexation par les moteurs de recherche + ajoutée le 27/6/2015 en vue d'une nouvelle utilisation du domaine, + celui sur l'informatique étant largement obsolète*/ + '',"\n\t", + '',"\n\t", + '',"\n\t", + '',"\n\t", + '',"\n\t", + '',"\n\n\t", + '',$titre,' - Sylvain.sab';?> + + + + + + + + + + + + + +',"\n\t"; + if(is_array($head)) + { + if(is_array($head['css'])) + foreach($head['css']as $numero_css=>$donnees) + { + if(empty($donnees['media'])) + $donnees['media']='all'; + echo'',"\n\t"; + } + if(is_array($head['access'])) + foreach($head['access']as $numero_linkaccess=>$attributs_et_valeurs) + { + echo'$val) + echo $attr,'="',$val,'" '; + echo'/>',"\n\t"; + } + if(!empty($head['autres'])) + echo $head['autres']; + } + else + echo $head; + echo"\n"; +} +echo'',"\n"; +/************ +/menu +/***********/ +echo'
',"\n"; +//************ +//pour voir la source*/ +if(isset($_GET['source'])) +{ + $SQL['TypePage']=4; + /*************************************** + Pour générer les codes + ***************************************/ + function GenererCodeSourcePHP($adresseFichier) + { + $page=highlight_file($adresseFichier,true); + $page=preg_replace('``i','>color:$1<>>',$page); + + $in =array('"', '\'', '', '','','
',' ','<>','',''."\n".'',"\n".'','class="xhtml">'."\n"); + $out=array('"',''','
','
', '',"\n", ' ','"', '', '', '', 'class="xhtml">'); + $page=str_replace($in,$out,$page); + + $page=preg_replace_callback('#\?>(.+)<\?php#sU','ColorerCodeHTML',$page); + + return $page; + } + function ColorerCodeHTML($Code) + { + //les entités + $Code[0]=preg_replace('`&(#x?[a-z0-9]+|[a-z]+)`i','$0',$Code[0]); + //les commentaires + $Code[0]=preg_replace('#<!--.*-->#sU','$0',$Code[0]); + //les balises et attributs + $SyntaxeBalise='#<(/?[a-z0-9]+)( (.*))?( /)?>#sU'; + $Code[0]=preg_replace_callback($SyntaxeBalise,'ColorerBalise',$Code[0]); + + return $Code[0]; + } + function ColorerBalise($Balise) + { + //balise (pas les attributs) + $Balise[0]=str_replace('<'.$Balise[1],'<'.$Balise[1].'',$Balise[0]); + //attributs + $Balise[0]=preg_replace('#([a-z]+)=((&\#039;|")([^\3]*)\3)#U','$1=$2',$Balise[0]); + + return $Balise[0]; + } + if($_SERVER['SCRIPT_NAME']==='/autres/source-haut.php') + { + echo'

Code des fichiers sources

',"\n\n", + '

Ces fichiers sont utilisés sur chaque page, ils contiennent les menus, ', + 'et certains scripts succeptibles d\'être utilisés partout.
',"\n\t", + 'Il y a deux fichiers qui servent à cela : un fichier "source-haut.php" et un autre "source-bas.php".

',"\n\n"; + echo'

source-haut.php

',GenererCodeSourcePHP('source-haut.php'),"\n\n\n", + '

source-bas.php

',"\n",GenererCodeSourcePHP('source-bas.php'); + } + else + { + echo'

',$titre,'

',"\n",'

Retour

',"\n", + '

Ceci est le code php du fichier :

',"\n",GenererCodeSourcePHP($_SERVER['SCRIPT_FILENAME']),"\n", + '

Retour

'; + } + require $_SERVER['DOCUMENT_ROOT'].'/autres/source-bas.php'; + exit; +} + /* + $page=str_replace(array('"','\''),array('"','''),$page); + $page=str_replace(array('','','','
',' '), + array('
','
','',"\n",' '),$page); + $page=str_replace(array('<>','',''."\n".'',"\n".'','class="xhtml">'."\n"), + array('"','','','','class="xhtml">'),$page); + */ +?> blob - /dev/null blob + c114f667fb1ba1c9cf75a37b0ed5bcf043242a20 (mode 644) --- /dev/null +++ autres/source.php @@ -0,0 +1,14 @@ +

+ Cette page est maintenant obsolète.
+ La page qui correspond est source-haut.php. +

+

+ Un mail m'a été envoyé pour que je mette àjour les mauvais liens. +

+

+ Voici le code de la page : +

+ blob - /dev/null blob + 2043ad41f3dd311a26d38302970a1623d1ae4102 (mode 644) --- /dev/null +++ cestquoi/index.php @@ -0,0 +1,96 @@ + +

TuxC'est quoi GNU/Linux ?

+

GNU/Linux

+

Linux appartient au monde du logiciel libre et open source. + C'est un système d'exploitation, comme Windows XP, Windows Vista, ou encore Mac OS, qui permet comme le nom l'indique d'exploiter son ordinateur. Tout système d'exploitation est composé d'un noyau, qui s'occupe des tâches élémentaires (Gestion de la mémoire, dialogues entre les logiciels et le matériel...) et d'un ensemble de logiciels. Le noyau de Linux est... Linux. L'ensemble de logiciels se nomme GNU (A l'époque ou il fut dévellopé, les principaux systèmes d'exploitations étaient des systèmes non-libres dérivés d'UNIX, et très chers. Le nom GNU fut donc donné à cet ensemble, pour signifier "GNU is Not Unix" (c'est un acronyme récursif), soit "GNU n'est pas Unix"). Le système d'exploitation est donc GNU/Linux, mais on dit souvent Linux.

+

Distributions

+

Linux est libre, chacun est donc libre de voir le code, le modifier et le redistribuer. + Cette liberté est la la base de la variété des distributions.

+

Chaque distribution utilise le même noyau Linux, mais les logiciels fournis par défaut (s'il y en a) + ne seront pas les mêmes. Les distributions diffèrent également selon leur orientation : certaines comme Red Hat sont plus indiquées pour être utilisées comme serveur, d'autres comme Ubuntu ou Mandriva sont plus destinées à un système d'exploitation complet. La façon dont elles sont fabriquées et maintenues à jour diffère également : Suse est gérée par une entreprise, alors que Debian et ses dérivés sont fabriquées par les utilisateurs. Enfin, le prix sépare les distributions : la majorité sont gratuites, mais certaines comme mandriva (Pour avoir un plus grand nombre de logiciels) sont payantes.

+

Principales différences avec Windows

+

(Note : ici, je n'aborde que les différences directement visibles par l'utilisateur)

+

Gestion des fichiers, dossiers, et périphériques

+

Sous Windows, l'antislash "\" est utilisé pour délimiter des fichiers/dossiers, et + Linux utilise le slash "/".
Sous Linux, lorsque l'on utilise le gestionnaire de fichiers (l'équivalent de l'explorateur Windows), on ne voit pas les lecteurs CD/DVD, les disques durs, les clés USB, et tout ce qui peut servir à stocker des données. Chacun de ces éléments est accessible via un dossier, comme s'il n'y avait qu'un seul disque dur. Ce dossier est appelé "point de montage" : par exemple, les CDs et DVDs sont souvent montés (c'est à dire accessibles via) dans le dossier /media/cdrom1, /media/cdrom2, etc. Il est possible de changer les points de montage des périphériques, et de configurer Linux pour monter un périphérique à un certain endroit.
Le dossier le plus haut dans l'arborescence est donc "/".

+

Gestion des logiciels

+

Sous Windows, pour installer un logiciel, il faut le chercher sur internet, + le télécharger et l'installer quelquepart dans un dossier. Pour le mettre à jour, il faut vérifier soit-même, via le logiciel si cela est possible ou bien sur Internet. C'est assez chaotique.
+ Sous Linux, il y a des serveurs qui fournissent la liste de la majorité des logiciels disponibles, et les mises à jour quand il y en a. Il est possible de choisir différentes sources de logiciels : gérés par la société, gérés par la communauté, open-source ou non. Les mises à jour sont classées par catégories : mises à jour importantes de sécurité, mises à jour recommandées, etc. Pour installer un logiciel, il suffit de regarder dans la liste disponible, puis de l'installer. Les mises à jour de tout le système (noyau et logiciels) sont vérifiées régulièrement. Il n'y a donc pas besoin de s'en occupper.

+

Les adresses des sources ou sont disponibles les logiciels sont apellés les dépôts. + Les logiciels sont en fait des paquets. Par exemple, le paquet correspondant à Firefox se nomme... firefox. Mais un logiciel peut nécéssiter plusieurs paquets. Par exemple, il est nécéssaire d'installer un paquet de traduction pour avoir firefox en français.

+

Interfaces graphiques

+

Sous Windows, il n'y a qu'une seule interface graphique : il y a forcément une barre des tâches, + un menu démarrer, la liste des applications ouvertes. Un seule thème de fenêtres est disponible, et vous pouvez choisir entre trois couleurs. A moins d'installer encore et encore des logiciels, il n'est pas vraiment possible de personaliser l'interface.
+ Avec Linux, l'interface graphique est un logiciel à part entière. Il est donc possible d'en installer plusieurs, et des les configurer à loisir.

+

Voici une capture de chacune des trois interfaces graphiques principales :

+
+

KDE (Voir KDE sur wikipédia)
+ + +

+

Gnome (Voir Gnome sur wikipédia)
+ + +

+

Xfce (Voir Xfce sur wikipédia)
+ +

+

Console

+

Sous linux, tout est faisable via une interface graphique (c'est à dire + en utilisant des logiciels spécifiques, en cliquant sur des boutons, etc...). Mais il est également possible de faire ce que l'on veut (lister des répertoires et des fichiers, installer et gérer des paquets, éditer des fichiers, lancer ou arrêter des programmes...). Bien sûr, il n'est pas du tout obligatoire d'utiliser la console si on préfère passer par des logiciels ordinaires. Mais une fois que l'on est habitué, c'est beaucoup plus rapide.

+

Exemples de ce que l'on peut faire via une console (aussi appelé terminal ou shell) :

+
+
ls -l /
+
Liste tous les fichiers et dossiers immédiatement contenus dans / en affichant le nom, + la date de modification, la taille, les propriétaires...
+ ls : la commande qui permet de lister des fichiers/dossiers
+ -l : option (les options commencent par deux tirets ou un seul en abrégé) qui demande d'afficher plusieurs renseignements sur les fichiers.
+ / : l'endroit ou sont les fichiers/dossiers à lister. Ici, je choisis de lister le dossier racine.
+
apt-cache search office
+
Permet de rechercher un paquet dont le nom contient "office".
+ apt-cache : pour manipuler la liste des paquets existants
+ search : pour indiquer à la commande apt-cahce que l'on veut chercher un paquet
+ office : on recherche un paquet qui contient "office". dans cette exemple, on cherche une suite qui peut ressembler à Microsoft office (word), OpenOffice.org, ou autre, mais on peut chercher n'importe quoi.
+
sudo aptitude install firefox
+
Pour installer le paquet firefox
+ sudo : Commande pour demander les droits d'administrateur (nécéssaires pour installer un paquet)
+ aptitude : commande qui permet de manipuler les paquets
+ install : pour indiquer à aptitude que l'on veut installer un paquet
+ firefox : le nom du paquet à installer
+
man ls
+
Pour avoir les informations du manuel sur la commande "ls"
+ man : utiliser le manuel, pour avoir des informations sur les commandes
+ ls : la commande que l'on veut apprendre
+

Il est possible de lancer une console en interface graphique, en utilisant + la console fournie par défaut avec son interface, et c'est ce que l'on fait le plus souvent pour utiliser une console, mais la vraie console est en mode texte, c'est à dire que tout l'écran est occupé. Sous Linux, sept consoles peuvent tourner en même temps, indépendemment de l'interface graphique (peut importe qu'elle fonctionne ou non). C'est très utile lorsque l'interface graphique plante par exemple.

+

Note : Windows dispose également d'une console, via le menu Démarrer>Accessoires, + mais il ne s'agit que d'une console DOS, et elle est beaucoup moins utilisée que sous Linux.

+
+

Voir également :

+ Pages de ce site : + C'est quoi le libre, l'open-source ?
+
+ Comprendre Linux :
+ Sebsauvage : C'est quoi Linux ?
+ Wikipédia : Linux
+ CCM : Linux

+ Plus d'informations sur Linux :
+ CCM : Astuces Linux
+ CCM : Débuter sous Linux
+ SDZ : Tutoriels Linux

+ Quelques sites entièrement dédiés à Linux :
+ Linuxfr.org
+ Lea Linux
+ Passer à GNU/Linux
+ Distrowatch, un site sur l'actualité des distributions
+ Linux France
+ Linux Center

+ Autres :
+ Récit d'une expérience (très subjectif) : un utilisateur de Linux a découvert Windows

+ \ No newline at end of file blob - /dev/null blob + a0d7fd513a54064b48d6aec944510dab876d4fe6 (mode 644) --- /dev/null +++ cestquoi/libre/index.php @@ -0,0 +1,50 @@ + +

CopyleftC'est quoi les logiciels libres ? L'open source ?

+

Chaque programme que vous utilisez est codé, c'est à dire qu'il est programmé + pour faire + certaines choses à un moment donné (voir "C'est quoi la programmation ?"). Chaque logiciel a donc un code source, qui définit ce que fait le programme.
+ Mais généralement, le programme que vous utilisez est compilé, c'est à dire qu'il a été transformé en fichier binaire, composé de 0 et de 1 et compréhensible uniquement par l'ordinateur. Vous ne pouvez donc pas connaitre le code que vous utilisez, ni savoir précisément ce qu'il fait.

+

L'Open Source

+

Avec les logiciels open-source, le code source est accessible (open source=source ouvert), + et chacun peut savoir (pour peu qu'on ait des connaissances en programmation) ce que fait le logiciel. On peut donc accorder sa confiance au logiciel.

+

Mais c'est loin d'être le seul avantage de l'open source par rapport au logiciel propriétaire + (code source non disponible) : selon les restrictions qu'a fixé l'auteur du logiciel, il est également possible de copier le logiciel pour le redistribuer, de le modifier, de le vendre, etc...

+

Le logiciel libre

+

L'auteur d'un logiciel open-source peut imposer plusieurs restrictions quant à l'utilisation de son + logiciel : interdiction de le modifier, interdiction de l'utiliser de façon commerciale, etc. Avec le logiciel libre, il n'y a absolument aucune restriction : vous êtes libre de le copier, de le modifier, de revendre les modifications, bref, tout ce que vous voulez.

+

La seule restriction possible sur un logiciel libre est le gauche d'auteur + (le logo dans le titre) : par opposition au droit d'auteur, cela signifie que si l'on redistribue le logiciel, il n'est pas possible de lui appliquer des restrictions.

+

ATTENTION, contrairement à certaines idées, le logiciel libre n'est pas forcément gratuit. + Il existe des versions de Mandriva payantes, et Mandriva est pourtant un logiciel libre.

+

Avantages du logiciel libre ou open source par rapport au logiciel propriétaire

+

Le logiciel libre étant généralement dévellopé par une communauté + d'utilisateurs, et non une entreprise, les failles de sécurité sont corrigées beaucoup plus rapidement. Et si une entreprise qui dévellopait un logiciel libre l'abandonnent, les utilisateurs peuvent le reprendre.

+

Avec le logiciel propriétaire, lorsque l'entreprise arrête de fabriquer ce logiciel, + il n'y a plus de mise à jour, et donc des risques de sécurité sont encourus. Il n'y également plus de support (hotline) à propos de ce logiciel. Dans le monde de l'open-source, les utilisateurs eux-mêmes fabriquent le logiciel. S'il y a des utilisateurs, il y a des mises à jour et des nouveautés.

+

Si vous avez des connaissances en programmation, il est possible de modifier le logiciel, + pour l'adapter à vos besoins, le personaliser, etc. Ce n'est pas possible avec le logiciel propriétaire.

+

Extensions du mot libre

+

Initialement, le mot "libre" en informatique signifie "libre de droits" pour un logiciel. + Mais cette définition s'est étendue à plusieurs autres choses : des images, des articles...
+ Par exemple, le contenu de ce site est sous License libre.

+

Ou est le libre ?

+

Sans que vous le sachiez peut-être, le libre vous sert tous les jours :

+
  • La majorité des serveurs Internet fonctionnent grâce à Linux, + un système libre.
  • +
  • Le navigateur Firefox, comme beaucoup d'autres logiciels, est libre.
  • +
  • Les articles de l'encyclopédie mondiale traitant de tous les sujets, wikipédia, sont libres.
  • +
  • Internet utilise le protocole TCP/IP, libre également.
+
+

Voire également :
+Sebsauvage : Les licences logicielles
+ Sebsauvage : Si si. L'opensource, ça marche.
+ Biologeek.com : Pourquoi contribuer aux logiciels libres ?
+ SDZ : 2007, essor de la culture libre ?
+ Wikipédia : Logiciel Libre
+ Wikipédia : Open Source
+ APRIL

+ \ No newline at end of file blob - /dev/null blob + c50f27781b8d55b2e9aea4576eb92aa3a9267ac4 (mode 644) --- /dev/null +++ cestquoi/programmation/index.php @@ -0,0 +1,124 @@ +'index','href'=>'../','title'=>'Index de la rubrique "C\'est quoi"'); +$titre='C\'est quoi la programmation ?'; +require'../../autres/source-haut.php'?> +

+ + +C'est quoi la programmation ?
Comment ça fonctionne ? +

+

Tout logiciel est programmé pour faire certaines choses a un moment donné. + Par exemple, votre navigateur ouvre une page quand vous cliquez sur un lien. + Cette fonctionnalité a été programmée par le ou les développeurs + du logiciel en question. Tous les logiciels sont programmés de cette manière : + ils éxecutent différentes instructions selon les actions de l'utilisateur.

+

Pour ces explications, mettons-nous dans la peau d'un "programmeur".

+

Un logiciel est écrit avec un certain langage de programmation. + Il existe plusieurs langages aux syntaxes différentes. + Cependant, il y a des choses que l'on retrouve dans la plupart des langages :

+
+
Les fonctions
+
Elles servent à exécuter une actionspécifique.
+
Les variables
+
Elles servent à stocker différentes informations.
+
Les boucles
+
Elles servent à répéter une action pendant un certain temps.
+
Les conditions
+
Elles servent à exécuter ou pas certaines actions selon certaines condition données.
+

Les fonctions

+

Une fonction exécute certaines actions (des calculs par exemple) en utilisant des arguments (aussi apellés paramètres), + indiqués entre parenthèses, et séparés par des virgules, après le nom de la fonction lorsqu'on l'utilise :
+ nomDeLaFonction(argument1,argument2)
+ Une fonction peut avoir un ou plusieurs arguments, voire aucun, et dans ce cas il faut mettre des parenthèses vides.

+

La fonction la plus basique est celle qui permet d'afficher du texte. + Pour simplifier, admettons qu'elle se nomme "affiche". Donc si l'on veut écrire "Bonjour", + on écrira ce code :
+ affiche("Bonjour")
+ Il existe des fonctions toutes prêtes. La fonction "affiche" en est une.

+

On peut également créer ses propres fonctions. + Par exemple, je crée une fonction nommée "Saluer", + qui affichera "Bonjour ", puis le nom d'une personne, puis " ! bienvenue sur ",puis le nom d'un logiciel :

+
fonction Saluer(Nom,Logiciel):
+  affiche('Bonjour ',Nom,' ! Bienvenue dans ',Logiciel)
+

Ensuite, on peut "appeler" la fonction en écrivant son nom. + Les instructions qui sont contenues dans cette fonction s'exécuteront : + il n'y a pas besoin de ré-écrire tout ce que fait la fonction. + De plus, si je change la fonction pour qu'elle écrive "Bienvenue" et plus "Bonjour", + cela se répercutera partout ou l'on utilise cette fonction !

+

Quand on utilise une fonction, il faut mettre à la place des arguments ce que l'on veut utiliser. + Par exemple, après avoir crée la fonction "Saluer", je peux faire ceci :
+ Saluer("Sylvain",'Firefox')
+ Qui affichera : "Bonjour Sylvain ! Bienvenue sur Firefox".

+

Les variables

+

Elles servent a stocker différentes informations. Une variable peut contenir :

+
+
Une «chaîne de caractères», c'est a dire un groupe de lettres ou de chiffres. Par exemple :
+
"Bonjour". Ou bien : "A". Ou encore : "Il y a 6 lettres dans le mot 'lettre' ". Ou : "Azerty123456blabla()".
+
Une valeur numérique :
+
1, ou 2, ou 123, ou encore 20.1, etc....
+
Un booléen :
+
Ce type spécial de variable peut valoir Vrai ou Faux.
+

On peut utiliser les variables pour enregistrer n'importe quelle information (du moment qu'elle correspond à un des trois types). + Par exemple, un nom (chaîne de caractères), l'âge de quelqu'un (valeur numérique), + ou s'il aime lire (booléen).

+

Pour créer (on dit aussi "définir") une variable, il suffit d'écrire son nom et sa valeur :
Par exemple :

+
+
phrase="Ceci est du code"
+
La variable "phrase" aura pour valeur la chaîne de caractères "Ceci est du code".
+
nombre=1+4
+
La variable "nombre" aura la valeur numérique 5.
+
il_aime_le_vert=faux
+
Le booléen "il_aime_le_vert" vaudra faux.
+

Il ne faut pas se tromper lorsque l'on créée une variable :

+
    +
  • Il faut délimiter les chaînes de caractères par des guillemets (ou apostrophes)
  • +
  • Il ne faut pas délimiter par des guillemets ou apostrophes les valeurs numériques et + les booléens, car sinon ils seraient pris pour des chaînes de caractères.
+

Les boucles

+

Les boucles sont utilisées pour répéter une action pendant qu'une certaine condition est vraie. + Par exemple, je peux créer une variable "nombre", et afficher la valeur de cette variable (l'action a faire) + pendant qu'elle est inférieure à 20 (la condition) :

+
nombre=3     #On crée d'abord la variable
+pendant que nombre < 20:#Ceci se passera tant qu'elle sera inférieure (inférieure:"<") à 20
+  affiche(nombre)#On écrira la valeur de la variable nombre
+  nombre=nombre+1#il faut augmenter la valeur de la variable sinon la boucle sera infinie
+

Les conditions

+

Les conditions servent à exécuter ou pas des actions selon plusieurs critères (généralement, + la valeur d'une variable) :
+ si condition(s):
  action(s)

+ Par exemple, voici ce que je devrais écrire si je veux dire à une personne si elle est + majeure ou mineure, selon son âge :

+
si age > 18:#si la personne a plus de 18 ans (supérieur: ">")
+  affiche("Vous êtes majeur")
+si age < 18:#Si la personne a moins de 18 ans
+  affiche("Vous êtes mineur")
+

Mais si l'âge est strictement égal a 18, rien ne s'affichera. On peut utiliser une autre condition, "sinon si".

+

Voici comment faire :

+
si age > 18:#si la personne a plus de 18 ans
+  affiche("Vous êtes majeur")
+sinon si age == 18:#Si la personne N'A PAS plus de 18 ans (la condition précédente), mais qu'elle a exactement 18 ans (il faut mettre deux signes égal)
+  affiche("Vous avez exactement 18 ans")
+sinon:#si aucune des conditions précédentes n'est vraie, la personne est mineure
+  affiche("Vous êtes mineur")
+

Conclusion

+

Un langage de programmation est dynamique, il agit en fonction de plusieurs éléments. + Il y a des choses que l'on retrouve dans plusieurs langages de programmation :

+
Les fonctions
+
Elles servent a exécuter une action spécifique.
+
Les variables
+
Elles servent a stocker différentes informations.
+
Les boucles
+
Elles servent a répéter une action pendant un certain temps.
+
Les conditions
+
Elles servent a exécuter ou pas certaines actions selon certaines condition données.
+

Il existe beaucoup de langages de programmation. Ils ont une syntaxe plus ou moins différente. + Le langage que j'ai utilisé pour ces exemples est le langage Python (un des plus simples à mon avis).
+ Evidemment, la fonction qui permet d'afficher du texte ne s'appelle pas "affiche", et les "sinon si", etc... n'ont pas ce nom. + Les langages sont souvent anglais. Par exemple, le "Si" des conditions est à remplacer par "if".

+

Liens :
+Wikipédia : La programmation
+Wikipédia : Les langages de programmation
+Comment Ca Marche : Comment débuter ? Quel langage ?

+ blob - /dev/null blob + 9ac90fb6c6335742e99542fa0bc90a558aefaea7 (mode 644) --- /dev/null +++ cestquoi/starforce.php @@ -0,0 +1,61 @@ +'index','href'=>'./','title'=>'Index de la rubrique "C\'est quoi ?"'); +$titre='C\'est quoi Starforce ?'; +require'../autres/source-haut.php'?> +

+ C'est quoi Starforce?

+

Starforce est une protection anti-copie présente dans certains jeux. + Vous savez, une protection qui vérifie si vous avez bien mis le CD dans l'ordinateur + au moment ou vous voulez jouer. Jusque là, rien de plus normal.

+

Cependant voila. Ce ne sont que des rumeurs, mais certains utilisateurs on eu des problèmes + avec leurs graveurs de cd et/ou dvd.Les graveurs sont tombés en panne ou bugaient. + Les logiciels de gravure (nero par exemple) ou d'émulation (daemon tools par exemple) fonctionnent + parfois mal ou plus du tout.
+ Il y a des erreurs de lecture des CD... En plus le processus de starforce se lance au démarrage du Bios + (c'est ce qui se lance des que vous allumez votre ordinateur, il ne peut pas fonctionner sans), + donc c'est difficile de l'enlever, et il ralentit le  système. + Ça ressemble a un rootkit : vous ne voyez pas ses processus dans le gestionnaire des tâches. + C'est déjà bien une preuve du mépris du client. +

+

Dans certaines démos (comme Splinter Cell Chaos Theory) Starforce place également + une protection (soit disant pour Empêcher les pirates d'exploiter le jeu) !! + C'est complètement débile, une démo n'a pas besoin du CD pour fonctionner + et il est légal de la copier, la graver, la télécharger... +

+

+ Mais nous arrivons au pire : Galactic Civilizations II, un jeu édité par Stardock, ne contient + AUCUNE PROTECTION. Un beau pied de nez à tous les éditeurs de jeux et/ou de protections + qui cherchent des protections de plus en plus efficaces pour empêcher le piratage, qui, + de toute façon, sont contournées dans les jours qui suivent par les pirates. + De plus, le jeu a été pendant plusieurs mois dans + les dix premiers jeux les plus vendus aux Etats-Unis. + Une preuve que protection ou pas, ça ne change rien D'autant plus les joueurs ont apprécié, + qu'un éditeur leur fasse confiance et distribue un jeu sans protection. + Jusque la rien de grave, c'est même très sympa (et légal) de la part de cet éditeur + d'avoir distribué des versions non protégées de son jeu. +

+

Oui, mais, respecter les joueurs, ça ne se fait pas chez starforce, + et l'attitude de Stardock ne leur a pas plus. + Starforce a eu alors une très bonne idée : ils ont mis un lien sur la page d'accueil de leur site + vers un téléchargement d'une version piratée de Galactic Civilizations !! C'est honteux. +

+

Plusieurs personnnes boycottent Starforce, d'ailleurs, je ne sais plus sur quel forum j'ai vu + une très bonne description de Starforce par un internaute : + Une protection tellement efficace qu'elle a tendance à ne pas faire fonctionner le jeu original. + C'est exactement ça. +

+
+

+ Sources / Liens
+ Site officiel de Starforce
+ Sebsauvage : C'est gentil de nous avoir invité
+ Boycott Starforce
+ Boycottstarforce.net
+ Wikipedia : Starforce
+ + Boycott Starforce.net : Une liste de jeux qui utilisent cette protection +

+
+

Il y a bien d' autres protections, qui sont des saletés dans le même genre, comme securom.

+ blob - /dev/null blob + b514338fcdeda7812567ea547ada1e04c85b5e7d (mode 644) --- /dev/null +++ cestquoi/web/css.php @@ -0,0 +1,228 @@ + + + + + '; +require'../../autres/source-haut.php'; +?> +

CSSC'est quoi les + CSS ?

+

Rappel du XHTML

+

Le xhtml est utilisé pour servir le contenu d'une page : c'est avec ce langage que l'on dit : + ceci est un titre, ceci est un paragraphe, ceci est une image, etc...
+ Mais en aucun cas il ne doit être utilisé pour la mise en page. + On ne doit pas dire que les titres sont en rouges souligné, ou que les paragraphes sont en blanc sur fond noir.
+ C'est le travail des CSS.

+

En xhtml, dans les balises, on voit parfois des attributs "style" :
+ <balise style="propriété:valeur;">

+

Le contenu de ces attributs "style" peut être remplacé par des CSS.

+

Les CSS, appelés Cascading Style Sheets, soit "Feuilles de style en cascades" en français, + permettent de créer la mise en page d'un site. Avec les CSS, on peut faire toute la mise en page : + Les couleurs de fond, de texte, les polices, la taille du texte, les bordures, les apparences des titres, les marges...

+
+

La Structure d'un fichier CSS

+

Voici comment est fait un fichier CSS :
+ élément
+     {
+         + propriété:valeur;
+         + propriété:valeur;
+         + propriété:etc...;
+     }

+

Donc, pour appliquer un style à un élément de la page, il faut :

+
  • Indiquer l'élément sur lequel on travaille.
  • +
  • Ouvrir des accolades "{"pour appliquer des propriétés de style à l'élément.
  • +
  • Ne pas oublier de refermer les accolades "}" quand on a fini d'appliquer des propriétés à l'élément.
  • +
  • mettre deux points devant chaque propriété pour dire : telle propriété prendra telle valeur,
  • +
  • et mettre un point-virgule ";" devant chaque valeur pour dire : on a fini de travailler sur cette propriété.
+ +

Voici un exemple de ce que l'on peut "dire" avec les CSS :
+ paragraphes
+        {
+           couleur du texte:rouge;
+             taille de police:1 ligne et demie;
+         }

+

On peut également faire des commentaires, qui servent à comprendre plus facilement le code plus tard :
+ /*Ceci est un Commentaire*/

+ On peut donc écrire les commentaires sur une ou plusieurs lignes avec "/*" et "*/".

+

Créer un style avec les CSS

+

Pour dire sur quelle élément de la page on veut appliquer certains style, il y a plusieurs façons :

+
  • Définir des styles en fonction des balises xhtml : par exemple, ce code CSS + "p{color:blue}" + colorera les paragraphes en bleu :
    + Ce paragraphe est coloré en bleu.
  • +
  • Définir des styles en fonction des classes. Par exemple, si l'on veut que certains paragraphes soient colorés en bleu, + et d'autres en rouge, nous allons écrire :
    + Le code xhtml :
    + <!--Ce paragraphe sera bleu-->
    + <p class="bleu">
    + Texte de couleur bleue.
    </p>

    + <!--Celui ci sera en rouge-->
    + <p class="rouge">
    + Texte de couleur rouge.
    </p>

    + Et le code CSS :
    p.rouge +         + /*ceci veut dire "Tous les paragraphes de classe "rouge"*/
    + {color:red;    /*seront colorés en rouge*/
    + }
    + p.bleu
    + {color:blue} +  /*et tous les paragraphes de classe "bleu" seront en bleu*/
    + Ceci donnera :
    + Ce paragraphe de classe "rouge" est coloré en rouge.
    + Ce paragraphe de classe "bleu" est coloré en bleu.
  • +
  • Définir un style en fonction des id :

    + Un id est presque le même chose qu'une classe, à la différence près qu'il ne peut + être utilisé qu'une seule fois dans une page.

    + Par exemple, vous avez le droit de faire ce code :
    + <p class="rouge"> + Paragraphe rouge</p>
    + <p class="bleu"> + Paragraphe bleu</p> + <p class="rouge"> + Un autre paragraphe rouge</p>


    + Mais vous n'avez pas le droit de faire ceci, car un id avec la même valeur est utilisé deux fois :
    + <p id="rouge"> + Un paragraphe en rouge</p>
    + <p id="bleu" + >Puis un en bleu</p>
    + <p id="bleu"> + Et un autre en bleu. Mais ça ne va pas ! On a utilisé deux fois l'id "bleu" !!</p>
+

Exemple

+

Voyons maintenant comment créer un style particulier pour un bloc. + Par exemple, nous voulons faire ressortir un extrait de texte, comme une citation.
+ Nous avons d'abord un paragraphe sans mise en forme :

+

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec fringilla justo ut dui nonummy scelerisque. + In dapibus diam non nisi. Cras et tellus vitae sapien tristique hendrerit. Aliquam quis eros. + In faucibus felis vel turpis. Aenean semper, nisl quis eleifend tempus, urna leo fringilla ipsum, vitae laoreet ante massa ac erat. + Aliquam nisi velit, faucibus vitae, iaculis sed, vehicula et, sem. Nulla facilisi. Donec placerat pulvinar felis. Sed ultricies leo ut elit. + Integer vitae tortor et neque blandit rhoncus. Quisque facilisis enim luctus quam. Vivamus hendrerit congue lacus. + Nulla id nunc non nibh egestas vehicula. Nullam varius. Morbi vitae ante in tortor condimentum gravida.

+

Et nous voulons avoir ceci :

+

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec fringilla justo ut dui nonummy scelerisque. + In dapibus diam non nisi. Cras et tellus vitae sapien tristique hendrerit. Aliquam quis eros. + In faucibus felis vel turpis. Aenean semper, nisl quis eleifend tempus, urna leo fringilla ipsum, vitae laoreet ante massa ac erat. + Aliquam nisi velit, faucibus vitae, iaculis sed, vehicula et, sem. Nulla facilisi. Donec placerat pulvinar felis. Sed ultricies leo ut elit. + Integer vitae tortor et neque blandit rhoncus. Quisque facilisis enim luctus quam. Vivamus hendrerit congue lacus. + Nulla id nunc non nibh egestas vehicula. Nullam varius. Morbi vitae ante in tortor condimentum gravida.

+

regardons ce qui à changé :

+
  • Il y a une bordure bleue de quatre pixels autour du bloc, et de huit pixels a gauche.
  • +
  • Le bloc est écrit en blanc sur fond noir.
  • +
  • Il y a un espacement entre le texte et la bordure.
  • +
  • Le bloc est décalé vers la droite.
  • +
  • La première lettre du paragraphe est une lettrine.
  • +
  • Elle est en rouge sur fond gris.
  • +
  • Elle a une bordure verte de deux pixels.
  • +
  • Il y a un espace entre la lettrine et sa bordure,
  • +
  • et un espace entre la lettrine et le reste du texte.
  • +
  • La lettrine est plus grande que le reste des lettres.
  • +
  • La police est "Comic sans MS".
+

Maintenant, voyons comment nous allons faire ceci :
+ Admettons que le paragraphe soit de classe "citation" (on aurait aussi pu utiliser la balise blockquote). + (<p class="citation"> + Blabla...</p>)
+ Pour faire une bordure, nous devons mettre :
+ p.citation {     + /*le ou les paragraphes de classe "citation"*/
+         + border-style: solid;    + /* auront une bordure solide, c'est à dire un trait continu*/
+         + border-color: #6666cc;   + /*la couleur de cette bordure sera bleue*/
        + border-width: 4px 4px 4px 8px; + /*la bordure sera de 4 pixels, sauf la bordure gauche qui sera de 8 pixels !!*/ }

+ "#6666cc" est une façon d'écrire plus précisément les couleurs. Les deux premiers chiffres après le dièse + indiquent le taux de rouge, les 3° et 4° le taux de vert et les deux derniers le taux de bleu.
+ On indique les couleurs en hexadécimal, c'est a dire avec 16 caractères :0123456789abcdef, #000000 étant noir et #ffffff étant blanc. +

+ Pour écrire le texte en blanc sur fond noir, il faut faire :
+ background-color: black; + /*la couleur de fond sera noire*/
+ color:white;           + /*la couleur du texte sera blanche*/


+ Pour décaler le bloc vers la droite, il faut utiliser la propriété margin, qui prend une valeur mesurable.
+ On rajoute "left" à la propriété car il doit y avoir une marge seulement à gauche :
+ margin-left:20%; + /*il y aura une marge de 20% de la fenêtre à gauche*/

+

Voici ce que nous obtiendrons avec ces propriétés CSS :

+

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec fringilla justo ut dui nonummy scelerisque. + In dapibus diam non nisi. Cras et tellus vitae sapien tristique hendrerit. Aliquam quis eros. + In faucibus felis vel turpis. Aenean semper, nisl quis eleifend tempus, urna leo fringilla ipsum, vitae laoreet ante massa ac erat. + Aliquam nisi velit, faucibus vitae, iaculis sed, vehicula et, sem. Nulla facilisi. Donec placerat pulvinar felis. Sed ultricies leo ut elit. + Integer vitae tortor et neque blandit rhoncus. Quisque facilisis enim luctus quam. Vivamus hendrerit congue lacus. + Nulla id nunc non nibh egestas vehicula. Nullam varius. Morbi vitae ante in tortor condimentum gravida.

+

Il manque :

+
  • L'espacement entre le texte et la bordure.
  • +
  • Le style de la lettrine.
+

Pour l'espacement entre la bordure et le contenu, il suffit de faire :

+ padding: 10px; + /*de cette façon il y aura un espacement de 10 pixels entre la bordure et le texte*/ +
Padding étant les marges intérieures (entre la bordure et le contenu), et margin les marges extérieures + (entre la bordure et le reste de la page).

+

Pour la lettrine, c'est plus compliqué :
+ Il faut utiliser ce que l'on appelle une pseudo-classe, une classe qui s'applique sur un élément en particulier + qui n'est pas délimité par des balises xhtml, ou à un certain moment (au passage de la souris sur un élément par exemple).
+ Ici, nous allons utiliser la pseudo-classe first-letter, qui désigne la première lettre d'une élément.
+ Donc pour que le style s'applique uniquement à la première + lettre du paragraphe, nous allons utiliser ce code CSS :
+ p.citation:first-letter { + /*seulement la première lettre des paragraphes de classe citation*/ }

+

Ensuite, on utilise des propriétés comme pour n'importe quel élément. Revoyons les styles qui sont appliqués à cette lettrine :

+
  • Elle est en rouge sur fond gris.
  • +
  • Elle a une bordure verte de deux pixels.
  • +
  • Il y a un espace entre la lettrine et sa bordure,
  • +
  • et un espace entre la lettrine et le reste du texte.
  • +
  • La lettrine est plus grande que le reste des lettres.
+

Pour les couleurs, c'est très simple :

+ p.citation:first-letter{
+ color:red; /* la couleur de la lettre sera rouge*/
+ background-color:#808080; + /*la couleur de fond sera grise*/ }

+

Ensuite, il faut faire la bordure :
+ border: 2px solid green; + /*la bordure sera verte et de deux pixels d'épaisseur*/

+

Puis, les espacements :
+ padding: 10px;       + /*Il y aura un espacement de 10 pixels entre la lettre et sa bordure*/
+ margin-right: 2px;   + /*Un espacemement de 2 pixels entre la bordure droite et le texte*/

+

Les propriétés de police :
+ font-family: 'comic sans ms'; + /*la police sera 'comic sans ms'*/
+ font-size: 2em; + /* et la lettre fera deux lignes de haut (1em = une ligne) */

+

Et enfin, les propriétés du bloc :
+ height: 4em; + /* le bloc fera 4 lignes de hauteur*/
+ float: left; + /*et il flottera a gauche, sinon il dépasse du paragraphe*/

+

Les pseudo-classes

+

Certaines classes spéciales sont appelées "pseudo-classes". + Ce sont par exemple :
Un style qui s'applique seulement...

+
  • à la première ligne d'un élément : élément:first-line
  • +
  • à la première lettre d'un élément : élément:first-letter
  • +
  • Quand la souris survole l'élément : élément:hover
  • +
  • Quand on clique sur un élément : élément:focus ou + élément:active
  • +
  • Aux liens qui sont dans l'historique du navigateur : a:visited
+

Plus d'informations sur les pseudo-classes : http://www.siteduzero.com/tuto-3-38-1.html

+

Conclusion

+

C'est de cette façon que l'on créée un style avec les CSS. Généralement, on fait un fichier CSS que l'on utilise pour toutes les pages. + Comme ceci, il est très facile de changer tout le design d'un site en une seule fois. De plus, le chargement des pages est allégé : + le navigateur enregistre une seule fois le fichier CSS, et le ré-utilise sans avoir à le charger dès qu'il y en a besoin. + Le code html est aussi moins lourd, car on n'utilise plus de style="...." directement dans les balises.

+

Cependant, les navigateurs n'interprètent pas tous de la même façon certaines propriétés CSS compliquées. + Par exemple, IE ne gère pas la pseudo-classe ":hover" autre part que sur un lien. En fait, il ne connait pas beaucoup de propriétés CSS 2, + car il n'y a pas de nouvelle version depuis 1999. Il ne connait que la première version des CSS. La version 7 devrait peut-être + (j'éspère) enfin supporter complètement les CSS 2, ce qui permettrait de faire des designs interessants compatibles avec + la majorité des navigateurs.

+

Liens :
+Le site du Zéro : Liste des propriétés CSS
+Toute la "puissance" des CSS sur CSS Zen-garden
+Comment Ca marche : Les CSS

+ blob - /dev/null blob + bdb2a6ae2579dca76a2cb5b88cff39fd8bcbff2f (mode 644) --- /dev/null +++ cestquoi/web/hebergement.php @@ -0,0 +1,46 @@ +'prev','href'=>'./serveur.php','title'=>'Qu\'est-ce qu\'un serveur Internet ?'); +$head['access'][0]=array('rel'=>'index','href'=>'../','title'=>'Index de la rubrique "C\'est quoi"'); +require'../../autres/source-haut.php'?> +

serveurC'est quoi l'hébergement ?

+

Les fichiers que vous voyez sur Internet sont stockés sur un serveur. + Selon le type d'hébergement, le serveur peut appartenir à différentes personnes, + servir pour différentes choses, etc. C'est souvent un hébergeur qui met à disposition un serveur. + L'hébergeur est une entreprise, qui peut être votre FAI + ou une société spécialisée dans l'hébergement.
Il existe plusieurs types d'hébergement :

+

Hébergement mutualisé

+

C'est le plus courant. + Un hébergeur met à disposition une offre d'hébergement, gratuite ou payante, + et permet de stocker des fichiers sur un serveur. Plusieurs sites sont stockés sur un seul serveur + avec ce type d'hébergement. Il y a plus ou moins de possibilités :
+ Gestion de langages dynamiques, mise à disposition de base de données, publicité ou pas...
+ Ce type d'hébergement, qu'il soit gratuit ou payant, est assez limité par rapport aux autres types d'hébergement. + Cependant, le coût d'un hébergement mutualisé payant est souvent assez bas (entre 0 € et 20 € par mois), + et s'il est payant, il n'y a pas de publicité.

+

Hébergement dédié

+

Ce type d'hébergement permet de disposer de son propre serveur, que l'on est le seul à utiliser. + Cependant il est toujours administré par l'intermédiaire d'un hébergeur. + L'hébergement dédié est (très) cher (parfois plusieurs centaines d'Euros par An), + mais permet beaucoup plus de possibilités que l'hébergement mutualisé : espace de stockage bien plus élevé, + création de plusieurs bases de données, installation de plusieurs serveurs (logiciels), + exécution de certains programmes...
+ Les personnes qui utilisent ce type d'hébergement sont surtout des entreprises ou des particuliers + disposant de sites important ou qui ont besoin de stocker beaucoup de données, + ou encore d'une certaine configuration (installation de logiciel précis).

+

Héberger soi-même

+

Celui-ci permet une totale liberté de configuration. + On héberge un serveur chez soi, avec les logiciels et données que l'on veut. + Ce type d'hébergement est assez rare, car il nécéssite une maitrise et une connaissance + assez importante des serveurs et logiciels que l'on veut installer et utiliser. + Il faut par exemple penser à la sécurité du serveur, qui est un point important.
+ Il faut également disposer d'un accès permanent à internet, pour que les pages soient accessibles à tout moment.

+
+

Il existe des types d'hébergement plus rares, + par exemple certains particuliers proposent d'héberger des fichiers sur un serveur qu'ils ont mis en place chez eux.

+

Pour continuer :
+ Comment Ca Marche : Hébergement
+ Wikipédia : Hébergement Internet
+ Sebsauvage.net : L'hébergement

+ blob - /dev/null blob + 9e11e94566a59b6f82787809d4545e6250b0a353 (mode 644) --- /dev/null +++ cestquoi/web/index.php @@ -0,0 +1,218 @@ + + + + '; +$titre='C\'est quoi "(x)HTML" ?'; +require'../../autres/source-haut.php'?> +

XHTML + C'est quoi "(x)HTML" ?

+

Les balises.

+

Lorsque vous visitez un site, vous voyez des images, du texte, de la couleur...

+

Mais votre navigateur (Internet explorer, Firefox, Opera, Netscape...) ne voit pas ça. Il lit du code, + qu'il transforme pour que vous puissiez le voir normalement. C'est ce code qui est appelé + "html" + (anciennes versions du code) ou "xhtml" (versions récentes).

+

Ce code est écrit sous forme de balises, c'est a dire du texte entouré par des chevrons : + <balise>

+

Votre navigateur comprend a quoi correspond telle ou telle partie de ce code. + Il sait par exemple que la balise <img> correpond à une image, que la balise <a> correspond à + un lien, que la balise <p> correspond à un paragraphe, etc...

+

Si votre navigateur voit le code :
+ <a + href="http://sylvain.sab.free.fr/"> + Mon site</a>

+ Il saura que cela correspond à un lien (grâce à "<a") + qui dirige vers http://sylvain.sab.free.fr/ (grâce à + "href="http://sylvain.sab.free.fr/""), + et que le texte qui comporte ce lien est "Mon site". + Il affichera :

Mon site

+

Si il voit "<img src="xhtml.jpg" + style="width:80px;height:18px;" />"
+ il saura qu'il doit afficher l'image xhtml.jpg (grâce à + "src="xhtml.jpg""),
+ et que cette image a une lageur de 80 pixels et une longueur de 18 pixels + (grâce à style="width:80px;height:18px;")

+ Il affichera :

+

Vous avez peut-être remarqué une différence entre les balises "<a></a>" + et "<img />".
+ Les balises "<a></a>" vont par paire, alors que la balise "<img />" + est seule.

+

Les balises qui vont par paire comportent deux types de balise :

+
  1. Une qui est apellée "balise ouvrante" (le <a>) + car elle ouvre un élément (ici c'est le lien), et
  2. +
  3. Une autre qui est apellée "balise fermante", reconnaissable au slash "/" car elle + indique la fin de l'élément.
+

Les balises qui sont seules sont appelées "auto-fermantes", car elles n'ont pas besoin d'une deuxième balise + pour indiquer la fin.
Elles le font toutes seules grâce à "/>".

+

On peut mettre du texte (ou d'autres balises) entre les balises qui vont par paire.

+

Quelques exemples de balises :

+
  1. Qui vont par paires : +
    <p>Paragraphe</p>
    +
    Le texte entre ces deux balises est un paragraphe.
    +
    <h1>Titre</h1>
    +
    Le texte entre ces deux balises est un titre. + Il y a plusieurs niveaux d'importance pour les titres, qui vont de h1 àa h6 :
    + h1 est le titre le plus important, et h6 le moins important.
    +
    <em>Texte important</em>
    +
    Ces balises indiquent que le texte est important. Généralement, + les navigateurs le mettent en italique, mais il n'y a pas de règle pour cela.
    + On peut également dire que le texte est plus important avec les balises
    +
    <strong>Texte plus important</strong>
    +
    Généralement, les navigateurs le mettent en gras.
  2. +
  3. Auto-fermantes : +
    <img />
    +
    Cette balise indique au navigateur qu'il doit aficher une image.
    +
    <br />
    +
    Cette balise indique un retour à la ligne.
    +
    <hr />
    +
    Cette balise indique un ligne horizontale, comme celle ci :
+
+

Les attributs et leurs valeurs.

+

J'ai énoncé plusieurs balises, comme par exemple
+ <br />, qui provoque un retour à ligne ou encore <img />, + qui indique la présence d'une image.

+

Si je mets ce code la, le navigateur ira à la ligne, puis qu'il doit afficher une image.
+ Mais quelle image ? Et de quelle taille ? +
+ C'est pour indiquer cela que l'on se sert des attributs.

+

Pour une image, l'attribut "src" prend une valeur qui indique la source de l'image, + c'est à dire l'endroit ou elle se trouve.

+

Voici comment est formée une balise, avec ses attributs :

+
  1. Pour les balises qui vont par paire : + <balise attribut1="valeur1" attribut2="valeur2">Texte</balise>
  2. +
  3. Pour les balises auto-fermantes : + <balise attribut1="valeur1" attribut2="valeur2" />
+

Voici une image avec les attributs habituels :
+ <img src="bateau.jpg" style="width:30px;height:10px;" />

+

L'attribut "src", qui à pour valeur "bateau.jpg", indique que l'image à afficher est le fichier + "bateau.jpg".
L'attribut "style" indique diverses choses correspondant à l'image, + ici "width:30px;" correspond à la largeur (width) de 30 pixels (30px),
+ et "height:10px," à la hauteur (height) de 10 pixels (10px).

+

Evidemment, l'image n'est pas la seule balise qui utilise les attributs. Toutes les balises peuvent en avoir.
+ Pour certaines, c'est obligatoire, pour d'autres, c'est facultatif.

+

Par exemple, la balise <a></a>, qui correspond à un lien, + doit obligatoirement avoir un attibut, sinon le navigateur ne saurait pas ou il doit aller quand on clique dessus. + L'attribut correspondant est "href".

+

Si l'attribut "href" à pour valeur "accueil.html", le code poura être :
+ <a href="accueil.html">Page d'accueil</a>.
+ Le navigateur affichera :
Page d'accueil

+

Pour un lien, l'attribut href est obligatoire, + mais la balise peut également prendre plusieurs autres attributs facultatifs :

+
  • L'attribut "title", qui affiche une infobulle lorsque l'on survole le lien avec la souris.
  • + +
  • L'attribut "hreflang", qui indique la langue de la page vers laquelle dirige le lien.
  • +
  • etc...
+
+

Des balises plus complexes

+

Le code html contient quelques balises spéciales : + Par exemple, les balises qui indiquent le titre de la page, l'auteur...

+

Voici le code minimal pour une page WEB : +
+ + <?xml version="1.0" encoding="iso-8859-1"?>
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
+    <head>
+        <title></title>
+    </head>
+  <body>
 </body>
</html>

+

En premier, il y a ce code (apellé "déclaration xml") :
+ <?xml version="1.0" encoding="iso-8859-1"?>
+ C'est la version du fichier (1.0), et l'encodage.
+ L'encodage sert à indiquer quel type de caractères utilisera la page.
+ Pour les langues anglaises, l'ASCII ou l'utf-8 sont souvent utilisés. + Cependant, certains ne prennent pas en compte les caractères latins (les accents par exemple). + On peut mettre des caractères latins dans un document en ASCII, + mais il faut indiquer que ce sont des caractères spéciaux avec "&" : "&eacute;" affiche é. + En iso, il n'est pas nécéssaire d'indiquer que c'est un caractère spécial, + on peut mettre directement "é" dans le code. + C'est pourquoi on utilise souvent "iso" dans les documents en français. + Il existe également des formats pour les langues chinoises, arabes... + (plus d'informations sur les encodages)

+

Puis :
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+ Cette partie de code (qui se place en premier), appellée "Doctype", + indique la version du xhtml ou html utilisée. Ici la version du xhtml est la 1.0 Strict.

+

Ensuite, il y à
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
+ C'est la balise html, qui contient tout le reste du code (sauf le Doctype) et indique la langue de la page.

+

Puis, voici les balises "head"
+ Elles contiennent plusieurs informations relatives à la page ou au site :
+ Le titre de la page, les flux RSS, les feuilles de style (CSS), les favicônes...
+ Cependant, seulement le titre est obligatoire (mais il peut être vide) :
+    <head>
       <title></title>
   </head>

+

Ensuite, il y a les balises "body".
+ Ce sont les balises les plus importantes, car elles contiennent le corps de la page.
+ C'est entre ces deux balises que sont placées la majorité des autres balises :
+ Les liens, les paragraphes, les images, les titres...
+ <body>
</body>

+

Après la fermeture de la balise body, on ferme la balise html :
+  </body>
</html>

+

Le schéma d'une page pourrait donc se résumer à ceci :
+ + <!--On indique la version du xml et du xhtml que l'on va utiliser, + puis la langue et l'encodage du document-->
+ <?xml version="1.0" encoding="iso-8859-1"?>
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
+ <!--La balise d'en tête contient plusieurs informations relatives au document.-->
+    <head>
+        <title> + <!--Le titre de la page. Par exemple "Bienvenue sur mon site".--> + </title>
</title>
+    </head>
+  <body>
  + <!--Ici, c'est le code de la page qui s'affiche à l'écran.-->
+  </body>
</html> + <!--Ensuite, on ferme les balises body et html.-->

+

Il y a beaucoup de balises que l'on peut mettre dans l'en-tête. En voici quelques unes :

+
  • Les balises link +
    Des Liens vers des flux RSS :
    +
    <link rel="alternate" type="application/rss+xml" title="Flux RSS" href="mon-flux-rss.xml" />
    +
    Des liens vers des fichiers CSS + (ou feuilles de style) pour la mise en page :
    +
     <link rel="stylesheet" type="text/css" href="mon-style.css" />
    +
    Des pages d'aide à la navigation :
    +
    <link rel="help" title="Accessibilité" href="accessibilite.php" />
    +
    Des liens vers des favicônes :
    +
    <link rel="icon" type="image/png" href="favicon.png" />
  • +
  • Les balises meta +
    Indiquer l'auteur de la page :
    +
    <meta name="author" content="Sylvain SABOUA" />
    +
    Un copyright
    +
    <meta name="copyright" content="© Sylvain SABOUA" />
    +
    Des mot-clés en rapport avec la page (pour les moteurs de recherche) :
    +
    <meta name="Keywords" content="xhtml" />
    +
    Une description de la page (idem) :
    +
    <meta name="Description" content="Site d'informatique" />
    +
    Le titre du site :
    +
    <meta name="title" content="Sylvain.sab" />
+
+

Conclusion

+

le langage xhtml, nouvelle version du html, est un langage dit "à balises". + Il existe deux types de balises : celles qui vont par paires (une ouvrante et une fermante) et les auto-fermantes. +

+ Les balises utilisent souvent des attributs. Pour une image, l'attibut src est obligatoire par exemple. + Cependant quelques balises utilisent très rarement des attributs, comme la balise de retour a la ligne : <br />. +

+

Le xhtml est utilisé avec les CSS. + Le xhtml sert à donner le contenu, et les CSS à la mise en page. +

+

Pour continuer :
+ C'est quoi les CSS ?
+ Comment ça marche : Introduction au HTML
+ Le html sur Wikipedia
+ Le site du Zéro : Liste des balises xhtml
+ Sebsauvage : conseils html

+ blob - /dev/null blob + f7bce0bb71f6867da3354856c913c320a7ccaa0e (mode 644) --- /dev/null +++ cestquoi/web/serveur.php @@ -0,0 +1,55 @@ +'next','href'=>'hebergement.php','title'=>'C\'est quoi l\'hébergement ?'); +$head['access'][1]=array('rel'=>'index','href'=>'../','title'=>'Index de la rubrique "C\'est quoi"'); +require'../../autres/source-haut.php'?> +

Une plume, le logo d'ApacheQu'est-ce qu'un serveur, un client ?

+

Le serveur

+

Les pages et les fichiers que vous voyez sur internet sont stockées quelquepart, plus précisément sur une machine apellée «serveur». + C'est un ordinateur qui stocke des fichiers, et les envoie au client (le client, c'est vous, qui regardez la page).
+ Parfois, dans le cas d'un site dynamique par exemple, le serveur exécute des instructions indiquées dans le code du fichier et + utilise d'autres logiciels avant d'envoyer le fichier au client.

+

On utilise le terme "serveur" à la fois pour désigner la machine ou sont installés les logiciels, + et le logiciel principal installé sur cette machine, qui intéragit avec les autres logiciels. + C'est ambigü, on pourrait dire "Le serveur est installé sur le serveur". Il faut comprendre la différence entre la machine et le logiciel.

+

Voici un schéma qui représente cette disposition :
+ La machine contient le serveur (logiciel) et les logiciels facultatifs. Le serveur (logiciel) peut intéragir avec les autres logiciels.

+

Logiciels

+

Plusieurs logiciels sont installés sur la machine :

+
+
Le système d'exploitation
+
Il fait tourner le serveur (logiciel). Le système d'exploitation le plus courant sur les serveurs est Linux, + mais il y a certains serveurs sous Windows ou autres.
+
Le serveur (logiciel)
+
Le plus courant sous Linux est Apache. Sous Windows, on trouve IIS.
+
Les logiciels facultatifs
+
Sur la machine, seuls le serveur et le système d'exploitation doivent être installés. + Cependant, d'autres logiciels, même s'ils ne sont pas obligatoires, sont couramment utilisés : +
Un langage dit "dynamique"
+
Un langage dynamique est utilisé sur tous les sites importants. Sans ce type de langage, on dit qu'un site est statique. + Un langage dynamique permet par exemple de gérer une base de données, un forum, des articles éditables façon "Wiki", + des inscriptions et des membres. On dit que ce langage est dynamique car le site n'a pas besoin de son créateur pour se mettre à jour.
+ PHP est utilisé sous Linux comme langage dynamique.
+ Sous Windows, il y a l'ASP.
+
Une base de données
+
Comme son nom l'indique, elle permet d'enregistrer toutes sortes de données. C'est avec elle que l'on peut enregistrer des articles + ou des coordonnées, pour gérer des inscriptions sur un site par exemple.
+ L'une des plus utilisée est MySQL. + On peut l'installer sous Linux ou Windows, mais elle est plus souvent liée avec Linux et PHP. + Il existe aussi Oracle, sous Windows, qui est souvent liée avec ASP.
+ On peut utiliser beaucoup d'autres logiciels. Par exemple, on peut installer plusieurs serveurs (logiciels) sur un ordinateur, + pour disposer des avantages de chacun.
+

Le client

+

La notion de "client" est simple. Toutes les personnes qui demande à afficher une page ou un fichier sont des clients (par opposition à "Serveur"). + Vous êtes un client, comme tous les internautes.
+ Lorsqu'un client demande l'affichage d'une page, ou un fichier, on dit qu'il envoie une requête. + Ensuite, le serveur lit la requête, l'exécute, puis renvoie le résultat au client.
+ Si l'on reprend le schéma, voici la succession et le déroulement des étapes :
+ Schéma et représentation d'une requête

+

Pour continuer :
+ Qu'est-ce que l'hébergement ?
+ Wikipédia : Serveur informatique
+ CCM : Environnement Client/Serveur

+ blob - /dev/null blob + 3a8e9c911d2a24166f39b71cd5edef77b7b3740c (mode 644) --- /dev/null +++ configurer/ccleaner.php @@ -0,0 +1,10 @@ +'index','href'=>'./','title'=>'Accueil de la rubrique "Configurer"'); +require'../autres/source-haut.php'?> +

Configurer Craps Cleaner

+

Il y a une vidéo en deux parties :
+1° partie : Télécharger et installer le logiciel
+2° partie : Configurer et utiliser le logiciel. +

+ blob - /dev/null blob + 910270e67630789cbedbaaee9614b9922603bb1f (mode 644) --- /dev/null +++ configurer/firefox.php @@ -0,0 +1,15 @@ +'index','href'=>'./','title'=>'Accueil de la rubrique "Configurer"'); +require'../autres/source-haut.php'?> +

Configurer Firefox

+

Il y a pour le moment :

+ + blob - /dev/null blob + dd0a4fd3b994c133d9d1389870035d339d5b025e (mode 644) --- /dev/null +++ configurer/index.php @@ -0,0 +1,21 @@ +'index','href'=>'./','title'=>'Accueil de la rubrique "Configurer"'); +require'../autres/source-haut.php'?> +

Configurer

+
+

Optimiser Windows + Windows

+

Aller à : Internet - Securité

+
+

Internet

+

Firefox   ;   Zone alarm

+

Thunderbird

+ +

Securité

+

Ccleaner

+ blob - /dev/null blob + ce67c4e2b2a0585ef769bfaea149e48d11f9a460 (mode 644) --- /dev/null +++ configurer/thunderbird.php @@ -0,0 +1,72 @@ +'index','href'=>'./','title'=>'Accueil de la rubrique "Configurer"'); +require'../autres/source-haut.php'?> +

Configurer Thunderbird

+ +

Filtrer et classer ses messages

+

Si vous recevez beaucoup de spam (mail indésirable), vous avez sûrement envie de vous en débarrasser et de ne pas avoir à faire le tri + parmi les messages que vous recevez chaque jour. Si vous échangez des messages avec beaucoup de personnes, + il est également pratique de classer les mails reçus dans des dossiers spécifiques.
+ Grâce aux règles de filtrage, Thunderbird (et la plupart des logiciels de messagerie) permet ceci. + L'exemple ici est en cas de spam. Nous allons voir comment définir des règles de filtrage et des actions spécifiques pour certains messages.

+

Pour créer des filtres, ouvrez le menu "Outils", puis "Filtres de messages...".
+ Fichier - Edition - Affichage - Aller à - Messages-=Outils=- Aide +

+

+

Une fenêtre comme cell-ci s'ouvre. Elle vous permet de créer de nouvelles règles pour classer et filtrer vos messages :
+

+ Cliquez sur "Nouveau" pour définir un nouveau filtre, et les actions qui iront avec. Cette fenêtre s'ouvre :
+

+ Ensuite, il faut définir les règles. Ici, si l'objet contient "site-spam.com", le message sera automqtiquement + déplacé vers la corbeille du dossier "Compte".
+

+ Vous pouvez ajouter autant de règles que vous le voulez en cliquant sur le bouton "+".
+ Voici un exemple avec plusieurs actions possibles, + et plusieurs conditions (règles) pour supprimer ou classer les messages indésirables :
+

+

"Supprimer du serveur POP" signifie effacer le message en ligne, et pas seulement sur votre ordinateur.
+ Les filtres de messages sont également très pratique pour classer les messages de sa famille, + de ses collègues, etc, dans différents dossiers.

+

Dans la fenêtre "Filtres des messages", il y a un bouton "Journal de filtrage". + Le journal de filtrage sert à garder une trace de chaque règle utilisée : + "Une règle a été utilisée sur tel message à telle date et telle(s) action(s) a (ont) été réalisées.".
+ Vous pouvez effacer les traces des actions utilisées ou tout simplement le désactiver.

+

Astuces

+

Envoyer un mail groupé

+

S'il vous arrive d'envoyer un mail à plusieurs personnes, chaque destinataire peut voir les adresses des autres destinataires. + C'est assez gênant : si une personne est infectée par un virus, spyware (logiciel espion) ou autre saleté indésirable, + toutes les adresse peuvent être récupérées !!
+ Il en est de même si une partie du message est récupérée par un spammeur, qui ajoutera ces adresse à sa "collection".
+ Tout simplement, il est aussi désagéable de voir que des personnes que l'on ne connait pas connaissent sa propre adresse, + surtout si c'est une adresse personelle.

+

Heureusement il existe une solution simple, et qui n'est pas seulement valable pour Thunderbird, + c'est d'utiliser le champ "CCI", "BCC", ou autre "Copie Cachée". + De cette façon, le message sera correctement envoyé, sans risque que qui que ce soit récupère une adresse.
+ Sous Thunderbird, il faut utiliser le champ "Copie Cachée".
+ Sans utiliser "Copie cachée", le champ est :
+ -v-   Pour: | adresse@mail.tld
+ Il faut séléctionner cette option :
+ Pour / Copie à /=Copie cachée=/ Répondre à / Forum / Faire suivre à

+

Cette option est bien sûr disponible dans la plupart des logiciels de messagerie ou webmail, + avec différents noms.

+

Envoyer ses messages au format texte plutôt que HTML

+

Il y a énormément d'inconvénients à envoyer un mail au format HTML. Voir cet article : + Pourquoi ne pas utiliser des emails en HTML.
+ Qu'est-ce qu'un mail en HTML ? + C'est tout ce qui contient du texte mis en forme (gras, italique, couleurs...) ou autre chose que du texte (images par exemple). + (Voir aussi : “ C'est quoi "(x)HTML" ? ”).
+ Pour envoyer ses e-mails au format texte simple dans Thunderbird, il faut se rendre dans le menu "Outils", puis "Paramètres des comptes", + et sélectionner "Rédaction et adressage" d'un compte. Décochez ensuite la case "Rédiger les messages en HTML".
+

+

Effectivement, vos mails seront moins "beaux" (question de goût), mais ils seront plus légers, plus agréables à lire, + et ils ne seront pas filtrés par les logiciels de messagerie.
+ De plus, certains WebMails gèrent mal le HTML.

+ blob - /dev/null blob + c56be52d8cdf0f2893f14f645aca024e9a9f1752 (mode 644) --- /dev/null +++ configurer/windows/1.php @@ -0,0 +1,119 @@ +'next','href'=>'2.php','title'=>'Optimiser Windows 2'); +$head['access'][1]=array('rel'=>'last','href'=>'2.php','title'=>'Optimiser Windows 2'); +$head['access'][2]=array('rel'=>'index','href'=>'./','title'=>'Optimiser Windows'); +require'../../autres/source-haut.php';?> + + + + + + + + +
SommaireSuite : Optimisation du système
+

1) Avant de commencer

+

Tout d'abord

+

Avant de faire quoi que ce soit sur votre ordinateur, mieux vaut le "nettoyer".
Faites donc dans cet ordre :

+
  1. Une analyse antivirus avec un BON logiciel antivirus. Pour des analyses en ligne : + http://sebsauvage.net/logiciels/fprot.html#online

  2. +
  3. une analyse anti-spywares, malwares etc... Pour ceci je vous recommande les logiciels + Spybot et Ad-aware.

  4. +
  5. supprimmez le maximum de fichiers temporaires et inutiles avec le logiciel Ccleaner.

    +
  6. +
+

Une défragmentation des disques durs

+

Au fur et à mesure que vous utilisez votre ordinateur, il copie, déplace et supprime des fichiers sur votre disque.
+ Vous ne le voyez pas, mais les fichiers sont "découpés" sur le disque en plusieurs morceaux, + et quand vous avez besoin d'un fichier,
il faut chercher toutes ses morceaux avant de pouvoir l'utiliser.

+

C'est pourquoi plus votre disque est fragmenté, plus il sera lent. + Il est donc conseillé de faire une défragmentation de temps en temps + (environ tous les mois).
Si vous n'avez pas fait de défragmentation depuis assez longtemps, + vous pouvez défragmenter plusieurs fois de suite chaque disque.
+ Ah oui, et dernière chose, il vaut mieux ne rien faire pendant la défragmentation, et même redémarrer avant.
+ C'est encore mieux de défragmenter en mode sans échec (appuyez sur "F8" au démarrage.)
+ Et c'est encore plus efficace de défragmenter avec le logiciel + PageDefrag.

+

Je vous conseille d'utiliser ce logiciel :
+ Une fois téléchargé et décompréssé, ouvrez le fichier "pagedfrg.exe".
+ Vous verrez cette fenêtre s'afficher :
+

+

Dans "Defragmentation Control", vous pouvez cocher "Defragment at next boot" + (défragmenter au prochain démarrage) ou "Defragment every boot" + (défragmenter à chaque démarrage).
+ Je vous conseille de défragmenter à chaque + démarrage : les premières fois votre ordinateur mettra du temps à démarrer, mais ensuite il sera plus rapide. +
L'option "Defrag abort countdown xx seconds" correspond au nombre de secondes que vous aurez + avant la défragmentation pour appuyer sur une touche et l'annuler.

+

Quand vous avez terminé, cliquez sur OK et redémarrez pour lancer la défragmentation.

+

toutefois si vous ne voulez pas utiliser ce logiciel, voici la marche à suivre :

+

1 - Ouvrez le Menu Démarrer, puis Tous les programmes>Accessoires>Outils système>Défragmenteur de disque.
+ Menu démarrer

+

2 - Sélectionnez un disque, puis cliquez sur défragmenter et attendez que cela se termine + (il est conseillé de ne rien faire pendant la défragmentation).

+

3 - Défragmentez chaque disque.

+

Une vérification des disques durs

+

A force d'utiliser vos disques durs, des parties (appelées "clusters") + peuvent s'abimer ou être déffectueuses.
+ Pour reperer ces clusters abimés et les corriger (quand c'est possible), + il est nécéssaire de vérifier vos disques.

+

Pour cela, déroulez le Menu Démarrer, puis Poste de Travail, faites un clic droit sur un disque dur et sélectionnez Propriétés.
+ Dans l'onglet Outils, cliquez sur vérifier maintenant, puis dans la fenêtre qui s'ouvre cochez les deux cases. + Cliquez ensuite sur Démarrer et patientez.
sRépetez la marche à suivre pour chaque disque.

+

Si, lorsque vous cliquez sur Démarrer, Windows affiche ceci (ce qui est assez probable) :
+ Vérification du disque.
+ Cliquez sur "Oui",  refaites la marche à suivre pour chaque disque et redémarrez.

+

Attention, les vérifications sont longues...

+

Un point de Srestauration

+

Nous allons ici créer un "Point de restoration", ce qui nous permettra, + en cas de problème plus tard, de restaurer le système + à la date de création de ce point de restoration.
+ Cependant, toutes les modifications que vous aurez effectuées + après la création de votre point de restauration + seront annulées si vous restaurez votre système.

+

Pour créer un point de restoration, ouvrez le Menu Démarrer, puis Tous les programmes>Accessoires>Outils + système>Restauration du sytème.
Sélectionnez ensuite "Créer un point de restauration", cliquez sur "Suivant", + entrez une description de ce point de restauration (par exemple "Avant Optimisation Windows"), + puis cliquez sur "Créer", et ensuite sur fermer.

+

Si vous avez un jour besoin de restaurer votre système, il faut ouvrir le Menu Démarrer, puis Tous les + programmes>Accessoires>Outils système>Restauration du sytème, sélectionner "Restaurer mon Ordinateur à une Date Antérieure, + puis cliquer sur Suivant et choisir votre point de restauration.

+

Si vous ne pouvez plus démarrer Windows à un moment ou un autre + (mais je le répète, il y a très peu de chances que cela arrive), démarrez votre ordinateur puis + appuyez tout de suite sur la touche "F8" de votre clavier et laissez la enfoncée.
+ On vous demandera de quelle facon vous voulez démarrer (mode sans échec...), choisissez "Dernière bonne configuration connue".
+ Ceci revient à faire une restauration du système.

+

Une sauvegarde du registre

+

Le registre, c'est l'endroit ou sont enregistrés tous les paramètres + de votre ordinateur. Tous, tous, tous, absolument tous.
+ De l'apparence de votre curseur au nombre d'icônes sur votre bureau, + en passant par les programmes qui se lancent au démarrage, tout est là.

+

C'est pourquoi une erreur peut endommager votre ordinateur.

+

Au cas ou ceci arriverait, nous allons faire une "Sauvegarde du registre". + Ceci ressemble un peu au point de restauration, mais concerne seulement le fichier spécial qu'est le registre.
+ Nous allons copier puis exporter le registre quelquepart dans votre ordinateur. + Le mieux est de le graver sur CD, comme ceci vous l'aurez quoi qu'il arrive + (même si, et je vous le repete, il est peu probable de faire une erreur).

+

Pour faire une sauvegarde du registre, ouvrez le registre en ouvrant le Menu Démarrer>Executer, + puis tapez "regedit". Si cela ne marche pas, le fichier executable correspondant au registre est souvent dans le répertoire + C:\Windows\regedit.exe.
Ouvrez ensuite le menu Fichier, puis exporter. + Une fenêtre qui ressemble a celle-ci s'affichera.
Dans "étendue de l'exportation", + vérifiez bien que "Tout" est coché.
+ Donnez un nom au fichier, sélectionnez l'endroit ou vous voulez l'enregistrer puis cliquez sur + "enregistrer" et fermez le registre. + Sauvegarde du registre
+ Vous pouvez aussi le graver sur CD (par exemple), mais à mon avis ca n'en vaut pas la peine..

+

Si un jour vous voulez "Restaurer" le registre, il vous suffira d'ouvrir le regitre, d'ouvrir le Menu Fichier, + puis importer et de sélectionner votre fichier.

+ + + + + + + + +
SommaireSuite : Optimisation du système
+ blob - /dev/null blob + 67e679328992fff19fcea9eb877c45ce427b3f83 (mode 644) --- /dev/null +++ configurer/windows/2.php @@ -0,0 +1,162 @@ +'prev','href'=>'1.php','title'=>'Optimiser Windows 1'); +$head['access'][1]=array('rel'=>'first','href'=>'2.php','title'=>'Optimiser Windows 2'); +$head['access'][2]=array('rel'=>'index','href'=>'./','title'=>'Optimiser Windows'); +$titre='Optimiser Windows 2'; +require'../../autres/source-haut.php'?> + + + + + + + + +
Précédent : Avant de commencerSommaire
+

2) optimisation du système

+

/!\ +Manipulations du registre

+

+ /!\ + Cette astuce peut avoir des conséquences sur votre système si vous faites mal les manipulations. + Cependant si vous suivez bien ce que j'ai donné, cela n'arrivera pas.
+ Et n'oubliez pas que vous avez fait une sauvegarde du registre + au cas ou ceci arriverait. +

+

+ Vous devrez ouvrir le registre à chaque étape de cette rubrique. Pour l'ouvrir, déroulez le menu démarrer, + exécuter et tapez "regedit" puis appuyez sur Entrée.
+ Si il ne s'ouvre pas, l'executable correspondant au registre est souvent dans le répertoire + "C:\Windows\regedit.exe" (vous pouvez également taper ceci dans "executer").
+ Vous voyez une arborescence de dossiers qui sont en fait des clés. + Si je dis "Déroulez la clé HKEY_CLASSES_ROOT", vous devez cliquer sur le + + + à coté du dossier + placé à coté de "HKEY_CLASSES_ROOT".
+ Les clés "HKEY_CURRENT_USER" et "HKEY_CURRENT_CONFIG" correspondent + à des réglages qui affectent seulement la session en cours (current).
+ Si je vous dis de modifier une valeur, il faut double-cliquer dessus pour la changer. +

+

+ Il est également important de respecter la casse, + c'est à dire la différence majuscules/minuscules, ainsi que + les espaces : + Si je dis : "créez une valeur Dword que vous appellerez 'TimeSettings'", + il est important de l'apeller "TimeSettings" et pas "Time Settings" ou + "timesettings". +

+

+ Lorque vous modifier une valeur, elle est tout de suite enregistrée. + Vous ne devez pas confirmer quoi que ce soit ou enregistrer vous même.
+ J'utiliserais souvent des abréviations pour les clés principales :
+ HKCR pour HKEY_CLASSES_ROOT, HKCU pour HKEY_CURRENT_USER, etc...
+

+
Arrêter windows plus vite
+

+ Lorsque vous arrêtez Windows, il met parfois très longtemps avant de s'éteindre. + Pourquoi ?
Car il laisse par défaut 20 secondes à chaque + logiciel encore actif avant de l'arrêter.
+ Vous pouvez changer cette valeur pour que les logiciels s'arrêtent plus vite. +

+

+ Déroulez les clés HKLM, puis System, CurrentControlSet et Control. + Modifiez la valeur WaitToKillServiceTimeOut fixée par défaut à 20000 millisecondes (20 secondes). + Entrez par exemple 5000 pour 5 secondes d'attente par logiciel.

+
Libérer la mémoire vive
+

+ Windows conserve les dll de plusieurs logiciels dans la mémoire vive, + pour y avoir accès plus rapidement en cas de besoin. + Mais elles sont gardées en mémoire même quand le logiciel est fermé, et cela prend + inutilement de la place qui pourrait être utilisée par d'autres logiciels.

+

+ Pour déchargera les dll après usage, déroulez les clés HKLM, SOFTWARE, Microsoft, + Windows, CurrentVersion, Explorer.
La valeur AlwaysUnloadDll est fixée par défaut à 0, + changez la à 1. +

+

La fonction de recherche

+

Désactiver l'indexation

+

+ Pour que vos recherches dans votre ordinateur soient plus rapides, + Windows indexe chaque fichier au fur et à mesure que vous les utilisez.
+ Cette fonction est plutôt encombrante, car elle ralentit + votre ordinateur. +

+

+ Pour la désactiver, ouvrez le menu démarrer puis rechercher (ou appuyez sur F3).
+ Cliquez ensuite sur "Modifier les préférences", puis sur "avec le service d'indexation" + et choisissez non. +

+

/!\ +Désactiver les services inutiles

+

+ /!\ + Cette manipulation peut avoir des conséquences si vous désactivez de mauvais services. +

+

+ XP charge au démarrage plusieurs logiciels apellés "services". + Tous ne sont pas utiles, certains ne servent même à rien!
+ Vous pouvez donc les désactiver pour gagner en rapidité. + (Cependant, vous devez être administrateur de l'ordinateur pour accèder à ces options) +

+

+ Pour cela, ouvrez le Menu Démarrer, Executer, puis tapez "services.msc". + Si cela ne marche pas, executez le fichier services.msc situé dans le répertoire C:\WINDOWS\system32\.
+ Vous devriez voir une fenêtre ressemblant a ceci :
+ Services +

+

+ Ce sont tous les services. Pour arrêter et désactiver un service, double cliquez dessus, + puis cliquez sur arrêter (si il est démarré).
+ Changez ensuite la valeur à coté de "démarrage" en "désactivé", + puis cliquez sur appliquer. C'est bon, le service est désactivé.
+ Vous pouvez également regarder cette vidéo : +

+
+ + + +
+

Services inutiles, à désactiver dans tous les cas :

+

+ Accès distant au registre ; Administration IIS ; Affichage des messages ; Avertissement ; Carte à puce ; + Carte de performance WMI ; Client de suivi de lien distribué ; Connexion secondaire ; DDE réseau ; + Distribued Transaction Coordinator ; DSDM DDE sréseau ; Fournisseur de la prise en charge de sécurité LM NT ; + Gestionnaire de l'album ; Journaux et alertes de performance ; Partage de Bureau à Distance Netmeeting ; + Prise en charge des cartes à puce ; Publication FTP ; Publication World Wide Web ; QoS RSVP ; + Routage et accès distant ; Service de rapport d'erreur ; Services d'indexation ; Services IPSEC ; + Simple Mail Transfert Protocol (SMTP) ; Telnet ; WebClient. +

+

Services à désactiver selon les cas :

+ + + + + + + + + + + + + + + + + + + + + + +
Serviceà désactiver si...
serviceà désactiver si...
Acquisition d'image windowsVous n'avez pas de scanner ni de webcam
Aide et supportVous ne vous servez pas de l'aide de windows
Assistance TCP/IP netbiosVous n'avez pas de réseau local
Compatibilité avec le changement rapide d'utilisateurVous n'avez qu'un compte sur votre ordinateur
Configuration automatique sans filVous n'utilisez pas de réseau wi-Fi (Sans fil)
Explorateur d'ordinateurVous n'avez pas de réseau local
FaxVous n'utilisez pas la fonction "Fax" de windows
Gestionnaire de session d'aide sur le bureau à distanceVous n'utilisez pas l'aide à distance
OnduleurVous n'utilisez pas d'onduleur
Planificateur de tâchesVous n'utilisez pas les tâches planifiées
ServeurVous n'utilisez pas d'imprimante en réseau
Service de découverte SSPDVous n'avez pas de réseau local
Service de numéro de série du lecteur multimédia portableVous n'avez pas de baladeur MP3/Vidéo
TéléphonieVous avez le câble ou l'ADSL ou que vous n'avez pas internet
+ + + + + + + +
Précédent : Avant de commencerSommaire
+ blob - /dev/null blob + ac96f7190d58b5a952d38c9faf874fc88e79b8f8 (mode 644) Binary files /dev/null and configurer/windows/img/defrag1.jpg differ blob - /dev/null blob + 79685c2bf4958687eaab8d110f6c2856d73c86d7 (mode 644) Binary files /dev/null and configurer/windows/img/defrag2.jpg differ blob - /dev/null blob + 59b4f7dd5b7f1c7acf5c454cbe40e51bfcd135e1 (mode 644) Binary files /dev/null and configurer/windows/img/savereg.jpg differ blob - /dev/null blob + 70b8b523a2ebd07cfbaba72194bf7e5657499c3e (mode 644) Binary files /dev/null and configurer/windows/img/verifdsk.jpg differ blob - /dev/null blob + 98a8978328faa0d7d6a9acf5beb17f42a70137bd (mode 644) --- /dev/null +++ configurer/windows/index.php @@ -0,0 +1,37 @@ +'; +require'../../autres/source-haut.php'?> +

Windows
+Configurer et optimiser windows

+
+

Je donne ici diverses façons de manipuler Windows pour le rendre plus performant + ou l'adapter à vos besoins.
Quelques manipulations peuvent s'effectuer avec le logiciel + TweakUI.
+ Certaines peuvent causer des problèmes dans votre ordinateur suite a des manipulations.
+ Ceci ne devrait pas arriver si vous suivez les astuces comme elles sont données, mais il vaut mieux se préparer en cas d'erreur. +
Je vous conseille donc de faire un point de restauration et une sauvegarde du registre avant de commencer + ces manipulations.
+ La plupart des astuces sont sans "danger". Celles qui peuvent causer de graves erreurs dans votre ordinateur suite a de mauvaises + manipulations seront signalées par l'image :/!\ +

+

Attention, je ne suis pas responsable des dommages qui peuvent être causés dans votre ordinateur suite + à de telles manipulations. +

+
+

sommaire

+

#1) Avant de commencer

+

#Tout d'abord

+

#Une défragmentation des disques durs

+

#Une vérification des disques

+

#Un point de restauration

+

#Une sauvegarde du registre

+

#2) Optimisation du système

+

#/!\Manipulations du registre

+

#Arrêter windows plus vite

+

#Libérer la mémoire vive

+

#La fonction de recherche

+

#désactiver l'indexation

+

#/!\Désactiver les services inutiles

+ blob - /dev/null blob + c26cae0e6a6c8e4a8addabdf970f2afb11a9600e (mode 644) --- /dev/null +++ configurer/zonealarm.php @@ -0,0 +1,10 @@ +'index','href'=>'./','title'=>'Accueil de la rubrique "Configurer"'); +require'../autres/source-haut.php'?> +

ZA + Configurer zone alarm

+

Il y a une vidéo complète en deux parties :
+ 1° partie (Vidéo de 2602 Ko) : Télécharger et installer
+ 2° partie (Vidéo de 976 Ko) : Configurer et utiliser

+ blob - /dev/null blob + 781c188e6f66d6ec385f693a4ab2110e66345dd0 (mode 644) --- /dev/null +++ delxml/delxml2html.py @@ -0,0 +1,81 @@ +#!/usr/bin/python +# -*- coding: iso-8859-1 -*- +import datetime, time +import xml.dom.minidom +# +# delxml2html.py version 1.0.0 +# del.icio.us XML export to HTML converter. +# +# This program takes the XML export of your bookmarks +# and creates an HTML page from it. +# +# Instructions: +# +# 1) Go to http://del.icio.us/api/posts/all +# 2) Enter your del.icio.us login and password +# 3) Save the page as all.xml +# 4) Run this program +# 5) You have your bookmarks in favs.html +# +# Requirements: +# - a del.icio.us account. +# - Python 2.4 or later. +# +# License: This program is public domain. +# +# Author: Sébastien SAUVAGE (webmaster of http://sebsauvage.net) +# +# Ce programme a été modifé. +# +# Modifications apportées : +# +# -Respect des normes du W3C +# -Version xhtml 1.0 Strict +# -Utilisation d'une feuille de style CSS. +# +print 'Reading all.xml and writing favs.html...' +document = xml.dom.minidom.parse('all.xml') +attrv = document.getElementsByTagName('posts')[0].attributes['update'].value +export_date = attrv.replace('T',' ').replace('Z','')[:10] +posts = {} +# Get all posts, put them in a dictionnary (key = date/time of post) +for post in document.getElementsByTagName('post'): + timep = post.attributes['time'].value.replace('T',' ').replace('Z','') + attributes = {'time':timep} + for attributename in ('href','description','extended','tag'): + attributes[attributename] = u"" + try: + attributes[attributename] = post.attributes[attributename].value + except KeyError: + pass # Value not found. Nevermind. + # Strip ridiculously long page titles: + attributes['description'] = attributes['description'][:150] + posts[timep] = attributes + +# Take the list of posts (chronological order) and build HTML +htmlbody = u"" +for timep in reversed(sorted(posts.keys())): + htmlbody += (u'%(description)s - ' + +u'%(href)s
%(extended)s (Tags: %(tag)s)' + +u'

\n') % posts[timep] + +htmlout=u''' + + + + Bookmarks %s + + + +

Bookmarks %s

+

+ %s +

+ + +''' % (export_date,export_date,htmlbody) +file = open('favs.html','w+b') +file.write(htmlout.encode('UTF-8')) +file.close() + +print "Done." blob - /dev/null blob + d433240b53a6cd9ca44dfd9e76ece4afd3102522 (mode 644) --- /dev/null +++ delxml/delxmloriginal.py @@ -0,0 +1,68 @@ +#!/usr/bin/python +# -*- coding: iso-8859-1 -*- +import datetime, time +import xml.dom.minidom +# +# delxml2html.py version 1.0.0 +# del.icio.us XML export to HTML converter. +# +# This program takes the XML export of your bookmarks +# and creates an HTML page from it. +# +# Instructions: +# +# 1) Go to http://del.icio.us/api/posts/all +# 2) Enter your del.icio.us login and password +# 3) Save the page as all.xml +# 4) Run this program +# 5) You have your bookmarks in favs.html +# +# Requirements: +# - a del.icio.us account. +# - Python 2.4 or later. +# +# License: This program is public domain. +# +# Author: Sébastien SAUVAGE (webmaster of http://sebsauvage.net) +# +print 'Reading all.xml and writing favs.html...' +document = xml.dom.minidom.parse('all.xml') +attrv = document.getElementsByTagName('posts')[0].attributes['update'].value +export_date = attrv.replace('T',' ').replace('Z','')[:10] +posts = {} +# Get all posts, put them in a dictionnary (key = date/time of post) +for post in document.getElementsByTagName('post'): + timep = post.attributes['time'].value.replace('T',' ').replace('Z','') + attributes = {'time':timep} + for attributename in ('href','description','extended','tag'): + attributes[attributename] = u"" + try: + attributes[attributename] = post.attributes[attributename].value + except KeyError: + pass # Value not found. Nevermind. + # Strip ridiculously long page titles: + attributes['description'] = attributes['description'][:150] + posts[timep] = attributes + +# Take the list of posts (chronological order) and build HTML +htmlbody = u"" +for timep in reversed(sorted(posts.keys())): + htmlbody += (u'%(description)s - ' + +u'%(href)s
%(extended)s (Tags: %(tag)s)
' + +u'

\n') % posts[timep] + +htmlout=u''' + + Bookmarks %s

Bookmarks %s

+%s + + +''' % (export_date,export_date,htmlbody) + +file = open('favs.html','w+b') +file.write(htmlout.encode('UTF-8')) +file.close() + +print "Done." blob - /dev/null blob + 7d1f39e31d87086851537addff1db589d8ff78d3 (mode 644) --- /dev/null +++ delxml/index.php @@ -0,0 +1,188 @@ + +

Utiliser le programme "delxml2html".

+

Ce programme vous permet, si vous avez un compte del.icio.us, de mettre tous vos marques pages en une seule page html, que vous pouvez + ensuite mettre sur votre site. +
J'ai rédigé quelques instructions pour montrer comment utiliser le programme, réalisé par + Sébastien Sauvage : http://www.sebsauvage.net/. +

+

Instructions

+
    +
  1. Rendez-vous sur + http://del.icio.us/api/posts/all/
  2. +
  3. Entrez votre login et votre mot de passe del.icio.us
  4. +
  5. Enregistrez la page sous le nom "all.xml" (appuyez sur [Ctrl] + S ou allez dans le menu Fichier > Enregistrer sous)
  6. +
  7. Enregistrez le programme dans le même dossier que le fichier "all.xml"
  8. +
  9. Lancez le programme
  10. +
  11. Si vous utilisez le programme modifié, enregistrez le fichier CSS dans un fichier nommé "favs.css" que vous placerez dans le même répertoire que "favs.html"
  12. +
  13. C'est bon ! Vous avez votre page favs.html, avec tous vos favoris en un seule page
  14. +
  15. Mettez à jour de temps en temps en ré-enregistrant le fichier "all.xml"
  16. +
+

Code du programme

+

Programme original (Télécharger au format Python) (http://sebsauvage.net/python/programs.html#delxml2html) : +

+
#!/usr/bin/python
+# -*- coding: iso-8859-1 -*-
+import datetime, time
+import xml.dom.minidom
+# 
+# delxml2html.py  version 1.0.0
+# del.icio.us XML export to HTML converter.
+#
+# This program takes the XML export of your bookmarks
+# and creates an HTML page from it.
+#
+# Instructions:
+# 
+#   1) Go to http://del.icio.us/api/posts/all
+#   2) Enter your del.icio.us login and password
+#   3) Save the page as all.xml
+#   4) Run this program
+#   5) You have your bookmarks in favs.html
+#
+# Requirements:
+#     - a del.icio.us account.
+#     - Python 2.4 or later.
+#
+# License: This program is public domain.
+#
+# Author: Sébastien SAUVAGE (webmaster of http://sebsauvage.net)
+#
+print 'Reading all.xml and writing favs.html...'
+document = xml.dom.minidom.parse('all.xml')
+attrv = document.getElementsByTagName('posts')[0].attributes['update'].value
+export_date = attrv.replace('T',' ').replace('Z','')[:10]
+posts = {}
+# Get all posts, put them in a dictionnary (key = date/time of post) 
+for post in document.getElementsByTagName('post'):
+    timep = post.attributes['time'].value.replace('T',' ').replace('Z','')
+    attributes = {'time':timep}
+    for attributename in ('href','description','extended','tag'):
+        attributes[attributename] = u""
+        try:
+            attributes[attributename] = post.attributes[attributename].value
+        except KeyError:
+            pass  # Value not found. Nevermind.
+    # Strip ridiculously long page titles:
+    attributes['description'] = attributes['description'][:150]
+    posts[timep] = attributes
+    
+# Take the list of posts (chronological order) and build HTML
+htmlbody = u""
+for timep in reversed(sorted(posts.keys())):
+    htmlbody += (u'<a href="%(href)s"><b>%(description)s</b></a> - <small>'
+                +u'%(href)s</small><br><dd>%(extended)s (Tags: %(tag)s)</dd>'
+                +u'<br><br>\n') % posts[timep]
+
+htmlout=u'''<html><head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<style type="text/css"><!--body{
+font-family:"Trebuchet MS",Verdana,Arial,Helvetica,sans-serif;font-size:10pt;}
+--></style> <title>Bookmarks %s</title></head><body><h1>Bookmarks %s</h1><body>
+%s
+</body>
+</html>
+''' % (export_date,export_date,htmlbody)
+
+file = open('favs.html','w+b')
+file.write(htmlout.encode('UTF-8'))
+file.close()
+
+print "Done."
+

Programme modifié (Télécharger au format Python) :
+Modifications apportées : +

+
    +
  • Respect des normes du W3C
  • +
  • Version xhtml1.0 strict
  • +
  • Utilisation d'une feuile de style CSS
  • +
+
#!/usr/bin/python
+# -*- coding: iso-8859-1 -*-
+import datetime, time
+import xml.dom.minidom
+# 
+# delxml2html.py  version 1.0.0
+# del.icio.us XML export to HTML converter.
+#
+# This program takes the XML export of your bookmarks
+# and creates an HTML page from it.
+#
+# Instructions:
+# 
+#   1) Go to http://del.icio.us/api/posts/all
+#   2) Enter your del.icio.us login and password
+#   3) Save the page as all.xml
+#   4) Run this program
+#   5) You have your bookmarks in favs.html
+#
+# Requirements:
+#     - a del.icio.us account.
+#     - Python 2.4 or later.
+#
+# License: This program is public domain.
+#
+# Author: Sébastien SAUVAGE (webmaster of http://sebsauvage.net)
+#
+# Ce programme a été modifé.
+#
+# Modifications apportées :
+#
+#   -Respect des normes du W3C
+#   -Version xhtml 1.0 Strict
+#   -Utilisation d'une feuille de style CSS.
+#
+print 'Reading all.xml and writing favs.html...'
+document = xml.dom.minidom.parse('all.xml')
+attrv = document.getElementsByTagName('posts')[0].attributes['update'].value
+export_date = attrv.replace('T',' ').replace('Z','')[:10]
+posts = {}
+# Get all posts, put them in a dictionnary (key = date/time of post) 
+for post in document.getElementsByTagName('post'):
+    timep = post.attributes['time'].value.replace('T',' ').replace('Z','')
+    attributes = {'time':timep}
+    for attributename in ('href','description','extended','tag'):
+        attributes[attributename] = u""
+        try:
+            attributes[attributename] = post.attributes[attributename].value
+        except KeyError:
+            pass  # Value not found. Nevermind.
+    # Strip ridiculously long page titles:
+    attributes['description'] = attributes['description'][:150]
+    posts[timep] = attributes
+    
+# Take the list of posts (chronological order) and build HTML
+htmlbody = u""
+for timep in reversed(sorted(posts.keys())):
+    htmlbody += (u'<span class="d"><a href="%(href)s">%(description)s</a></span> - <span class="l">'
+                +u'%(href)s</span><br /><span class="n">%(extended)s (Tags: %(tag)s)</span>'
+                +u'<br /><br />\n') % posts[timep]
+
+htmlout=u'''
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
+   <head>
+       <title>Bookmarks %s</title>
+       <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" />
+       <link type="text/css" href="favs.css" rel="stylesheet" />
+   </head>
+   <body>    <h1>Bookmarks %s</h1>
+    <p>
+    %s
+    </p>
+    </body>
+    </html>
+''' % (export_date,export_date,htmlbody)
+file = open('favs.html','w+b')
+file.write(htmlout.encode('UTF-8'))
+file.close()
+
+print "Done."
+

Et le fichier CSS qui va avec le programme modifié :

+
body{font-family:"Trebuchet MS",Verdana,Arial,Helvetica,sans-serif;font-size:10pt;}
+p span.d{font-weight:bold;}
+p span.l{font-size:0.8em;}
+p span.n{margin-left:3%;}
+ blob - /dev/null blob + 952ee297a725c80996a5f0b9620ec6e78c1676be (mode 644) --- /dev/null +++ extract.php @@ -0,0 +1,9 @@ +extract() == 0) { + die("Error : ".$archive->errorInfo(true)); +} +?> blob - /dev/null blob + e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 (mode 644) blob - /dev/null blob + 7e5ea2571816f2c98829176a89f574a1a6604c93 (mode 644) --- /dev/null +++ html.php @@ -0,0 +1,1637 @@ + +

Conseils et astuces pour vos sites

+
+

+ divers +

+

+ faire une sitemap (Plan du + site) +

+ +
+ Attention : ce tutoriel + vous apprendra a faire une sitemap, pas une googlemap. Si + c'est ce que vous voulez, il existe le logiciel gratuit + YoodaMAP.
+ Vous pouvez voir aussi : + + http://www.commentcamarche.net/faq/sujet-3649-plan-du-site-sitemap-consultable-avec-navibar-pour-firefox +
+

+ sur certains sites, (dont le mien) si vous + utilisez Firefox muni de + l'extension Navibar, vous avez déja vu un plan du site dans le panneau latéral. Vous + trouvez ceci très pratique et vous aimeriez en faire profiter + les visiteurs de votre site mais vous ne savez pas comment + faire ? Ce n'est pas très compliqué. Il existe des logiciels + qui font ceci en quelques clics, mais ils sont payants. Ne + vous fiez pas non plus aux versions d'évaluation de ces + logiciels, la plupart ont des restrictions assz + contraignantes(ex: sitemap pro : seulement 6 urls!!). + Toutefois si vous trouvez un logiciel gratuit qui fait ca + bien, vous pouvez me contacter + +

+

+ vous devrez faire un fichier que vous nommerez "sitemap.rdf" et que vous deposerez a la + racine de votre site. Vous pouvez faire ce fichier avec le + bloc-notes mais cest plus pratique d'avoir un logiciel qui + colore et range le code, comme + PSPad editor. Si vous + n'avez pas ce logiciel ou un logiciel similaire je vous + invite à le télécharger. En plus il fait aussi xslt, rss, + html... et une multitude d'autres formats. Si vous voulez + vous pouvez également regarder la sitemap de mon site : sitemap.rdf. Appuyez sur Ctrl+U dans + Firefox pour voir son code source. +

+ +

+ quand vous avez téléchargé et installé le logiciel, crééz un + nouveau fichier texte que vous nommerez "sitemap.rdf", puis + ouvrez le avec votre éditeur. Vous voyez une page vide. C'est + normal pour le moment. Nous allons maintenant remplir cette + page. Tout d'abord il faut indiquer la version de votre + fichier, c'est à dire la première version. Vous devez écrire + sur la première ligne de votre fichier le code +

+
+ <?xml version="1.0"?> +
+

+ qui indique que la version du fichier xml est la version + numéro 1.
+ +

+

+ vous devez ensuite indiquer le code qui suit : ce sont + diverses adresses en rapport avec la validité de votre + fichier. +

+
+ <rdf:RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ +         xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ +         xmlns:map="http://www.oaklett.org/map/1.0#"
+ +         xmlns:dc="http://purl.org/dc/elements/1.1/"> +
+

+ vous avez terminé la première partie. Maintenant nous allons + faire votre sitemap. Une sitemap est présentée sous forme + d'arborescence : des dossiers + contenant des fichiers ou d'autres dossiers. +

+ +

+ nous allons indiquer le contenu + de votre sitemap. Vous n'êtes pas obligé d'indiquer tout le + contenu de votre site dans la sitemap, c'est vous qui + choisissez ce que les visiteurs pourront voir ou pas. Vous + pouvez aussi y mettre des liens + externes (vers d'autres sites).Vous choisissez + également l'organisation des dossiers et + des fichiers de votre sitemap : elle ne dépend pas de + celle de votre site. +

+

+ + la première partie de ma sitemap est : +

+
+ <rdf:Description rdf:about="urn:sitemap:root">
+ <map:container>
+ <rdf:Seq>
+ + <rdf:li rdf:resource="syl:home"/>
+ <rdf:li rdf:resource="syl:cestquoi"/>
+ <rdf:li rdf:resource="syl:configurer"/>
+ + <rdf:li rdf:resource="syl:logiciels"/>
+ <rdf:li rdf:resource="syl:temp"/>
+ [...]etc
+ + </rdf:Seq>
+ </map:container>
+ </rdf:Description> +
+

+ ? Ca veut dire quoi tout ce charabia ?
+ + Ne vous inquiétez pas. Ceci vous paraitra beaucoup plus clair + une fois que vous aurez fini de lire ce tutoriel. Je vous + explique ce code : +

+
+ <rdf:Description rdf:about="urn:sitemap:root"> +
+

+ + Cette ligne est obligatoire + pour une sitemap. Elle indique le début + de l'arborescence et les éléments qui seront au + "premier niveau"(disons ca comme ca).
+
+

+
+ <map:container>
+ + <rdf:Seq> +
+

+ Indique le début du contenu de la + sitemap, de ce que les visiteurs de votre site verront. + Obligatoire également.
+
+

+ +
+ <rdf:li rdf:resource="syl:home"/>
+ + <rdf:li
rdf:resource="syl:cestquoi"/>
+ + <rdf:li rdf:resource="syl:configurer"/> +
+

+ Veut dire : l'élément "syl:home" sera affiché en + premier, puis celui "syl:cestquoi", etc...
+ Obligatoire aussi, a moins de ne rien vouloir mettre dans sa + sitemap...
+ +
+

+
+ </rdf:Seq>
+ </map:container>
+ </rdf:Description> +
+ +

+ Indique la fin du contenu de votre sitemap. + Obligatoire.
+

+

+ c'est maintenant que cela devient intéressant. Je vous ai + parlé "d'éléments", nous allons maintenant les rajouter dans + votre sitemap. Nous allons par exemple indiquer le contenu de + l'élément +

+
+ <rdf:li rdf:resource="syl:home"/> + +
+

+ il faut mettre du code qui donnera le titre du contenu ainsi + qu'un lien vers la page correspondante. Le code +

+
+ <rdf:Description rdf:about="syl:home">
+ +     <dc:title>Ssylvainsab - + Accueil</dc:title>
+     <dc:identifier>http://ssylvainsab.free.fr/index.html</dc:identifier>
+ + </rdf:Description> +
+ +

+ Indique le contenu de l'élément "syl:home"
+

+

+ que veut dire ce code? +

+
+ <rdf:Description rdf:about="syl:home"> + +
+

+ Indique le début d'un élément et dit : Cet élément est + l'élément "syl:home".
+

+
+     <dc:title>Ssylvainsab - + Accueil</dc:title> + +
+

+ Veut dire : Le titre de cet élément est "Ssylvainsab - + Accueil"
+
+

+
+     <dc:identifier>http://ssylvainsab.free.fr/index.html</dc:identifier> + +
+

+ Indique la page vers laquelle dirige l'élément.
+
+

+
+ </rdf:Description> +
+ +

+ Indique la fin du contenu de l'élément. +

+

+ donc le code : +

+
+ <?xml version="1.0"?>
+
+ + <rdf:RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ +         xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ +         xmlns:map="http://www.oaklett.org/map/1.0#"
+         xmlns:dc="http://purl.org/dc/elements/1.1/"> + +     + <rdf:Description rdf:about="urn:sitemap:root">
+         + <map:container>
+         + +     <rdf:Seq>
+         +         <rdf:li + rdf:resource="syl:home"/>
+ +         +     </rdf:Seq>
+         + </map:container>
+     + </rdf:Description> <rdf:Description rdf:about="syl:home">
+ +     <dc:title>Ssylvainsab - + Accueil</dc:title>
+     <dc:identifier>http://ssylvainsab.free.fr/index.html</dc:identifier>
+ + </rdf:Description>
+
+ + </rdf:RDF>
+
+

+ Veut dire : La version de ce fichier est la version 1.
+ Le contenu de la sitemap sera l'élément "syl:home".
+ Le titre de l'élément "syl:home" est Ssylvainsab - Accueil et + c'est un lien vers la page + http://ssylvainsab.free.fr/index.html. +

+

+ + evidemment une sitemap avec seulement la page d'accueil + n'aurait pratiquement aucun intêret. Il vous faut donc + rajouter des éléments. +

+

+ nous allons voir ici comment faire pour ajouter des dossiers + a votre sitemap. Par exemple, nous voulons que la sitemap + contienne la page d'accueil et un dossier de photos. il + faudra entrer le code : +

+
+ [...]
+
+ <rdf:Description rdf:about="urn:sitemap:root"><!--Le début de la sitemap-->
+ +     + <map:container><!--Le contenu de la + sitemap-->
+         + <rdf:Seq>
+        +      <rdf:li rdf:resource="pagedaccueil"/><!--On affichera en premier l'element + "pagedaccueil"-->
+ +         +     <rdf:li rdf:resource="photos"/><!--On affiche ensuite l'element + "photos"-->
+         + </rdf:Seq>
+ +     + </map:container><!--On ferme le contenu de la + sitemap-->
+ </rdf:Description> + <rdf:Description rdf:about="pagedaccueil"><!--Ceci est l'element + "pagedaccueil"-->
+ +     <dc:title>Accueil</dc:title><!--Le titre de cet element + est "Accueil"-->
+     <dc:identifier>http://www.monsite.com/index.html</dc:identifier><!--Il + y a un lien vers ma page d'accueil sur cet + element-->
+ </rdf:Description><!--On + ferme l'element "pagedaccueil"-->
+ + <rdf:Description rdf:about="photos"><!--Ceci est l'element "photos". C'est + un dossier avec mes photos-->
+     + <dc:title>Les Photos de Mes Vacances</dc:title><!--Le titre du dossier est + "Les Photos de Mes Vacances-->
+ +     <dc:identifier>http://www.monsite.com/photos/index.html</dc:identifier><!--Il + y a un lien vers la page de mes photos sur cet element + -->
+     <map:container><!--Le contenu de + l'element "photos"-->
+         + <rdf:Seq>         + +      <rdf:li rdf:resource="photo1"/><!--On affiche d'abord la premiere + photo-->
+         +     <rdf:li rdf:resource="photo2"/><!--Puis la deuxieme-->
+ +         +     <rdf:li rdf:resource="photo3"/><!--puis la troisieme-->
+         +     <rdf:li rdf:resource="photo4"/><!--...etc-->
+ +         +     <rdf:li rdf:resource="photo5"/><!--etc-->
+         + </rdf:Seq>
+ +     </map:container>
<!--On + ferme le contenu du dossier-->
+ </rdf:Description>

+
+ <rdf:Description
rdf:about="photo1"><!--Ceci est le contenu de l'element + "photo1"-->
+ +     <dc:title>Moi a la plage</dc:title><!--Le titre de cet element + est "Moi a la plage"-->
+     <dc:identifier>http://www.monsite.com/photos/premierephoto.jpg</dc:identifier><!--Il + y a un lien vers la photo de moi a la plage dans cet + element-->
+ </rdf:Description><!--On + ferme l'element "photo1"-->
+ +
+ <rdf:Description rdf:about="photo2"><!--Ceci est le contenu de l'element + "photo2"-->
+     <dc:title>Moi a la montagne</dc:title><!--Le titre de cet element + est "Moi a la montagne"-->
+ +     <dc:identifier>http://www.monsite.com/photos/deuxiemephoto.jpg</dc:identifier><!--Il + y a un lien vers la photo de moi a la montagne dans cet + element-->
+ </rdf:Description><!--On + ferme l'element "photo2"-->
+
+ <rdf:Description rdf:about="photo3"><!--On ouvre l'element-->
+ +     <dc:title>Moi et mes amis</dc:title><!--Le titre est "Moi et + mes amis"-->
+     <dc:identifier>http://www.monsite.com/photos/troisiemephoto.jpg</dc:identifier><!--Il + y a un lien vers la photo de moi et mes amis-->
+ </rdf:Description><!--On + ferme l'element-->
+ +
+ <rdf:Description rdf:about="photo4"><!--On ouvre l'element-->
+     <dc:title>Mon chien</dc:title>
+ +     <dc:identifier>http://www.monsite.com/photos/monchien.jpg</dc:identifier><!--photo + de mon chien-->
+ </rdf:Description><!--On + ferme l'element-->
+
+ <rdf:Description rdf:about="photo5"><!--...etc-->
+ +     <dc:title>Moi</dc:title>
+     <dc:identifier>http://www.monsite.com/photos/photo.jpg</dc:identifier><!--...etc-->
+ + </rdf:Description><!--etc-->
+ +
+ </rdf:RDF>
[...] +
+

+ voici ce que le visiteur verra lorsqu'il visitera votre site + :
+ ACCUEIL | PHOTOS> 1 2 3 4 5 +

+

+ + Si vous ne voulez pas mettre de lien sur un dossier, il + suffit de mettre une ancre (un dièze) à la place. Exemple : +

+
+ <rdf:Description rdf:about="photos"><!--Ceci est l'element "photos". C'est + un dossier avec mes photos-->
+     + <dc:title>Les Photos de Mes Vacances</dc:title><!--Le titre du dossier est + "Les Photos de Mes Vacances-->
+ +     <dc:identifier>#</dc:identifier><!--J'AI MIS UN DIEZE DONC + IL N'Y A PAS DE LIENS ATTRIBUE A CE DOSSIER-->
+     <map:container><!--Le contenu de + l'element "photos"-->
+         + <rdf:Seq>         + +      <rdf:li rdf:resource="photo1"/><!--On affiche d'abord la premiere + photo-->
+         +     <rdf:li rdf:resource="photo2"/><!--Puis la deuxieme-->
+ +         +     <rdf:li rdf:resource="photo3"/><!--puis la troisieme-->
+         +     <rdf:li rdf:resource="photo4"/><!--...etc-->
+ +         +     <rdf:li rdf:resource="photo5"/><!--etc-->
+         + </rdf:Seq>
+ +     </map:container>
<!--On + ferme le contenu du dossier-->
+ </rdf:Description>
+
+

+ vous pouvez faire autant de dossiers et de fichiers que vous + voulez à l'interieur d'autant de dossiers que vous voulez. + Par contre attention, il ne faut pas mettre d'accent ou + d'autre caractere à part "-" ou "_" dans votre fichier, sinon + il y aura à la place un point d'interrogation. +

+

+ + voila, vous savez maintenant comment faire une sitemap. Notez + qu'il existe un validateur pour ce type de documents : + http://www.w3.org/RDF/Validator/ +

+

+ Si votre document n'est pas valide, vérifiez : +

+
    +
  • Que toutes les balises sont bien fermées dans le bon + ordre +
  • +
  • Que vous n'avez pas oublié de guillemets +
  • + +
  • Que vous n'avez pas mi un caractère invalide +
  • +
+

+ les tableaux +

+

+ attribut summary +

+

+ + Utilisez toujours l'attribut + "summary" dans vos tableaux. + C'est une règle pour respecter les + normes (http://www.w3.org/) + d'internet.
+ Cet attribut est une sorte de "alt" pour un tableau. +

+

+ + L'attribut "alt" est le + texte qui s'affiche à la place d'une image lorqu'elle n'est pas + chargée. Par exemple le code html : +

+
+ <img  style="width: 150px; height: 35px;" alt="html" src="http://ssylvainsab.free.fr/img/boutons/btlogiciels.gif">
+ +
+

+ affichera : + +

+

+ Cependant si la source est + éronnée (par exemple en se trompant on met .png au + lieu de .gif) : +

+ +
+ <img style="width: 150px; height: 35px;" alt="logiciels" src="http://ssylvainsab.free.fr/img/boutons/btlogiciels.png"> +
+

+ + ce qui sera affiché à l'écran sera : logiciels car le lien vers l'image est + erronné.
+ Mais avec l'attribut "alt" on sait quand même de quoi va + parler la page. Très utile. +

+

+ Si on n'avait pas mis d'attribut + "alt" ce qui aurait été affiché serait :
+ + pas de alt.
+ La, aucun idée du thème de la page. Beaucoup moins pratique. +

+

+ eh bien c'est un peu pareil pour un tableau. Par exemple + l'attribut "summary" du tableau + de la page Temp de mon site est "Videos et fichiers".
+ + De cette façon le visiteur de mes pages sait de quoi va + parler le tableau. +

+

+ En fait cet attribut et l'attribut "alt" servent plutot dans + les navigateurs en mode texte, + comme Lynx,
+ ou pour les personnes qui ont désactivé + les images sur leur navigateur. +

+
+ +

+ "Thead" et "Tfoot" +

+

+ dans vos tableaux, vous avez sans doute déja voulu + mettre un en-tête ou un + pied, mais vous ne savez pas comment faire?
+ C'est très simple. +

+ +

+ habituellement votre tableau est en une partie : le corps + (tbody) : regardez ce tableau de + base : +

+ + + + + + + + + + + + + + + + +
+ liens.html + + Liens +
+ news.html + + + News +
+ index.html + + Accueil + +
+

+
+ ...et son code html (que j'ai coloré pour qu'il soit plus + "lisible") :
+
+ +

+
+ <table summary="exemple de tableau simple" style="text-align: center; width: 400px;" + border="2" + cellpadding="2" + cellspacing="2">
+ + <tbody>
+
+ <tr>
+     + <td>liens.html</td>
+     + + <td><img style="width: + 150px; height: 35px;" alt="Liens" src="http://ssylvainsab.free.fr/img/boutons/btliens.gif"></td>
+ + </tr>
+ +
+  <tr>
+     + <td>news.html</td>
+     + <td><img style="width: + 150px; height: 35px;" alt="News" src="http://ssylvainsab.free.fr/img/boutons/btnews.gif"></td>
+ + </tr>  <tr>
+     + <td>index.html</td>
+     + <td><img style="width: + 150px; height: 35px;" alt="Accueil" src="http://ssylvainsab.free.fr/img/boutons/btaccueil.gif"></td>
+ + </tr>
+
+ </tbody>
+ </table> +
+

+ décortiquons-le : +

+ +
+ <table [...] > +
+

+ Indique le début du tableau
+
+

+ +
+ summary="exemple de tableau + simple" +
+

+ Est l'attribut "summary". Si vous ne savez pas ce que c'est + voyez plus haut : ^ +

+
+ + text-align: center; width: 400px;" +
+

+ Est le "style" (comme son nom l'indique) du tableau. Il est + indiqué ici que le texte est aligné au centre des cellules + (les "cases") et que mon tableau fait 400 pixels de + large. +

+
+ border="2" + cellpadding="2" + cellspacing="2" +
+ +

+ Indique que la bordure fera 2 pixels, qu'il y aura 2 pixels + entre la bordure et le contenu de chaque cellule et qu'il y + aura une marge de 2 pixels entre chacune des cellules.
+
+
+

+
+ <tbody> +
+ +

+ Tout ce qui va suivre dans cette balise sera le corps du tableau. +

+
+ <tr> +
+

+ + Tout ce qui va suivre dans cette balise sera une ligne du tableau (une balise <tr> = une ligne avec un nombre x de + colonnes) +

+
+ <td> +
+

+ + Ceci indique une cellule. Ce qui + va suivre sera son contenu. Il y a autant de balises + <td> par ligne que de + colonnes dans votre tableau. +

+

+ Donc : +

+
+ <tbody>
+ +
+ <tr>

+     + <td>liens.html</td>
+     + <td><img style="width: + 150px; height: 35px;" alt="Liens" src="http://ssylvainsab.free.fr/img/boutons/btliens.gif"></td>
+ + </tr> +
+

+
+ Veut dire : Dans le corps du + tableau (<tbody>), il + y a une ligne (<tr>[...]</tr>) qui comporte deux cellules (<td>liens.html</td><td>[...]</td>).
+ + Le contenu de la première cellule est "liens.html" et + celui de la deuxième est +

+
+ <img style="width: 150px; height: 35px;" alt="Liens" src="liens.gif"> + +
+

+ qui veut dire : Il y a ici un image de largeur 150 pixels et + de hauteur 35 pixels.
+ Cette image se nomme : liens.gif
+ Si elle ne s'affiche pas, il faut afficher à la place le + texte "Liens". +

+

+ donc un tableau est formé comme ceci : +

+ +
+ <table summary="Le "thème" de votre tableau" + style="La "présentation" de + votre tableau(taille...)" [ce que nous avons vu + plus haut]> On + ouvre le tableau <tbody>
+ + Le contenu du corps de + votre tableau
+
+ <tr>
Le contenu + de la première ligne
+     <td>Le + contenu de la première cellule</td>
+     <td>Le + contenu de la deuxième cellule</td>
+ + </tr>On ferme la première ligne
+

+
+
+ <tr>Le contenu de la deuxième + ligne
+     + <td>Le + contenu de la première cellule</td>
+ +     + <td>Le + contenu de la deuxième cellule</td>
+ </tr>
On + ferme la deuxième ligne +

+

+
+ + <tr>etc...
+     <td>etc...</td>
+     + <td>etc...</td>
+ + </tr>etc...
+
+ </tbody> On ferme le corps du + tableau
+ </table>

+ On ferme le + tableau
+ +

+
+

+ Vous pouvez ajouter autant de lignes, de + colonnes et de celulles que vous voulez : exemple : un + tableau à quatre colonnes et deux lignes : +

+
+ <table [...]> On + ouvre le tableau<tbody>
+ + Le contenu du corps de votre tableau

+
+ <tr>Le contenu de la première + ligne
+     <td>Le + contenu de la première cellule</td>
+     + + <td>Le contenu + de la deuxième cellule</td>     <td>Le contenu de la troisième + cellule</td>
+     + <td>Le contenu + de la quatrième cellule</td>
+ + </tr>On ferme la première ligne
+
+ <tr>Le contenu de la deuxième + ligne
+     <td>Le + contenu de la première cellule</td>
+     + + <td>Le contenu + de la deuxième cellule</td>
+     + <td>Le contenu + de la troisième cellule</td>
+     + <td>Le contenu + de la quatrième cellule</td>
+ + </tr>On ferme la deuxième ligne
+
+ </tbody> On ferme le corps du + tableau</table>
+ On ferme le tableau +
+ +

+ cela donne :  +

+ + + + + + + + + + + + + + + + + + +
+ le contenu de la première cellule + + le contenu de la deuxième cellule + + le contenu de la troisième cellule + + le contenu de la quatrième cellule +
+ le contenu de la première cellule + + le contenu de la deuxième cellule + + le contenu de la triosième cellule + + le contenu de la quatrième cellule +
+

+
+ maintenant je vais vous montrer comment faire un en-tête et + un pied à votre tableau (si vous avez bien compris ce que + j'ai expliqué avant, ce sera facile) : +

+ +

+ Vous vous souvenez, je vous ai dit :
+ " +

+
+ <tbody> +
+ +

+ Tout ce qui va suivre dans cette balise sera + le corps du tableau." +

+

+ eh bien c'est très simple, les en-têtes et les pieds se + forment de la même manière que le corps du tableau :
+ il suffit de mettre des balises <thead>[...]</thead> (pour l'en-tête) ou + <tfoot>[...]</tfoot> (pour le pied) avant les balises <tbody>[...]</tbody>.
+ +
+ La seule chose qui + peut paraître illogique, c'est que le pied est placé + avant le corps dans le code html, + mais il apparait après dans le tableau. Retenez bien + ceci pour ne pas vous tromper.
+  
+ Par exemple, pour le tableau que vous avez vu avant cela + donne : +

+ + + + + + + + + + + + + + + + + + + + + + + + + +
+ page + + image +
+ liens.html + + Liens +
+ news.html + + News +
+ index.html + + Accueil +
+ +

+
+ Et le code html est :
+
+

+
+ <table summary="exemple de tableau simple" style="text-align: center; width: 400px;" + border="2" + cellpadding="2" + cellspacing="2">
+ +
+ <thead>
+     <tr>

+         + <td>page</td>
+ +         + <td>image</td>
+     + </tr>
+ </thead>
+
+ + <tbody>

+ Contenu du + tableau
+ </tbody>
+
+ </table>
+
+

+ +
+
+ Vous pouvez choisir ce que vous voulez faire : avec/sans +  :   pied/en-tête.
+ avec un pied le code aurait été :
+
+

+ +
+ <table [...]>
+
+ <tfoot>
+     <tr>

+         + + <td>page</td>
+         + <td>image</td>
+     + </tr>
+ + </tfoot>
+
+ <tbody>

+ Contenu du + tableau
+ </tbody>
+
+ </table>

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +
+ page + + image +
+ liens.html + + Liens + +
+ news.html + + News +
+ index.html + + Accueil +
+

+
+ Ca ne sert pratiquement à rien, mais je vous le dis quand + même : vous pouvez mettre autant de pied/en-tête que vous + voulez. Par contre, seul le premier "pied" sera considéré + comme tel(sera placé en bas du tableau). Les autres seront + considérés comme des en-têtes(en haut du tableau). +

+

+ ah mais au fait, a quoi ca sert d'utiliser des en-têtes et + des pieds, on aurait pu utiliser des lignes normales, + c'aurait été pareil!
+
+ + Pas tout à fait : avec les balises "thead" et "tfoot" : +

+
    +
  • Votre code est mieux organisé, c'est plus facile de s'y + retrouver +
  • +
  • Si vous mettez des lignes à la place, si vous voulez + ajouter une ligne à votre tableau, vous devrez faire bien + attention à ne pas l'ajouter avant les en-têtes ou pieds de + page, alors qu'avec ceci, la ligne se mettra au bon endroit. +
  • +
  • Avec le CSS, vous pouvez faire un style différent aux + en-tête, pieds de pages et corps du tableau. +
  • +
+

+ + astuces +

+

+ mettre une favicône sur + son site +

+

+ Sur certains sites, peut-être avez vous remarqué + une petite image à gauche de + l'url(et de l'onglet dans firefox) : +

+ + + + + + + + + +
+ favicône : + + + +
+

+ Par exemple quand vous surfez sur les pages de mon site, vous + voyez : ::. + Cette image s'apelle une "favicône". C'est pratique pour repérer quel + onglet correspond à quel site.
+ Vous en voulez une sur votre site? +

+

+ Voici les étapes à suivre pour mettre un favicône sur votre site : +

+
    +
  1. Créez une image aux dimensions 16 pixels sur 16 pixels + (environ) (avec paint : menu image puis attributs) +
  2. +
  3. Enregistrez-la sous le nom "favicon.ico" +
  4. +
  5. Deposez-la à la racine de votre site +
  6. +
  7. C'est tout ! Dorénavant les visiteurs qui iront sur votre + site verront cette favicône. +
  8. + +
+

+ Notez que si vous ne déposez pas la favicone a la racine de + votre site, vous devrez indiquer son emplacement dans chaque + page pour qu'elle s'affiche, en faisant de cette facon + :
+ Dans les balises <head> de + votre page, mettez le code suivant : <link rel="shortcut + icon" href="emplacement de votre + favicone">. +

+ +

+ Vous pouvez également utiliser plusieurs favicones sur des + pages différentes pour votre site, en changeant l'emplacement + de la favicone. +

+

+ Il existe un validateur pour les favicones : http://www.html-kit.com/favicon/validator/ +

+

+ voyez aussi : http://www.commentcamarche.net/faq/sujet-332   + +  http://www.xhtml.net/xhtmlcss/favicon +

+
+

+ mettre une icône signalant + la préscence d'un flux RSS sur son site +

+

+ sur certains sites, vous avez sans doute remarqué la présence + de l'image RSS, située à droite de l'url et + signalant un flux RSS sur le + site. Vous aimeriez bien faire pareil ? +

+ + + + + + + + + +
+ + + + Icône signalant un flux RSS +
+

+ C'est très simple :
+ Une fois que vous avez créé votre flux + RSS, mettez le code html + +

+
+ <link rel="alternate" type="application/rss+xml" title="Titre de votre + flux" href="Emplacement de votre flux"> + +
+

+
+ entre les balises <head> et + <head> de la page/des pages + ou vous souhaitez voir cette image. +

+

+ + exemple : sur ma page d'accueil, j'ai indiqué le code + suivant :  +

+
+ <link rel="alternate" type="application/rss+xml" title="Les news de Ssylvainsab par flux RSS" + href="rss/rss.xml"> + +
+

+ cependant attention : il faut mettre ce + code sur chaque page ou vous voulez voir cette image. + Sur ce site je l'ai mis sur la page + d'acccueil, les news et la page du flux. +

+

+ a retenir pour vos pages : +

+ +

+ vous pouvez regarder le code sources des pages des autres + sites. C'est assez instructif. +

+

+ Pour les images sur internet, n'utilisez que les formats + .gif,(pour les dessins sans trop de nuances) .png(pour les + dessins) ou .jpg(pour les photos). Les autres formats sont + trop lourds ou pas adaptés. +

+

+ Utilisez les attributs "alt" pour vos images et "summary" + pour vos tableaux. Sinon vos pages ne seront pas + valides(http://www.w3.org/). +

+ +

+ respectez les standards du WEB (http://www.w3.org/) +

+

+ si vous le pouvez, utilisez le logiciel TidyGUI pour vérifier vos pages + avant de les mettre en ligne. +

+

+ + L'extension WebDeveloper pour + Firefox est très pratique : elle vous permet de vérifier vos + fichiers CSS, html, rss.... et bien d'autres choses. +

+

+ validez vos pages avant de les mettre en ligne : +

+

+ les validateurs : +

+ + blob - /dev/null blob + 0c41da62c2b691ea5135169c231dc6f32345bfd3 (mode 644) --- /dev/null +++ index.php @@ -0,0 +1,21 @@ + +

Le flux RSS est a l'adresse : rss.xml

+

+ Pour s'abonner a ce flux, il suffit de cliquer sur l'icône + RSS à droite de l'url, + ou de marquer l'url : http://sylvain.sab.free.fr/rss/rss.xml + dans votre lecteur de flux. +

+

+ Vous pouvez également vérifier sa validité : + + W3C RSS 2.0 +

+

Les News : news.php

+

+ Vous pouvez aussi regarder une vidéo (588 Ko) qui explique comment gérer les Flux RSS avec Firefox : + /temp/?video=firefoxrss +

+ blob - /dev/null blob + e82ad30e8bff7e62714cbb7ad1a8ddde1507451b (mode 644) --- /dev/null +++ liens.php @@ -0,0 +1,581 @@ +'."\n\t". + ''; +$titre='Liens'; +require'autres/source-haut.php';?> +

Liens

+
+

Je suis inscrit au service "del.icio.us".
Ce service permet de partager ses marques pages avec tout le monde. + Vous pouvez voir mes marques-pages de différentes façons :

+
  1. Directement depuis del.icio.us (mise à jour en temps réel) : http://del.icio.us/ssylvainsab/
  2. +
  3. Depuis le flux RSS de del.icio.us (mise à jour en temps réel également) : + http://del.icio.us/rss/ssylvainsab/
  4. +
  5. Sur une seule page (crée avec le programme Delxml2html), mise à jour de temps en temps : + http://sylvain.sab.free.fr/pages/
+

Pour utiliser le programme delxml2html, voir la page Utiliser le programme delxml2html.

+
+

+ Quels liens voulez-vous voir ?
+ || Securité || Informatique || Télécharger / Logiciels || Site WEB / Programmation || Multimedia || Images - Dessin - Graphisme || Recherche || Divers || Liens ||

+
(.+)#sU','
$1
',$page); + } + ob_start('callback_liens'); + echo'

Cliquez ici pour revenir à l"affichage normal avec CSS.


'; +} +else echo'

Vous n\'avez pas activé les CSS ? Cliquez ici pour voir les liens normalement.


'; +?> + +
+

Securité

+

Documentation

+

+ Claymania : + Savoir se protéger contre les virus. + + Assiste : + Documentation et explications sur les logiciels malveillants. + + Safe-hex - Sébastien sauvage : + Les recommandations de Sébastien Sauvage. + + Abc de la sécurité : + Plusieurs reccommandations utiles. +

+

Test de fichiers

+

+ Eicar antivirus test file : + Téléchargez un des fichiers, puis analysez le avec votre antivirus. Il devrait reconnaitre un virus. (faux bien sur) + + Online Malware Scan : + Si vous avez un doute sur un fichier, vous pouvez le scanner avec 14 antivirus différents. + VirusToal : + La même chose, mais avec 25 antivirus ! + + CryptoDox : + Un wiki sur la cryptographie. +

+ +

Espionnage

+

+ Pour voir comme il est facile de connaitre des informations sur vous (souvent via des variables php).
+ http://www.actulab.com/big-brother-vous-observe.php
+ http://www.adresseip.com/
+ http://abcdelasecurite.free.fr/[...]variables-informations-adresse-ip.php
+ http://www.monip.net/
+ http://www.dnsstuff.com/tools/aboutyou.ch
+

+
+ + +
+

Informatique

+

+ Le Site du zér0 : + De bons tutoriels pour apprendre plusieurs choses sur l"informatique. + + Sebsauvage.net : + Un excellent site sur l"informatique. L"auteur est un adepte de python, il y a plein de scripts intéressants. + + Comment Ca Marche : + Beaucoup d"explications sur l"informatique en général. + Tout le monde peut agrandir la base de connaissances et aider sur les forums, il suffit de s"y inscrire.
J"y participe régulièrement.
+ Sebsauvage a également archivé la Base de connaissance Comment Ca marche : + + Info-3000 : + Quelques astuces et explications utiles. + + WebArck : + Un site avec des tutoriels et explications pour les Webmasters débutants. + + Jesses Entraide : + Un site plein d"explications pour les débutants. + + Wikipédia - Catégorie informatique : + La rubrique Informatique de Wikipedia. Vous pouvez y contribuer sans vous inscrire. + + Aide-Informatique : + Comme le nom l"indique... + + Leregistre-fr : + Comprendre ce qu"est le registre et le modifier. + + Logiciel Libre : + Un site sur l"informatique, nottament les logiciels libres. + + FAQ Windows XP : + Une FAQ sur Windows XP. + Il existe également une FAQ + sur outlook express, et des astuces pour optimiser Windows. +

+
+ + +
+

Télécharger / Logiciels

+

Liste de sites

+

+ Liens utiles.org + Une liste de sites ou télécharger des fichiers et logiciels. + + Sites dédiés au téléchargement : + 01net.com
+ Gratilog
+ télécharger.Yacapa
+ Clubic.com
+ + Des forums dédiés aux logiciels gratuits : + Koreus.com
+ 3D Chips
+ Photoshopow
+ Presence-pc.com
+ + Des Sites de logiciels open-source et/ou gratuits : + Concise Freeware
+ LoLiWin
+ NirSoft/
+ Freeware Find
+ Framasoft
+ GNUWin
+ Je Suis Libre
+ Pricelessware
+

+

Logiciels

+

+ An App A Day : + Waow ! Cette personne fait un logiciel par jour. + + Microsoft Powertoys : + Plusieurs utilitaires pour Windows + + The OSSwin project : Open Source for Windows ! : + Une liste de projets (logiciels entre autres) open-source pour Windows. + + Safe XP : + Un programe similaire à TweakUI, qui permet de manipuler Windows. + + PortableApps : + Le site des logiciels portables. Plusieurs logiciels habituels (firefox, vlc, gimp...) + qui ne nécéssitent pas d"installation pour fonctionner et permettent d"être transportés sur clé USB +

+
+ + +
+

Site WEB / Programmation

+

Site WEB

+

Débuter

+

+ Tutoriel - le Site du zér0 : + Un tutoriel Ultra complet pour apprendre le xhtml et les CSS. + + Tutoriel PHP - Le Site du zér0 : + Le même site et la même chose, mais sur le PHP. + + Sebsauvage.net - Conseils HTML : + Les conseils de Sébastien Sauvage, ce qu"il faut éviter dans ses pages. + + StarYouDev : + Tutoriels sur les différents langages du WEB. +

+ +

Les standards, l"accessibilité

+

+ Open WEB : + Un site sur les standards du WEB. + + Pompage.net : + Des articles sur les standards du WEB. + + Alsacreations : + Plusieurs tutoriels sur les standards, l"accessibilité, etc... + + Building Standards Compliant WebSites : + Un site qui aide a respecter les standards du WEB. + + VisCheck : + Ce site permet de voir ce que verrait un daltonien en visitant un autre site : il change les couleurs. + Utile pour vérifier l"accessibilité de votre site. +

+ +

Outils et ressources

+

+ Guppy : + Guppy est un CMS libre. + Il vous permet de créér un site complet (zone membre, flux rss, etc...) sans rien connaitre au html ou php.
+ Il existe plusieurs autres CMS : + Wikipedia : Liste des CMS + + Editeur en ligne : + Génial. Cette page propose un éditeur xhtml/css/JS, avec des balises à portée de main, + des CSS spécial IE, et surtout un apercu en direct dans un pop-up. + + Dynamic Drive : + Plusieurs outils en ligne utiles. Création de gradients, optimisation d"images, etc... + + Web Site Optimization : + Plusieurs outils pour optimiser son site. + + Listible : + Des dizaines d"outils pour les Webmasters. + + CSS Formateur et Optimiseur : + Un excellent outil pour les CSS. Votre code CSS est compréssé au maximum. + + Smashing Magazine : + Une liste importante d"outils en tous genres. + + Aptant : + Un logiciel de dévelopement WEB intéressant. + + DEVPRO : + Plusieurs bouts de scripts/codes php, xhtml, css, etc... +

+ +

Les validateurs

+

+ The W3C Markup Validation Service + Le validateur xhtml, html, etc officiel. + + Validome : + Un excellent validateur xhtml, html, etc bien meilleur que l"officiel. C"est le plus strict que je connaisse. + + Validateur W3C Multipage pour une validation de site WEB : + Un validateur qui valide toutes les pages de votre site (maximum 300) à la fois. Il utilies le validateur du W3C. + + Le service de validation CSS du W3C : + Le validateur officiel du CSS. + + W3C Feed Validation Service : + Le validateur officiel de flux RSS ou Atom. + + W3C RDF Validation Service : + Le validateur officiel de fichiers RDF. + + Validateur d"accessibilité : + Pour vérifier le niveau d"accessibilité de vos pages. +

+ +

Autres

+

+ Kits-Gratuits : + Plusieurs logiciels pour réaliser un site en html-css. + + MDC : + La rubrique "dévellopeurs" de la société Mozilla. + + CSS examples : + Beaucoup d"exemples de l"utilisation possible des CSS. + + Tout JavaScript : + Des tutoriaux sur le JavaScript. + + Friendly Bit : + Plusieurs outils, ressources et articles intéressants et utiles (une liste complète des balises xhtml) + + Properties CSS 2.1 : + Une liste des propriétés CSS 2.1, leurs caractéristiques, leurs compatibilités, etc... + + CSS Play : + Plusieurs tests très poussés avec les CSS. + + clb56 - Tests en développement WEB : + Des tests intéressants avec php, javascript et CSS. + + Quelques autres sites intéressants : + http://www.uris-rhone-alpes.org/GestionSite/
+ http://richard.geneva-link.ch/
+ XHTML / CSS
+ WebSite Tips +

+ +

Programmation

+

+ Dévellopez.com : + Une bibliothèque de tutoriels sur les différents langages (du web, mais aussi de programmation). + + DelphiFR : + Des articles sur la programmation. + + Open Source Flash : + Un projet open-source par des dévelopeurs flash. +

+
+ + +
+

Multimedia

+

+ Media-Convert : + Un convertisseur de fichiers en ligne. Des dizaines de formats sont supportés. + + Zamzar - Free online Conversion : + Un autre convertisseur de fichiers. + + PeerTV + Plusieurs chaînes de télévision à regarder sur internet. +

+
+ +
+

Images - Dessin - Graphisme

+

Icônes/Mini-bannières

+

+ famfamfam.com : + Des centaines d"icones au format 16x16 + + Mini Pixels Icons : + Une autre librairie d"icônes 16x16. + + Sweetie | Free icon set : + Plus de 150 icones. + + Publicons.de : + Beaucoup de mini-bannières au format 80x15. + + Tiny icon factory : + Créez des icônes et ajoutez à la liste des milliers d"autres. + + Jpbardiau : + Un site excellent : de superbes images. + + mouse runner.com : + Le propriétaire de ce site crée et distribue gratuitement ses images. +

+ +

Plusieurs images,icônes et logos créés par des particuliers

+

+ CustomXP.net
+ Wincustomize
+ LinuxGraphic
+ Deviantart
+ Basehead
+ CrystalXP
+ IconAholic +

+ +

Outils

+

+ Colorjack : Color generator : + Une palette de couleurs sophitiquée. + + Easy RGB : + Plusieurs outils pour faire de la conversion de couleurs : hexadécimal vers RGB, etc... + + Buttonator : + Crééz rapidement des boutons, en choisissant la couleur, la taille, etc...
+ + Cool Text : + Idem + + Ajaxload : + Permet de créer de petites images animées. + + Custom Sign Generator : + Permet de générer des images. + + Brilliant Button Maker : + Permet de faire un bouton au format 80x15 pixels. +

+ +

Autres

+

+ ScratchPad : + Vous pouvez dessiner avec plusieurs personnes dans un cadre. + + Logos - Sylvain.sab : + La page logos de mon site. Vous y trouverez beaucoup d"images. + + [GUG] Tutorials : + Des tutoriels pour apprendre à utiliser The Gimp (le "clone" open source de Photoshop). +

+
+ + +
+

Recherche

+

+ BlackBox Search : + Ce site sert d"intermédiaire entre vous et les moteurs de recherche en les empêchant d"enregistrer vos requêtes. + + TurboScout : + Ce moteur de recherche utilise plusieurs autres moteurs existants (Yahoo, google, msn....), ce qui permet d"en changer rapidement. + + Google Image Ripper : + Lorsque vous trouvez une image qui vous interesse sur google, + vous devez cliquer sur plusieurs liens avant de pouvoir l"enregistrer (à cause des miniatures).
+ Ce site affiche les images en taille réelle pour que vous puissiez directement les enregistrer. + + Inquisitor - Instant search : + Ce moteur de recherche utilise google et affiche les résultats à chaque fois que vous changez une lettre. + + Google labs : + Plusieurs outils intéressants de google. + + Koders : + Un moteur de recherche... de code source ! (similaire à Google codesearch) + + Exalead : + Un moteur de recherche populaire. Une miniature de chaque page est affichée, c"est pratique. + + FullTorent.net : + Un moteur de recherche de fichiers torrent. + + Diggtorrents : + Un autre moteur de recherches de torrents. + + NAPALM FTP Indexer : + Permet de faire des recherches dans des serveurs FTP que des particulers mettent à disposition. + + Creative Commons search : + Recherche dans google, yahoo, etc et n"affiche que le contenu sous licence creative commons. + + VDoogle : + Recherche de vidéos. + + VideoRonk : + Encore un moteur de recherches de vidéos. + + Teardrop : + Un logiciel disponible pour MAC, Windows et Linux qui permet de rechercher des images, des fichiers, des pages WEB, etc... +

+
+ + +
+

Divers

+

Loisirs/Jeux/Humour/Divertissements

+

+ BashFR.org : + Les perles du chat. Excellent. + + LaBanane.org : + Même auteur que Bashfr, un site de blagues. J"aime bien. + + Perles de profs : + Un autre site sur le même modèle (design et organisation) bashfr. + + 20q.net : + Le logiciel qui devine en 20 questions ce à quoi vous pensez. + + Lemmings : + Quelqu"un a refait le jeu lemmings, entièrement en JavaScript ! + + Optical Illusions : + Des illusions d"optique. + + Animated Knotes : + Un site pour apprendre à faire toutes sortes de neuds. + + Origami + Un site sur les origamis (les pliages et montages en papier). + + OneMoreLevel + Des jeux flash. + + Angry Alien Production : + Des films célèbres résumés en trentes secondes avec des lapins. Marrant. + + beautifully : webdesign : + Un liste de sites flash. + + Charabia.net : + Un générateur de charabia en tout genre. Rigolo. + + L"Argoteur : + Change l"écriture des pages de diverses facons : javanais, inversé, etc.... C"est rigolo. + + Chat Creator : + Un site pour créér vous-même votre page de chat (temporaire). + Donnez un nom a votre page, puis indiquez l"url correspondante aux personnes auxquelles vous voulez parler. + + Skybeurk Awards : + Les "pires" skyblogs du net. Navrant. + + Wormux : + Une sorte de remake du jeu Worms, mais open-source. + + Dogmazic + Un site de musique libre. + + Jeux libres : + Une liste de jeux vidéos libres. +

+ +

Bureautique/Systèmes d"exploitation

+

+ FredCavazza : + Une suite bureautique en ligne. + + YouOS : + Ce site simule un système d"exploitation dans le navigateur !! + + VisiBone : + Une liste de plusieurs polices de caractères. + + Geocities.com - Acronymes : + Une liste d"acronymes utilisés. + + C"est quoi Windows ? : + Un "Linuxien" qui a essayé Windows, et qui raconte son experience. C"est assez parlant. +

+ +

Quelques services en ligne

+

+ Upload - MiHD : + Un service d"upload et de stockage de fichiers, pour les partager ensuite. + + MediaFire : + Un autre service de stockage. +

+ +

Autres

+

+ Test de connexion + + CSS Zengarden : + Une démonstration de la "puissance" du CSS. Choisissez un style, la page est transformé mais le html reste le même. + + Ultimate Boot CD : + Un des plus populaire CD bootables. Très utile pour dépanner votre ordinateur s"il ne peut plus s"alummer : + il y a dessus des antivirus, des logiciels de vérification des disques... etc + + Totalement Cretin(s) : + Il y a de tout sur Internet. Et parfois, c"est vraiment idiot. + + StopDRM ! : + Un site français contre les DRM et la loi DADVSI (qui est malheureusement passée...) + + Web Devout : + Un site qui explique plusieurs choses sur les navigateurs (notamment leur attitude face aux standards) + + Non aux Racketiciels : + La vente de logiciels avec un ordinateur (vente liée) est interdite : + normalement on ne devrait pas vendre Windows par défaut avec les ordinateurs que vous achetez. + + Le Conjugueur : + Donnez un verbe, et il est conjugué à tous les temps ! +

+
+ + + + blob - /dev/null blob + 18ebafdfb39910bed180277f325315c330b48ff3 (mode 644) --- /dev/null +++ logiciels/avast.php @@ -0,0 +1,20 @@ +'index','href'=>'./','title'=>'Index de la rubrique "Logiciels"'); +require'../autres/source-haut.php'?> +

Avast!Avast!

+

Avast est un excellent antivirus:

+
    +
  • Il est gratuit(dans cette version).
  • +
  • Il est simple à configurer et à utiliser.
  • +
  • Il y a des mises a jour régulières(important pour ce type de logiciel).
  • +
  • C'est l'un des antivirus le plus performant, apprécié et utilisé.
  • +
  • Il est en français.
  • +
+
+

Site officiel : http://www.avast.com/

+

+ Télécharger la version 4 de Avast! Home en français (gratuit) + Depuis le site officiel +

+ blob - /dev/null blob + 85beb54890dbdcecb64986c823969b68408c6ffb (mode 644) --- /dev/null +++ logiciels/ccleaner.php @@ -0,0 +1,24 @@ +'index','href'=>'./','title'=>'Index de la rubrique "Logiciels"'); +require'../autres/source-haut.php'?> +

Craps Cleaner

+

Le logiciels Craps Cleaner est très pratique :

+
    +
  • Il est gratuit.
  • +
  • Il permet plusieurs choses : effacer ses traces, les erreurs du registre(il peut y en avoir des milliers), + contrôler les programmes qui se lancent au démarrage, etc...
  • +
  • Il protège votre vie privée.
  • +
  • Il est en français.
  • +
  • Il est très léger (seulement 16 fichiers ou 1.33 Mo).
  • +
  • Il et mis à jour régulièrement.
  • +
  • Il est simple d'utilisation et vous pouvez automatiser le nettoyage de votre ordinateur + pour ne plus devoir vous en occuper.
  • +
+
+

Site officiel : http://www.ccleaner.com

+

Télécharger la version 1.34.407 :
+Depuis FileHippo
+Depuis mon site.

+

Voir également : Configurer Ccleaner

+ blob - /dev/null blob + 3925fea64c82096e96c1463c6248b2fcbfc7feb0 (mode 644) --- /dev/null +++ logiciels/dbpoweramp.php @@ -0,0 +1,12 @@ +'index','href'=>'./','title'=>'Index de la rubrique "Logiciels"'); +require'../autres/source-haut.php'?> +

dBPowerAMP Music Converter

+

Ce logiciel très pratique permet de convertir plusieurs fichiers audios ou vidéos dans plusieurs formats : mp3, wma, ogg, wave...
+ On peut également choisir la qualité de l'encodage, et la fréquence, ou convertir plusieurs pistes à la fois, + depuis n'importe quels fichiers.
+ De plus, le logiciel peut aller lui-même chercher les références du fichier sur internet.
C'est un logiciel gratuit.

+
+

Site officiel : http://dbpoweramp.com/

+ blob - /dev/null blob + a5ec7f0476ebe3337a5e4baa0bfa17215d6b2ec8 (mode 644) --- /dev/null +++ logiciels/firefox.php @@ -0,0 +1,142 @@ +'index','href'=>'./','title'=>'Index de la rubrique "Logiciels"'); +require'../autres/source-haut.php'?> + +

Firefox

+

Firefox est une très bonne alternative a un autre navigateur comme Internet Explorer :

+
  • Il est gratuit et open-source.
  • +
  • Il permet la navigation par onglets.
  • +
  • Il gère les flux RSS.
  • +
  • Vous pouvez lui associer des extensions, plugins, thèmes... pour améliorer votre confort de navigation.
  • +
  • Il est plus sécurisé (pas d'ActiveX).
  • +
  • Il est plus agréable à utiliser.
  • +
  • Il possède un filtre anti-pop-up (ces fenêtres agaçantes qui surgissent lorsque vous naviguez).
  • +
  • Lors de l'installation, vous pouvez importer tous vos favoris, historiques... Depuis IE ou un autre navigateur.
  • +
  • ... etc. Il y a tellement d'avantages que je ne peux pas tous les citer.
+
+

+Pour des raisons de sécurité, je vous recommande de laisser tomber Internet Explorer et d'utiliser Firefox.

+

Vous pourrez si vous le voulez continuer à utiliser Internet Explorer. Cela ne provoquera aucun "bug" dans votre + ordinateur et ne changera pas vos habitudes(l'interface, personnalisable grace aux extensions, reste pratiquement la même).

+
+

Sites officiels : http://www.mozilla-europe.org/fr/products/firefox/

+

Extensions, plugins, thèmes... : http://extensions.geckozone.org/Firefox/ et + https://addons.mozilla.org/firefox/

+

Télécharger la version 2.0 en français Depuis le site officiel

+
+

Extensions

+

J'utilise beaucoup d'extensions. Je vous en donne la liste ici :

+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
*/ +?> +
    +
  • FireFTP
    Un client FTP très pratique, + pas besoin d'en installer un autre comme ceci.
  • +
  • Get jetable mail
    + Pour obtenir une adresse jetable sur des sites si vous ne voulez pas donner votre adresse e-mail. + Vous pouvez choisir pendant combien de temps les e-mails qui arriveront à cette adresse vous seront renvoyés à votre + réelle adresse e-mail.
  • +
  • Sort extensions and themes
    Classe alphabétiquement + vos extensions, vos thèmes, vos plugins...
  • +
  • WebDeveloper
    + Une extension vraiment très pratique et utile, pour les Webmasters comme tout le monde :
    + Pour les webmasters : +
      +
    • Outils pour valider le code css, html, rss, les liens... d'une page.
    • +
    • Vous pouvez voir en quelques clics plusieurs informations sur divers éléments : + blocs, paragraphes, liens, balises...
    • +
    • Autres outils pour voir les caractéristiques et la construction d'une page web : tableau, liens, frames...
    • +
    • etc...
    • +
    + Pour tout le monde : +
      +
    • Option pour voir le code source d'une page.
    • +
    • Reconstruisez à volonté le code html ou css : + utile pour changer le design a votre gout par exemple.
    • +
    • Plusieurs options pour les images.
    • +
    • Un bouton pour effacer ses traces.
    • +
    • Permet de changer le code PHP.
    • +
    • Permet de bloquer les cookies, le cache, les javascripts...
    • +
    • etc...
    • +
    +
  • + +
  • Adblock Plus
    + Bloque énormément de publicités, quel que soit leur format (Bannières, Flash, JavaScript, Pop-Ups...). + Vraiment très efficace
  • +
  • FilterSet G Updater
    + Télécharge et installe automatiquement les nouvelles listes de publicités a bloquer pour AdBlock
  • +
  • Download Statusbar
    + Remplace le fenêtre de téléchargement par des barre de progression en bas de la fenêtre de Firefox. + Ainsi vous n'avez qu'une fenêtre et vous pouvez voir la progression de chaque téléchargement
  • +
  • BugMeNot
    + Permet d'utiliser les mots de passe du site http://www.bugmenot.com. + Ce site repertorie plusieurs mots de passe de sites ou l'inscription est obligatoire. + Vous pouvez ainsi vous connecter à certains sites sans vous inscrire.
  • +
  • Html Validator
    + Vérifie le code Html de chaque page avec le logiciel Tidy. Peut corriger le code s'il n'est pas valide. + Vous évite ainsi de passer par le W3C et permet de valider plus rapidement les pages.
  • +
  • Mass Installer
    + Permet d'installer plusieurs extensions en une seule fois
  • +
  • Sage
    + Un lecteur de Flux RSS. Il vous permet de gérer plusieurs flux RSS a la fois, affiche chaque flux rss lisiblement, etc... + C'est une très bonne extension.
  • +
  • Pearl Crescent Page Saver Basic
    + Permet de faire une capture au format png d'image d'une page Web, + quelle que soient ses dimensions. Beaucoup plus pratique que de faire "enregistrer sous"
  • +
+
+

Opera

+

Opera est un autre très bon navigateur, performant, rapide et gratuit.
+ Il possède un lecteur de flux RSS, la navigation par onglets...
+ Vous pouvez utiliser plusieurs outils pour changer le style, ou afficher certaines options.
+ Par exemple, il y a un mode "accessibilité" ou encore une fonction qui permet d'afficher la structure de la page + (balises html, fichiers attachés...).
+ C'est un bon navigateur, mais aussi un outil pratique pour Webmaster.
+ D'ailleurs il est plus respectueux des standards que Firefox.

+

Site officiel : http://www.opera.com/

+

Télécharger directement depuis le site officiel : + http://www.opera.com/download/get.pl?id=28418

+
+

Lynx

+

Lynx est un navigateur en mode texte : pas d'images, pas de CSS, pas de JavaScript...
+ Evidemment il est très restreint, mais c'est la sécurité absolue + (à chaque fois qu'un cookie est crée il vous demande si vous l'acceptez). +
Vous ne pouvez pas non plus utiliser la souris, la navigation se fait au clavier +
Je ne l'utilise pas comme navigateur, mais plutôt pour tester mon site.

+

Site officiel : http://lynx.isc.org/

+

Télécharger Lynx pour Windows + Depuis mon site
+ Pour Linux : voir la page du site officel : + http://lynx.isc.org/current/index.html +

+

+ Quelques liens sur Lynx à voir :
+ Les options dans Lynx : + http://jp.barralis.com/linux-man/man1/lynx.1.php +
Les commandes usuelles : + http://dominique.guebey.club.fr/tekno/lynx/lynx_com.htm +
Lynx sur Wikipedia : + http://fr.wikipedia.org/wiki/Lynx_(navigateur) +

+ blob - /dev/null blob + 0f5b29e4e8d0afca3b86efef1f7c0051dbe66900 (mode 644) --- /dev/null +++ logiciels/iconedit.php @@ -0,0 +1,18 @@ +'index','href'=>'./','title'=>'Index de la rubrique "Logiciels"'); +require'../autres/source-haut.php'?> +

Icon edit 32

+

+ IconEdit32 est un éditeur et créateur d'icones. Vous pouvez créér des icones pour + personaliser votre ordinateur, ou des favicones pour vos sites WEB.
+ C'est d'ailleurs avec ce logiciel que j'ai créé la favicon de ce site. +

+

Vous pouvez créér des icones au format 48x48, 32x32, ou 16x16, en 256, 16 couleurs ou noir et blanc.

+
+

L'accès au fichier est maintenant payant, mais son utilisation est gratuite.

+

Vous pouvez le télécharger légalement et gratuitement depuis mon site + ou à l'adresse + http://www.onlythebestfreeware.com/program.asp?program_id=135. +

+ blob - /dev/null blob + 61cf9c3660273a4617173c9f7c7368538d67a681 (mode 644) --- /dev/null +++ logiciels/iconsushi.php @@ -0,0 +1,14 @@ +'index','href'=>'./','title'=>'Index de la rubrique "Logiciels"'); +require'../autres/source-haut.php'?> +

@@icon Sushi

+

@icon sushi est un logiciel qui vous permet d'extraire des icônes : L'icône d'un programme vous plait ?
+ Utilisez @icon sushi pour extraire l'image d'une dll ou d'un .exe, ou encore d'une image déjà existante.
+ Vous pouvez ensuite éditer l'image, ou l'enregistrer au format ico/bmp/png.
+ Le fichier C:\Windows\system32\shell32.dll contient énormément d'icones. Vous pouvez les extraire avec ce logiciel.

+
+

Site officiel : http://www.towofu.net/soft/e-aicon.php
+ Télécharger la version 1.20 + Depuis le site officiel

+ blob - /dev/null blob + 09ba77ec1e5b9dbb5c4b822ec76aa402044455d7 (mode 644) --- /dev/null +++ logiciels/index.php @@ -0,0 +1,115 @@ +'; +require'../autres/source-haut.php'?> +

Logiciels

+
+

+ Voici plusieurs logiciels pour la plupart gratuits, que je vous recommande.
+ Ils fonctionnent tous sous Windows, et beaucoup existent également pour Linux ou MAC.
+ Attention cependant, les versions des logiciels que je + propose en téléchargement sont pour Windows. Si vous voulez + les versions d'un autre OS, il faudra vous rendre sur le site + officiel.

+

Quels logiciels voulez-vous voir ?
+ || Internet|| Sécurité|| Utilitaires|| Multimédia|| Site / Programmation|| Graphisme / Dessin||

+

Vous pouvez également voir une page regroupant tous les fichiers a télécharger

+ + +

Internet

+ +
Firefox / Opera / Lynx
+

Un navigateur puissant et sécurisé.

+
+ +
Thunderbird
+

Un courrielleur efficace.

+
+ +
Star Downloader
+

Un bon gestionnaire de téléchargements.

+
+ + + +

Sécurité

+ +
Avast
+

Un excellent antivirus.

+
+ +
Spybot - Search and Destroy / Ad - Aware
+

De bons anti-spywares.

+
+ +
Zone Alarm
+

Un mur de feu gratuit, simple et efficace.

+
+ + + +

Utilitaires

+ +
Craps Cleaner
+

Faire le ménage sur le disque dur.

+
+ +
Pagedefrag
+

Un logiciel gratuit et efficace.

+
+ + + +

Multimédia

+ +
Winamp / VLC Media Player
+

Lire tous les fichiers audios et vidéos.

+ +
dBPowerAMP Music Converter
+

Convertir des fichiers multimédia.

+ + + +

Site / Programmation

+ + +

Site

+ +
Nvu
+

Un bon éditeur xhtml/css.

+ +
Xenu's Link Sleuth
+

Vérifiez rapidement tous les liens de votre site.

+
+ +
TidyGUI
+

Votre code est-il valide ?

+
+ + +

Programmation

+ +
PSPad Editor
+

Un excellent éditeur multi-codes (java/python/c++/perl/php/html/css/JavaScript/etc....).

+
+ + + +

Graphisme / Dessin

+ + +

Icones

+ +
IconEdit32
+

Créez vos icônes.

+
+ +
@iconSushi
+

Pour extraire des images de vos logiciels.

+
+ +

Utilitaires

+
Shoot2png
+

Faire des captures d'écran rapidement

+
+ blob - /dev/null blob + 166372a44a830ecbfadd4374776cd219a426ff52 (mode 644) --- /dev/null +++ logiciels/nvu.php @@ -0,0 +1,42 @@ +'index','href'=>'./','title'=>'Index de la rubrique "Logiciels"'); +require'../autres/source-haut.php'?> +

Nvu

+

Nvu est un bon éditeur  + WYSIWYG :

+
  • Vous pouvez travailler au niveau du code html ou en mode normal + (WYSIWYG).
  • +
  • Une fonction est incorporée pour valider directement vos fichiers html avec le validateur du W3C.
  • +
  • Il respecte les standards (contrairement à Frontpage et autres(Word ou Publisher qui ne sont même pas conçus pour la + réalisation de pages WEB!)).
  • +
  • Il possède un Client FTP pour publier vos pages et vos fichiers.
  • +
  • Il possède également un gestionnaire de sites pour Gérer plusieurs sites plus simplement.
  • +
  • En lui ajoutant des extensions, vous pouvez : +
      +
    • Vérifier le code html avec TidyGUI depuis le menu.
    • +
    • Editer les regles CSS à la main.
    • +
    • Utiliser un correcteur et nettoyeur de code html en quelques clics.
+
+

Site officiel : + http://frenchmozilla.sourceforge.net/nvu/

+

Télécharger Nvu + Depuis le site officiel

+
+
Extensions :
+
HandCoder
+
Pour ouvrir l'éditeur de son choix depuis Nvu et éditer les pages html, + mais aussi et surtout pour vérifier en quelques clics le code html avec Tidy.
+
Html Header
+
Permet de visualiser les balises contenues dans l'élément head et de les éditer + avec une interfacegraphique (sans passer par le code source).
+
KaZcadeS
+
Un éditeur CSS qui corrige les bugs de l'ancien éditeur par défaut de Nvu + (CasCadeS) et qui permet d'éditer le code (mode expert).
+
Nsm Extender
+
Ajoute des fonctions au gestionnaire de sites.
+
Nvu Tutorial
+
Un tutoriel pour apprendre à utiliser Nvu et faire des pages respectueuses des standards.
+
Url Cleaner
+
Transforme les liens absolus en liens relatifs, et autres.
+ blob - /dev/null blob + 7f24cc52986188b0f57abf87e88301737aaab4a8 (mode 644) --- /dev/null +++ logiciels/pagedefrag.php @@ -0,0 +1,19 @@ +'index','href'=>'./','title'=>'Index de la rubrique "Logiciels"'); +require'../autres/source-haut.php'?> +

Page DefragPagedefrag

+

Ce logiciel est un très bon utilitaire pour défragmenter les fichiers systèmes :

+
  • Il peut défragmenter le fichier d'échange (pagefile.sys).
  • +
  • Il est très léger (3 fichiers sur votre ordinateur ou 132 Ko).
  • +
  • Il défragmente également la base de registres.
+
+ +

Télécharger : Depuis mon site
+ Depuis le site officiel

+ + blob - /dev/null blob + 7cd98f4c956a7abe0b859545ef6e38c5b9788924 (mode 644) --- /dev/null +++ logiciels/pspad.php @@ -0,0 +1,20 @@ +'index','href'=>'./','title'=>'Index de la rubrique "Logiciels"'); +require'../autres/source-haut.php'?> +

PSPadPSPad

+

Pspad est un éditeur multi-codes très complet :

+
  • Il gère les langages Html, CSS, Java, Javascript, PHP, C++, C#, C, Python, Perl et beaucoup d'autres.
  • +
  • La coloration syntaxique (colorer le code pour mieux s'y retrouver) est disponible et activée par défaut.
  • +
  • Vous pouvez en quelques clics dans le menu vérifier le code de vos pages html avec tidy.
  • +
  • Un client FTP + est integré pour publier facilement vos fichiers.
  • +
  • Vous pouvez voir directement le rendu de vos pages dans le logiciel
  • +
  • Vous pouvez valider vos fichiers html, CSS ou RSS depuisle logiciel.
  • +
  • Il peut reformater le code html pour le rendre moins lourd.
+

C'est vraiment l'éditeur à tout faire et qu'il faut avoir.

+
+

Site officiel : http://www.pspad.com/fr/

+

Télécharger : Depuis mon site (version 4.5.1)
+ Depuis le site officiel

+ blob - /dev/null blob + b9beab6b10e519e4f1761baf5f9f9d4d890538b2 (mode 644) --- /dev/null +++ logiciels/shoot2png.php @@ -0,0 +1,17 @@ +'index','href'=>'./','title'=>'Index de la rubrique "Logiciels"'); +require'../autres/source-haut.php'?> +

+Shoot2png

+

Shoot2png est un bon freeware (logiciel gratuit) qui vous permet de prendre des captures d'écran au format png, gif ou jpg.
+ Il permet de capturer tout l'écran, seulement la fenêtre ouverte ou une sélection.
+ Vous pouvez également redimmensionner l'image, ou avoir un aperçu dans votre logiciel de graphisme/dessin par défaut, + et il a plusieurs autres fonctionnalités.

+

De plus, il ne prend qu'un fichier et ne nécéssite aucune installation ni fichier supplémentaire, et ne laisse pas de trace + sur le disque dur.
(pour le "désinstaller", il suffir d'effacer le fichier).

+
+

Site officiel : http://www.scaranet.net/

+

Télécharger : Depuis mon site (version 1.0.1.0) + Depuis le site officiel (Dernière version)

+ blob - /dev/null blob + 5cbafb02814c8f88ab3bc872f4597a3727159198 (mode 644) --- /dev/null +++ logiciels/spybot.php @@ -0,0 +1,37 @@ +'index','href'=>'./','title'=>'Index de la rubrique "Logiciels"'); +require'../autres/source-haut.php'?> +

Spybot - Search and destroy

+

Je vous recommande Spybot Search and Destroy :

+
    +
  • Il trouve la plupart des logiciels malveillants et indésirables.
  • +
  • Il est gratuit et open-source.
  • +
  • Il est pratique et en français.
  • +
  • Il est régulièrement mis à jour (important pour ce type de logiciel).
  • +
  • Il met à disposition beaucoup d'options utiles.
+
+

+ Vous pouvez faire un don aux benevoles qui developpent spybot.

+

Site officiel : + http://www.safer-networking.org/fr/

+

Télécharger la version 1.4 : Depuis le site officiel + (choisissez un site miroir) ; ou Depuis mon site

+

Autres téléchargements pour Spybot : + http://www.safer-networking.org/fr/download/ +

+
+

Ad-awareAd-aware

+

Ad-Aware est un autre bon anti-spyware complémentaire à spybot :

+
  • Il analyse la base de registre.
  • +
  • Il est performant.
  • +
  • Il est gratuit.
  • +
  • Il est régulièrement mis à jour.
+
+

Site officiel : http://www.lavasoft.de/

+

Télécharger Ad-Aware : Depuis download.com

+

Télécharger la traduction en français : + Depuis le site officiel ou + Depuis mon site

+

Tous les téléchargements pour Ad-Aware

+ blob - /dev/null blob + 47efb1c66fcf44048717ad839437bfb93c0177e4 (mode 644) --- /dev/null +++ logiciels/stardown.php @@ -0,0 +1,22 @@ +'index','href'=>'./','title'=>'Index de la rubrique "Logiciels"'); +require'../autres/source-haut.php'?> +

Star DownloaderStar downloader

+

Star downloader est un bon gestionnaire de téléchargements :

+
    +
  • Vous pouvez télécharger plusieurs fichiers en même temps
  • +
  • Si un téléchargement est trop long, + vous pouvez le mettre en pause pour arrêter votre ordinateur et le reprendre plus tard.
  • +
  • Il peut "découper" les fichiers que vous télécharger en plusieurs fichiers + pour les télécharger rapidement.
  • +
  • Il est en français.
  • +
  • Vous pouvez planifier un téléchargement, + lui demander d'arrêter l'ordinateur après un téléchargement terminé.
  • +
  • Vous pouvez lui demander d'analyser automatiquement le fichier avec votre logiciel antivirus + lorsque le téléchargement est terminé.
  • +
  • Même en cas d'erreur (serveur saturé par exemple), + vous pouvez reprendre le téléchargement sans perte de données.
+
+

Site officiel : http://www.stardownloader.com/

+ blob - /dev/null blob + eae42ccceaee2f4f61ba9c1181604801ca73f041 (mode 644) --- /dev/null +++ logiciels/thunderbird.php @@ -0,0 +1,30 @@ +'index','href'=>'./','title'=>'Index de la rubrique "Logiciels"'); +require'../autres/source-haut.php'?> +

TBThunderbird

+

Thunderbird est un très bon logiciel de messagerie :

+
    +
  • Il est gratuit et open-source.
  • +
  • Il peut gérer les flux RSS.
  • +
  • Vous pouvez lui associer des extensions, plugins, themes...
  • +
  • Il est plus agréable et plus pratique à utiliser.
  • +
  • Il possède un filtre anti-spam TRES efficace : vous pouvez définir vos propres règles + selon le contenu, l'expéditeur, le sujet.... etc. Il filtre et détecte une grande partie des spams.
  • +
  • Il possède également un filtre anti-phishing. + (ces faux e-mails qui semblent provenir des banques, mais sont en réalité des escroqueries)
  • +
  • Il peut gérer plusieurs comptes et les importer de vos anciens logiciels de messagerie.
  • +
  • En installant deux extensions, vous pouvez relever les messages de vos comptes Webmail (hotmail, yahoo, aol, lycos....) + directement dans ce logiciel.
+
+

Site officiel
+ Extensions, plugins... : Geckozone ou + Mozilla

+

Télécharger la version 1.5.0.8 + Depuis le site officiel

+

Avec Thunderbird, lorsque vous écrivez un message, il est possible de corriger l'orthographe. + Mais le dictionnaire en Français n'est pas inclus par défaut dans Thunderbird.
+ Vous pouvez le télécharger depuis mon site. + (Il s'installe de la même façon qu'une extension)

+

Voir également “ Configurer Thunderbird ”

+ blob - /dev/null blob + 245af800f60dd127eabeefae088f343be0c5954c (mode 644) --- /dev/null +++ logiciels/tidy.php @@ -0,0 +1,29 @@ +'index','href'=>'./','title'=>'Index de la rubrique "Logiciels"'); +require'../autres/source-haut.php'?> +

TidyGUI

+

Ce logiciel très pratique vous permet de verifier si il n'y a pas d'erreurs dans vos pages html :

+
  • Il vous les indique et les répare si possible, + et vous dit celles qu'il n'a pas pu réparer pour que vous le fassiez vous-même.
  • +
  • Il rend votre code plus lisible pour que vos pages s'affichent le mieux possible.
  • +
  • Avec certains éditeurs, ce logiciel est vraiment utile, vu le code qu'ils génèrent.
  • +
  • Il est gratuit et open-source.
  • +
  • il ne prend presque pas de place sur votre ordinateur : Téléchargez le fichier (312 Ko seulement), + et c'est bon, vous n'avez rien à installer, vous pouvez l'utiliser.
+
+

Sites : officiel ;
Autres : + http://perso.orange.fr/ablavier/TidyGUI/     + http://www.w3.org/People/Raggett/tidy/

+

Télécharger Depuis mon site ou + Depuis un autre site

+
Notes : +

+ Attention, ce logiciel ne remplace pas la validation du W3C : + Il repère des erreurs non détectées par le validateur W3C et inversement.
+ Il reste donc important de valider vos pages avec + le validateur W3C

+

Il existe également une extension pour Firefox qui intègre Tidy directement dans le navigateur + et vérifie automatiquement les pages : + https://addons.mozilla.org/firefox/249/

+ blob - /dev/null blob + 41b3089cf2220f54d07054a23f4d9476b04de810 (mode 644) --- /dev/null +++ logiciels/winamp.php @@ -0,0 +1,72 @@ +'index','href'=>'./','title'=>'Index de la rubrique "Logiciels"'); +$head['access'][1]=array('rel'=>'next','href'=>'./winampnotice.php','title'=>'Comment utiliser Winamp'); +$head['css'][0]['filename']='logwinamp'; +require'../autres/source-haut.php'?> +

Winamp / VLC Media Player
+

+

Ces deux logiciels sont des lecteurs performants :

+

Winamp

+
    +
  • Il peut encoder(enregistrer) en beacoup plus de formats qui sont plus compacts et prennent moins de place.
  • +
  • Il gère(et peutcréer!) les listes en m3u, ainsi que les vidéos.
  • +
  • Il existe des plugins,extensions etskins qui permettent de changer son apparence et de lui ajouter des fonctions.
  • +
  • Vous pouvez écouter des centaines de radios sur internet.
  • +
  • Il existe un skin qui luidonne l'apparence de Windows Media Player.
  • +
  • .....etc
  • +
+

VLC Media Player

+
    +
  • Il lit absolument TOUS les formats audio et vidéos, sans que vous n'ayez rien à installer.
  • +
  • Il est gratuit et open-source.
  • +
  • Il à une interfacetrès légère, idéale pour les systèmes lents, ou si + vous ouvrez beaucoup de programmes en même temps.
  • +
  • Il gère les listes.
  • +
  • ....etc
  • +
+
+ + + + + + + + + + + + + + + + + +
#WinampVLC Media Player
AvantagesIl peutgérer une bibliothèque de fichiers audio et vidéos.

+ Il peut encoder/décoder(enregistrer/lire) une multitude de formats.

+ Il est gratuit.
Il lit tout, absolument tout.

+ Il peut gérer des listes.

+ Il est gratuit, open-source et en français.
InconvénientsIl consomme beaucoup de ressources (mais moins que Windows Media Player).

+ Il a été repris par AOL.
Il ne peut pas gérer de bibliothèque.
SitesSite officiel : + http://www.winamp.com

+ Très bon site sur Winamp (non-officiel) : + http://www.winampfr.com/
Site officiel : http://www.videolan.org/
TéléchargerA lire avant de télécharger Winamp + + + + + + + + + + + + + +
FichierDepuis mon siteDepuis le site officiel
Winamp 5.24winamp524.exe[Redirection]
Traduction et dllTraduction + Dll[Redirection] + dll
Skin Windows Media Playerwmp10.wal[Redirection]
Codec Oggogg11.exe[Redirection]
Télécharger VLC (version 0.8.5.0) : + Depuis le site officiel (choisissez un site miroir)
+ blob - /dev/null blob + 7797717b0b35b7cd97f11ffcd851718abc5949eb (mode 644) --- /dev/null +++ logiciels/winampnotice.php @@ -0,0 +1,38 @@ +'index','href'=>'./','title'=>'Index de la rubrique "Logiciels"'); +$head['access'][1]=array('rel'=>'prev','href'=>'./winamp.php','title'=>'Revenir à "Winamp / VLC" dans la rubrique des logiciels'); +$head=''; +require'../autres/source-haut.php'?> +

Il y a eu une erreur dans le patch de traduction en français : les périphériques externes + (lecteurs cd, mp3..) n'étaient plus reconnus!

+

Ce problème est maintenant réglé, il faut télécharger le fichier + telecharger/ml_disc.dll si vous voulez utiliser le patch de traduction.

+

L'installation de Winamp se résume donc à : + Téléchargez Winamp (telecharger/winamp524.exe) + et les skins/extensions/patchs/plugins que vous voulez (dont la traduction en français par exemple).

+

Installer Winamp, puis les extensions que vous avez téléchargé(dont la traduction par exemple).

+

Si vous avez téléchargé la traduction en français, téléchargez le fichier + telecharger/ml_disc.dll et copiez le dans le dossier plugins + du répertoire d'installation de winamp (par défaut C:\Program Files\Winamp\Plugins). + Une fenêtre s'ouvre vous demandant si vous êtes surs de vouloir remplacer l'ancien fichier, dites oui.

+

C'est bon, vous pouvez utiliser Winamp normalement.

+

Retour au logiciel

+
+ + + + + + + + + + + + + +
Télécharger les fichiers
FichierDepuis mon siteDepuis le site officiel
Winamp 5.24telecharger/winamp524.exe[Redirection]
Traduction et dllTraduction + Dll[Redirection] + dll
Skin Windows Media Playertelecharger/wmp10.wal[Redirection]
Codec Oggtelecharger/ogg11.exe[Redirection]
+ blob - /dev/null blob + 8382e47624793ff83c16efe2f8c93f04f28f95fb (mode 644) --- /dev/null +++ logiciels/xenu.php @@ -0,0 +1,13 @@ +'index','href'=>'./','title'=>'Index de la rubrique "Logiciels"'); +$titre='Xenu\'s Link Sleuth'; +require'../autres/source-haut.php'?> +

XenuXenu's Link Sleuth

+

Ce freeware très pratique vérifie tous liens d'un site ou d'un fichier local : les pages, les images, les CSS...

+

Vous pouvez repérer très vite les liens morts sur votre site et les rectifier.

+

Il vous permet également de définir des règles pour vérifier ou pas certains fichiers et urls.

+ +

Site officiel : http://home.snafu.de/tilman/xenulink.html

+

Télécharger depuis mon site : telecharger/xenu.zip
+Télécharger depuis le site officiel : http://home.snafu.de/tilman/XENU.ZIP

+ blob - /dev/null blob + 3965d5b6e7639e62c47c7f435bab62ff0d6f8364 (mode 644) --- /dev/null +++ logiciels/zonealarm.php @@ -0,0 +1,19 @@ +'index','href'=>'./','title'=>'Index de la rubrique "Logiciels"'); +require'../autres/source-haut.php'?> +

Zone AlarmZone Alarm

+

Je vous recommande VIVEMENT Zone Alarm en remplacement de Microsoft Firewall :

+
    +
  • Il gère les connexions entrantes ET sortantes contrairement au firewall de Microsoft.
  • +
  • Il peut définir des règles (autorisations/interdictions) précises pour chaque logiciel.
  • +
  • Il possède une option pour bloquer tout le trafic en deux clics : utiles en cas de problème.
  • +
  • Il surveille vos e-mails pour voir s'ils ne contiennent + pas de virus ou de liens vers des sites de phishing (arnaque).
  • +
  • Vous pouvez le configurer dans les moindres détails.
  • +
  • Il est gratuit
  • +
+
+

Site officiel : http://www.zonelabs.com/

+

Voir également : Configurer Zone Alarm

+ blob - /dev/null blob + 9f1bdc11c02aea4f432196bcf04227040bdf9739 (mode 644) --- /dev/null +++ logos/index.php @@ -0,0 +1,354 @@ +'; +$titre='Logos'; +require'../autres/source-haut.php'?> +

Logos

+
+

vous trouverez beaucoup de logos de logiciels et autres, trouvés sur internet. Je donne également des liens vers des sites d'images, d'icones et de graphisme. +
+ Attention, ces images ne sont pas de moi. Je n'ai aucun droit dessus, elles appartiennent a leurs auteurs respectifs. +
Beaucoup d'images proviennent des sites indiqués +

+

Cette page contient beaucoup d'images, il est possible qu'elles ne s'affichent pas toutes au premier chargement. +
Pour régler ce problème vous pouvez + RECHARGER LA PAGE. +

+ +
+

Logos

+

Firefox

+

Boutons

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

'Crystalisé'

+
+ + + + + + + + + + + + + + + + + + +
+ + + + + + +
+

'Dessin'

+
+ + + + + + + +
+

Normal / Autres

+
+ + + + + + + + + + +
+ + + +
+
+ + +
+ + + + + + + + + + + + + + + + + +
+ + +
+ +

Thunderbird

+

Boutons

+
+ + + + + + + + +
+

"Crystalisé"

+
+ + + + + + + + + + + + + + +
+

Dessin

+
+ + + + +
+

Oiseaux

+
+ + + + +
+ + +
+ + +
+

Autres

+
+ + +
+ + + +
+ +
+ + + +
+
+ + +
+
+ + +
+ + +
+
+ +
+ +

Nvu

+
+ + +
+ + +
+ + +
+ +
+ +
+

Mozilla

+
+ + + + + + +
+ + + + + +
+ + + +
+ + +
+
+ +
+
+ + + +

+ +
+ + +
+
+ +
+
+ + +
+
+ + + +
+ +

Autres

+
+ + +
+
+ +
+
+ +
+
+ + +
+
+ +
+

Zone Alarm

+
+ + + +
+ + + +
+ + +
+ + +
+
+

Plus d'images et de logos :
+http://sylvain.sab.free.fr/liens.php#images +

+ blob - /dev/null blob + e04db9f7985b73aab21916245350da8b8a220575 (mode 644) --- /dev/null +++ mail/bonjour.php @@ -0,0 +1,8 @@ + blob - /dev/null blob + 1fddd1f025463f06f841a41dada736c72d958f7e (mode 644) --- /dev/null +++ mail/index.php @@ -0,0 +1,154 @@ +'."\n\t".''; +$titre='Me contacter'; +require'../autres/source-haut.php'?> +

Contact

+

Je ne répondrais pas aux demandes d'aide pour problèmes informatiques en tout genres, je n'ai pas le temps. + Il y a déjà plusieurs forums sur internet faits pour ça.

+ +

'; +$Envoi="\n".'

+

'; +$checkeddefaut='checked="checked" '; +$checkedbug=''; +$checkedccm=''; +if(isset($_POST['objet'])) +{ + $objet=htmlentities($_POST['objet']); + if($objet=='bug') + {$objet='[BUG]';$checkedbug='checked="checked" ';} + elseif($objet=='ccm') + {$objet='[CCM]';$checkedccm='checked="checked" ';} + else + {$objet='Discussion';$checkeddefaut='checked="checked" ';} +} +$objetecho=' +

Quel est l\'objet de votre message ?
+ + + +

'; +if (isset($_POST['message'])) + { + // La variable $verif va nous permettre de vérifier si la sémantique de l'email est bonne + $verif='#^[\w.-]+@[\w.-]+\.[a-z]{2,6}$#'; + + // On assigne et/ou protège nos variables + $votremail=stripslashes(htmlentities($_POST['votremail'])); + $message=stripslashes(htmlspecialchars($_POST['message'],ENT_NOQUOTES)); + $envoi=isset($_POST['envoi']); + $previsualiser=isset($_POST['previsualiser']); + $votremail=trim($votremail); + $message=trim($message); + $apercu_resultat='

Aperçu du résultat :

'; + + + /*On vérifie si l'e mail et le message sont pleins, et on agit en fonction. + (on affiche Apercu du resultat, tel ou tel champ est vide, etc...*/ + //Si ca ne vas pas (mal rempli, mail non valide...) + if ((empty($message))or(!preg_match($verif,$votremail))) + { + if (empty($votremail)and(empty($message))) + { + echo '

Tous les champs sont vides.

'; + $message=''; + $votremail=''; + $apercu_resultat=''; + } + else + { + if (empty($votremail)) + { + echo '

Vous n\'avez pas donné votre adresse e-mail.

'; + $votremail=''; + } + elseif (!preg_match($verif,$votremail)) + echo '

Votre adresse e-mail n\'est pas valide.

'; + if (empty($message)) + { + echo '

Votre message est vide.

'; + $apercu_resultat=''; + $message=''; + } + } + } + //Si les deux sont pleins et que l'adresse est valide, on envoie on on prévisualise sans envoi + else + { + $domaine=preg_replace('#[^@]+@(.+)#','$1',$votremail); + $DomaineMailExiste=checkdnsrr($domaine,'MX'); + if (preg_match('#^(sylvain\.sab(oua@laposte\.net|@free\.fr)|ssylvainsab@free\.fr)$#',$votremail)) + echo '

Merci de ne pas entrer l\'adresse du Webmaster !

'; + elseif(!$DomaineMailExiste) + echo'

Le nom de domaine ('.$domaine.') de l\'adresse e-mail ('.$votremail.') que vous avez donné n\'existe pas.

'; + elseif($previsualiser) + { + $apercu_resultat='

Votre message et votre adresse e-mail sont valides et prêts à être envoyés. +
Vous n\'avez plus qu\'à cliquer sur le bouton "Envoyer".
Prévisualisation :

'; + $Previsualiser=''; + } + elseif($envoi) + { + require'bonjour.php'; + if(!function_exists('htmlspecialchars_decode')) + { + function htmlspecialchars_decode($texte) + { + return str_replace( + array('&','<','>',''','"'), + array('&','<','>','\'','"'), + $texte); + } + } + $objet='[SITE] : '.$objet; + $headers='From:'.$votremail."\r\n".'To:'.$mail."\r\n".'Subject:'.$objet."\r\n".'Content-type:text/plain;charset=iso-8859-1'."\r\n".'Sent:'.date('l, F d, Y H:i'); + if(@mail($mail,htmlspecialchars_decode($objet),htmlspecialchars_decode($message),$headers)) + { + echo '

Votre message a bien été envoyé. Merci.

Retour à la page d\'accueil

'; + require'../autres/source-bas.php'; + exit; + } + echo'

Un problème est survenu durant l\'envoi du mail.

'; + } + else + echo'

Une condition innatendue est survenue lors du traitement des informations.

'; + } +echo $apercu_resultat; + } +else + { + echo '

Vous pouvez me contacter à l\'adresse suivante :
+ L\'adresse e-mail est une image. Vous pouvez utiliser le formulaire de contact. +

+

Ou avec ce formulaire :

'; + $votremail='';$message=''; + } +$bas_formulaire=$Previsualiser.$Envoi; +?> +
+ + +

+ +

+ + +
+
+
--
+Sylvain

+http://sylvain.sab.free.fr/
+ \ No newline at end of file blob - /dev/null blob + 91c7f18d4656bb7d3054a80c133cac644427f47f (mode 644) Binary files /dev/null and mail/mail.gif differ blob - /dev/null blob + 08f9ff99c35cc3f01274816cd6e88cdbe73241f5 (mode 644) Binary files /dev/null and mail/mail2.gif differ blob - /dev/null blob + 2783cccb8fc221257cdfeb33facd4c95665e8f45 (mode 644) --- /dev/null +++ news.php @@ -0,0 +1,282 @@ + +

News

+
+

+ + Flux RSS + Voir les news par Flux RSS : rss/

+
+ + + + + + + + + + + + + + + +
Voir les news de :
AnnéeMois
2006JuinJuilletAoûtSeptembreOctobreNovembreDécembre
2007JanvierFévrierAoût
+
+ +

Dimanche 9 septembre 2007

+

Après plus de six mois d'absence, pour diverses raisons, j'ai enfin mis à jour le site !

+

Voici pour commencer, un article sur Linux dans la rubrique + "C'est quoi", ainsi qu'un article sur le logiciel libre, dans la même rubrique.

+ +

Vendredi 2 Février 2007

+

Ajout d'un article pour configurer Thunderbird avec les règles de filtrage et deux astuces.

+ +

Samedi 27 Janvier 2007

+

Après l'explication sur les serveurs, j'ai ajouté un article sur les hébergeurs et l'hébergement.

+ +

Samedi 30 Décembre 2006

+

J'ai ajouté une page sur les statistiques du site. + Vous y trouverez entre autres le nombre de visiteurs, les pages les plus vues et + le nombre de pages qu'ont vu les visiteurs les plus connectés.
+ J'utilise l'adresse IP pour ces statistiques, mais elle est cryptée, c'est à dire transformée. + Donc je ne peux pas avoir d'informations sur vous à partir de cette adresse. + Par exemple, voici ce que donne "samedi" crypté : 785ee49b7e2b0e5f10791f06364fb8d17291d1d8

+

Mardi 26 Décembre 2006

+

Joyeux Noël

+

J'ai ajouté un article sur les notions de client et de serveur sur le Web.

+

Samedi 9 Décembre 2006

+

dBPowerAMP Music Converter + est un logiciel qui permet de convetir des fichiers dans plusieurs formats.

+ +

Dimanche 26 Novembre 2006

+

J'ai ajouté beaucoup de liens. Ils proviennent notamment des + favoris de sebsauvage et des miens.

+

J'ai également fait des lègères modifications sur l'ensemble du site :

+
  • Le site est en xhtml 1.1. C'est la dernière version du xhtml, plus stricte.
    + Avec certains navigateurs, la moidre erreur empêche d'afficher la page. + De cette façon je sais que mes pages sont parfaitement valides.
    + De plus, le lien pour valider la page en cours ne dirige plus vers le W3C, + mais vers le validome, bien plus performant.
  • +
  • J'ai supprimé les arrangements pour Internet Explorer. + Après tout, pourquoi est-ce que je me préoccuperais d'un navigateur qui ne respècte pas les standards ? + Pour ceux qui ont ce navigateur, vous pouvez en changer.
  • +
  • Sur la plupart des pages, la langue du lien + (français ou anglais, ainsi que quelques autres langues) est indiquée.
+

Enfin, j'ai coloré les codes dans les pages suivantes :
+ C'est quoi la programmation ?
+ C'est quoi xhtml ?
+ C'est quoi les CSS ?

+

Jeudi 2 Novembre 2006

+

Dans les logiciels, j'ai ajouté Shoot2png, + un très bon freeware (logiciel gratuit) pour faire des captures d'écran

+ +

Dimanche 29 Octobre 2006

+

Le contenu de mon site est maintenant sous Licence Creative Commons, + une licence plus souple que le copyright.
+ Cette page fait partie de la rubrique "A propos de ce site".

+

Jeudi 26 Octobre 2006

+

La version 2.0 de Firefox est enfin disponible ! Vous pouvez voir + l'article + correspondant sur ccm, avec les explications de quelques nouveautés.
+ Une nouvelle version de Ccleaner est également disponible.
+ Je propose ces deux logiciels en téléchargement.

+

Samedi 21 Octobre 2006

+

J'ai légèrement refait le design du site (les titres ne sont plus présentés de la même façon) et j'ai allégé mes fichiers css + avec le site http://flumpcakes.co.uk/css/optimiser/

+

Opera est un bon navigateur, Lynx + est un navigateur en mode texte.

+

Xenu's Link Sleuth est un freeware utile pour vérifier tous les liens d'un site ou d'un fichier local.

+

Mercredi 11 Octobre 2006

+

Dans la rubrique "C'est quoi", ajout de "C'est quoi la programmation ?"

+

Samedi 7 Octobre 2006

+

J'ai refait la page des logiciels. J'ajoute une petite description pour chaque logiciel, + et les images sont pour la plupart aux dimensions 48x48 ou 32x32 pixels.
+ J'ai également ré-organisé légèrement les catégories.
+ Si vous utilisez Internet Explorer, les images seront au format gif. Avec un autre navigateur, elles seront au format png.
+ C'est du au fait que Internet Explorer ne supporte pas la transparence des fichiers png, + il les affiche avec un moche fond bleu. J'utilise une regex en php pour changer la source de l'image selon le navigateur.
+ Vous pouvez voir la source de la page en ajoutant "?source" a l'url : logiciels/?source

+

La page des logos est aussi refaite, mais cela ne se voit pas. + J'ai supprimé les tableaux et les attributs alt des images (ce sont des images purement décoratives).

+

Et enfin, j'ai refait le fichier xslt qui affiche mon flux RSS. Il est ici : + "/rss/rss.xslt".

+ +

Samedi 30 Septembre 2006

+

J'ai rédigé la page "C'est quoi les CSS ?". + Le CSS est un langage utilisé pour faire la mise en page des sites, en complément du xhtml.

+

Quelques précisions sur le xhtml.

+

En refaisant la page d'accueil, j'avais oublié les accesskeys ! C'est refait.

+

J'ai allégé mes images avec le site + http://tools.dynamicdrive.com/imageoptimizer/.

+

Vendredi 29 Septembre 2006

+

J'ai ajouté @icon Sushi, qui vous permet d'extraire les images de programmes, dll ou d'autres images.

+

J'ai changé la police du site, je trouve que c'est plus lisible.

+

Dimanche 24 Septembre 2006

+

J'ai changé la page d'accueil : elle n'est plus codée en tableaux.
+ J'ai également ajouté quelques nouvelles images. Je les ai faites sur le site + Brilliant button maker.
+ Le menu est aussi changé.

+

Samedi 23 Septembre 2006

+

Des nouvelles versions de Ccleaner (1.33.385), + Firefox (1.5.0.7) et + Thunderbird (1.5.0.7) sont disponibles.
+ Je les propose en téléchargement. + ( + Plus d'informations sur les nouvelles versions de Firefox et Thunderbird).

+

Sur la page "Contact", + je me suis un peu amusé avec des propriétés CSS 3 (La version des CSS est actuellement la version 2) : + Si vous utilisez Firefox, vous verrez des bordures arrondies. J'ai également amélioré le formulaire de contact.

+

Ajout d'une rubrique dans "C'est quoi (x)HTML ?".

+

J'ai refait la page de Liens. Elle s'affiche plus vite.
+ Vous pouvez également voir la page de del.icio.us.

+

Suite à une suggestion, j'ai refait la vidéo qui explique comment utiliser Ccleaner en deux parties.
+ 1° partie (téléchargement, installation)
+ 2° partie (configuration, installation)

+

Mercredi 13 Septembre 2006

+

Le programme Delxml2html, créé par Sébastien Sauvage, permet de transformer ses marques pages del.icio.us en une seule page html. +
J'ai modifié ce programme, et j'ai rédigé une page qui explique comment l'utiliser.

+

Mardi 12 Septembre 2006

+

Il y a quelques temps, je me suis inscrit au service "del.icio.us.". +
Ce service permet de partager ses marques pages avec tout le monde. Vous pouvez voir mes marques-pages de différentes façons :

+
  1. Directement depuis del.icio.us (mise à jour en temps réel) : + http://del.icio.us/Ssylvainsab/
  2. +
  3. Depuis le flux RSS de del.icio.us (mise à jour en temps réel également) : + http://del.icio.us/rss/Ssylvainsab/
  4. +
  5. Sur une page de ce site (mise à jour de temps en temps)
+

Dimanche 10 Septembre 2006

+

J'ai enfin remis à jour la page des logos. J'en ai ajouté beaucoup :
+ Il y a maintenant des logos sur Firefox, thunderbird, Nvu, Mozilla et Zone Alarm.

+

Ajout de la page "C'est quoi (x)HTML ?"

+

Samedi 9 Septembre 2006

+

J'ai ajouté beaucoup de liens.

+

Dimanche 3 septembre 2006

+

Pas de news pendant une semaine !
+ Pendant ce temps, j'étais occupé a transferer les fichiers du site a une autre adresse.
+ Le site est a l'adresse http://sylvain.sab.free.fr/

+

il y a eu très peu de mises a jour pendant ce temps. Cependant quelques choses ont changées :

+
  • La favicône n'est plus la même :
  • +
  • Je suis inscrit à "del.icio.us". Ce service permet de partager ses marques pages avec d'autres personnes, + en les notant sur une page accessible à tout le monde.
    Vous pouvez voir les pages que j'ai notées à l'adresse + http://del.icio.us/ssylvainsab/. + Cette page est également accessible par flux RSS : http://del.icio.us/rss/Ssylvainsab/. +
    Ce service est bien entendu gratuit et tout le monde peut l'utiliser.
  • +
  • J'ai ajouté quelques nouveaux liens, et fait quelques modifications dans la page "html".
  • +
  • J'ai rajouté le logiciel IconEdit32, un éditeur d'icones. + C'est avec ce logiciel que j'ai fait les nouvelles favicones.
+ +

Dimanche 27 août 2006

+

Ajout d'Accesskeys et d' une page qui explique ce que c'est, et comment les utiliser.

+

J'ai eu un problème avec la page des logos, elle est indisponible pour le moment. + Mais je suis en train de la refaire et d'y ajouter beaucoup de logos.

+

Vendredi 25 août 2006

+

Ajout de plusieurs extensions pour Firefox.

+

Ajout d'une page ou sont répertoriés tous les logiciels proposés en téléchargement sur mon site ainsi que leur extensions/plugins/add-on : + /logiciels/telecharger/

+

Jeudi 24 août 2006

+

Sur la page des logiciels, ajout d'une section pour les sites et de 3 logiciels dans cette section : + PSPad Editor, Nvu et TidyGUI

+

Une nouvelle version de Ccleaner (la 1.32.345) est disponible. Je la propose en téléchargement.

+

Mercredi 9 août 2006

+

Une vidéo (400 Ko) qui explique comment utiliser les onglets dans Firefox.

+

Mardi 8 août 2006

+

Encore des astuces pour Optimiser Windows. Cette fois-ci, désactiver les services inutiles. + configurer/windows/2.php#desactiveservices
+ Egalement une vidéo qui explique comment désactiver les services (elle est dans la page 2 de Windows) : + temp/?video=stopservice

+

Lundi 7 août 2006

+

Ajout d'astuces pour optimiser Windows : configurer/windows/2.php

+

Dimanche 6 août 2006

+

Ajout de Pagedefrag dans les logiciels, + qui est un excellent utilitaire de défragmentation.

+

Ajout d'une page d'astuces pour optimiser Windows. Elle est encore en construction, seule la première partie est terminée. + /configurer/windows/.

+

Samedi 5 août 2006

+

Ajout de Star Downloader dans les logiciels. + C'est un excellent gestionnaire de téléchargements.

+

Vendredi 4 août 2006

+

J'ai mis des nouveaux boutons dans le menu et sur la page d'accueil.

+

Le nouveau design est terminé ! Il est sur chaque page, le site est donc plus "uni". Je vous conseille d'utiliser + Firefox, car ce navigateur respecte les standards, contrairement à IE.
+ Il y a donc une chose qui fonctionne sous Firefox mais pas sous IE : Lorsque vous cliquez sur un lien, + il devient vert sur fond noir dans Firefox. Dans IE, il reste gris.
+ Quand vous avez cliqué sur un lien, IE le laisse en noir sur fond noir, ce n'est pas joli.

+

Ajout de liens vers des images Firefox dans la pages logos : + logos/index.php#firefox

+

Une nouvelle version de Firefox (1.5.0.6) est disponible. + Elle comporte notamment des correctifs de sécurité. Je la propose en téléchargement.

+ +

Dimanche 30 juillet 2006

+

Ajout d'une sitemap. Si vous utilisez l'extension Navibar pour Firefox, vous pourrez voir dans la barre latérale un plan du site. + Je vous recommande cette extension, elle est très pratique.
+ Sitemap : sitemap.rdf     + Navibar : logiciels/firefox.php#navibar

+

Dans la page "Conseils et astuces pour vos sites WEB et vos pages html", + ajout de "Faire Une SiteMap".

+

Samedi 29 juillet 2006

+

Ajout de logos Firefox dans la page "Logos", + ainsi que de plusieurs liens ou vous touverez des fonds d'écran et des images Firefox.

+

Une nouvelle version de Thunderbird + est parue, la 1.5.0.5 (l'ancienne était la 1.5.0.4).
+ Une nouvelle version de Firefox est également disponible (la 1.5.0.5).

+

Vendredi 28 juillet 2006

+

Ajout de la page "logos". Vous y trouverez toutes les images qui sont sur le site, ainsi que + d'autres images qui me plaisent ou qui peuvent servir. + Vous pouvez reprendre ces images pour votre site, mais si vous prenez une de celles + que j'ai faites moi même indiquez le moi.

+

Ajout de la page "html". Vous y trouverez des conseils et des astuces pour faire vos sites.

+

J'ai refait la vidéo qui explique comment gérer ses traces avec Firefox : + elle était en mauvaise résolution et on la voyait mal. J'ai aussi corrigé quelques fautes d'orthographe et mentionné l'extension + WebDeveloper. La video est a l'adresse : + temp/?video=configfirefoxtraces.

+

Les pages se chargent plus vite pour beaucoup de raisons :

+
  • Les liens sont raccourcis : il sont en relatif et plus en absolu.
  • +
  • J'ai également allégé les fichiers css et html.
  • +
  • J'ai réorganisé le site. Si vous trouvez un lien mort, écrivez-moi.
+

Le flux RSS du site est enfin adapté! C'est à dire que vous pouvez le voir normalement.

+

Mardi 25 juillet 2006

+

J'ai réorganisé le répertoire "temp". +
La présentation des fichiers, nottament des vidéos est maintenant sous la forme d'un tableau.

+

Ajout de l'extension Web Develloper pour Firefox.

+

Lundi 24 juillet 2006

+

Le nouveau design du site est presque fini. Il ne reste plus que la page + liens. J'y ajoute en même temps de nouveaux liens.

+

Il y a des nouveaux boutons sur la page d'accueil. + Je les ai faits avec le logiciel DeKnop.

+

J'ai également ajouté l'icone RSS + à droite de l'url qui signale la présence d'un flux RSS sur le site.
+ Il vous suffit de cliquer dessus pour l'ajouter a vos favoris

+

Dimanche 23 juillet 2006

+

J'ai ajouté un flux RSS (enfin!)

+

J'ai mis à jour la page Winamp + dans les logiciels : tous les téléchargements sont désormais disponibles.

+

Ajout d'une vidéo qui explique comment télécharger, + installer, configurer et utiliser le logiciel Zone Alarm : configurer/zonealarm.php

+

Mardi 4 Juillet 2006

+

Ajout de Craps Cleaner dans les logiciels. +
J'ai fait une vidéo pour vous montrer comment télécharger, + installer, configurer et utiliser ce logiciel.

+

J'ai oublié de le préciser hier, mais j'ai ajouté une favicône.
+ C'est la petite image que vous voyez a droite de l'url, elle vous permettra de reconnaître les pages de mon site : + ::.
+ Ajout de la rubrique C'est quoi. + Vous trouverez Starforce à cet endroit.

+

Lundi 3 Juillet 2006

+

Mise à jour de la page Starforce.

+

Mise à jour de Winamp et VLC Media Player dans les logiciels.

+

Samedi 1° Juillet 2006

+

Mise à jour de Firefox, et + ajout de Winamp et VLC Media Player dans les logiciels.

+ +

Jeudi 29 juin 2006

+

Ajout de Thunderbird, d'Avast, + de Zone Alarm et d'anti-spywares.

+

Mercredi 28 juin 2006

+

Création de mon site.

+

Mise à jour de la page Contact, ainsi que de la page Liens.

+

Ajout de Firefox dans les logiciels, + et de deux vidéos pour vous montrer comment configurer ce logiciel.

+ blob - /dev/null blob + 72edecd60f54d7588d82db5dfb533785fe9abf46 (mode 644) --- /dev/null +++ pages/index.php @@ -0,0 +1,445 @@ +'."\n\t". + ''; +$titre='Bookmarks del.icio.us'; +require'../autres/source-haut.php'?> +

Bookmarks 2007-02-22

+

Page originale

+

+Google Image Labeler - http://images.google.com/imagelabeler/
C'est une nouveauté de google : avec quelqu'un choisi au hasard, vous devez attribuer des mots-clés à une ou plusieurs images. (Tags: fun game)

+Télécharger mp3DirectCut - http://www.infos-du-net.com/telecharger/mp3DirectCut,0301-460.html
un logiciel de découpage de mp3 (Tags: tools mp3 multimédia)

+Disco Sarko - http://www.discosarko.com/disco_sarko.php
arf arf arf. pour faire danser sarkozy. c'est stupide, mais très rigolo ! (Tags: fun activism)

+Le guide des langages Web : Les cours - http://www.laltruiste.com/
(Tags: programming webmaster)

+List of User-Agents (Spiders, Robots, Browser) - http://www.user-agents.org/index.shtml
une liste importante. (Tags: system:unfiled)

+andreasviklund.com - http://andreasviklund.com/
(Tags: system:unfiled)

+Web accessible : les "pourquoi" et les "Comment" - http://www.christopher-jablonski.com/fr/reperes/accessibilite.shtml
(Tags: accessibilite)

+Grand Stream Dreams: 20 Free Ways to Pimp Windows XP - http://grandstreamdreams.blogspot.com/2006/08/20-free-ways-to-pimp-windows-xp.html
(Tags: windows tools)

+Nettoyer PAGEFILE.SYS - http://www.laboratoire-microsoft.org/t/1794/
pagefile.sys, c'est le fichier de mémoire de windows, assez lourd et qui contient beaucoup d'informations. (Tags: tools windows)

+Home of MultiProxy and Anonymous proxy list - http://www.multiproxy.org/
(Tags: tools internet securite)

+AusDilecce Extensions - http://www.supportware.net/mozilla/
des extensions pour firefox et thunderbird (Tags: extension)

+thenod.info - http://www.thenod.info/
un blog intéressant (Tags: blog)

+Trichoko - http://trichoko.free.fr/index.php
un site d'upload d'images (Tags: tools)

+Flash Element TD | Novel Concepts - http://novelconcepts.co.uk/FlashElementTD/
un jeu tiré de warcraft (Tags: fun game)

+Le Stop Motion - Pour en savoir plus ! - Face Cachée - Découvrez le web différemment - http://www.face-cache.fr/index.php/2006/12/14/17-le-stop-motion-pour-en-savoir-plus
(Tags: fun)

+Déplacer le répertoire cache de Firefox : Trucs et Astuces Windows XP 2000 2003 NT - http://www.generation-nt.com/astuces/lire/149/deplacer-le-repertoire-cache-de-firefox/
(Tags: firefox tools)

+Firefox et Thunderbird : sauvegarder ses paramètres Tuto Soft - EchosDunet - http://www.echosdunet.net/dossiers/dossier_1171_firefox+thunderbird+sauvegarder+ses+parametres.html
(Tags: firefox tools)

+Les logiciels libres - http://tina.zevillage.org/news/les-logiciels-libres
(Tags: free libre)

+SELFHTML: HTML/XHTML / Sommaire de référence HTML /Référence HTML pour les caractères - http://fr.selfhtml.org/html/reference/signes.htm
(Tags: html)

+So, You Want An "& Command", Huh? - http://www.htmlgoodies.com/beyond/reference/article.php/3472611
une liste d'entités html (Tags: html)

+Liste de tutoriels CSS - Forum osCommerce-fr - http://www.oscommerce-fr.info/forum/index.php?showtopic=17429
quelques aides-mémoires CSS. (Tags: css)

+CSS : les règles @ - JDN Développeurs - http://developpeur.journaldunet.com/tutoriel/css/040601-css-regles-at.shtml
(Tags: css)

+PHPFrance :: Voir le sujet - [Résolu] Date et heure au format français - http://www.phpfrance.com/forums/voir_reponse-83074.php
(Tags: php sql programming)

+PHPFrance :: Voir le sujet - Quelques petites manipulations avec les dates (PHP/MySQL) - http://www.phpfrance.com/forums/voir_sujet-8323.php
sur les dates en php et sql. (Tags: php sql programming)

+Les astuces excel d'Excelabo : Les Dates : Formats et Calculs - http://www.excelabo.net/xl/dates.php
attention, il faut avoir javascript activé. (Tags: system:unfiled)

+Test de bande passante par ZDNet.fr - http://www.zdnet.fr/services/speedtest/speedtest.htm
un test de vitesse de connexion (Tags: tools)

+5 JavaScripts vraiment utiles - JDN Développeurs - http://developpeur.journaldunet.com/tutoriel/dht/060512-5-javascripts-vraiment-utiles.shtml
(Tags: javascript programming)

+Aide-mémoire de la syntaxe et des mots-clés javascript -- Le Coin Web de QuentinC - http://quentinc.net/ref/articles/aide-memoire-syntaxe-et-mots-cles-javascript/cde14
(Tags: javascript programming)

+Statistik - http://chameau.moostik.net/
Un site de statistiques gratuites. Il y a l'air d'avoir beaucoup de fonctionnalités. (Tags: free tools)

+BadVista.org: Stopping Vista adoption by promoting free software — BadVista - http://badvista.fsf.org/
un site pour empêcher la monopolisation de l'informatique par microsoft avec windows vista. (Tags: activism)

+Finissons-en avec les pièces jointes Word - http://www.gnu.org/philosophy/no-word-attachments.fr.html
c'est vrai que c'est désagréable de recevoir des fichiers que l'on ne peut pas lire. (Tags: activism)

+Online CSS Optimizer / Optimiser - http://www.cssoptimiser.com/
(Tags: css)

+3SIP - http://nicolas.chazot.free.fr/
Un excellent site sur " la sécurité des systèmes informatiques des particuliers". (Tags: securite)

+Table d'entités - http://mdbui2.ift.ulaval.ca/Knowledges/Coding_Text/Table_Entites.htm
une autre liste assez complète d'entités html (Tags: html)

+Troll Machine - Le Trollodrôme (trollodrome trollesque) - http://jdhosts.net/starwars-rpg/troll/
Du troll, du troll, et encore du troll. (Tags: fun)

+Les OGM sont ils dangereux pour la santé? L'étude qui accuse - Google Video - http://video.google.fr/videoplay?docid=-8996055986353195886&pr=goog-sl
(Tags: activism)

+Pouvez-vous faire confiance à votre ordinateur ? - Projet GNU - Free Software Foundation/Fondation pour le Logiciel Libre (FSF/FLL) - http://www.gnu.org/philosophy/can-you-trust.fr.html
Un article sur l'informatique déloyale, avec quelques liens en bas de page pour agir. (Tags: activism)

+Microsoft a inventé le monde - Totalement Cretin(s) - http://totalementcretin.apinc.org/blog/2007/01/29/384-microsoft-a-invente-le-monde
Waow. La c'est crétin. TRES. impressionnant (Tags: activism)

+Musique libre de droit - illustration musicale - http://www.libre-musique-mp3.com/
(Tags: free music libre gratuit)

+BOXSON # Accueil # musique libre et gratuite: telecharger des mp3, des OGG et partager vos morceaux! - http://www.boxson.net/
(Tags: free music libre gratuit)

+LeWiki404:Mp3Legal - http://rezal404.org/wikini/wakka.php?wiki=Mp3Legal
une liste de sites de musique libre. (Tags: free music libre gratuit)

+Télécharger et écouter de la musique libre - http://www.auboutdufil.com/
un site de podcasting (blog de musique) (Tags: free music libre gratuit blog)

+Keopz.com - La nouvelle plate-forme de la musique libre et gratuite - http://www.keopz.com/
(Tags: free music gratuit libre)

+Dogmazic.net, musique libre - Accueil - http://www.dogmazic.net/index.php?op=edito
un autre site de musique libre de droits. (Tags: free music libre gratuit)

+Vous reprendrez bien un peu d'humanisme ? - http://suis-jeleseulcommecela.hautetfort.com/
un blog (Tags: blog)

+Jamendo : Madame Olga - http://kirk-www.jamendo.com/fr/artist/madameolga/
j'aime bien aussi. (Tags: music free libre gratuit)

+www.davidTMX.com - http://www.davidtmx.com/
un artiste découvert sur jamendo.com, un site de musique libre. j'aime bien ! (Tags: fun music free libre gratuit)

+XHTML 1.0 Strict - http://yansanmo.no-ip.org/xhtml/
une autre liste de balises html (Tags: html)

+Aux Tutoriaux Français-Tutorial et Aide Pour Logiciels - http://www.tutoriaux.biz/
(Tags: system:unfiled)

+HTML Entity Chart :: Webmaster Toolkit - http://www.webmaster-toolkit.com/html-entity-chart.shtml
une liste d'entités (Tags: system:unfiled)

+UITest.com: Site Check – Web Site Test - http://uitest.com/en/check/
Un site qui donne directement plusieurs liens (validations, etc) à partir d'une url. (Tags: system:unfiled)

+Fake Name Generator - http://www.fakenamegenerator.com/index.php
permet de créer une fausse identité. un peu comme bugmenot. (Tags: tools internet)

+12 astuces d'optimisation de performance PHP - Prendre un Caf - http://www.prendreuncafe.com/blog/post/2006/11/22/12-astuces-optimisation-performances-php
encore (Tags: php programming)

+optimisation php - http://www.estvideo.com/dew/pages/phpbench/
(Tags: system:unfiled)

+Optimiser son site - http://www.toutjavascript.com/savoir/optimiser.php3
un autre article sur l'optimisation. (Tags: php sql programming bdd)

+Erreurs de films.com - http://www.erreursdefilms.com/
un site qui montre quelques erreurs de tournage, ou clins d'oeil dans les films. il y en a beaucoup. (Tags: fun)

+Apostrophes ou guillemets : lesquels choisir ? - Club d'entraide des développeurs francophones - http://pbnaigeon.developpez.com/tutoriel/PHP/apostrophe-guillemet/
un autre article sur l'ioptimisation php (Tags: php programming)

+Gradient generator - http://calebegg.com/grad/
(Tags: tools)

+Info à gogo | La programmation pour les débutants - http://infoagogo.free.fr/
un site intéressant (Tags: programming)

+Tux-Life - Élever votre Tux ! - http://www.tux-life.com/
(Tags: fun)

+OFF THE WRIST - Free Games and online toys - http://www.offthewrist.com/index.jsp?id=ff
un jeu qui consiste à taper l&#39;alphabet le plus rapidement. (Tags: fun)

+Mobile Encyclopedia - http://wapedia.mobi/
une encycolpédie pour lire les articles de wikipédia sur portable ou pda. Il y a un problème au niveau de l&#39;encodage (déclaré en utf-8 au lieu de iso) (Tags: free site)

+ColorZilla - Geckozone - Extensions en français pour Mozilla, Firefox, Thunderbird et Nvu - http://extensions.geckozone.org/ColorZilla
une extension pour utiliser des palettes de couleur, entre (beaucoup) d'autres. (Tags: firefox_extension)

+Frékence Flash Xtreme - Le monde de l'inconscient - Tous les meilleurs jeux et animations du moment sont sur Frékence Flash Xtreme - http://www.frekenceflash.com/index.php?page=divers
une quantité d'images qui parodient "Luc, je suis ton père". (Tags: fun)

+Free - Envoyez vos documents - http://dl.free.fr/
un service de stockage en ligne (Tags: internet tools)

+Portail d'informations sur les Nouvelles Technologies et Internet : Cours, Dossiers, Livres, Ressources gratuites, offres d'emploi... - http://www.netalya.com/
(Tags: system:unfiled)

+w e b y u s . c o m - http://www.webyus.com/
un service pour surfer anonymement sur internet. (Tags: web tools)

+JkDefrag v3.5 - http://www.kessels.com/JkDefrag/
un logiciel de défragmentation libre (Tags: tools free)

+Projet Unix/Linux - http://projet.unix.free.fr/
un site sur l'histoire de linux (Tags: linux site)

+UserbarsCity - http://userbarscity.armatronic.com/
(Tags: graphics)

+affiliates homepage | Spread Firefox - http://www.spreadfirefox.com/?q=affiliates/homepage
quelques logos firefox (Tags: firefox graphics)

+Fédération Informatique et Libertés - http://www.vie-privee.org/
(Tags: system:unfiled)

+Info-Graphistes.com - http://www.info-graphistes.com/
(Tags: tutoriel graphics)

+TUTMarks - didacticiels, guides et tutoriaux sur internet - http://tutmarks.com/
(Tags: tutoriel)

+Freewares & Tutos - http://freewares-tutos.blogspot.com/
un blog ou sont référencés plusieurs tutoriels de logiciels gratuits/open-source (Tags: logiciels tutoriel)

+Classes.ScriptsPHP.org - Ressources PHP - http://classes.scriptsphp.org/
(Tags: php programming)

+FAI:saisir le juge qd on est dans son droit! - http://www.commentcamarche.net/forum/affich-2304797-fai-saisir-le-juge-qd-on-est-dans-son-droit
une histoire qui finit bien (Tags: activism loi)

+Outil XHTML 1.1 Hiérarchie - La balise html, ses attributs, ses événements, son utilité et sa syntaxe. - http://giminik.developpez.com/xhtml/
(Tags: xhtml)

+GuideLinux.Org - http://www.guidelinux.org/
(Tags: linux site)

+Cyber-Protect.Fr - Votre Protection Informatique - Protection de la vie privée - http://www.cyber-protect.fr/
(Tags: securite)

+Failles PHP à éviter - http://www.vulgarisation-informatique.com/failles-php.php
(Tags: securite php)

+ORDINATEUR = glossaire bilingue (A/F) : ABREVIATION informatique WXYZ (lexique, traduction) - http://www.glossaire.be/glossaire_abreviation_x_anglais_francais.htm
une liste d'abréviations (Tags: liste)

+TinyMCE Javascript Content Editor by Moxiecode Systems AB - http://tinymce.moxiecode.com/
un éditeur html (Tags: system:unfiled)

+monoface - http://www.mono-1.com/monoface/main.html
marrant. trouvé sur htp://del.icio.us/sebsauvage/ (Tags: fun)

+Installation de Fedora - Google Video - http://video.google.fr/videoplay?docid=4748185074137523658
une vidéo qui explique comment installer cette distribution (Tags: linux)

+Dedibox - Votre serveur dédié pour 29,99 Euros / mois trafic illimité - http://www.dedibox.fr/
(Tags: serveur)

+KIMSUFI, votre serveur dédié, tout simplement suffisant. - http://www.kimsufi.com/
(Tags: serveur)

+AERIS - Cours - Comprendre Internet - Historique - http://aeris.11vm-serv.net/cours/internet/histoire.html
une histoire d'internet (Tags: article)

+[uZine 3] Le HTML dans le potage - http://www.uzine.net/article2143.html
(Tags: system:unfiled)

+Les types de Média XHTML - http://sebastienguillon.com/traduction/types-de-media-xhtml#summary
(Tags: system:unfiled)

+Geckozone :: Voir le sujet - Du XHTML 1.1 envoyé au format text/html - http://www.geckozone.org/forum/viewtopic.php?t=38659
des indications intéressants (Tags: xhtml valide)

+French Translations of W3C Documents - http://www.w3.org/2003/03/Translations/byLanguage?language=fr
(Tags: w3c)

+Mentos diet coke rocket - Google Video - http://video.google.com/videoplay?docid=6570869723386259299&q=mentos+diet
une autre vidéo de mélange coca+mentos. C'est quand même parfois dangeureux, vaut mieux pas s'en inspirer... (Tags: fun)

+Accueil - Ekopedia - http://fr.ekopedia.org/Accueil
"Ekopedia est un projet d'encyclopédie pratique traitant des techniques alternatives de vie. L'encyclopédie est gratuite, écrite coopérativement et son contenu est librement réutilisable." (Tags: libre free)

+evolt.org - Browser Archive - http://browsers.evolt.org/
une liste de navigateurs (Tags: browser)

+Google Code: Web Authoring Statistics - http://code.google.com/webstats/index.html
les statistiques d'un milliard de pages indexées par google. (Tags: system:unfiled)

+Validator - http://homepage.mac.com/rcrews/software/validator/
un autre validateur html/xhtml/xml (Tags: valide)

+Servir du XHTML en tant que text/html jugé néfaste - http://www.hixie.ch/advocacy/xhtml.fr/#p7
Un article intéressant, à lire. (Tags: xhtml valide)

+HebServ -- Hébergement gratuit - Accueil - http://www.hebserv.net/
(Tags: system:unfiled)

+RHIEN - Réseau d'Hébergeurs Indépendants et ENgagés : Accueil - http://www.rhien.org/?wiki=Accueil
un site d'hébergeurs et de services d'hébergement à but non lucratif (Tags: free)

+REGEX - REGEXP - Expressions régulières en PHP - Les article d'expreg - Les billets de Fred - http://expreg.com/rex_article.php?art=grossir
un autre article sur la valeur d'un octet (1 Ko=1000 octets, 1Kio=1024 octets) (Tags: article)

+http://www.funxhtml.com/CH2/corriges_ch2.txt - http://www.funxhtml.com/CH2/corriges_ch2.txt
un fichier texte sur le javascript avec es méthodes qui s'appliquent au xhtml 1.1 (Tags: javascript)

+Studios Tastalian :: Cours de Programmation :: Jeux vidéo et applications libres - http://tastalian.free.fr/
un site sur la programmation et le libre (Tags: programming libre)

+LogicielMac.com - Section - Editeur de Site - http://www.logicielmac.com/logiciel/section-Editeur%20de%20Site.html
plusieurs logiciels pour webmaster sous MAC (Tags: webmaster)

+PHP: mysql_unbuffered_query - Manual - http://fr2.php.net/mysql_unbuffered_query
"Exécute une requête SQL sans mobiliser les résultats MySQL". Donc à utiliser pour l'insertion ou la modification de données qu'on ne récupère pas (Tags: sql optimisation programming)

+wannaBrowser | http user agent spoofing - http://www.wannabrowser.com/
un service qui permet de se faire passer pour un autre navigateur que le sien. (Tags: internet tools)

+SpamReport pour FireFox : Reporter un Spam dans l'index de Google - http://www.spam-report.net/fr/
Extension qui permet de dénoncer un site anormalement positionné dans Google, grace à diverses techniques (par exemple : le cloaking, qui permet d'afficher une page différent aux robots des moteurs de recherche : http://en.wikipedia.org/Cloaking ) (Tags: activism firefox_extension)

+IconEdit32: Download It Here - http://www.pcmag.com/article2/0,1895,1558903,00.asp
un autre lien pour télécharger IconEdit32. Il faut s'enregistrer, mais on peut utiliser BugMeNot. (Tags: graphics icon)

+Infini : l'encyclopédie de l'informatique et de la programmation - http://www.infini-fr.com/
(Tags: system:unfiled)

+REGEX - REGEXP - Expressions régulières en PHP - Les articles d'expreg.com - http://www.expreg.com/expreg_article.php?art=timestamp
un article intéressant sur les facons d'utiliser les dates et le temps dans les requêtes MySQL (Tags: php sql programming)

+.: Radio Live :. - La musique continuellement libre ! - http://www.emakers.info/radio/
une radio de musique libre (Tags: free)

+iGloo-fr.org - L'autre façon de communiquer - http://www.igloo-fr.org/
un système de blogs (Tags: blog site)

+Network Query Tool - http://tools.wikimedia.de/~essjay/nqt.php
et un autre (Tags: internet tools)

+DShield - IP Info - http://www.dshield.org/ipinfo.php
un autre service qui permet d'obtenir des infos à propos d'une adresse IP. (Tags: internet tools)

+Query the RIPE Database - http://www.ripe.net/fcgi-bin/whois
ce site permet d'avoir des informations (beaucoup d'informations) sur une adresse IP. (Tags: internet tools)

+FSF France - Licence Publique Générale GNU - http://fsffrance.org/gpl/gpl-fr.fr.html
(Tags: system:unfiled)

+Utiliser Firefox sous Linux et Windows en même temps - Le Site du Zéro - http://www.siteduzero.com/tuto-3-13921-1-utiliser-firefox-sous-linux-et-windows-en-meme-temps.html
pratique. ca permet d'avoir le même profil avec firefox sous linux et windows (Tags: system:unfiled)

+Dogpile Web Search Home Page - http://www.dogpile.com/
un moteur de recherche qui semble performant (Tags: tools internet)

+Ubuntu Blog - http://ubuntu.wordpress.com/
un blog (Tags: blog)

+Wallpapers Gallery | Vladstudio.com - free desktop wallpapers, high resolution, widescreen and dual-monitor images, web design and development - http://www.vladstudio.com/wallpapers/
d'autres fonds d'écran (Tags: graphics)

+Selected Wallpapers: For Desktop & Web-Design | Smashing Magazine - http://www.smashingmagazine.com/2006/12/07/selected-wallpapers-for-desktop-and-web-design/
des fonds d'écran. pour firefox : http://3couleurs.blogspot.com/2005/01/wallpapers-firefox.html (Tags: graphics)

+Bienvenue sur PHP Débutant - http://www.phpdebutant.org/article49.php
pour faire des statistiques, mais ici on utilise des sessions. (Tags: php programmin)

+Articles - Qu'est-ce qu'AJAX et comment l'utiliser - http://www.un-programmeur-php.ca/articles/ajax.php
un autre tutoriel sur l'Ajax (Tags: ajax javascript programming)

+:: Le PHP Facile :: Comment faire ? - Un script de statistiques - http://www.lephpfacile.com/howto/index.php?p=8
un moyen simple, sans cookie. L'adresse ip est cependant utilisée mais on peut faire un sha1 ou md5. (Tags: php programming)

+La balise meta robots - http://www.robots.darkseoteam.com/meta-robots.php
plusieurs infos sur le fonctionnement de cette balise et des robots. (Tags: web)

+Adresse email jetable Ephemail. antispam ephemere temporaire jetable gratuite - http://www.ephemail.net/
(Tags: tools)

+stylexp.net - http://www.stylexp.net/
(Tags: system:unfiled)

+Notpron - The Hardest Riddle Available on the Internet - http://deathball.net/notpron/
un jeu ou vous devez chercher des indices pour résoudre des énigmes. (Tags: fun)

+Le père Noël - http://perso.orange.fr/oncle.dom/humour/pere_noel/pere_noel.htm
trouvé via http://quentinc.net/forum/topic130-noyeux-jo%EBl/ (Tags: fun)

+CSS : Modifier l'état du curseur - JDNet Développeurs - http://developpeur.journaldunet.com/tutoriel/dht/040127_changer_curseur.shtml
les curseurs CSS possibles. (Tags: css)

+ClamAVâ„¢: Project News - http://www.clamav.net/
un antivirus open-source (Tags: open-source securite antivirus)

+Drivl.com | What code DOESN'T do in real life (that it does in the movies) - http://www.drivl.com/posts/view/494
(Tags: fun)

+Installation de ndiswrapper sous Mandrake/Mandriva - NETGEAR Forum - http://www.netgear-forum.com/forum/index.php?showtopic=31299
pour installer une carte réseau negear sous linux (Tags: tools linux)

+CSE HTML Validator Pro Screen Shots - http://www.htmlvalidator.com/htmlval/screenshots.html
un logiciel pour valider du html en local. (Tags: valide)

+StarForce&Starforce 3 comment les contourner - http://www.tutoriaux-excalibur.com/starforce-3.htm
à lire : http://sylvain.sab.free.fr/cestquoi/starforce.php (Tags: tools securite activism)

+Scripts PHP pour Webmasters - JeunesWebmasters.com - http://www.jeunes-webmasters.com/
a voir (Tags: php programming)

+Simple site map generator in Xml, Html or text file format - http://www.scriptet.com/simple-map-fr.html
un logiciel pour faire un plan de site web (Tags: tools)

+Pluxml.org - Blog ou Cms à l'Xml - http://www.pluxml.org/
"Aussi léger qu'une plume et motorisé à l'Xml" (Tags: blog)

+Elevez votre Yoshi en ligne sur Project-Yoshi.net - http://www.project-yoshi.net/
(Tags: fun game)

+Tempomail - http://extensions.geckozone.org/Tempomail
une extension pour firefox qui permet d'avoir des adresses e mail temporaires. voir aussi "Get jetable mail" (Tags: firefox_enxtension)

+BLOGIX, le blog de Jérôme aka qwix - http://qwix.media-box.net/
(Tags: blog)

+TLCC Developer tip for WebSphere, Notes and Domino - Create Better Looking Tables for Web Browsers and Internet Mail - http://www.tlcc.com/admin/tips.nsf/ibmtipsview/783263610C515C4D8525716800533816
(Tags: system:unfiled)

+ILIAS DOC - http://149.222.51.71/ilias/docs/html/layout_inc.html
(Tags: system:unfiled)

+Réinstaller complètement le protocole TCP/IP : Trucs et Astuces Windows XP 2000 2003 NT - http://www.generation-nt.com/astuces/lire/234/reinstaller-completement-le-protocole-tcp-ip/
(Tags: system:unfiled)

+QuirksMode - for all your browser quirks - http://www.quirksmode.org/
(Tags: css)

+evolt.org - Browser Archive - http://browsers.evolt.org/?ie/32bit
hm. on peut télécharger les anciennes versions de IE, de la 1 à la 6. si vous aimez les virus, l'insécurité mais que vous détestez ce qui est pratique c'est pour vous :D (Tags: browser activism)

+petit cours javascript P. TRAU - http://www-ipst.u-strasbg.fr/pat/program/javascript/
(Tags: javascript)

+Mozinet - Utiliser Mozilla pour tester et déboguer les sites Web - Henrik Gemal - http://mozinet.free.fr/moz/fcn/tester_deboguer.html
(Tags: tools programming)

+"Le Patron" - Aide à la rédaction - http://lepatron.tapor.ualberta.ca/
un correcteur orthographique (Tags: system:unfiled)

+Plongez dans l'accessibilité : Sommaire - http://www.la-grange.net/accessibilite/table_of_contents.html
complet (Tags: accessible)

+WireImage.com – The Largest Entertainment Photo & Video Archive - http://www.wireimage.com/
un service pour stocker des photos et images. (Tags: tolls internet graphics)

+Blue Ball Machine (Classic GIF Returned) - http://blueballfixed.ytmnd.com/
un gif animé rigolo. (Tags: fun)

+Apprenez Ruby - http://www.ruby-doc.org/docs/beginner-fr/xhtml/index.html
(Tags: ruby programming)

+France24, Halde et Téléthon : pas de lien hypertexte ! - Pour les formats ouverts ! - http://formats-ouverts.org/blog/2006/12/07/1029-france24-halde-et-telethon-pas-de-lien-hypertexte#content
"l'interdiction d'établir des liens hypertextes sans autorisation". bein voyons. il y en a qui n'ont pas compris le principe d'internet, à savoir l'échange. (Tags: system:unfiled)

+AFUL : Groupe de travail sur l'interopérabilité - http://www.aful.org/gdt/interop/
(Tags: accessible)

+Sloppy - the slow proxy for dial-up modem speed simulation (slow down) - http://www.dallaway.com/sloppy/
un logiciel qui permet de simuler un débit de connexion inférieur à sa connexion réelle (trouvé sur http://del.icio.us/sebsauvage/ ) (Tags: tools internet)

+MySQL AB :: Manuel de référence MySQL 5.0 :: 7 Optimisation de MySQL - http://dev.mysql.com/doc/refman/5.0/fr/mysql-optimization.html
(Tags: bdd mysql)

+No Software Patents! - http://www.nosoftwarepatents.com/
no aux brevets logiciels. (http://www.nosoftwarepatents.com/fr/m/intro/index.html ) (Tags: activism)

+RESO - ANTI SARKO - le site militant contre Nicolas Sarkozy - http://u-m-p.fr/
(Tags: activism)

+Ton choix pour 2007 c’est Ségolène ou Sarkozy, vive la démocratie. C’est ça l’avenir de la France ? ... (LBS) - http://www.labanlieuesexprime.org/article.php3?id_article=1492
(Tags: system:unfiled)

+Ras l'front - accueil - http://www.raslfront.org/
Un site contre le racisme. A propos de Sarkozy : "le voilà pris d'une frénésie guerrière à l'encontre des sans-papiers, de leurs enfants , qu'il expulse à tour de bras." (Tags: activism)

+La section CDATA en Xml - jy[B]log - http://www.ljouanneau.com/blog/2004/04/06/262-la-section-cdata-en-xml
comment faire du javascript avec application/xhtml+xml. a garder PRECIEUSEMENT !! (Tags: javascript xhtml standards programming)

+Accueil -- Le Coin Web de QuentinC - http://quentinc.net/
un site intéressant (Tags: site)

+Web Specifications Supported in Opera 9 - CSS - http://www.opera.com/docs/specs/
(Tags: browser)

+XML/XSL avec PHP - Club d'entraide des développeurs francophones - http://bob.developpez.com/phpxslt/
pour parser du xml avec php (Tags: php xml programming)

+PECL :: Package :: Bcompiler - http://pecl.php.net/package/bcompiler
le php peut être compilé (Tags: php programming tools)

+Naholyr Devnotes - Accueil - http://www.naholyr.com/home/index.php
Un site intéréssant (Tags: blog)

+Regex - Expressions régulières PCRE - http://www.lumadis.be/regex/index.php
(Tags: php programming)

+Weebls Stuff - Rock Scissors Paper Multiplayer - http://www.weebls-stuff.com/games/Rock+Scissors+Paper+Multiplayer/
pour jouer au chi fu mi sur internet !! (Tags: fun)

+HoHoHo! : Design : Brand Spanking New - http://www.brandspankingnew.net/archive/2006/12/hohoho.html
des icones (Tags: graphics icons)

+My Personal Pet Peeves I See in Other People’s Code - http://onsmalltalk.com/programming/my-personal-pet-peeves-i-see-in-other-peoples-code/
trouvé sur les liens de sebsauvage(http://del.icio.us/sebsauvage/ ) (Tags: programming)

+secretGeek's Gradient Maker - http://secretgeek.net/GradientMaker.asp
un outil pour faire des gradients (Tags: graphics tools)

+dBpowerAMP - http://www.dbpoweramp.com/shutdown.htm
un programme pour arrêter windows plus rapidement (Tags: tools)

+CSS: Under Construction - http://www.w3.org/Style/CSS/current-work
de la documentation sur les CSS (Tags: css)

+XML Francophone - http://www.chez.com/xml/
un site pour apprendre le xml et ses dérivés (Tags: xml)

+Tutoriaux - Le Site du Zéro - http://www.siteduzero.com/forum-83-4711-p1-tutoriaux.html
une liste de sites sur html, php, flash, javascript, etc (Tags: xhtml css php javascript flash xml programming)

+XML Schema Validator - http://schneegans.de/sv/
un autre validateur (Tags: xhtml valide)

+Clean CSS - A Resource for Web Designers - Optmize and Format your CSS - http://www.cleancss.com/
il y a la même chose ici : http://www.cdburnerxp.se/cssparse/css_optimiser.php (Tags: css)

+documentation css - Ressources Mediabox - Wiki - http://wiki.media-box.net/documentation/css
(Tags: css)

+Le site de Totoffe - http://www.totoffe.net/
intéressant (Tags: system:unfiled)

+Portail - pouipouidesign v.6 ... et pourquoi pas ? ©2006 - http://www.pouipouidesign.net/
un blog intéressant (Tags: system:unfiled)

+StopIE: Help stop Internet Explorer, the worlds most popular and worst internet browser - StopIE.com - http://www.stopie.com/
un site contre IE (Tags: activism browser)

+POMPAGE - Séparer le comportement de la structure - http://pompage.net/pompe/separation/
c'est à dire n'utiliser aucun attribut onevent dans le code html. (Tags: xhtml css valide)

+POMPAGE - Comment lire une spécification du W3C - http://pompage.net/pompe/lirespec/
(les dtd) (Tags: system:unfiled)

+Diabolhuile.free.fr - http://diabolhuile.free.fr/index.php
un site sur le diabolo, avec plusieurs figures (Tags: fun)

+POMPAGE - Mon site Web est standard ! Et le vôtre ? - http://pompage.net/pompe/sitestandard/
(Tags: system:unfiled)

+Open Source Web Design - Download free web design templates. - http://www.oswd.org/
(Tags: css)

+GeneeWeb - le créateur de site ! Créer son site est gratuit, facile et rapide avec GeneeWeb ! - http://www.geneeweb.com/
(Tags: system:unfiled)

+Objet : RegExp - Référence Tout JavaScript.com - http://www.toutjavascript.com/reference/reference.php?ref=RegExp&parent=0
(Tags: javascript)

+Parents et enfants - Blog Alsacréations : XHTML, CSS et Standards web - http://blog.alsacreations.com/2004/09/09/58-parents-et-enfants
pour savoir quel élément peut contenir quels autres (Tags: xhtml)

+Web-Modules >> Services pour Webmaster - http://web-modules.net/#
plusieurs petits scripts intéréssants (Tags: webmaster)

+Tutoriaux-Photoshop :: Tutoriaux Adobe Photoshop :: - http://www.ultrairprod.info/tutoriaux-photoshop/index.php
(Tags: graphics)

+Eviter les injections SQL - Le Site du Zéro - http://www.siteduzero.com/tuto-3-11537-1-eviter-les-injections-sql.html
(Tags: securite)

+The NEW EXTREME WAY To Do the Diet Coke Mentos Reaction Explosion - Google Video - http://video.google.com/videoplay?docid=5695044769427318137&q=mentos+diet
waow ! une sorte de mini fusée avec des mentos et du coca.(voir aussi : http://www.siteduzero.com/forum-83-50236.html ) (Tags: fun)

+DistroWatch.com: Put the fun back into computing. Use Linux, BSD. - http://distrowatch.com/
pour télécharger des distributions linux (beaucoup de pub malheureusement) (Tags: linux)

+M. Sarkozy nous spamme ? - http://www.commentcamarche.net/forum/affich-1823800-m-sarkozy-nous-spamme
(Tags: activism)

+Ubuntu's Stories - http://blog.aelor.net/
un blog intéressant (trouvé sur les liens de sebsauvage) (Tags: blog)

+8 conseils pour le développement Ajax - http://developpeur.journaldunet.com/imprimer/tutoriel/dht/051103-javascript-ajax-conseils.shtml
(Tags: ajax programming)

+IANA | MIME Media Types - http://www.iana.org/assignments/media-types/
(Tags: server)

+Apache Tutorial: .htaccess files - Apache HTTP Server - http://httpd.apache.org/docs/2.0/howto/htaccess.html
(Tags: server)

+Aide Javascript - http://www.aidejavascript.com/
et aussi du php (Tags: javascript php programming)

+Création d'un fichier htaccess pour gérer l'accès. des pages web. - http://tecfa.unige.ch/themes/FAQ-FL/controle_diff_page_web/htaccess.html
(Tags: system:unfiled)

+SciTE - Éditeurs de Texte - Logiciels Libres - Framasoft - http://www.framasoft.net/article1988.html
ce logiciel a l'air intéressant (Tags: logiciel open-source)

+CSE HTML Validator - Professional HTML Syntax Checker and HTML Editor - http://www.htmlvalidator.com/
mouais. payant et pas forcément performant, mais on ne sait jamais (Tags: xhtml validateur)

+Le validateur HTML du WDG - http://www.htmlhelp.com/tools/validator/
encore un (Tags: xhtml valide)

+Display, vous connaissez ? - Blog Alsacréations : XHTML, CSS et Standards web - http://blog.alsacreations.com/2004/06/09/22-display-vous-connaissez
elle peut prendre plusieurs de valeurs utiles (Tags: css)

+Comment bien décalrer XHTML 1.1 ? - http://forum.alsacreations.com/faq/#item42
il faut le déclarer en application/xhtml+xml, point barre (Tags: xhtml site valide)

+SmartMiddleClick - Geckozone - http://extensions.geckozone.org/SmartMiddleClick
Par défaut, lors d'un clique-milieu sur un lien javascript, Firefox ouvre un nouvel onglet vide. Cette extension corrige ce problème et permet l'ouverture des liens en javascript dans un nouvel onglet. Elle permet donc -entre autres- d'ouvrir des pages, (Tags: firefox firefox_extension)

+cours php (écrire, lire, créer supprimer un fichier) ! [Ton Webmaster .com] - http://www.tonwebmaster.com/zones_webmasters/cours_php_actions_fichier.php
beaucoup de fonction pour le traitement des fichiers (Tags: php programming)

+[JS] Colorisation Syntaxique Instantanée - Le Site du Zéro - http://www.siteduzero.com/forum-83-91185-p1-js-colorisation-syntaxique-instantanee.html
plusieurs liens intéressants vers des essais de coloration syntaxique instantanée (en plusieurs langages) (Tags: programming)

+Maître shteshitsu » Le gars qui ne savait pas faire de musique - http://remouk.alt-tab.org/2006/11/14/le-gars-qui-ne-savait-pas-faire-de-musique/
marrant (Tags: fun)

+ColorJack: Color Generator - http://www.colorjack.com/studio/
une palette de couleurs (trouvée sur les liens de sebsauvage) (Tags: graphics fun)

+All lemmingsâ„¢ accounted for! - http://www.elizium.nu/scripts/lemmings/
Un petit jeu amusant (Tags: fun)

+Inquisitor - Instant Search - http://www.inquisitorx.com/beta/
Permet de faire une recherche avec plusieurs moteurs de recherche en lançant instantanément la recherche a chaque nouvelle lettre tapée. (Tags: fun service)

+Tiny Icon Factory - http://tiny.media.mit.edu/
vous pouvez créer des icônes qui seront ajoutées à des milliers d'autres (trouvé via :http://del.icio.us/sebsauvage/ ) (Tags: icon graphics fun)

+XHTML and CSS - http://xhtml-css.net/
(Tags: xhtml css)

+DKG-FMR - http://xhtmlcsskits.xooit.net/base.html
Waow.... un éditeur de xhtml/css/js en temps réel ! (un pop-up s'ouvre pour voir le résultat) avec eds fragments de code, les balises a portée, etc... (Tags: ajax fun web2.0)

+Mes extensions pour Firefox/thunderbird/Nvu - http://www.chevrel.org/fr/extensions/
(Tags: firefox_extension)

+Spécifier l'encodage des caractères d'un document (X)HTML août 2004 Weblog - Blog & Blues - http://www.blog-and-blues.org/weblog/2004/08/16/275-encodage-caracteres-xhtml
(Tags: valide xhtml)

+Applet, Object ou Embed ? | Numabilis - http://www.numabilis.com/blog/2006-09-05-applet_object_ou_embed
(Tags: system:unfiled)

+Essais EMBED - http://eric.hurtebis.chez-alice.fr/embed.htm
(Tags: system:unfiled)

+Opera-Fr.com :: Communauté francophone des utilisateurs d'opera - http://www.opera-fr.com/
(Tags: browser)

+Injections sql - http://webdod.free.fr/injections_sql.txt
(Tags: securite bdd)

+L'école de tournage d'effaceur - pen spinning - http://tourneffaceur.free.fr/
des vidéos impresionnantes (Tags: fun)

+PHP: Tidy - Manual - http://www.php.net/manual/fr/ref.tidy.php
une extension pour php qui permet d'indenter le code html généré. (Tags: php programming)

+Liste des fonctions PHP - http://www.info-3000.com/phpmysql/listecompletefonction.php
une liste complète (cependant les fonctions sont celles d'anciennes versions de php) (Tags: php)

+Test de la présence d'un fichier hébregé sur un serveur distant [PHP] - http://www.presence-pc.com/forum/ppc/Programmation/test-presence-fichier-distant-is_file-sujet-1000-1.htm
pratique (Tags: php programming)

+Forum Ubuntu-fr.org / Wine est un Windows XP valide! - http://forum.ubuntu-fr.org/viewtopic.php?id=44965
Ou "Comment faire croire qu'on a Windows en deux clics au super-logiciel-de-la-mort-qui-tue de Microsoft" (Tags: activism fun os)

+Campagne Anti-Verrous - http://alliance.bugiweb.com/phpPetitions/modele/test/index_anti_verrous.html
un site contre la loi dadvsi et tout ce qui tourne autour (Tags: activism article site)

+Catégories de logiciels libres et non libres - Projet GNU - Free Software Foundation/Fondation pour le Logiciel Libre (FSF/FLL) - http://www.gnu.org/philosophy/categories.fr.html#ProprietarySoftware
(Tags: article)

+Pourquoi «Free Software» est-il meilleur que «Open Source» - Projet GNU - Free Software Foundation/Fondation pour le Logiciel Libre (FSF/FLL) - http://www.gnu.org/philosophy/free-software-for-freedom.fr.html
(Tags: article)

+KDE-Look.org - http://www.kde-look.org/index.php?xcontentmode=22
une librairie d'icônes (Tags: graphics)

+scaranet.net - http://www.scaranet.net/
un site interessant, et le logiciel shoot2png est très bien ! (Tags: freeware site)

+Accueil - DotClear - DotClear 2 - http://www.dotclear.net/
un excellent logiciel libre et gratuit utilisé pour la conception de blogs (Tags: blog open-source freeware)

+.::[FockNiouzes]::. - Webradio libre associative. - http://fockniouzes.zaup.org/
un site de musique libre (Tags: system:unfiled)

+A nous la guillotine - http://www.tousenprison.info/index.html
un site sur la loi DADVSI (Tags: activism)

+GoLDZoNE Web HoSTING - L'hébergeur web gratuit pour tous - http://www.goldzoneweb.info/
un hébergeur gratuit qui a l'air interessant (Tags: system:unfiled)

+Tests css - http://www.editions-eyrolles.com/css2/tests/couleur/couleur9.htm
(Tags: css)

+Wormux - http://www.wormux.org/wiki/fr/index.php
Génial ! Un clone open source de Worms ! (trouvé via : http://del.icio.us/sebsauvage/ (Tags: fun games)

+Validation HTML/XHTML - http://yansanmo.no-ip.org/w3c-validator/
encore un validateur xhtml/xml, qui a l'air bon aussi. Le site est interessant (voir : http://yansanmo.no-ip.org/ ) (Tags: valide)

+Scaramanga's - http://scaraweb.free.fr/scaranet/www/?page=index&z=shoot2png
Shoot2Png, un logiciel pour faire des captures d'écran. Il a l'air bien (Tags: system:unfiled)

+Configuration - http://cui.unige.ch/~robin0/configuration.xhtml
Plusieurs logiciels intéressants ainsi qu'une liste d'extensions pour Firefox (Tags: firefox_extension logiciel)

+kopikol.net - http://www.kopikol.net/
un annuaire de sites (Tags: fun)

+BBComposer : Editeur BBCode intégré à Mozilla Firefox - http://bbcomposer.elitwork.com/
une extension qui permet d'éditer en mode WYSIWYG une page, avec le langage xhtml, bbcode, ou xbbcode (Tags: firefox_extension xhtml)

+Liste complète des codes HTTP - http://www.codeshttp.com/
(Tags: system:unfiled)

+FireBug - http://extensions.geckozone.org/FireBug
cette extension permet de voir le traffic xmlhttprequest, les fonctions javascript, débugger certaines pages ou scripts.... (Tags: firefox_extension)

+pygame - python game development - http://www.pygame.org/projects/20/308/
un site de développement de jeux en python (Tags: python programming games fun)

+chkrootkit -- locally checks for signs of a rootkit - http://abcdelasecurite.free.fr/chkrootkit.org/download/index.html
un anti-rootkit (Tags: anti-rootkit securite)

+clb56 - Tests en développement web - Page d'accueil. - http://clb56.freezee.org/
(Tags: webmaster tools)

+Info-Actu - http://www.info-actu.info/
un site interessant (Tags: system:unfiled)

+Tux - http://membres.lycos.fr/cybertux/
une galerie de png de pingouins :) (Tags: graphics png)

+test.php (Image PNG, 180x60 pixels) - http://www.exquisses.com/gecko/test.php?texte=Mettez+un+texte
pour mettre du texte sur une image (Tags: fun)

+Official Web 2.0 Certifyr - http://www.certifyr.com/
on aura tout vu (Tags: web2.0)

+SIW - System Information for Windows - http://www.gtopala.com/
un logiciel pour avoir différentes informations sur son ordinateur (windows). (Tags: windows tools)

+How to keep bad robots - http://www.fleiner.com/bots/
une explicaion sur les robots qui visitent les sites pour les indexer. (Tags: system:unfiled)

+Les scripts dans les documents HTML - http://www.la-grange.net/w3c/html4.01/interact/scripts.html#h-18.2.3
les évènement relatifs aux actions de la souris : onclick, onmouseover, etc.... (Tags: javascript)

+shamrock - http://marc.golinvaux.free.fr/shamrock/session.php
un autre os en ligne. (Tags: os web2.0)

+Le site de JoJaBa - http://jojaba.free.fr/
slogan du site : "Traduction d'extensions Mozilla et utilisation de PLume CMS". Un bon site, même s'il n'est plsu mis a jour. (Tags: firefox_extension)

+plone.org — plone.org - http://plone.org/
un autre cms open source (cf guppy) qui a l'air interessant (Tags: cms free)

+/IE7/ - http://dean.edwards.name/IE7/
une librairie javascript qui permet de "faire fonctionner" certaines propriétés CSS par IE. Quand est ce qu'on aura plus besoin de recourir a tant de manipulations avec ce navigateur ? (Tags: activism browser javascript)

+IE7: easier and more secure (2) - Totalement Cretin(s) - http://totalementcretin.apinc.org/blog/2006/10/26/370
youpi ! encore des failles de sécurité dans IE ! Qu'est ce qu'ils sont généreux chez microsoft ! (Tags: activism browser)

+Skybeurk Awards : Les Pires SkyBlogs du Net - http://skybeurk.net/
je déteste les skyblogs (Tags: fun blog)

+Web Development Bookmarklets - http://www.squarefree.com/bookmarklets/webdevel.html
quelques scripts javascripts (Tags: javascript)

+Lemondeduweb - http://www.lemondeduweb.net/
un site/blog interessant (Tags: blog)

+Gabbly - http://gabbly.com/
ce site permet de chatter avec les visiteurs d'un autre site. Une fenêtre s'ouvre par-dessus la page du site visité. Tout ca sans aucune installation, c'est immédiat. Essayez par exemple http://gabbly.com/sylvain.sab.free.fr/ (Tags: fun chat)

+MozCC - CcWiki - http://wiki.creativecommons.org/MozCC
Une extension pour Firefox qui permet de voir les détails d'une licence Creative Commons d'un site. (Tags: firefox firefox_extension)

+Firefox - Interview et version 2.0 finale - Logiciels/Systèmes - Actualités - http://www.commentcamarche.net/actualites/firefox-interview-et-version-2-0-finale-2437007-actualite.php3
bon téléchargement :) (Tags: firefox)

+Lutter contre les spammeurs - http://www.commentcamarche.net/faq/sujet-244-lutter-contre-les-spammeurs
(Tags: antispam securite)

+Peut-être une réponse ? - http://www.peutetreunereponse.net/
plusieurs astuces pour webmaster et autres. interessant (Tags: webmaster)

+SELFHTML - http://fr.selfhtml.org/
Une liste de balises, fonction et propriétés html/css/jS.... Trouvé via : http://www.commentcamarche.net/forum/affich-2433992 (Tags: xhtml css javascript webmaster)

+Openweb.eu.org - L'objet XMLHttpRequest - http://openweb.eu.org/articles/objet_xmlhttprequest/
(Tags: ajax programming)

+Web 2.0, allez plus loin avec AJAX et XMLHttpRequest - Club d'entraide des développeurs francophones - http://siddh.developpez.com/articles/ajax/
(Tags: ajax programming)

+Ajax et XMLHttpRequest - http://www.xul.fr/xml-ajax.html
(Tags: ajax programming tutoriel)

+Programmation PHP - Wikibooks - http://fr.wikibooks.org/wiki/Programmation_PHP
une référence sur la programmation en php sur wikipedia (Tags: php programming)

+CSS Selectors testsuite - CSS3 . info - http://www.css3.info/selectors-test/index.html
un test pour voir quels sont les selceteurs css 3 compatibles avec votre navigateur (Tags: css)

+rakaz - How well do browsers support CSS Selectors? - http://rakaz.nl/item/how_well_do_browsers_support_css_selectors
(Tags: css)

+CSS Formatteur et Optimiseur (basé sur CSSTidy 1.2) - http://www.cdburnerxp.se/cssparse/css_optimiser.php
un autre très bon optimiseur de code css (Tags: css)

+CSS Keyboard : flumpCakes - http://flumpcakes.co.uk/css/keyboard#
un faux clavier entièrement en CSS ! (Tags: css)

+Online CSS Optimiser/Optimizer : flumpCakes - http://flumpcakes.co.uk/css/optimiser/
(Tags: css)

+AJAX:Premiers pas - MDC - http://developer.mozilla.org/fr/docs/AJAX:Premiers_pas
un tutoriel sur ajax (Tags: ajax programming webmaster)

+PHP: Variables prédéfinies - Manual - http://fr2.php.net/manual/fr/reserved.variables.php#reserved.variables.server
la doc php sur les variables superglobales (Tags: php)

+PHPScripts - Scripts PHP / MySQL - MailingList / NewsLetter - http://www.phpscripts-fr.net/scripts/scripts.php?cat=MailingList+%2F+NewsLetter
(Tags: php)

+Outils [Archives] - Forum des développeurs - http://www.developpez.net/forums/archive/index.php/f-241.html
une faq sur php (Tags: php)

+BashFR.org, ... - La Maroquinerie (greenmarocain) - http://greenmarocain.blog.jeuxvideo.com/25.php
Je cite : "Sur BashFR ( http://www.bashfr.org ), on trouve des conversations marrantes trouvées sur des forums, chats, etc. Je vais mettre ici celles qui parlent de jeux vidéo. Pour certaines, avec le titre du jeu avant, c'est moins drôle, y a moins de (Tags: fun)

+Suggestions pour Firefox 3 - http://www.commentcamarche.net/actualites/suggestions-pour-firefox-3-2425727-actualite.php3
(Tags: firefox)

+Désencyclopédie:Accueil - Désencyclopédie - http://desencyclopedie.wikia.com/wiki/D%C3%A9sencyclop%C3%A9die:Accueil
une parodie de Wikipedia (Tags: fun)

+MacBidouille.com : Bidouille hardware sur Mac - http://www.macbidouille.com/articles/218/
Je cite : "Cet article détaille comment faire cohabiter Mac OS X, Linux, Windows XP et Windows Vista sur un même Mac Pro." (Tags: os windows linux)

+Quelques logiciels - http://www.keime.fr/projets.html
(Tags: freeware)

+PHPTools4U.com : Variables utiles en PHP - http://www.phptools4u.com/site/2002/06/04/97-variables-utiles-en-php
surtout des variables serveur (Tags: php)

+REGEX - REGEXP - Expressions régulières - http://www.expreg.com/
un site sur les regex en php (Tags: php)

+PNG-24 Alpha Transparency With Microsoft Internet Explorer - http://koivi.com/ie-png-transparency/
(Tags: graphics webmaster)

+Notre site a-t-il des problèmes avec Internet Explorerâ„¢? - RyXéo SARL - http://www.ryxeo.com/index.php/2006/07/12/56-notre-site-a-t-il-des-problemes-avec-internet-explorer
"Les internautes ne s'aperçoivent donc pas du manque et pensent qu'Internet Explorer est un bon navigateur". Sic.... (Tags: activism)

+Web-Modules >> Services pour Webmaster - http://web-modules.net/
(Tags: webmaster)

+Utiliser des accents et autres caractères spéciaux - http://www.commentcamarche.net/faq/sujet-188-utiliser-des-accents-et-autres-caracteres-speciaux
pour utiliser des accents dans les langages de programmation (Tags: caractere speciaux)

+Windows Process Library - http://www.liutilities.com/products/wintaskspro/processlibrary/
une autre liste de processus (Tags: tools windows)

+OpenSourceCMS - Home - http://www.opensourcecms.com/
un site de CMS open source. (les cms permettent de faire un site complet sans s'y connaitre) (Tags: free gratuit webmaster site)

+Exalead - http://www.exalead.fr/search
un nouveau moteur de recherche (Tags: system:unfiled)

+CSS Top Sites Resources - http://www.csstopsites.com/resources/
(Tags: css)

+CSS3 Preview - CSS3 . info - http://www.css3.info/preview/
un apercu de ce que permettron les CSS 3 (trouvé via les liens de sebsauvage) (Tags: css webmaster)

+apache friends - xampp pour linux - http://www.apachefriends.org/fr/xampp-linux.html
un serveur ? (Tags: system:unfiled)

+Linux-area - http://www.linux-area.info/
un site qui a l'air interessant (sur Linux) (Tags: os linux)

+AFPY — Association Francophone PYthon - http://afpy.org/
(Tags: python programming)

+CSS3 module: W3C Selectors - http://www.w3.org/Style/css3-selectors-updates/WD-css3-selectors-20010126.fr.html
plusieurs pseudo classes parfois utiles. certaines sont CSS 2 (Tags: css)

+Media Convert - free and on line - convert and split sound, ringtones, images, docs - http://media-convert.com/convert/
un convertisseur de fichiers en ligne. beaucoup de formats supportés. (Tags: system:unfiled)

+A css mouseover - http://www.cssplay.co.uk/book/index.html
une excellente utilisation des CSS. Comme d'habitude, ne fonctionne pas sous IE. (Tags: css)

+Transformations XSL (XSLT) - http://xmlfr.org/w3c/TR/xslt/
les recommandations du W3C (Tags: webmaster xml xslt)

+Changement de curseurs en CSS - http://seb.prevot.free.fr/csscursor.html
(Tags: css)

+Icon War - http://www.xs4all.nl/~jvdkuyp/flash/see.htm
(Tags: fun)

+ツ blog.virgule.info - http://blog.virgule.info/
un autre blog interessant sur divers sujets (entre autres l'informatique) (Tags: blog article)

+Proper PNG Support in Internet Explorer for Windows Petition - http://www.petitiononline.com/msiepng/petition.html
Ah, esperons que cette pétition se fera entendre et aura un impact (IE ne supporte pas les png transparents, vachement pratique d'utiliser les gifs.....) (Tags: webmaster browser article activism)

+Liens Mozilla vs IE essentiels - BlogZiNet - http://blogzinet.free.fr/index.php?2004/09/22/359-liens-mozilla-vs-ie-essentiels
Pourquoi FF est mieux que IE. On pourait aussi dire : "Pourquoi IE est le moins avancé des navigateurs graphiques". (Tags: browser article)

+Mail encoder - http://www.biologeek.com/contact/mail_encoder.php.txt
des fonctions php qui permettraient d'encoder un e mail (Tags: php webmaster securite)

+What's New in Internet Explorer 7 (Script) - http://msdn.microsoft.com/workshop/essentials/whatsnew/whatsnew_70_scr.asp
(Tags: article browser)

+Biologeek : Ubuntu, bio-informatique et geekeries libres d'un bio-informaticien au quotidien. - http://www.biologeek.com/
un bon site que j'aurais du marquer plus tôt. (Tags: webmaster article site)

+Code::Blocks IDE - Open Source, Cross-platform Free C++ IDE - http://www.codeblocks.org/
un éditeur C/C++ open source (Tags: programming logiciel gratuit freeware)

+Les sigles, acronymes et autres abréviations - http://www.acces-pour-tous.net/fichiers_communs/access.php?rub=sigles
(Tags: webmaster accessibilite)

+Jean-Yves Stervinou > RSS 2.0 traduction française - http://www.stervinou.com/projets/rss/
un article interessant sur le format rss (Tags: webmaster xml)

+Mon RSS :: Des flux RSS et des Podcast pour être au courant de l'actualité - http://www.monrss.info/
(Tags: général)

+Google Fight : proposez un combat avec googleFight - http://www.googlefight.com/index.php?lang=fr_FR
(Tags: fun)

+Linux sur la Toile - Le Site du Zéro - http://www.siteduzero.com/forum-83-55210-p1-linux-sur-la-toile.html
Une liste utile de sites sur Linux. (Tags: os linux)

+Mandriva 2007 dans les bacs - http://www.commentcamarche.net/actualites/mandriva-2007-dans-les-bacs-2406038-actualite.php3
(Tags: os linux)

+Le rêve américain... - http://www.commentcamarche.net/forum/affich-2407608-le-reve-americain
(Tags: activism)

+Nouvelle loi sur la surveillance électronique - http://www.commentcamarche.net/forum/affich-2406267-nouvelle-loi-sur-la-surveillance-electronique
En plus, les Etats unis sont en train de faire voter une loi quipermettrait d'emprisonner et de *torturer* n'importe qui sur le territoire américain. Mais vous inquiétez pas hein, c'est les défenseurs du monde libre. (Tags: activism)

+HoaxBuster - Premiere ressource francophone sur les hoax - http://www.hoaxbuster.com/
Ce site recense des chaines qui existent. Si vous recevez un mail groupé avec un contenu bidon, c'est surement une chaine. Voici comment envoyer un mail groupé en cachant les destinataires : http://sylvain.sab.free.fr/autres/temp/mailccibss.gif (Tags: securite)

+::.VideoRonk.:: Your favorite videos - http://www.videoronk.com/
ce site mermet d'enregistrer des videos de google, youtube, et autres sites de vidéo en ligne. Trouvé comme pas mal d'autres sur http://del.icio.us/sebsauvage/ (Tags: fun)

+digg labs / swarm - http://labs.digg.com/swarm/
Une animation en flash qui permet de voir les liens postés dans digg. Lorsque l'on pointe la souris sur un lien, on voit les liens en rapport. (Tags: fun)

+liveplasma music, movies, search engine and discovery engine - http://www.liveplasma.com/
Entrez le nom d'un artiste, vous aurez des artistes qui y ressemblent. En plus, c'est marrant de se balader dans ce truc : ) (Tags: fun)

+Links - http://www.ndesign-studio.com/resources/links/
des liens interresants. (Tags: webmaster fun site)

+Mini Pixel Icons - http://www.ndesign-studio.com/resources/mini-pixel-icons/
Oh, plein d'icones, génial. Trouvé via les liens de sebsauvage (http://del.icio.us/sebsauvage/ ) (Tags: images)

+Openweb.eu.org - Zoom d'images avec les CSS - http://openweb.eu.org/articles/zoom_image/
Modifier une image au survol par la souris (Tags: css webmaster)

+CodeS-SourceS.com - http://www.codes-sources.com/
(Tags: system:unfiled)

+Torpark : un Firefox anonyme et gratuit - http://www.branchez-vous.com/actu/06-09/10-295504.html
voir également http://internetauxpetitsoignons.50webs.com/ et http://matrix.samizdat.net/crypto/AnonApps/#firefox (Tags: browser)

+Openweb.eu.org - Cascade CSS et **priorité des sélecteurs** - http://openweb.eu.org/articles/cascade_css/
quelles règles CSS les navigateurs suivent-ils en premier ? (Tags: webmaster CSS)

+Openweb.eu.org - Bien valider ses formulaires avec Javascript - http://openweb.eu.org/articles/validation_formulaire/
(Tags: webmaster accessibilite)

+Openweb.eu.org - Une feuille de style pour l'impression - http://openweb.eu.org/articles/css_impression/
Attention : l'attribut "title" d'une balise link pour insérer un CSS doit prendre une valeur selon le media utilisé, par exemple "Ecran" ou "Impression", et non "Design par defaut du site" par exemple. (Tags: css webmaster)

+IE View Lite - https://addons.mozilla.org/firefox/1429/
Cette extension permet d'ouvrir une page dans IE. Il existe une extension similaire qui utilise opera. (Tags: firefox firefox_extension)

+[CSS] Les compteurs - Le Site du Zéro - http://www.siteduzero.com/tuto-3-8314-1-css-les-compteurs.html#ss_part_1
Une facon pratique de numéroter ses titres pour faire des chapitres. Mais bon, comme d'habitude, ne fonctionne pas sous IE.... (Tags: css)

+SVM: Windows Vista crée des emplois - http://svmblogs.vnunet.fr/svm/2006/09/windows_vista_c.html
Sisi, c'est vrai ! Et il ne faut pas prendre Linux hein, ca coute de l'argent a Microsft. Une analyse détaillée : http://nauges.typepad.com/my_weblog/2006/09/windows_vista_l.html (Tags: fun)

+DragDeGo - Geckozone - Extensions pour Firefox - http://extensions.geckozone.org/DragDeGo/
cette extension a l'air très pratique (Tags: firefox firefox_extension)

+View HTTP Request and Response Header - http://web-sniffer.net/
(Tags: webmaster)

+Faire un Style switcher (changement d'habillage) en PHP - Alsacréations - http://css.alsacreations.com/Tutoriels-PHP/style-switcher-php
(Tags: webmaster)

+Comment faire un arrière-plan étirable ? - Alsacreations - http://forum.alsacreations.com/faq/#item56
faire une image d'arrière plan qui s'agranda it ou se rétrécit avec le texte. (Tags: webmaster css)

+Le Coin des Experts - http://perso.orange.fr/coin.des.experts/
quelques trucs utiles ? (Tags: system:unfiled)

+Optical Illusions and Visual Phenomena - http://www.michaelbach.de/ot/index.html
oh, un site sur les illutsion d'optique.... (Tags: fun)

+Dr.Web anti-virus link checker :: Mozilla Add-ons - https://addons.mozilla.org/firefox/938
cete extension pour firefox permet de vérifier si un fichier ne comporte pas de virus avant de le télécharger (Tags: firefox firefox_extension)

+XHTML:: Comment réussir - http://ptaff.ca/xhtml/#css
un article interessant (Tags: webmaster xhtml)

+Codage valide des caractères Windows illégaux en HTML et XHTML - http://www.openweb.eu.org/articles/caracteres_illegaux/
une autre liste de caractères spéciaux (Tags: caractere speciaux)

+Christophe Bouthier - http://christ.bouthier.free.fr/index.html
un site qui a l'air interessant (Tags: site)

+Donner le bon type MIME - Alsacréations - http://forum.alsacreations.com/posting.php?action=newp&tid=5547&fid=20&p=1&q=48507
Serait-ce enfin la solution pour envoyer le bon type MIME selon le navigateur ? On dirait. Mais il faut activer le module url rewriting. (grrrr). Petit rappel : IE ne gère pas correctement la version 1.1 de http ni le type application/xhtml+xml (remarq (Tags: webmaster)

+Barre latérale - Validateur HTML / XHTML / XML / WML - http://www.validome.org/lang/fr/html/sidebar/
un plug-in pour IE qui permet de valider des sites WEB. En plus, le validateur a l'air très performant. (Tags: webmaster valid)

+FrontPage - Wiki Python Fr - http://wikipython.flibuste.net/
un site sur Python (Tags: programming)

+le blog florian54 par: Florian - http://florian54.over-blog.net/
un blog interessant (Tags: blog fun)

+Lecteur de Fichiers Universel Online - http://www.googoo.fr/lecteur_universel/
a tester (Tags: webmaster)

+Basic HTML data types - http://www.w3.org/TR/html4/types.html
les differents types de soctypes, de medias, de balises link/meta, etc.... très utile et complet (Tags: webmaster)

+Nouvelle version de ZA - http://download.zonelabs.com/bin/free/fr/zaAFR1079.html
Une nouvelle version de Zone Alarm est disponible. Mais vu ce qui s'est passé avec la précédente version, je vous coseille d'attendre avant de la télécharger. (Tags: logiciels securite)

+edit2web - http://t2net.fr/outils/edit2web/index.html
cette extension permet d'éditer le code d'une page, pour enlever les publicités par exemple (Tags: firefox firefox_extension)

+Snapper - https://addons.mozilla.org/firefox/2703/
encore un extension qui permet cette fois de faire des captures d'écran (Tags: firefox firefox_extension)

+Firefox Extension Backup - https://addons.mozilla.org/firefox/2109/
Cette extension permet de sauvegarder vos mots de passe, historique, marque pages.... etc. Ressemble un peu a MozBackup (Tags: firefox firefox_extension)

+View-source-chart - http://extensions.geckozone.org/vrs/
Cette extension pour Firefox permet de voir la source d'une page (Tags: firefox firefox_extension)

+Fixed Positioning for Windows Internet Explorer - http://tagsoup.com/-dev/null-/css/fixed/
Encore une astce qui permet de contourner les bugs CSs d'IE (Tags: webmaster css)

+Astuces - http://gcyrillus.free.fr/trucs_css/
encore des astuces (Tags: webmaster)

+Astuces xhtml/css - http://www.siteduzero.com/forum-83-6123-53117.html#r53117
pratique (Tags: webmaster)

+[Messagerie] Adresses serveurs POP ET SMTP des FAI - http://www.commentcamarche.net/faq/sujet-893-messagerie-adresses-serveurs-pop-et-smtp-des-fai
(Tags: messagerie)

+Creative Commons France - les 6 contrats - http://fr.creativecommons.org/contrats.htm
(Tags: system:unfiled)

+W3C QA - Quality Tips for Webmasters - http://www.w3.org/QA/Tips/
des recommandations sur ce qu'il ne faut pas faire sur un site (Tags: webmaster)

+Top Ten Mistakes in Web Design (Jakob Nielsen's Alertbox) - http://www.useit.com/alertbox/9605.html
les 10 choses les plus exsapérantes sur un site. (Tags: fun site)

+The OSSwin project: Open Source for Windows! - http://osswin.sourceforge.net/
Une liste de projets libres pour Windows (Tags: freeware gratuit windows)

+Google Labs - http://labs.google.com/
des moteurs de recherches spécifiques de Google (Tags: web)

+Google Accessible Search - http://labs.google.com/accessible/
Une version de google qui affiche en premier les sites les plus accessibles. (Tags: web webmaster site)

+Comparatif des navigateurs web - Club d'entraide des développeurs francophones - http://cyberzoide.developpez.com/html/navigateurs/
Une liste très complète de navigateurs (d'ailleurs, regardez le classement.... Firefox est premier partout :) (Tags: browser web)

+Nous les informaticiens - http://www.commentcamarche.net/forum/affich-236418-nous-les-informaticiens
.... (Tags: fun)

+-ware - http://www.commentcamarche.net/forum/affich-2139295-ware
Marrant (Tags: fun)

+Traduction d'extensions pour les logiciels Mozilla - http://jojaba.free.fr/traductions.htm
un site qui a l'air interessant. (Tags: extensions)

+Statistiques Navigateurs, détecter le navigateur avec PHP - http://danzcontrib2.free.fr/statistiques.php
(Tags: php webmaster site)

+Encyclopedia of HTML elements - Friendly Bit - http://friendlybit.com/html/encyclopedia-of-html-elements/
Une liste des balises html (encore) (Tags: xhtml webmaster site)

+-moz-border-radius : coins ronds avec Gecko - http://www.amaryllidaceae.org/web-jardin/CSS/moz-border-radius.htm
Des exemples concrets sur l'utilisation des propriétés CSS 3 (Tags: css webmaster)

+wiki XULfr - Reference/Css - http://xulfr.org/wiki/Reference/Css
Les propriétés CSS 3 (supportés par Firefox et autres navigateurs utilisant le moteur de rendu Gecko) qui s'appliquent aux bordures. (Tags: css webmaster)

+AMSN - IRC / Chat - Logiciels Libres - Framasoft - http://www.framasoft.net/article2077.html
aMSN remplace aisément MSN messenger. (Tags: chat messagerie)

+Forum Entraide des Helpers - http://entraide.aceboard.fr/
Un forum qui pourra vous rendre service si vous avez un problème de malware (Tags: securite)

+HTML Help by The Web Design Group - http://www.htmlhelp.com/
un site qui a l'air interessant et utile (Tags: webmaster site)

+RFC 2822 (rfc2822) - Internet Message Format - http://www.faqs.org/rfcs/rfc2822
(Tags: mail)

+solutions libres pour les Webmasters - http://cestadire.ch/
un site qui a l'air interessant (Tags: web)

+Tableless - Web Standards com arroz e feijão. - http://www.tableless.com.br/
Un site avec pas mal de tutoriels sur l'accessibilité, et les technologies du WEB 2.0 (Ajax par exemple) et autres. Bon d'accord c'est en espagnol ou italien (j'ai l'impression), mais bon... (Tags: fun webmaster site)

+Validateur HTML / XHTML / XML / WML - http://www.validome.org/
Encore un validateur (Tags: w3c standards xhtml)

+Validateur W3C Multipages pour une validation de site XHTML - http://validateur.ca/
Ce validateur vous permet de valider l'ensemble des pages d'un site en une seule fois. un énorme gain de temps. (Tags: valid w3c xhtml)

+Détecteur de politesse - http://www.technicland.com/fixvirus.php3
... (Tags: fun)

+Mozilla and Firefox Games - http://mouserunner.com/Mozilla_and_Firefox_Games.html
(Tags: firefox fun games)

+GSpot Codec Information Appliance - http://www.headbands.com/gspot/
un logiciel qui indique le codec dont on a besoin pour lire un fichier. (Tags: codec)

+GMER - http://www.gmer.net/
Un détecteur de rootkits pour windows (il existe aussi un logiciel de la société sysinternals (RootkitRevealer) et un logiciel de la société fsecure (blacklight)) (Tags: anti-rootkit)

+[Tutoriels] Tutoriels de logiciels - La solution - http://www.commentcamarche.net/faq/sujet-3045-tutoriels-tutoriels-de-logiciels
(Tags: tutoriel windows logiciels)

+AnyBrowser.COM - http://www.anybrowser.com/siteviewer.html
Pratique, ce site permet de voir a quoi ressemble votre site si on desactive javascript et certains des CSS. (Tags: accessibilite)

+ZAP - http://bluestorm.info/ZAP/
ZAP signifie zCode A Plusieurs. Le zCode est un langage dévellopé par le site du zero. Le ZAP est donc un wiki, vous pouvez y participer. (Tags: wiki)

+Optimiser un script php - http://www.vulgarisation-informatique.com/optimiser-php.php
voir aussi: http://www.phpdebutant.org/article147.php http://www.blueshoes.org/en/developer/php_bench/ http://www.siteduzero.com/tuto-3-1600-1-optimiser-un-script-php.html (Tags: php)

+Liste des balises html - http://www.aliasdmc.fr/
et leurs équivalent en CSS et javascript. (Tags: css xhtml)

+créer un site web ? - http://www.salemioche.net/
je n'avais encore jamais vu ce site, ou il y a plusieurs tutoriaux sur les langages du web. (Tags: site webmaster)

+Ce que votre browser internet revele de vous - http://www.yazerty.net/category/Soft-spirit
Marrant. (Tags: fun)

+Navigateur Lynx, codes usuels - http://dominique.guebey.club.fr/tekno/lynx/lynx_com.htm
Les touches utilisées pour naviguer dans Lynx (Tags: lynx browser)

+Lynx, un navigateur en mode texte - http://lynx.isc.org/
Pour des liens ou tester son site avec Lynx, voir : http://forum.alsacreations.com/topic-6-11061-1.html (Tags: lynx browser)

+Free Anti Spam and Spyware Programs - http://www.freeantispam.org/
Un site qui distribue des antispams et antispywares gratuits. (Tags: antispam antispyware gratuit)

+Your Firefox browser guide. Download it now! - http://www.browserfirefox.com/
un autre site sur Firefox qui a l'air interessant. Je ne connaissais pas. (Tags: firefox)

+HTML 4.0 Latin-1 Entities - http://www.htmlhelp.com/reference/html40/entities/latin1.html
Idem, mais avec plus de combinaisons que alt (Tags: caractere speciaux)

+Combinaisons De Nombre + Alt - http://www.starr.net/is/type/altnum-fr.html
Cette page montre les caractères spéciaux que l'on peut écrire avec la touche [Alt] et une combinaison de chiffres (0356 par exemple). (Tags: caractere speciaux)

+Processus Windows - http://www.generation-nt.com/processus/
Une liste de plein de processus Windows. (Tags: processus windows)

+Ajouter un moteur de recherche a Firefox - http://www.commentcamarche.net/forum/affich-1312312-firefox-recherche-integre
Une manière très simple d'ajouter son propre moteur de recherche a firefox. très patique. (Tags: firefox firefox_add-on)

+Concise Freeware - http://www.concisefreeware.com/
Un site de freeware (logiciel gratuit) très complet (Tags: freeware logiciels gratuit)

+Désactiver le mouchard WGA - http://www.commentcamarche.net/forum/affich-2256094-wga-supprimer-windows-genuine-advantage
Ce topic donne divers liens pour expliquer comment désactiver et desinstaller le progrmmae wga, un mouchard (?) de windows. (Tags: wga windows spyware)

+Pine Information Center - http://www.washington.edu/pine/
Pine, un logiciel de messagerie en mode texte. (Tags: mail)

+N'envoyez pas vos mails en html - http://www.freeantispam.org/gratuit/email-html.php
Plusieurs bonnes raisons de ne pas envoyre ses e mails en html. préferez le format texte. (Tags: mail)

+SessionSaver .2 :: Mozilla Add-ons - https://addons.mozilla.org/firefox/436/
Une extension pour firefox qui permet de sauvegarder sa session. je vais l'essayer (Tags: firefox firefox_add-on)

+BLACK BOX SEARCH... no IP, no tracking cookies, no logging - EVER! - http://www.blackboxsearch.com/
Permet d'utiliser un proxy pour éviter que les moteurs de recherche n'enregistrent vos recherches (trouvé sur les liens de sebsauvage) (Tags: internet privacy tools)

+XHTML CSS - http://xhtml.css.free.fr/
Un site qui a l'air interessant (Tags: xhtml css site webmaster)

+Transformer du texte. - http://spins.us/tools/l33t.asp
Avec ca, vous pouvez transformer votre text en "mode geek" (Tags: geek)

+Plusieurs tutoriels sur les langages du web. - http://www.startyourdev.com/
(Tags: tutoriel webmaster)

+Polices de caractère - http://www.visibone.com/font/FontResults.html
une liste de polices de caractères. (Tags: police font caractere)

+Une seule page pour le site. - http://www.siteduzero.com/tuto-3-6192-1-la-base-d-039-un-site-php.html
Comment faire une seule page source en PHP, valide html, avec un titre qui change, bref, comme il faut. Très utile. (Tags: php webmaster)

+centricle : css filters (css hacks) - http://centricle.com/ref/css/filters/
un schéma qui mon tre plein de facons de cacher une propriété CSS a un ou des navigateurs. très complet. (Tags: css webmaster)

+Logiciels Libres pour Windows - http://loliwin.org/contenu.php
(Tags: logiciels open-source)

+Validateur d'accessibilité - http://validateur-accessibilite.apinc.org/mode_emploi_validateur.htm
Pour vérifier si votre site est accessible et si la sémantique est bonne. (Tags: accessibilite)

+Extension foxylicious pour firefox - https://addons.mozilla.org/firefox/1532/
(Tags: firefox firefox_add-on del.icio.us)

+Top 10 Firefox Web 2.0 Add-ons - http://www.readwriteweb.com/archives/top_10_firefox_addons.php
Un classement des 10 meilleurs extensions pour firefox. (dont del.icio.us). (Tags: firefox_add-on)

+Use links in your document - Quality Web Tips - http://www.w3.org/QA/Tips/use-links
Les recommandations du w3c : utiliser les éléments link. utile, a voir. (Tags: w3c standards xhtml)

+C'est quoi windows - Mon premier essai de ce système d'exploitation - http://membres.lycos.fr/cestquoiwindows/
Un linuxien qui a essayé Windows. C'est assez parlant. (Tags: Windows Linux)

+Welcome to YouOS. - https://www.youos.com/
Un système d'exploitation directement dans le navigateur (Tags: os youos)

+GeSHI - colorer son code - http://www.siteduzero.com/tuto-3-7340-1-colorer-son-code.html
pratique pour colorer du code sans utiliser span class... (Tags: webmaster)

+Plein d'images mozilla - http://mozilla.tlk.fr/splash.php
(Tags: images mozilla)

+Mozilla Thunderbird 2.0 en alpha est de sortie - http://www.generation-nt.com/actualites/17335/mozilla-thunderbird-alpha-client-messagerie/
(Tags: mail thunderbird)

+FavIcon from Pics -- favicon.ico for your website - http://www.html-kit.com/favicon/
faire une favicon a partir d'une image avec du texte défilant (Tags: web icon)

+Icônes de pages web, la favicon.ico - XHTML.net - http://www.xhtml.net/xhtmlcss/favicon
ce qu'est une favicon, comment en faire une pour son site et autres (Tags: web site icon webmaster)

+

+
+

Cette page à été créée avec un programme de + Sébastien Sauvage, que j'ai modifié.
+ Plus d'informations : instructions +

+ blob - /dev/null blob + d8a95f67c5d7c3bd01479be67f50e3e239022872 (mode 644) --- /dev/null +++ pages/menu.php @@ -0,0 +1,5 @@ + blob - /dev/null blob + 4bf05a52365e10fe5a404ae641d3daaafa4505f2 (mode 644) --- /dev/null +++ pclzip.lib.php @@ -0,0 +1,5694 @@ +zipname = $p_zipname; + $this->zip_fd = 0; + $this->magic_quotes_status = -1; + + // ----- Return + return; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : + // create($p_filelist, $p_add_dir="", $p_remove_dir="") + // create($p_filelist, $p_option, $p_option_value, ...) + // Description : + // This method supports two different synopsis. The first one is historical. + // This method creates a Zip Archive. The Zip file is created in the + // filesystem. The files and directories indicated in $p_filelist + // are added in the archive. See the parameters description for the + // supported format of $p_filelist. + // When a directory is in the list, the directory and its content is added + // in the archive. + // In this synopsis, the function takes an optional variable list of + // options. See bellow the supported options. + // Parameters : + // $p_filelist : An array containing file or directory names, or + // a string containing one filename or one directory name, or + // a string containing a list of filenames and/or directory + // names separated by spaces. + // $p_add_dir : A path to add before the real path of the archived file, + // in order to have it memorized in the archive. + // $p_remove_dir : A path to remove from the real path of the file to archive, + // in order to have a shorter path memorized in the archive. + // When $p_add_dir and $p_remove_dir are set, $p_remove_dir + // is removed first, before $p_add_dir is added. + // Options : + // PCLZIP_OPT_ADD_PATH : + // PCLZIP_OPT_REMOVE_PATH : + // PCLZIP_OPT_REMOVE_ALL_PATH : + // PCLZIP_OPT_COMMENT : + // PCLZIP_CB_PRE_ADD : + // PCLZIP_CB_POST_ADD : + // Return Values : + // 0 on failure, + // The list of the added files, with a status of the add action. + // (see PclZip::listContent() for list entry format) + // -------------------------------------------------------------------------------- + function create($p_filelist) + { + $v_result=1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Set default values + $v_options = array(); + $v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE; + + // ----- Look for variable options arguments + $v_size = func_num_args(); + + // ----- Look for arguments + if ($v_size > 1) { + // ----- Get the arguments + $v_arg_list = func_get_args(); + + // ----- Remove from the options list the first argument + array_shift($v_arg_list); + $v_size--; + + // ----- Look for first arg + if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { + + // ----- Parse the options + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, + array (PCLZIP_OPT_REMOVE_PATH => 'optional', + PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', + PCLZIP_OPT_ADD_PATH => 'optional', + PCLZIP_CB_PRE_ADD => 'optional', + PCLZIP_CB_POST_ADD => 'optional', + PCLZIP_OPT_NO_COMPRESSION => 'optional', + PCLZIP_OPT_COMMENT => 'optional', + PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', + PCLZIP_OPT_TEMP_FILE_ON => 'optional', + PCLZIP_OPT_TEMP_FILE_OFF => 'optional' + //, PCLZIP_OPT_CRYPT => 'optional' + )); + if ($v_result != 1) { + return 0; + } + } + + // ----- Look for 2 args + // Here we need to support the first historic synopsis of the + // method. + else { + + // ----- Get the first argument + $v_options[PCLZIP_OPT_ADD_PATH] = $v_arg_list[0]; + + // ----- Look for the optional second argument + if ($v_size == 2) { + $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1]; + } + else if ($v_size > 2) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, + "Invalid number / type of arguments"); + return 0; + } + } + } + + // ----- Look for default option values + $this->privOptionDefaultThreshold($v_options); + + // ----- Init + $v_string_list = array(); + $v_att_list = array(); + $v_filedescr_list = array(); + $p_result_list = array(); + + // ----- Look if the $p_filelist is really an array + if (is_array($p_filelist)) { + + // ----- Look if the first element is also an array + // This will mean that this is a file description entry + if (isset($p_filelist[0]) && is_array($p_filelist[0])) { + $v_att_list = $p_filelist; + } + + // ----- The list is a list of string names + else { + $v_string_list = $p_filelist; + } + } + + // ----- Look if the $p_filelist is a string + else if (is_string($p_filelist)) { + // ----- Create a list from the string + $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist); + } + + // ----- Invalid variable type for $p_filelist + else { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_filelist"); + return 0; + } + + // ----- Reformat the string list + if (sizeof($v_string_list) != 0) { + foreach ($v_string_list as $v_string) { + if ($v_string != '') { + $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string; + } + else { + } + } + } + + // ----- For each file in the list check the attributes + $v_supported_attributes + = array ( PCLZIP_ATT_FILE_NAME => 'mandatory' + ,PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional' + ,PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional' + ,PCLZIP_ATT_FILE_MTIME => 'optional' + ,PCLZIP_ATT_FILE_CONTENT => 'optional' + ,PCLZIP_ATT_FILE_COMMENT => 'optional' + ); + foreach ($v_att_list as $v_entry) { + $v_result = $this->privFileDescrParseAtt($v_entry, + $v_filedescr_list[], + $v_options, + $v_supported_attributes); + if ($v_result != 1) { + return 0; + } + } + + // ----- Expand the filelist (expand directories) + $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options); + if ($v_result != 1) { + return 0; + } + + // ----- Call the create fct + $v_result = $this->privCreate($v_filedescr_list, $p_result_list, $v_options); + if ($v_result != 1) { + return 0; + } + + // ----- Return + return $p_result_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : + // add($p_filelist, $p_add_dir="", $p_remove_dir="") + // add($p_filelist, $p_option, $p_option_value, ...) + // Description : + // This method supports two synopsis. The first one is historical. + // This methods add the list of files in an existing archive. + // If a file with the same name already exists, it is added at the end of the + // archive, the first one is still present. + // If the archive does not exist, it is created. + // Parameters : + // $p_filelist : An array containing file or directory names, or + // a string containing one filename or one directory name, or + // a string containing a list of filenames and/or directory + // names separated by spaces. + // $p_add_dir : A path to add before the real path of the archived file, + // in order to have it memorized in the archive. + // $p_remove_dir : A path to remove from the real path of the file to archive, + // in order to have a shorter path memorized in the archive. + // When $p_add_dir and $p_remove_dir are set, $p_remove_dir + // is removed first, before $p_add_dir is added. + // Options : + // PCLZIP_OPT_ADD_PATH : + // PCLZIP_OPT_REMOVE_PATH : + // PCLZIP_OPT_REMOVE_ALL_PATH : + // PCLZIP_OPT_COMMENT : + // PCLZIP_OPT_ADD_COMMENT : + // PCLZIP_OPT_PREPEND_COMMENT : + // PCLZIP_CB_PRE_ADD : + // PCLZIP_CB_POST_ADD : + // Return Values : + // 0 on failure, + // The list of the added files, with a status of the add action. + // (see PclZip::listContent() for list entry format) + // -------------------------------------------------------------------------------- + function add($p_filelist) + { + $v_result=1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Set default values + $v_options = array(); + $v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE; + + // ----- Look for variable options arguments + $v_size = func_num_args(); + + // ----- Look for arguments + if ($v_size > 1) { + // ----- Get the arguments + $v_arg_list = func_get_args(); + + // ----- Remove form the options list the first argument + array_shift($v_arg_list); + $v_size--; + + // ----- Look for first arg + if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { + + // ----- Parse the options + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, + array (PCLZIP_OPT_REMOVE_PATH => 'optional', + PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', + PCLZIP_OPT_ADD_PATH => 'optional', + PCLZIP_CB_PRE_ADD => 'optional', + PCLZIP_CB_POST_ADD => 'optional', + PCLZIP_OPT_NO_COMPRESSION => 'optional', + PCLZIP_OPT_COMMENT => 'optional', + PCLZIP_OPT_ADD_COMMENT => 'optional', + PCLZIP_OPT_PREPEND_COMMENT => 'optional', + PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', + PCLZIP_OPT_TEMP_FILE_ON => 'optional', + PCLZIP_OPT_TEMP_FILE_OFF => 'optional' + //, PCLZIP_OPT_CRYPT => 'optional' + )); + if ($v_result != 1) { + return 0; + } + } + + // ----- Look for 2 args + // Here we need to support the first historic synopsis of the + // method. + else { + + // ----- Get the first argument + $v_options[PCLZIP_OPT_ADD_PATH] = $v_add_path = $v_arg_list[0]; + + // ----- Look for the optional second argument + if ($v_size == 2) { + $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1]; + } + else if ($v_size > 2) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); + + // ----- Return + return 0; + } + } + } + + // ----- Look for default option values + $this->privOptionDefaultThreshold($v_options); + + // ----- Init + $v_string_list = array(); + $v_att_list = array(); + $v_filedescr_list = array(); + $p_result_list = array(); + + // ----- Look if the $p_filelist is really an array + if (is_array($p_filelist)) { + + // ----- Look if the first element is also an array + // This will mean that this is a file description entry + if (isset($p_filelist[0]) && is_array($p_filelist[0])) { + $v_att_list = $p_filelist; + } + + // ----- The list is a list of string names + else { + $v_string_list = $p_filelist; + } + } + + // ----- Look if the $p_filelist is a string + else if (is_string($p_filelist)) { + // ----- Create a list from the string + $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist); + } + + // ----- Invalid variable type for $p_filelist + else { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type '".gettype($p_filelist)."' for p_filelist"); + return 0; + } + + // ----- Reformat the string list + if (sizeof($v_string_list) != 0) { + foreach ($v_string_list as $v_string) { + $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string; + } + } + + // ----- For each file in the list check the attributes + $v_supported_attributes + = array ( PCLZIP_ATT_FILE_NAME => 'mandatory' + ,PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional' + ,PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional' + ,PCLZIP_ATT_FILE_MTIME => 'optional' + ,PCLZIP_ATT_FILE_CONTENT => 'optional' + ,PCLZIP_ATT_FILE_COMMENT => 'optional' + ); + foreach ($v_att_list as $v_entry) { + $v_result = $this->privFileDescrParseAtt($v_entry, + $v_filedescr_list[], + $v_options, + $v_supported_attributes); + if ($v_result != 1) { + return 0; + } + } + + // ----- Expand the filelist (expand directories) + $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options); + if ($v_result != 1) { + return 0; + } + + // ----- Call the create fct + $v_result = $this->privAdd($v_filedescr_list, $p_result_list, $v_options); + if ($v_result != 1) { + return 0; + } + + // ----- Return + return $p_result_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : listContent() + // Description : + // This public method, gives the list of the files and directories, with their + // properties. + // The properties of each entries in the list are (used also in other functions) : + // filename : Name of the file. For a create or add action it is the filename + // given by the user. For an extract function it is the filename + // of the extracted file. + // stored_filename : Name of the file / directory stored in the archive. + // size : Size of the stored file. + // compressed_size : Size of the file's data compressed in the archive + // (without the headers overhead) + // mtime : Last known modification date of the file (UNIX timestamp) + // comment : Comment associated with the file + // folder : true | false + // index : index of the file in the archive + // status : status of the action (depending of the action) : + // Values are : + // ok : OK ! + // filtered : the file / dir is not extracted (filtered by user) + // already_a_directory : the file can not be extracted because a + // directory with the same name already exists + // write_protected : the file can not be extracted because a file + // with the same name already exists and is + // write protected + // newer_exist : the file was not extracted because a newer file exists + // path_creation_fail : the file is not extracted because the folder + // does not exist and can not be created + // write_error : the file was not extracted because there was a + // error while writing the file + // read_error : the file was not extracted because there was a error + // while reading the file + // invalid_header : the file was not extracted because of an archive + // format error (bad file header) + // Note that each time a method can continue operating when there + // is an action error on a file, the error is only logged in the file status. + // Return Values : + // 0 on an unrecoverable failure, + // The list of the files in the archive. + // -------------------------------------------------------------------------------- + function listContent() + { + $v_result=1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + return(0); + } + + // ----- Call the extracting fct + $p_list = array(); + if (($v_result = $this->privList($p_list)) != 1) + { + unset($p_list); + return(0); + } + + // ----- Return + return $p_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : + // extract($p_path="./", $p_remove_path="") + // extract([$p_option, $p_option_value, ...]) + // Description : + // This method supports two synopsis. The first one is historical. + // This method extract all the files / directories from the archive to the + // folder indicated in $p_path. + // If you want to ignore the 'root' part of path of the memorized files + // you can indicate this in the optional $p_remove_path parameter. + // By default, if a newer file with the same name already exists, the + // file is not extracted. + // + // If both PCLZIP_OPT_PATH and PCLZIP_OPT_ADD_PATH aoptions + // are used, the path indicated in PCLZIP_OPT_ADD_PATH is append + // at the end of the path value of PCLZIP_OPT_PATH. + // Parameters : + // $p_path : Path where the files and directories are to be extracted + // $p_remove_path : First part ('root' part) of the memorized path + // (if any similar) to remove while extracting. + // Options : + // PCLZIP_OPT_PATH : + // PCLZIP_OPT_ADD_PATH : + // PCLZIP_OPT_REMOVE_PATH : + // PCLZIP_OPT_REMOVE_ALL_PATH : + // PCLZIP_CB_PRE_EXTRACT : + // PCLZIP_CB_POST_EXTRACT : + // Return Values : + // 0 or a negative value on failure, + // The list of the extracted files, with a status of the action. + // (see PclZip::listContent() for list entry format) + // -------------------------------------------------------------------------------- + function extract() + { + $v_result=1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + return(0); + } + + // ----- Set default values + $v_options = array(); +// $v_path = "./"; + $v_path = ''; + $v_remove_path = ""; + $v_remove_all_path = false; + + // ----- Look for variable options arguments + $v_size = func_num_args(); + + // ----- Default values for option + $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE; + + // ----- Look for arguments + if ($v_size > 0) { + // ----- Get the arguments + $v_arg_list = func_get_args(); + + // ----- Look for first arg + if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { + + // ----- Parse the options + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, + array (PCLZIP_OPT_PATH => 'optional', + PCLZIP_OPT_REMOVE_PATH => 'optional', + PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', + PCLZIP_OPT_ADD_PATH => 'optional', + PCLZIP_CB_PRE_EXTRACT => 'optional', + PCLZIP_CB_POST_EXTRACT => 'optional', + PCLZIP_OPT_SET_CHMOD => 'optional', + PCLZIP_OPT_BY_NAME => 'optional', + PCLZIP_OPT_BY_EREG => 'optional', + PCLZIP_OPT_BY_PREG => 'optional', + PCLZIP_OPT_BY_INDEX => 'optional', + PCLZIP_OPT_EXTRACT_AS_STRING => 'optional', + PCLZIP_OPT_EXTRACT_IN_OUTPUT => 'optional', + PCLZIP_OPT_REPLACE_NEWER => 'optional' + ,PCLZIP_OPT_STOP_ON_ERROR => 'optional' + ,PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional', + PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', + PCLZIP_OPT_TEMP_FILE_ON => 'optional', + PCLZIP_OPT_TEMP_FILE_OFF => 'optional' + )); + if ($v_result != 1) { + return 0; + } + + // ----- Set the arguments + if (isset($v_options[PCLZIP_OPT_PATH])) { + $v_path = $v_options[PCLZIP_OPT_PATH]; + } + if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) { + $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH]; + } + if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { + $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH]; + } + if (isset($v_options[PCLZIP_OPT_ADD_PATH])) { + // ----- Check for '/' in last path char + if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) { + $v_path .= '/'; + } + $v_path .= $v_options[PCLZIP_OPT_ADD_PATH]; + } + } + + // ----- Look for 2 args + // Here we need to support the first historic synopsis of the + // method. + else { + + // ----- Get the first argument + $v_path = $v_arg_list[0]; + + // ----- Look for the optional second argument + if ($v_size == 2) { + $v_remove_path = $v_arg_list[1]; + } + else if ($v_size > 2) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); + + // ----- Return + return 0; + } + } + } + + // ----- Look for default option values + $this->privOptionDefaultThreshold($v_options); + + // ----- Trace + + // ----- Call the extracting fct + $p_list = array(); + $v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path, + $v_remove_all_path, $v_options); + if ($v_result < 1) { + unset($p_list); + return(0); + } + + // ----- Return + return $p_list; + } + // -------------------------------------------------------------------------------- + + + // -------------------------------------------------------------------------------- + // Function : + // extractByIndex($p_index, $p_path="./", $p_remove_path="") + // extractByIndex($p_index, [$p_option, $p_option_value, ...]) + // Description : + // This method supports two synopsis. The first one is historical. + // This method is doing a partial extract of the archive. + // The extracted files or folders are identified by their index in the + // archive (from 0 to n). + // Note that if the index identify a folder, only the folder entry is + // extracted, not all the files included in the archive. + // Parameters : + // $p_index : A single index (integer) or a string of indexes of files to + // extract. The form of the string is "0,4-6,8-12" with only numbers + // and '-' for range or ',' to separate ranges. No spaces or ';' + // are allowed. + // $p_path : Path where the files and directories are to be extracted + // $p_remove_path : First part ('root' part) of the memorized path + // (if any similar) to remove while extracting. + // Options : + // PCLZIP_OPT_PATH : + // PCLZIP_OPT_ADD_PATH : + // PCLZIP_OPT_REMOVE_PATH : + // PCLZIP_OPT_REMOVE_ALL_PATH : + // PCLZIP_OPT_EXTRACT_AS_STRING : The files are extracted as strings and + // not as files. + // The resulting content is in a new field 'content' in the file + // structure. + // This option must be used alone (any other options are ignored). + // PCLZIP_CB_PRE_EXTRACT : + // PCLZIP_CB_POST_EXTRACT : + // Return Values : + // 0 on failure, + // The list of the extracted files, with a status of the action. + // (see PclZip::listContent() for list entry format) + // -------------------------------------------------------------------------------- + //function extractByIndex($p_index, options...) + function extractByIndex($p_index) + { + $v_result=1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + return(0); + } + + // ----- Set default values + $v_options = array(); +// $v_path = "./"; + $v_path = ''; + $v_remove_path = ""; + $v_remove_all_path = false; + + // ----- Look for variable options arguments + $v_size = func_num_args(); + + // ----- Default values for option + $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE; + + // ----- Look for arguments + if ($v_size > 1) { + // ----- Get the arguments + $v_arg_list = func_get_args(); + + // ----- Remove form the options list the first argument + array_shift($v_arg_list); + $v_size--; + + // ----- Look for first arg + if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { + + // ----- Parse the options + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, + array (PCLZIP_OPT_PATH => 'optional', + PCLZIP_OPT_REMOVE_PATH => 'optional', + PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', + PCLZIP_OPT_EXTRACT_AS_STRING => 'optional', + PCLZIP_OPT_ADD_PATH => 'optional', + PCLZIP_CB_PRE_EXTRACT => 'optional', + PCLZIP_CB_POST_EXTRACT => 'optional', + PCLZIP_OPT_SET_CHMOD => 'optional', + PCLZIP_OPT_REPLACE_NEWER => 'optional' + ,PCLZIP_OPT_STOP_ON_ERROR => 'optional' + ,PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional', + PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', + PCLZIP_OPT_TEMP_FILE_ON => 'optional', + PCLZIP_OPT_TEMP_FILE_OFF => 'optional' + )); + if ($v_result != 1) { + return 0; + } + + // ----- Set the arguments + if (isset($v_options[PCLZIP_OPT_PATH])) { + $v_path = $v_options[PCLZIP_OPT_PATH]; + } + if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) { + $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH]; + } + if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { + $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH]; + } + if (isset($v_options[PCLZIP_OPT_ADD_PATH])) { + // ----- Check for '/' in last path char + if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) { + $v_path .= '/'; + } + $v_path .= $v_options[PCLZIP_OPT_ADD_PATH]; + } + if (!isset($v_options[PCLZIP_OPT_EXTRACT_AS_STRING])) { + $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE; + } + else { + } + } + + // ----- Look for 2 args + // Here we need to support the first historic synopsis of the + // method. + else { + + // ----- Get the first argument + $v_path = $v_arg_list[0]; + + // ----- Look for the optional second argument + if ($v_size == 2) { + $v_remove_path = $v_arg_list[1]; + } + else if ($v_size > 2) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); + + // ----- Return + return 0; + } + } + } + + // ----- Trace + + // ----- Trick + // Here I want to reuse extractByRule(), so I need to parse the $p_index + // with privParseOptions() + $v_arg_trick = array (PCLZIP_OPT_BY_INDEX, $p_index); + $v_options_trick = array(); + $v_result = $this->privParseOptions($v_arg_trick, sizeof($v_arg_trick), $v_options_trick, + array (PCLZIP_OPT_BY_INDEX => 'optional' )); + if ($v_result != 1) { + return 0; + } + $v_options[PCLZIP_OPT_BY_INDEX] = $v_options_trick[PCLZIP_OPT_BY_INDEX]; + + // ----- Look for default option values + $this->privOptionDefaultThreshold($v_options); + + // ----- Call the extracting fct + if (($v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path, $v_remove_all_path, $v_options)) < 1) { + return(0); + } + + // ----- Return + return $p_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : + // delete([$p_option, $p_option_value, ...]) + // Description : + // This method removes files from the archive. + // If no parameters are given, then all the archive is emptied. + // Parameters : + // None or optional arguments. + // Options : + // PCLZIP_OPT_BY_INDEX : + // PCLZIP_OPT_BY_NAME : + // PCLZIP_OPT_BY_EREG : + // PCLZIP_OPT_BY_PREG : + // Return Values : + // 0 on failure, + // The list of the files which are still present in the archive. + // (see PclZip::listContent() for list entry format) + // -------------------------------------------------------------------------------- + function delete() + { + $v_result=1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + return(0); + } + + // ----- Set default values + $v_options = array(); + + // ----- Look for variable options arguments + $v_size = func_num_args(); + + // ----- Look for arguments + if ($v_size > 0) { + // ----- Get the arguments + $v_arg_list = func_get_args(); + + // ----- Parse the options + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, + array (PCLZIP_OPT_BY_NAME => 'optional', + PCLZIP_OPT_BY_EREG => 'optional', + PCLZIP_OPT_BY_PREG => 'optional', + PCLZIP_OPT_BY_INDEX => 'optional' )); + if ($v_result != 1) { + return 0; + } + } + + // ----- Magic quotes trick + $this->privDisableMagicQuotes(); + + // ----- Call the delete fct + $v_list = array(); + if (($v_result = $this->privDeleteByRule($v_list, $v_options)) != 1) { + $this->privSwapBackMagicQuotes(); + unset($v_list); + return(0); + } + + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : deleteByIndex() + // Description : + // ***** Deprecated ***** + // delete(PCLZIP_OPT_BY_INDEX, $p_index) should be prefered. + // -------------------------------------------------------------------------------- + function deleteByIndex($p_index) + { + + $p_list = $this->delete(PCLZIP_OPT_BY_INDEX, $p_index); + + // ----- Return + return $p_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : properties() + // Description : + // This method gives the properties of the archive. + // The properties are : + // nb : Number of files in the archive + // comment : Comment associated with the archive file + // status : not_exist, ok + // Parameters : + // None + // Return Values : + // 0 on failure, + // An array with the archive properties. + // -------------------------------------------------------------------------------- + function properties() + { + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Magic quotes trick + $this->privDisableMagicQuotes(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + $this->privSwapBackMagicQuotes(); + return(0); + } + + // ----- Default properties + $v_prop = array(); + $v_prop['comment'] = ''; + $v_prop['nb'] = 0; + $v_prop['status'] = 'not_exist'; + + // ----- Look if file exists + if (@is_file($this->zipname)) + { + // ----- Open the zip file + if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0) + { + $this->privSwapBackMagicQuotes(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in binary read mode'); + + // ----- Return + return 0; + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) + { + $this->privSwapBackMagicQuotes(); + return 0; + } + + // ----- Close the zip file + $this->privCloseFd(); + + // ----- Set the user attributes + $v_prop['comment'] = $v_central_dir['comment']; + $v_prop['nb'] = $v_central_dir['entries']; + $v_prop['status'] = 'ok'; + } + + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_prop; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : duplicate() + // Description : + // This method creates an archive by copying the content of an other one. If + // the archive already exist, it is replaced by the new one without any warning. + // Parameters : + // $p_archive : The filename of a valid archive, or + // a valid PclZip object. + // Return Values : + // 1 on success. + // 0 or a negative value on error (error code). + // -------------------------------------------------------------------------------- + function duplicate($p_archive) + { + $v_result = 1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Look if the $p_archive is a PclZip object + if ((is_object($p_archive)) && (get_class($p_archive) == 'pclzip')) + { + + // ----- Duplicate the archive + $v_result = $this->privDuplicate($p_archive->zipname); + } + + // ----- Look if the $p_archive is a string (so a filename) + else if (is_string($p_archive)) + { + + // ----- Check that $p_archive is a valid zip file + // TBC : Should also check the archive format + if (!is_file($p_archive)) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "No file with filename '".$p_archive."'"); + $v_result = PCLZIP_ERR_MISSING_FILE; + } + else { + // ----- Duplicate the archive + $v_result = $this->privDuplicate($p_archive); + } + } + + // ----- Invalid variable + else + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add"); + $v_result = PCLZIP_ERR_INVALID_PARAMETER; + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : merge() + // Description : + // This method merge the $p_archive_to_add archive at the end of the current + // one ($this). + // If the archive ($this) does not exist, the merge becomes a duplicate. + // If the $p_archive_to_add archive does not exist, the merge is a success. + // Parameters : + // $p_archive_to_add : It can be directly the filename of a valid zip archive, + // or a PclZip object archive. + // Return Values : + // 1 on success, + // 0 or negative values on error (see below). + // -------------------------------------------------------------------------------- + function merge($p_archive_to_add) + { + $v_result = 1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + return(0); + } + + // ----- Look if the $p_archive_to_add is a PclZip object + if ((is_object($p_archive_to_add)) && (get_class($p_archive_to_add) == 'pclzip')) + { + + // ----- Merge the archive + $v_result = $this->privMerge($p_archive_to_add); + } + + // ----- Look if the $p_archive_to_add is a string (so a filename) + else if (is_string($p_archive_to_add)) + { + + // ----- Create a temporary archive + $v_object_archive = new PclZip($p_archive_to_add); + + // ----- Merge the archive + $v_result = $this->privMerge($v_object_archive); + } + + // ----- Invalid variable + else + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add"); + $v_result = PCLZIP_ERR_INVALID_PARAMETER; + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + + + // -------------------------------------------------------------------------------- + // Function : errorCode() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function errorCode() + { + if (PCLZIP_ERROR_EXTERNAL == 1) { + return(PclErrorCode()); + } + else { + return($this->error_code); + } + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : errorName() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function errorName($p_with_code=false) + { + $v_name = array ( PCLZIP_ERR_NO_ERROR => 'PCLZIP_ERR_NO_ERROR', + PCLZIP_ERR_WRITE_OPEN_FAIL => 'PCLZIP_ERR_WRITE_OPEN_FAIL', + PCLZIP_ERR_READ_OPEN_FAIL => 'PCLZIP_ERR_READ_OPEN_FAIL', + PCLZIP_ERR_INVALID_PARAMETER => 'PCLZIP_ERR_INVALID_PARAMETER', + PCLZIP_ERR_MISSING_FILE => 'PCLZIP_ERR_MISSING_FILE', + PCLZIP_ERR_FILENAME_TOO_LONG => 'PCLZIP_ERR_FILENAME_TOO_LONG', + PCLZIP_ERR_INVALID_ZIP => 'PCLZIP_ERR_INVALID_ZIP', + PCLZIP_ERR_BAD_EXTRACTED_FILE => 'PCLZIP_ERR_BAD_EXTRACTED_FILE', + PCLZIP_ERR_DIR_CREATE_FAIL => 'PCLZIP_ERR_DIR_CREATE_FAIL', + PCLZIP_ERR_BAD_EXTENSION => 'PCLZIP_ERR_BAD_EXTENSION', + PCLZIP_ERR_BAD_FORMAT => 'PCLZIP_ERR_BAD_FORMAT', + PCLZIP_ERR_DELETE_FILE_FAIL => 'PCLZIP_ERR_DELETE_FILE_FAIL', + PCLZIP_ERR_RENAME_FILE_FAIL => 'PCLZIP_ERR_RENAME_FILE_FAIL', + PCLZIP_ERR_BAD_CHECKSUM => 'PCLZIP_ERR_BAD_CHECKSUM', + PCLZIP_ERR_INVALID_ARCHIVE_ZIP => 'PCLZIP_ERR_INVALID_ARCHIVE_ZIP', + PCLZIP_ERR_MISSING_OPTION_VALUE => 'PCLZIP_ERR_MISSING_OPTION_VALUE', + PCLZIP_ERR_INVALID_OPTION_VALUE => 'PCLZIP_ERR_INVALID_OPTION_VALUE', + PCLZIP_ERR_UNSUPPORTED_COMPRESSION => 'PCLZIP_ERR_UNSUPPORTED_COMPRESSION', + PCLZIP_ERR_UNSUPPORTED_ENCRYPTION => 'PCLZIP_ERR_UNSUPPORTED_ENCRYPTION' + ,PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE => 'PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE' + ,PCLZIP_ERR_DIRECTORY_RESTRICTION => 'PCLZIP_ERR_DIRECTORY_RESTRICTION' + ); + + if (isset($v_name[$this->error_code])) { + $v_value = $v_name[$this->error_code]; + } + else { + $v_value = 'NoName'; + } + + if ($p_with_code) { + return($v_value.' ('.$this->error_code.')'); + } + else { + return($v_value); + } + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : errorInfo() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function errorInfo($p_full=false) + { + if (PCLZIP_ERROR_EXTERNAL == 1) { + return(PclErrorString()); + } + else { + if ($p_full) { + return($this->errorName(true)." : ".$this->error_string); + } + else { + return($this->error_string." [code ".$this->error_code."]"); + } + } + } + // -------------------------------------------------------------------------------- + + +// -------------------------------------------------------------------------------- +// ***** UNDER THIS LINE ARE DEFINED PRIVATE INTERNAL FUNCTIONS ***** +// ***** ***** +// ***** THESES FUNCTIONS MUST NOT BE USED DIRECTLY ***** +// -------------------------------------------------------------------------------- + + + + // -------------------------------------------------------------------------------- + // Function : privCheckFormat() + // Description : + // This method check that the archive exists and is a valid zip archive. + // Several level of check exists. (futur) + // Parameters : + // $p_level : Level of check. Default 0. + // 0 : Check the first bytes (magic codes) (default value)) + // 1 : 0 + Check the central directory (futur) + // 2 : 1 + Check each file header (futur) + // Return Values : + // true on success, + // false on error, the error code is set. + // -------------------------------------------------------------------------------- + function privCheckFormat($p_level=0) + { + $v_result = true; + + // ----- Reset the file system cache + clearstatcache(); + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Look if the file exits + if (!is_file($this->zipname)) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "Missing archive file '".$this->zipname."'"); + return(false); + } + + // ----- Check that the file is readeable + if (!is_readable($this->zipname)) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to read archive '".$this->zipname."'"); + return(false); + } + + // ----- Check the magic code + // TBC + + // ----- Check the central header + // TBC + + // ----- Check each file header + // TBC + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privParseOptions() + // Description : + // This internal methods reads the variable list of arguments ($p_options_list, + // $p_size) and generate an array with the options and values ($v_result_list). + // $v_requested_options contains the options that can be present and those that + // must be present. + // $v_requested_options is an array, with the option value as key, and 'optional', + // or 'mandatory' as value. + // Parameters : + // See above. + // Return Values : + // 1 on success. + // 0 on failure. + // -------------------------------------------------------------------------------- + function privParseOptions(&$p_options_list, $p_size, &$v_result_list, $v_requested_options=false) + { + $v_result=1; + + // ----- Read the options + $i=0; + while ($i<$p_size) { + + // ----- Check if the option is supported + if (!isset($v_requested_options[$p_options_list[$i]])) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid optional parameter '".$p_options_list[$i]."' for this method"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Look for next option + switch ($p_options_list[$i]) { + // ----- Look for options that request a path value + case PCLZIP_OPT_PATH : + case PCLZIP_OPT_REMOVE_PATH : + case PCLZIP_OPT_ADD_PATH : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], FALSE); + $i++; + break; + + case PCLZIP_OPT_TEMP_FILE_THRESHOLD : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + return PclZip::errorCode(); + } + + // ----- Check for incompatible options + if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_OFF])) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_OFF'"); + return PclZip::errorCode(); + } + + // ----- Check the value + $v_value = $p_options_list[$i+1]; + if ((!is_integer($v_value)) || ($v_value<0)) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Integer expected for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + return PclZip::errorCode(); + } + + // ----- Get the value (and convert it in bytes) + $v_result_list[$p_options_list[$i]] = $v_value*1048576; + $i++; + break; + + case PCLZIP_OPT_TEMP_FILE_ON : + // ----- Check for incompatible options + if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_OFF])) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_OFF'"); + return PclZip::errorCode(); + } + + $v_result_list[$p_options_list[$i]] = true; + break; + + case PCLZIP_OPT_TEMP_FILE_OFF : + // ----- Check for incompatible options + if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_ON])) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_ON'"); + return PclZip::errorCode(); + } + // ----- Check for incompatible options + if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_THRESHOLD])) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_THRESHOLD'"); + return PclZip::errorCode(); + } + + $v_result_list[$p_options_list[$i]] = true; + break; + + case PCLZIP_OPT_EXTRACT_DIR_RESTRICTION : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + if ( is_string($p_options_list[$i+1]) + && ($p_options_list[$i+1] != '')) { + $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], FALSE); + $i++; + } + else { + } + break; + + // ----- Look for options that request an array of string for value + case PCLZIP_OPT_BY_NAME : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + if (is_string($p_options_list[$i+1])) { + $v_result_list[$p_options_list[$i]][0] = $p_options_list[$i+1]; + } + else if (is_array($p_options_list[$i+1])) { + $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; + } + else { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + $i++; + break; + + // ----- Look for options that request an EREG or PREG expression + case PCLZIP_OPT_BY_EREG : + // ereg() is deprecated starting with PHP 5.3. Move PCLZIP_OPT_BY_EREG + // to PCLZIP_OPT_BY_PREG + $p_options_list[$i] = PCLZIP_OPT_BY_PREG; + case PCLZIP_OPT_BY_PREG : + //case PCLZIP_OPT_CRYPT : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + if (is_string($p_options_list[$i+1])) { + $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; + } + else { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + $i++; + break; + + // ----- Look for options that takes a string + case PCLZIP_OPT_COMMENT : + case PCLZIP_OPT_ADD_COMMENT : + case PCLZIP_OPT_PREPEND_COMMENT : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, + "Missing parameter value for option '" + .PclZipUtilOptionText($p_options_list[$i]) + ."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + if (is_string($p_options_list[$i+1])) { + $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; + } + else { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, + "Wrong parameter value for option '" + .PclZipUtilOptionText($p_options_list[$i]) + ."'"); + + // ----- Return + return PclZip::errorCode(); + } + $i++; + break; + + // ----- Look for options that request an array of index + case PCLZIP_OPT_BY_INDEX : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + $v_work_list = array(); + if (is_string($p_options_list[$i+1])) { + + // ----- Remove spaces + $p_options_list[$i+1] = strtr($p_options_list[$i+1], ' ', ''); + + // ----- Parse items + $v_work_list = explode(",", $p_options_list[$i+1]); + } + else if (is_integer($p_options_list[$i+1])) { + $v_work_list[0] = $p_options_list[$i+1].'-'.$p_options_list[$i+1]; + } + else if (is_array($p_options_list[$i+1])) { + $v_work_list = $p_options_list[$i+1]; + } + else { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Value must be integer, string or array for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Reduce the index list + // each index item in the list must be a couple with a start and + // an end value : [0,3], [5-5], [8-10], ... + // ----- Check the format of each item + $v_sort_flag=false; + $v_sort_value=0; + for ($j=0; $j= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; + $i++; + break; + + // ----- Look for options that request a call-back + case PCLZIP_CB_PRE_EXTRACT : + case PCLZIP_CB_POST_EXTRACT : + case PCLZIP_CB_PRE_ADD : + case PCLZIP_CB_POST_ADD : + /* for futur use + case PCLZIP_CB_PRE_DELETE : + case PCLZIP_CB_POST_DELETE : + case PCLZIP_CB_PRE_LIST : + case PCLZIP_CB_POST_LIST : + */ + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + $v_function_name = $p_options_list[$i+1]; + + // ----- Check that the value is a valid existing function + if (!function_exists($v_function_name)) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Function '".$v_function_name."()' is not an existing function for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Set the attribute + $v_result_list[$p_options_list[$i]] = $v_function_name; + $i++; + break; + + default : + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, + "Unknown parameter '" + .$p_options_list[$i]."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Next options + $i++; + } + + // ----- Look for mandatory options + if ($v_requested_options !== false) { + for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) { + // ----- Look for mandatory option + if ($v_requested_options[$key] == 'mandatory') { + // ----- Look if present + if (!isset($v_result_list[$key])) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter ".PclZipUtilOptionText($key)."(".$key.")"); + + // ----- Return + return PclZip::errorCode(); + } + } + } + } + + // ----- Look for default values + if (!isset($v_result_list[PCLZIP_OPT_TEMP_FILE_THRESHOLD])) { + + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privOptionDefaultThreshold() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privOptionDefaultThreshold(&$p_options) + { + $v_result=1; + + if (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) + || isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) { + return $v_result; + } + + // ----- Get 'memory_limit' configuration value + $v_memory_limit = ini_get('memory_limit'); + $v_memory_limit = trim($v_memory_limit); + $last = strtolower(substr($v_memory_limit, -1)); + + if($last == 'g') + //$v_memory_limit = $v_memory_limit*1024*1024*1024; + $v_memory_limit = $v_memory_limit*1073741824; + if($last == 'm') + //$v_memory_limit = $v_memory_limit*1024*1024; + $v_memory_limit = $v_memory_limit*1048576; + if($last == 'k') + $v_memory_limit = $v_memory_limit*1024; + + $p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] = floor($v_memory_limit*PCLZIP_TEMPORARY_FILE_RATIO); + + + // ----- Sanity check : No threshold if value lower than 1M + if ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] < 1048576) { + unset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privFileDescrParseAtt() + // Description : + // Parameters : + // Return Values : + // 1 on success. + // 0 on failure. + // -------------------------------------------------------------------------------- + function privFileDescrParseAtt(&$p_file_list, &$p_filedescr, $v_options, $v_requested_options=false) + { + $v_result=1; + + // ----- For each file in the list check the attributes + foreach ($p_file_list as $v_key => $v_value) { + + // ----- Check if the option is supported + if (!isset($v_requested_options[$v_key])) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file attribute '".$v_key."' for this file"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Look for attribute + switch ($v_key) { + case PCLZIP_ATT_FILE_NAME : + if (!is_string($v_value)) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + + $p_filedescr['filename'] = PclZipUtilPathReduction($v_value); + + if ($p_filedescr['filename'] == '') { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty filename for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + + break; + + case PCLZIP_ATT_FILE_NEW_SHORT_NAME : + if (!is_string($v_value)) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + + $p_filedescr['new_short_name'] = PclZipUtilPathReduction($v_value); + + if ($p_filedescr['new_short_name'] == '') { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty short filename for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + break; + + case PCLZIP_ATT_FILE_NEW_FULL_NAME : + if (!is_string($v_value)) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + + $p_filedescr['new_full_name'] = PclZipUtilPathReduction($v_value); + + if ($p_filedescr['new_full_name'] == '') { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty full filename for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + break; + + // ----- Look for options that takes a string + case PCLZIP_ATT_FILE_COMMENT : + if (!is_string($v_value)) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + + $p_filedescr['comment'] = $v_value; + break; + + case PCLZIP_ATT_FILE_MTIME : + if (!is_integer($v_value)) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". Integer expected for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + + $p_filedescr['mtime'] = $v_value; + break; + + case PCLZIP_ATT_FILE_CONTENT : + $p_filedescr['content'] = $v_value; + break; + + default : + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, + "Unknown parameter '".$v_key."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Look for mandatory options + if ($v_requested_options !== false) { + for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) { + // ----- Look for mandatory option + if ($v_requested_options[$key] == 'mandatory') { + // ----- Look if present + if (!isset($p_file_list[$key])) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter ".PclZipUtilOptionText($key)."(".$key.")"); + return PclZip::errorCode(); + } + } + } + } + + // end foreach + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privFileDescrExpand() + // Description : + // This method look for each item of the list to see if its a file, a folder + // or a string to be added as file. For any other type of files (link, other) + // just ignore the item. + // Then prepare the information that will be stored for that file. + // When its a folder, expand the folder with all the files that are in that + // folder (recursively). + // Parameters : + // Return Values : + // 1 on success. + // 0 on failure. + // -------------------------------------------------------------------------------- + function privFileDescrExpand(&$p_filedescr_list, &$p_options) + { + $v_result=1; + + // ----- Create a result list + $v_result_list = array(); + + // ----- Look each entry + for ($i=0; $iprivCalculateStoredFilename($v_descr, $p_options); + + // ----- Add the descriptor in result list + $v_result_list[sizeof($v_result_list)] = $v_descr; + + // ----- Look for folder + if ($v_descr['type'] == 'folder') { + // ----- List of items in folder + $v_dirlist_descr = array(); + $v_dirlist_nb = 0; + if ($v_folder_handler = @opendir($v_descr['filename'])) { + while (($v_item_handler = @readdir($v_folder_handler)) !== false) { + + // ----- Skip '.' and '..' + if (($v_item_handler == '.') || ($v_item_handler == '..')) { + continue; + } + + // ----- Compose the full filename + $v_dirlist_descr[$v_dirlist_nb]['filename'] = $v_descr['filename'].'/'.$v_item_handler; + + // ----- Look for different stored filename + // Because the name of the folder was changed, the name of the + // files/sub-folders also change + if (($v_descr['stored_filename'] != $v_descr['filename']) + && (!isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH]))) { + if ($v_descr['stored_filename'] != '') { + $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_descr['stored_filename'].'/'.$v_item_handler; + } + else { + $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_item_handler; + } + } + + $v_dirlist_nb++; + } + + @closedir($v_folder_handler); + } + else { + // TBC : unable to open folder in read mode + } + + // ----- Expand each element of the list + if ($v_dirlist_nb != 0) { + // ----- Expand + if (($v_result = $this->privFileDescrExpand($v_dirlist_descr, $p_options)) != 1) { + return $v_result; + } + + // ----- Concat the resulting list + $v_result_list = array_merge($v_result_list, $v_dirlist_descr); + } + else { + } + + // ----- Free local array + unset($v_dirlist_descr); + } + } + + // ----- Get the result list + $p_filedescr_list = $v_result_list; + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privCreate() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privCreate($p_filedescr_list, &$p_result_list, &$p_options) + { + $v_result=1; + $v_list_detail = array(); + + // ----- Magic quotes trick + $this->privDisableMagicQuotes(); + + // ----- Open the file in write mode + if (($v_result = $this->privOpenFd('wb')) != 1) + { + // ----- Return + return $v_result; + } + + // ----- Add the list of files + $v_result = $this->privAddList($p_filedescr_list, $p_result_list, $p_options); + + // ----- Close + $this->privCloseFd(); + + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privAdd() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privAdd($p_filedescr_list, &$p_result_list, &$p_options) + { + $v_result=1; + $v_list_detail = array(); + + // ----- Look if the archive exists or is empty + if ((!is_file($this->zipname)) || (filesize($this->zipname) == 0)) + { + + // ----- Do a create + $v_result = $this->privCreate($p_filedescr_list, $p_result_list, $p_options); + + // ----- Return + return $v_result; + } + // ----- Magic quotes trick + $this->privDisableMagicQuotes(); + + // ----- Open the zip file + if (($v_result=$this->privOpenFd('rb')) != 1) + { + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) + { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + return $v_result; + } + + // ----- Go to beginning of File + @rewind($this->zip_fd); + + // ----- Creates a temporay file + $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp'; + + // ----- Open the temporary file in write mode + if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0) + { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_zip_temp_name.'\' in binary write mode'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Copy the files from the archive to the temporary file + // TBC : Here I should better append the file and go back to erase the central dir + $v_size = $v_central_dir['offset']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = fread($this->zip_fd, $v_read_size); + @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Swap the file descriptor + // Here is a trick : I swap the temporary fd with the zip fd, in order to use + // the following methods on the temporary fil and not the real archive + $v_swap = $this->zip_fd; + $this->zip_fd = $v_zip_temp_fd; + $v_zip_temp_fd = $v_swap; + + // ----- Add the files + $v_header_list = array(); + if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1) + { + fclose($v_zip_temp_fd); + $this->privCloseFd(); + @unlink($v_zip_temp_name); + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + + // ----- Store the offset of the central dir + $v_offset = @ftell($this->zip_fd); + + // ----- Copy the block of file headers from the old archive + $v_size = $v_central_dir['size']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($v_zip_temp_fd, $v_read_size); + @fwrite($this->zip_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Create the Central Dir files header + for ($i=0, $v_count=0; $iprivWriteCentralFileHeader($v_header_list[$i])) != 1) { + fclose($v_zip_temp_fd); + $this->privCloseFd(); + @unlink($v_zip_temp_name); + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + $v_count++; + } + + // ----- Transform the header to a 'usable' info + $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); + } + + // ----- Zip file comment + $v_comment = $v_central_dir['comment']; + if (isset($p_options[PCLZIP_OPT_COMMENT])) { + $v_comment = $p_options[PCLZIP_OPT_COMMENT]; + } + if (isset($p_options[PCLZIP_OPT_ADD_COMMENT])) { + $v_comment = $v_comment.$p_options[PCLZIP_OPT_ADD_COMMENT]; + } + if (isset($p_options[PCLZIP_OPT_PREPEND_COMMENT])) { + $v_comment = $p_options[PCLZIP_OPT_PREPEND_COMMENT].$v_comment; + } + + // ----- Calculate the size of the central header + $v_size = @ftell($this->zip_fd)-$v_offset; + + // ----- Create the central dir footer + if (($v_result = $this->privWriteCentralHeader($v_count+$v_central_dir['entries'], $v_size, $v_offset, $v_comment)) != 1) + { + // ----- Reset the file list + unset($v_header_list); + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + + // ----- Swap back the file descriptor + $v_swap = $this->zip_fd; + $this->zip_fd = $v_zip_temp_fd; + $v_zip_temp_fd = $v_swap; + + // ----- Close + $this->privCloseFd(); + + // ----- Close the temporary file + @fclose($v_zip_temp_fd); + + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Delete the zip file + // TBC : I should test the result ... + @unlink($this->zipname); + + // ----- Rename the temporary file + // TBC : I should test the result ... + //@rename($v_zip_temp_name, $this->zipname); + PclZipUtilRename($v_zip_temp_name, $this->zipname); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privOpenFd() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function privOpenFd($p_mode) + { + $v_result=1; + + // ----- Look if already open + if ($this->zip_fd != 0) + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Zip file \''.$this->zipname.'\' already open'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Open the zip file + if (($this->zip_fd = @fopen($this->zipname, $p_mode)) == 0) + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in '.$p_mode.' mode'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privCloseFd() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function privCloseFd() + { + $v_result=1; + + if ($this->zip_fd != 0) + @fclose($this->zip_fd); + $this->zip_fd = 0; + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privAddList() + // Description : + // $p_add_dir and $p_remove_dir will give the ability to memorize a path which is + // different from the real path of the file. This is usefull if you want to have PclTar + // running in any directory, and memorize relative path from an other directory. + // Parameters : + // $p_list : An array containing the file or directory names to add in the tar + // $p_result_list : list of added files with their properties (specially the status field) + // $p_add_dir : Path to add in the filename path archived + // $p_remove_dir : Path to remove in the filename path archived + // Return Values : + // -------------------------------------------------------------------------------- +// function privAddList($p_list, &$p_result_list, $p_add_dir, $p_remove_dir, $p_remove_all_dir, &$p_options) + function privAddList($p_filedescr_list, &$p_result_list, &$p_options) + { + $v_result=1; + + // ----- Add the files + $v_header_list = array(); + if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1) + { + // ----- Return + return $v_result; + } + + // ----- Store the offset of the central dir + $v_offset = @ftell($this->zip_fd); + + // ----- Create the Central Dir files header + for ($i=0,$v_count=0; $iprivWriteCentralFileHeader($v_header_list[$i])) != 1) { + // ----- Return + return $v_result; + } + $v_count++; + } + + // ----- Transform the header to a 'usable' info + $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); + } + + // ----- Zip file comment + $v_comment = ''; + if (isset($p_options[PCLZIP_OPT_COMMENT])) { + $v_comment = $p_options[PCLZIP_OPT_COMMENT]; + } + + // ----- Calculate the size of the central header + $v_size = @ftell($this->zip_fd)-$v_offset; + + // ----- Create the central dir footer + if (($v_result = $this->privWriteCentralHeader($v_count, $v_size, $v_offset, $v_comment)) != 1) + { + // ----- Reset the file list + unset($v_header_list); + + // ----- Return + return $v_result; + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privAddFileList() + // Description : + // Parameters : + // $p_filedescr_list : An array containing the file description + // or directory names to add in the zip + // $p_result_list : list of added files with their properties (specially the status field) + // Return Values : + // -------------------------------------------------------------------------------- + function privAddFileList($p_filedescr_list, &$p_result_list, &$p_options) + { + $v_result=1; + $v_header = array(); + + // ----- Recuperate the current number of elt in list + $v_nb = sizeof($p_result_list); + + // ----- Loop on the files + for ($j=0; ($jprivAddFile($p_filedescr_list[$j], $v_header, + $p_options); + if ($v_result != 1) { + return $v_result; + } + + // ----- Store the file infos + $p_result_list[$v_nb++] = $v_header; + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privAddFile() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privAddFile($p_filedescr, &$p_header, &$p_options) + { + $v_result=1; + + // ----- Working variable + $p_filename = $p_filedescr['filename']; + + // TBC : Already done in the fileAtt check ... ? + if ($p_filename == "") { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file list parameter (invalid or empty list)"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Look for a stored different filename + /* TBC : Removed + if (isset($p_filedescr['stored_filename'])) { + $v_stored_filename = $p_filedescr['stored_filename']; + } + else { + $v_stored_filename = $p_filedescr['stored_filename']; + } + */ + + // ----- Set the file properties + clearstatcache(); + $p_header['version'] = 20; + $p_header['version_extracted'] = 10; + $p_header['flag'] = 0; + $p_header['compression'] = 0; + $p_header['crc'] = 0; + $p_header['compressed_size'] = 0; + $p_header['filename_len'] = strlen($p_filename); + $p_header['extra_len'] = 0; + $p_header['disk'] = 0; + $p_header['internal'] = 0; + $p_header['offset'] = 0; + $p_header['filename'] = $p_filename; +// TBC : Removed $p_header['stored_filename'] = $v_stored_filename; + $p_header['stored_filename'] = $p_filedescr['stored_filename']; + $p_header['extra'] = ''; + $p_header['status'] = 'ok'; + $p_header['index'] = -1; + + // ----- Look for regular file + if ($p_filedescr['type']=='file') { + $p_header['external'] = 0x00000000; + $p_header['size'] = filesize($p_filename); + } + + // ----- Look for regular folder + else if ($p_filedescr['type']=='folder') { + $p_header['external'] = 0x00000010; + $p_header['mtime'] = filemtime($p_filename); + $p_header['size'] = filesize($p_filename); + } + + // ----- Look for virtual file + else if ($p_filedescr['type'] == 'virtual_file') { + $p_header['external'] = 0x00000000; + $p_header['size'] = strlen($p_filedescr['content']); + } + + + // ----- Look for filetime + if (isset($p_filedescr['mtime'])) { + $p_header['mtime'] = $p_filedescr['mtime']; + } + else if ($p_filedescr['type'] == 'virtual_file') { + $p_header['mtime'] = time(); + } + else { + $p_header['mtime'] = filemtime($p_filename); + } + + // ------ Look for file comment + if (isset($p_filedescr['comment'])) { + $p_header['comment_len'] = strlen($p_filedescr['comment']); + $p_header['comment'] = $p_filedescr['comment']; + } + else { + $p_header['comment_len'] = 0; + $p_header['comment'] = ''; + } + + // ----- Look for pre-add callback + if (isset($p_options[PCLZIP_CB_PRE_ADD])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_header, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. +// eval('$v_result = '.$p_options[PCLZIP_CB_PRE_ADD].'(PCLZIP_CB_PRE_ADD, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_PRE_ADD](PCLZIP_CB_PRE_ADD, $v_local_header); + if ($v_result == 0) { + // ----- Change the file status + $p_header['status'] = "skipped"; + $v_result = 1; + } + + // ----- Update the informations + // Only some fields can be modified + if ($p_header['stored_filename'] != $v_local_header['stored_filename']) { + $p_header['stored_filename'] = PclZipUtilPathReduction($v_local_header['stored_filename']); + } + } + + // ----- Look for empty stored filename + if ($p_header['stored_filename'] == "") { + $p_header['status'] = "filtered"; + } + + // ----- Check the path length + if (strlen($p_header['stored_filename']) > 0xFF) { + $p_header['status'] = 'filename_too_long'; + } + + // ----- Look if no error, or file not skipped + if ($p_header['status'] == 'ok') { + + // ----- Look for a file + if ($p_filedescr['type'] == 'file') { + // ----- Look for using temporary file to zip + if ( (!isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) + && (isset($p_options[PCLZIP_OPT_TEMP_FILE_ON]) + || (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) + && ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] <= $p_header['size'])) ) ) { + $v_result = $this->privAddFileUsingTempFile($p_filedescr, $p_header, $p_options); + if ($v_result < PCLZIP_ERR_NO_ERROR) { + return $v_result; + } + } + + // ----- Use "in memory" zip algo + else { + + // ----- Open the source file + if (($v_file = @fopen($p_filename, "rb")) == 0) { + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode"); + return PclZip::errorCode(); + } + + // ----- Read the file content + $v_content = @fread($v_file, $p_header['size']); + + // ----- Close the file + @fclose($v_file); + + // ----- Calculate the CRC + $p_header['crc'] = @crc32($v_content); + + // ----- Look for no compression + if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) { + // ----- Set header parameters + $p_header['compressed_size'] = $p_header['size']; + $p_header['compression'] = 0; + } + + // ----- Look for normal compression + else { + // ----- Compress the content + $v_content = @gzdeflate($v_content); + + // ----- Set header parameters + $p_header['compressed_size'] = strlen($v_content); + $p_header['compression'] = 8; + } + + // ----- Call the header generation + if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { + @fclose($v_file); + return $v_result; + } + + // ----- Write the compressed (or not) content + @fwrite($this->zip_fd, $v_content, $p_header['compressed_size']); + + } + + } + + // ----- Look for a virtual file (a file from string) + else if ($p_filedescr['type'] == 'virtual_file') { + + $v_content = $p_filedescr['content']; + + // ----- Calculate the CRC + $p_header['crc'] = @crc32($v_content); + + // ----- Look for no compression + if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) { + // ----- Set header parameters + $p_header['compressed_size'] = $p_header['size']; + $p_header['compression'] = 0; + } + + // ----- Look for normal compression + else { + // ----- Compress the content + $v_content = @gzdeflate($v_content); + + // ----- Set header parameters + $p_header['compressed_size'] = strlen($v_content); + $p_header['compression'] = 8; + } + + // ----- Call the header generation + if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { + @fclose($v_file); + return $v_result; + } + + // ----- Write the compressed (or not) content + @fwrite($this->zip_fd, $v_content, $p_header['compressed_size']); + } + + // ----- Look for a directory + else if ($p_filedescr['type'] == 'folder') { + // ----- Look for directory last '/' + if (@substr($p_header['stored_filename'], -1) != '/') { + $p_header['stored_filename'] .= '/'; + } + + // ----- Set the file properties + $p_header['size'] = 0; + //$p_header['external'] = 0x41FF0010; // Value for a folder : to be checked + $p_header['external'] = 0x00000010; // Value for a folder : to be checked + + // ----- Call the header generation + if (($v_result = $this->privWriteFileHeader($p_header)) != 1) + { + return $v_result; + } + } + } + + // ----- Look for post-add callback + if (isset($p_options[PCLZIP_CB_POST_ADD])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_header, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. +// eval('$v_result = '.$p_options[PCLZIP_CB_POST_ADD].'(PCLZIP_CB_POST_ADD, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_POST_ADD](PCLZIP_CB_POST_ADD, $v_local_header); + if ($v_result == 0) { + // ----- Ignored + $v_result = 1; + } + + // ----- Update the informations + // Nothing can be modified + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privAddFileUsingTempFile() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privAddFileUsingTempFile($p_filedescr, &$p_header, &$p_options) + { + $v_result=PCLZIP_ERR_NO_ERROR; + + // ----- Working variable + $p_filename = $p_filedescr['filename']; + + + // ----- Open the source file + if (($v_file = @fopen($p_filename, "rb")) == 0) { + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode"); + return PclZip::errorCode(); + } + + // ----- Creates a compressed temporary file + $v_gzip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.gz'; + if (($v_file_compressed = @gzopen($v_gzip_temp_name, "wb")) == 0) { + fclose($v_file); + PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary write mode'); + return PclZip::errorCode(); + } + + // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks + $v_size = filesize($p_filename); + while ($v_size != 0) { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($v_file, $v_read_size); + //$v_binary_data = pack('a'.$v_read_size, $v_buffer); + @gzputs($v_file_compressed, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Close the file + @fclose($v_file); + @gzclose($v_file_compressed); + + // ----- Check the minimum file size + if (filesize($v_gzip_temp_name) < 18) { + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'gzip temporary file \''.$v_gzip_temp_name.'\' has invalid filesize - should be minimum 18 bytes'); + return PclZip::errorCode(); + } + + // ----- Extract the compressed attributes + if (($v_file_compressed = @fopen($v_gzip_temp_name, "rb")) == 0) { + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode'); + return PclZip::errorCode(); + } + + // ----- Read the gzip file header + $v_binary_data = @fread($v_file_compressed, 10); + $v_data_header = unpack('a1id1/a1id2/a1cm/a1flag/Vmtime/a1xfl/a1os', $v_binary_data); + + // ----- Check some parameters + $v_data_header['os'] = bin2hex($v_data_header['os']); + + // ----- Read the gzip file footer + @fseek($v_file_compressed, filesize($v_gzip_temp_name)-8); + $v_binary_data = @fread($v_file_compressed, 8); + $v_data_footer = unpack('Vcrc/Vcompressed_size', $v_binary_data); + + // ----- Set the attributes + $p_header['compression'] = ord($v_data_header['cm']); + //$p_header['mtime'] = $v_data_header['mtime']; + $p_header['crc'] = $v_data_footer['crc']; + $p_header['compressed_size'] = filesize($v_gzip_temp_name)-18; + + // ----- Close the file + @fclose($v_file_compressed); + + // ----- Call the header generation + if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { + return $v_result; + } + + // ----- Add the compressed data + if (($v_file_compressed = @fopen($v_gzip_temp_name, "rb")) == 0) + { + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode'); + return PclZip::errorCode(); + } + + // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks + fseek($v_file_compressed, 10); + $v_size = $p_header['compressed_size']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($v_file_compressed, $v_read_size); + //$v_binary_data = pack('a'.$v_read_size, $v_buffer); + @fwrite($this->zip_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Close the file + @fclose($v_file_compressed); + + // ----- Unlink the temporary file + @unlink($v_gzip_temp_name); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privCalculateStoredFilename() + // Description : + // Based on file descriptor properties and global options, this method + // calculate the filename that will be stored in the archive. + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privCalculateStoredFilename(&$p_filedescr, &$p_options) + { + $v_result=1; + + // ----- Working variables + $p_filename = $p_filedescr['filename']; + if (isset($p_options[PCLZIP_OPT_ADD_PATH])) { + $p_add_dir = $p_options[PCLZIP_OPT_ADD_PATH]; + } + else { + $p_add_dir = ''; + } + if (isset($p_options[PCLZIP_OPT_REMOVE_PATH])) { + $p_remove_dir = $p_options[PCLZIP_OPT_REMOVE_PATH]; + } + else { + $p_remove_dir = ''; + } + if (isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { + $p_remove_all_dir = $p_options[PCLZIP_OPT_REMOVE_ALL_PATH]; + } + else { + $p_remove_all_dir = 0; + } + + + // ----- Look for full name change + if (isset($p_filedescr['new_full_name'])) { + // ----- Remove drive letter if any + $v_stored_filename = PclZipUtilTranslateWinPath($p_filedescr['new_full_name']); + } + + // ----- Look for path and/or short name change + else { + + // ----- Look for short name change + // Its when we cahnge just the filename but not the path + if (isset($p_filedescr['new_short_name'])) { + $v_path_info = pathinfo($p_filename); + $v_dir = ''; + if ($v_path_info['dirname'] != '') { + $v_dir = $v_path_info['dirname'].'/'; + } + $v_stored_filename = $v_dir.$p_filedescr['new_short_name']; + } + else { + // ----- Calculate the stored filename + $v_stored_filename = $p_filename; + } + + // ----- Look for all path to remove + if ($p_remove_all_dir) { + $v_stored_filename = basename($p_filename); + } + // ----- Look for partial path remove + else if ($p_remove_dir != "") { + if (substr($p_remove_dir, -1) != '/') + $p_remove_dir .= "/"; + + if ( (substr($p_filename, 0, 2) == "./") + || (substr($p_remove_dir, 0, 2) == "./")) { + + if ( (substr($p_filename, 0, 2) == "./") + && (substr($p_remove_dir, 0, 2) != "./")) { + $p_remove_dir = "./".$p_remove_dir; + } + if ( (substr($p_filename, 0, 2) != "./") + && (substr($p_remove_dir, 0, 2) == "./")) { + $p_remove_dir = substr($p_remove_dir, 2); + } + } + + $v_compare = PclZipUtilPathInclusion($p_remove_dir, + $v_stored_filename); + if ($v_compare > 0) { + if ($v_compare == 2) { + $v_stored_filename = ""; + } + else { + $v_stored_filename = substr($v_stored_filename, + strlen($p_remove_dir)); + } + } + } + + // ----- Remove drive letter if any + $v_stored_filename = PclZipUtilTranslateWinPath($v_stored_filename); + + // ----- Look for path to add + if ($p_add_dir != "") { + if (substr($p_add_dir, -1) == "/") + $v_stored_filename = $p_add_dir.$v_stored_filename; + else + $v_stored_filename = $p_add_dir."/".$v_stored_filename; + } + } + + // ----- Filename (reduce the path of stored name) + $v_stored_filename = PclZipUtilPathReduction($v_stored_filename); + $p_filedescr['stored_filename'] = $v_stored_filename; + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privWriteFileHeader() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privWriteFileHeader(&$p_header) + { + $v_result=1; + + // ----- Store the offset position of the file + $p_header['offset'] = ftell($this->zip_fd); + + // ----- Transform UNIX mtime to DOS format mdate/mtime + $v_date = getdate($p_header['mtime']); + $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2; + $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday']; + + // ----- Packed data + $v_binary_data = pack("VvvvvvVVVvv", 0x04034b50, + $p_header['version_extracted'], $p_header['flag'], + $p_header['compression'], $v_mtime, $v_mdate, + $p_header['crc'], $p_header['compressed_size'], + $p_header['size'], + strlen($p_header['stored_filename']), + $p_header['extra_len']); + + // ----- Write the first 148 bytes of the header in the archive + fputs($this->zip_fd, $v_binary_data, 30); + + // ----- Write the variable fields + if (strlen($p_header['stored_filename']) != 0) + { + fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename'])); + } + if ($p_header['extra_len'] != 0) + { + fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privWriteCentralFileHeader() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privWriteCentralFileHeader(&$p_header) + { + $v_result=1; + + // TBC + //for(reset($p_header); $key = key($p_header); next($p_header)) { + //} + + // ----- Transform UNIX mtime to DOS format mdate/mtime + $v_date = getdate($p_header['mtime']); + $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2; + $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday']; + + + // ----- Packed data + $v_binary_data = pack("VvvvvvvVVVvvvvvVV", 0x02014b50, + $p_header['version'], $p_header['version_extracted'], + $p_header['flag'], $p_header['compression'], + $v_mtime, $v_mdate, $p_header['crc'], + $p_header['compressed_size'], $p_header['size'], + strlen($p_header['stored_filename']), + $p_header['extra_len'], $p_header['comment_len'], + $p_header['disk'], $p_header['internal'], + $p_header['external'], $p_header['offset']); + + // ----- Write the 42 bytes of the header in the zip file + fputs($this->zip_fd, $v_binary_data, 46); + + // ----- Write the variable fields + if (strlen($p_header['stored_filename']) != 0) + { + fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename'])); + } + if ($p_header['extra_len'] != 0) + { + fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']); + } + if ($p_header['comment_len'] != 0) + { + fputs($this->zip_fd, $p_header['comment'], $p_header['comment_len']); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privWriteCentralHeader() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privWriteCentralHeader($p_nb_entries, $p_size, $p_offset, $p_comment) + { + $v_result=1; + + // ----- Packed data + $v_binary_data = pack("VvvvvVVv", 0x06054b50, 0, 0, $p_nb_entries, + $p_nb_entries, $p_size, + $p_offset, strlen($p_comment)); + + // ----- Write the 22 bytes of the header in the zip file + fputs($this->zip_fd, $v_binary_data, 22); + + // ----- Write the variable fields + if (strlen($p_comment) != 0) + { + fputs($this->zip_fd, $p_comment, strlen($p_comment)); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privList() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privList(&$p_list) + { + $v_result=1; + + // ----- Magic quotes trick + $this->privDisableMagicQuotes(); + + // ----- Open the zip file + if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0) + { + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in binary read mode'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) + { + $this->privSwapBackMagicQuotes(); + return $v_result; + } + + // ----- Go to beginning of Central Dir + @rewind($this->zip_fd); + if (@fseek($this->zip_fd, $v_central_dir['offset'])) + { + $this->privSwapBackMagicQuotes(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read each entry + for ($i=0; $i<$v_central_dir['entries']; $i++) + { + // ----- Read the file header + if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1) + { + $this->privSwapBackMagicQuotes(); + return $v_result; + } + $v_header['index'] = $i; + + // ----- Get the only interesting attributes + $this->privConvertHeader2FileInfo($v_header, $p_list[$i]); + unset($v_header); + } + + // ----- Close the zip file + $this->privCloseFd(); + + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privConvertHeader2FileInfo() + // Description : + // This function takes the file informations from the central directory + // entries and extract the interesting parameters that will be given back. + // The resulting file infos are set in the array $p_info + // $p_info['filename'] : Filename with full path. Given by user (add), + // extracted in the filesystem (extract). + // $p_info['stored_filename'] : Stored filename in the archive. + // $p_info['size'] = Size of the file. + // $p_info['compressed_size'] = Compressed size of the file. + // $p_info['mtime'] = Last modification date of the file. + // $p_info['comment'] = Comment associated with the file. + // $p_info['folder'] = true/false : indicates if the entry is a folder or not. + // $p_info['status'] = status of the action on the file. + // $p_info['crc'] = CRC of the file content. + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privConvertHeader2FileInfo($p_header, &$p_info) + { + $v_result=1; + + // ----- Get the interesting attributes + $v_temp_path = PclZipUtilPathReduction($p_header['filename']); + $p_info['filename'] = $v_temp_path; + $v_temp_path = PclZipUtilPathReduction($p_header['stored_filename']); + $p_info['stored_filename'] = $v_temp_path; + $p_info['size'] = $p_header['size']; + $p_info['compressed_size'] = $p_header['compressed_size']; + $p_info['mtime'] = $p_header['mtime']; + $p_info['comment'] = $p_header['comment']; + $p_info['folder'] = (($p_header['external']&0x00000010)==0x00000010); + $p_info['index'] = $p_header['index']; + $p_info['status'] = $p_header['status']; + $p_info['crc'] = $p_header['crc']; + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privExtractByRule() + // Description : + // Extract a file or directory depending of rules (by index, by name, ...) + // Parameters : + // $p_file_list : An array where will be placed the properties of each + // extracted file + // $p_path : Path to add while writing the extracted files + // $p_remove_path : Path to remove (from the file memorized path) while writing the + // extracted files. If the path does not match the file path, + // the file is extracted with its memorized path. + // $p_remove_path does not apply to 'list' mode. + // $p_path and $p_remove_path are commulative. + // Return Values : + // 1 on success,0 or less on error (see error code list) + // -------------------------------------------------------------------------------- + function privExtractByRule(&$p_file_list, $p_path, $p_remove_path, $p_remove_all_path, &$p_options) + { + $v_result=1; + + // ----- Magic quotes trick + $this->privDisableMagicQuotes(); + + // ----- Check the path + if ( ($p_path == "") + || ( (substr($p_path, 0, 1) != "/") + && (substr($p_path, 0, 3) != "../") + && (substr($p_path,1,2)!=":/"))) + $p_path = "./".$p_path; + + // ----- Reduce the path last (and duplicated) '/' + if (($p_path != "./") && ($p_path != "/")) + { + // ----- Look for the path end '/' + while (substr($p_path, -1) == "/") + { + $p_path = substr($p_path, 0, strlen($p_path)-1); + } + } + + // ----- Look for path to remove format (should end by /) + if (($p_remove_path != "") && (substr($p_remove_path, -1) != '/')) + { + $p_remove_path .= '/'; + } + $p_remove_path_size = strlen($p_remove_path); + + // ----- Open the zip file + if (($v_result = $this->privOpenFd('rb')) != 1) + { + $this->privSwapBackMagicQuotes(); + return $v_result; + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) + { + // ----- Close the zip file + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + return $v_result; + } + + // ----- Start at beginning of Central Dir + $v_pos_entry = $v_central_dir['offset']; + + // ----- Read each entry + $j_start = 0; + for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++) + { + + // ----- Read next Central dir entry + @rewind($this->zip_fd); + if (@fseek($this->zip_fd, $v_pos_entry)) + { + // ----- Close the zip file + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read the file header + $v_header = array(); + if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1) + { + // ----- Close the zip file + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + return $v_result; + } + + // ----- Store the index + $v_header['index'] = $i; + + // ----- Store the file position + $v_pos_entry = ftell($this->zip_fd); + + // ----- Look for the specific extract rules + $v_extract = false; + + // ----- Look for extract by name rule + if ( (isset($p_options[PCLZIP_OPT_BY_NAME])) + && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) { + + // ----- Look if the filename is in the list + for ($j=0; ($j strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) + && (substr($v_header['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) { + $v_extract = true; + } + } + // ----- Look for a filename + elseif ($v_header['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) { + $v_extract = true; + } + } + } + + // ----- Look for extract by ereg rule + // ereg() is deprecated with PHP 5.3 + /* + else if ( (isset($p_options[PCLZIP_OPT_BY_EREG])) + && ($p_options[PCLZIP_OPT_BY_EREG] != "")) { + + if (ereg($p_options[PCLZIP_OPT_BY_EREG], $v_header['stored_filename'])) { + $v_extract = true; + } + } + */ + + // ----- Look for extract by preg rule + else if ( (isset($p_options[PCLZIP_OPT_BY_PREG])) + && ($p_options[PCLZIP_OPT_BY_PREG] != "")) { + + if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header['stored_filename'])) { + $v_extract = true; + } + } + + // ----- Look for extract by index rule + else if ( (isset($p_options[PCLZIP_OPT_BY_INDEX])) + && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) { + + // ----- Look if the index is in the list + for ($j=$j_start; ($j=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) { + $v_extract = true; + } + if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) { + $j_start = $j+1; + } + + if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) { + break; + } + } + } + + // ----- Look for no rule, which means extract all the archive + else { + $v_extract = true; + } + + // ----- Check compression method + if ( ($v_extract) + && ( ($v_header['compression'] != 8) + && ($v_header['compression'] != 0))) { + $v_header['status'] = 'unsupported_compression'; + + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR + if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) + && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { + + $this->privSwapBackMagicQuotes(); + + PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_COMPRESSION, + "Filename '".$v_header['stored_filename']."' is " + ."compressed by an unsupported compression " + ."method (".$v_header['compression'].") "); + + return PclZip::errorCode(); + } + } + + // ----- Check encrypted files + if (($v_extract) && (($v_header['flag'] & 1) == 1)) { + $v_header['status'] = 'unsupported_encryption'; + + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR + if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) + && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { + + $this->privSwapBackMagicQuotes(); + + PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION, + "Unsupported encryption for " + ." filename '".$v_header['stored_filename'] + ."'"); + + return PclZip::errorCode(); + } + } + + // ----- Look for real extraction + if (($v_extract) && ($v_header['status'] != 'ok')) { + $v_result = $this->privConvertHeader2FileInfo($v_header, + $p_file_list[$v_nb_extracted++]); + if ($v_result != 1) { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + return $v_result; + } + + $v_extract = false; + } + + // ----- Look for real extraction + if ($v_extract) + { + + // ----- Go to the file position + @rewind($this->zip_fd); + if (@fseek($this->zip_fd, $v_header['offset'])) + { + // ----- Close the zip file + $this->privCloseFd(); + + $this->privSwapBackMagicQuotes(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Look for extraction as string + if ($p_options[PCLZIP_OPT_EXTRACT_AS_STRING]) { + + $v_string = ''; + + // ----- Extracting the file + $v_result1 = $this->privExtractFileAsString($v_header, $v_string, $p_options); + if ($v_result1 < 1) { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + return $v_result1; + } + + // ----- Get the only interesting attributes + if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted])) != 1) + { + // ----- Close the zip file + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + return $v_result; + } + + // ----- Set the file content + $p_file_list[$v_nb_extracted]['content'] = $v_string; + + // ----- Next extracted file + $v_nb_extracted++; + + // ----- Look for user callback abort + if ($v_result1 == 2) { + break; + } + } + // ----- Look for extraction in standard output + elseif ( (isset($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT])) + && ($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT])) { + // ----- Extracting the file in standard output + $v_result1 = $this->privExtractFileInOutput($v_header, $p_options); + if ($v_result1 < 1) { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + return $v_result1; + } + + // ----- Get the only interesting attributes + if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + return $v_result; + } + + // ----- Look for user callback abort + if ($v_result1 == 2) { + break; + } + } + // ----- Look for normal extraction + else { + // ----- Extracting the file + $v_result1 = $this->privExtractFile($v_header, + $p_path, $p_remove_path, + $p_remove_all_path, + $p_options); + if ($v_result1 < 1) { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + return $v_result1; + } + + // ----- Get the only interesting attributes + if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) + { + // ----- Close the zip file + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + return $v_result; + } + + // ----- Look for user callback abort + if ($v_result1 == 2) { + break; + } + } + } + } + + // ----- Close the zip file + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privExtractFile() + // Description : + // Parameters : + // Return Values : + // + // 1 : ... ? + // PCLZIP_ERR_USER_ABORTED(2) : User ask for extraction stop in callback + // -------------------------------------------------------------------------------- + function privExtractFile(&$p_entry, $p_path, $p_remove_path, $p_remove_all_path, &$p_options) + { + $v_result=1; + + // ----- Read the file header + if (($v_result = $this->privReadFileHeader($v_header)) != 1) + { + // ----- Return + return $v_result; + } + + + // ----- Check that the file header is coherent with $p_entry info + if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { + // TBC + } + + // ----- Look for all path to remove + if ($p_remove_all_path == true) { + // ----- Look for folder entry that not need to be extracted + if (($p_entry['external']&0x00000010)==0x00000010) { + + $p_entry['status'] = "filtered"; + + return $v_result; + } + + // ----- Get the basename of the path + $p_entry['filename'] = basename($p_entry['filename']); + } + + // ----- Look for path to remove + else if ($p_remove_path != "") + { + if (PclZipUtilPathInclusion($p_remove_path, $p_entry['filename']) == 2) + { + + // ----- Change the file status + $p_entry['status'] = "filtered"; + + // ----- Return + return $v_result; + } + + $p_remove_path_size = strlen($p_remove_path); + if (substr($p_entry['filename'], 0, $p_remove_path_size) == $p_remove_path) + { + + // ----- Remove the path + $p_entry['filename'] = substr($p_entry['filename'], $p_remove_path_size); + + } + } + + // ----- Add the path + if ($p_path != '') { + $p_entry['filename'] = $p_path."/".$p_entry['filename']; + } + + // ----- Check a base_dir_restriction + if (isset($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION])) { + $v_inclusion + = PclZipUtilPathInclusion($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION], + $p_entry['filename']); + if ($v_inclusion == 0) { + + PclZip::privErrorLog(PCLZIP_ERR_DIRECTORY_RESTRICTION, + "Filename '".$p_entry['filename']."' is " + ."outside PCLZIP_OPT_EXTRACT_DIR_RESTRICTION"); + + return PclZip::errorCode(); + } + } + + // ----- Look for pre-extract callback + if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. +// eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header); + if ($v_result == 0) { + // ----- Change the file status + $p_entry['status'] = "skipped"; + $v_result = 1; + } + + // ----- Look for abort result + if ($v_result == 2) { + // ----- This status is internal and will be changed in 'skipped' + $p_entry['status'] = "aborted"; + $v_result = PCLZIP_ERR_USER_ABORTED; + } + + // ----- Update the informations + // Only some fields can be modified + $p_entry['filename'] = $v_local_header['filename']; + } + + + // ----- Look if extraction should be done + if ($p_entry['status'] == 'ok') { + + // ----- Look for specific actions while the file exist + if (file_exists($p_entry['filename'])) + { + + // ----- Look if file is a directory + if (is_dir($p_entry['filename'])) + { + + // ----- Change the file status + $p_entry['status'] = "already_a_directory"; + + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR + // For historical reason first PclZip implementation does not stop + // when this kind of error occurs. + if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) + && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { + + PclZip::privErrorLog(PCLZIP_ERR_ALREADY_A_DIRECTORY, + "Filename '".$p_entry['filename']."' is " + ."already used by an existing directory"); + + return PclZip::errorCode(); + } + } + // ----- Look if file is write protected + else if (!is_writeable($p_entry['filename'])) + { + + // ----- Change the file status + $p_entry['status'] = "write_protected"; + + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR + // For historical reason first PclZip implementation does not stop + // when this kind of error occurs. + if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) + && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { + + PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, + "Filename '".$p_entry['filename']."' exists " + ."and is write protected"); + + return PclZip::errorCode(); + } + } + + // ----- Look if the extracted file is older + else if (filemtime($p_entry['filename']) > $p_entry['mtime']) + { + // ----- Change the file status + if ( (isset($p_options[PCLZIP_OPT_REPLACE_NEWER])) + && ($p_options[PCLZIP_OPT_REPLACE_NEWER]===true)) { + } + else { + $p_entry['status'] = "newer_exist"; + + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR + // For historical reason first PclZip implementation does not stop + // when this kind of error occurs. + if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) + && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { + + PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, + "Newer version of '".$p_entry['filename']."' exists " + ."and option PCLZIP_OPT_REPLACE_NEWER is not selected"); + + return PclZip::errorCode(); + } + } + } + else { + } + } + + // ----- Check the directory availability and create it if necessary + else { + if ((($p_entry['external']&0x00000010)==0x00000010) || (substr($p_entry['filename'], -1) == '/')) + $v_dir_to_check = $p_entry['filename']; + else if (!strstr($p_entry['filename'], "/")) + $v_dir_to_check = ""; + else + $v_dir_to_check = dirname($p_entry['filename']); + + if (($v_result = $this->privDirCheck($v_dir_to_check, (($p_entry['external']&0x00000010)==0x00000010))) != 1) { + + // ----- Change the file status + $p_entry['status'] = "path_creation_fail"; + + // ----- Return + //return $v_result; + $v_result = 1; + } + } + } + + // ----- Look if extraction should be done + if ($p_entry['status'] == 'ok') { + + // ----- Do the extraction (if not a folder) + if (!(($p_entry['external']&0x00000010)==0x00000010)) + { + // ----- Look for not compressed file + if ($p_entry['compression'] == 0) { + + // ----- Opening destination file + if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) + { + + // ----- Change the file status + $p_entry['status'] = "write_error"; + + // ----- Return + return $v_result; + } + + + // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks + $v_size = $p_entry['compressed_size']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($this->zip_fd, $v_read_size); + /* Try to speed up the code + $v_binary_data = pack('a'.$v_read_size, $v_buffer); + @fwrite($v_dest_file, $v_binary_data, $v_read_size); + */ + @fwrite($v_dest_file, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Closing the destination file + fclose($v_dest_file); + + // ----- Change the file mtime + touch($p_entry['filename'], $p_entry['mtime']); + + + } + else { + // ----- TBC + // Need to be finished + if (($p_entry['flag'] & 1) == 1) { + PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION, 'File \''.$p_entry['filename'].'\' is encrypted. Encrypted files are not supported.'); + return PclZip::errorCode(); + } + + + // ----- Look for using temporary file to unzip + if ( (!isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) + && (isset($p_options[PCLZIP_OPT_TEMP_FILE_ON]) + || (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) + && ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] <= $p_entry['size'])) ) ) { + $v_result = $this->privExtractFileUsingTempFile($p_entry, $p_options); + if ($v_result < PCLZIP_ERR_NO_ERROR) { + return $v_result; + } + } + + // ----- Look for extract in memory + else { + + + // ----- Read the compressed file in a buffer (one shot) + $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); + + // ----- Decompress the file + $v_file_content = @gzinflate($v_buffer); + unset($v_buffer); + if ($v_file_content === FALSE) { + + // ----- Change the file status + // TBC + $p_entry['status'] = "error"; + + return $v_result; + } + + // ----- Opening destination file + if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) { + + // ----- Change the file status + $p_entry['status'] = "write_error"; + + return $v_result; + } + + // ----- Write the uncompressed data + @fwrite($v_dest_file, $v_file_content, $p_entry['size']); + unset($v_file_content); + + // ----- Closing the destination file + @fclose($v_dest_file); + + } + + // ----- Change the file mtime + @touch($p_entry['filename'], $p_entry['mtime']); + } + + // ----- Look for chmod option + if (isset($p_options[PCLZIP_OPT_SET_CHMOD])) { + + // ----- Change the mode of the file + @chmod($p_entry['filename'], $p_options[PCLZIP_OPT_SET_CHMOD]); + } + + } + } + + // ----- Change abort status + if ($p_entry['status'] == "aborted") { + $p_entry['status'] = "skipped"; + } + + // ----- Look for post-extract callback + elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. +// eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header); + + // ----- Look for abort result + if ($v_result == 2) { + $v_result = PCLZIP_ERR_USER_ABORTED; + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privExtractFileUsingTempFile() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privExtractFileUsingTempFile(&$p_entry, &$p_options) + { + $v_result=1; + + // ----- Creates a temporary file + $v_gzip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.gz'; + if (($v_dest_file = @fopen($v_gzip_temp_name, "wb")) == 0) { + fclose($v_file); + PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary write mode'); + return PclZip::errorCode(); + } + + + // ----- Write gz file format header + $v_binary_data = pack('va1a1Va1a1', 0x8b1f, Chr($p_entry['compression']), Chr(0x00), time(), Chr(0x00), Chr(3)); + @fwrite($v_dest_file, $v_binary_data, 10); + + // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks + $v_size = $p_entry['compressed_size']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($this->zip_fd, $v_read_size); + //$v_binary_data = pack('a'.$v_read_size, $v_buffer); + @fwrite($v_dest_file, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Write gz file format footer + $v_binary_data = pack('VV', $p_entry['crc'], $p_entry['size']); + @fwrite($v_dest_file, $v_binary_data, 8); + + // ----- Close the temporary file + @fclose($v_dest_file); + + // ----- Opening destination file + if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) { + $p_entry['status'] = "write_error"; + return $v_result; + } + + // ----- Open the temporary gz file + if (($v_src_file = @gzopen($v_gzip_temp_name, 'rb')) == 0) { + @fclose($v_dest_file); + $p_entry['status'] = "read_error"; + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode'); + return PclZip::errorCode(); + } + + + // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks + $v_size = $p_entry['size']; + while ($v_size != 0) { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @gzread($v_src_file, $v_read_size); + //$v_binary_data = pack('a'.$v_read_size, $v_buffer); + @fwrite($v_dest_file, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + @fclose($v_dest_file); + @gzclose($v_src_file); + + // ----- Delete the temporary file + @unlink($v_gzip_temp_name); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privExtractFileInOutput() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privExtractFileInOutput(&$p_entry, &$p_options) + { + $v_result=1; + + // ----- Read the file header + if (($v_result = $this->privReadFileHeader($v_header)) != 1) { + return $v_result; + } + + + // ----- Check that the file header is coherent with $p_entry info + if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { + // TBC + } + + // ----- Look for pre-extract callback + if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. +// eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header); + if ($v_result == 0) { + // ----- Change the file status + $p_entry['status'] = "skipped"; + $v_result = 1; + } + + // ----- Look for abort result + if ($v_result == 2) { + // ----- This status is internal and will be changed in 'skipped' + $p_entry['status'] = "aborted"; + $v_result = PCLZIP_ERR_USER_ABORTED; + } + + // ----- Update the informations + // Only some fields can be modified + $p_entry['filename'] = $v_local_header['filename']; + } + + // ----- Trace + + // ----- Look if extraction should be done + if ($p_entry['status'] == 'ok') { + + // ----- Do the extraction (if not a folder) + if (!(($p_entry['external']&0x00000010)==0x00000010)) { + // ----- Look for not compressed file + if ($p_entry['compressed_size'] == $p_entry['size']) { + + // ----- Read the file in a buffer (one shot) + $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); + + // ----- Send the file to the output + echo $v_buffer; + unset($v_buffer); + } + else { + + // ----- Read the compressed file in a buffer (one shot) + $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); + + // ----- Decompress the file + $v_file_content = gzinflate($v_buffer); + unset($v_buffer); + + // ----- Send the file to the output + echo $v_file_content; + unset($v_file_content); + } + } + } + + // ----- Change abort status + if ($p_entry['status'] == "aborted") { + $p_entry['status'] = "skipped"; + } + + // ----- Look for post-extract callback + elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. +// eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header); + + // ----- Look for abort result + if ($v_result == 2) { + $v_result = PCLZIP_ERR_USER_ABORTED; + } + } + + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privExtractFileAsString() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privExtractFileAsString(&$p_entry, &$p_string, &$p_options) + { + $v_result=1; + + // ----- Read the file header + $v_header = array(); + if (($v_result = $this->privReadFileHeader($v_header)) != 1) + { + // ----- Return + return $v_result; + } + + + // ----- Check that the file header is coherent with $p_entry info + if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { + // TBC + } + + // ----- Look for pre-extract callback + if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. +// eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header); + if ($v_result == 0) { + // ----- Change the file status + $p_entry['status'] = "skipped"; + $v_result = 1; + } + + // ----- Look for abort result + if ($v_result == 2) { + // ----- This status is internal and will be changed in 'skipped' + $p_entry['status'] = "aborted"; + $v_result = PCLZIP_ERR_USER_ABORTED; + } + + // ----- Update the informations + // Only some fields can be modified + $p_entry['filename'] = $v_local_header['filename']; + } + + + // ----- Look if extraction should be done + if ($p_entry['status'] == 'ok') { + + // ----- Do the extraction (if not a folder) + if (!(($p_entry['external']&0x00000010)==0x00000010)) { + // ----- Look for not compressed file + // if ($p_entry['compressed_size'] == $p_entry['size']) + if ($p_entry['compression'] == 0) { + + // ----- Reading the file + $p_string = @fread($this->zip_fd, $p_entry['compressed_size']); + } + else { + + // ----- Reading the file + $v_data = @fread($this->zip_fd, $p_entry['compressed_size']); + + // ----- Decompress the file + if (($p_string = @gzinflate($v_data)) === FALSE) { + // TBC + } + } + + // ----- Trace + } + else { + // TBC : error : can not extract a folder in a string + } + + } + + // ----- Change abort status + if ($p_entry['status'] == "aborted") { + $p_entry['status'] = "skipped"; + } + + // ----- Look for post-extract callback + elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Swap the content to header + $v_local_header['content'] = $p_string; + $p_string = ''; + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. +// eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header); + + // ----- Swap back the content to header + $p_string = $v_local_header['content']; + unset($v_local_header['content']); + + // ----- Look for abort result + if ($v_result == 2) { + $v_result = PCLZIP_ERR_USER_ABORTED; + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privReadFileHeader() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privReadFileHeader(&$p_header) + { + $v_result=1; + + // ----- Read the 4 bytes signature + $v_binary_data = @fread($this->zip_fd, 4); + $v_data = unpack('Vid', $v_binary_data); + + // ----- Check signature + if ($v_data['id'] != 0x04034b50) + { + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read the first 42 bytes of the header + $v_binary_data = fread($this->zip_fd, 26); + + // ----- Look for invalid block size + if (strlen($v_binary_data) != 26) + { + $p_header['filename'] = ""; + $p_header['status'] = "invalid_header"; + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data)); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Extract the values + $v_data = unpack('vversion/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len', $v_binary_data); + + // ----- Get filename + $p_header['filename'] = fread($this->zip_fd, $v_data['filename_len']); + + // ----- Get extra_fields + if ($v_data['extra_len'] != 0) { + $p_header['extra'] = fread($this->zip_fd, $v_data['extra_len']); + } + else { + $p_header['extra'] = ''; + } + + // ----- Extract properties + $p_header['version_extracted'] = $v_data['version']; + $p_header['compression'] = $v_data['compression']; + $p_header['size'] = $v_data['size']; + $p_header['compressed_size'] = $v_data['compressed_size']; + $p_header['crc'] = $v_data['crc']; + $p_header['flag'] = $v_data['flag']; + $p_header['filename_len'] = $v_data['filename_len']; + + // ----- Recuperate date in UNIX format + $p_header['mdate'] = $v_data['mdate']; + $p_header['mtime'] = $v_data['mtime']; + if ($p_header['mdate'] && $p_header['mtime']) + { + // ----- Extract time + $v_hour = ($p_header['mtime'] & 0xF800) >> 11; + $v_minute = ($p_header['mtime'] & 0x07E0) >> 5; + $v_seconde = ($p_header['mtime'] & 0x001F)*2; + + // ----- Extract date + $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980; + $v_month = ($p_header['mdate'] & 0x01E0) >> 5; + $v_day = $p_header['mdate'] & 0x001F; + + // ----- Get UNIX date format + $p_header['mtime'] = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year); + + } + else + { + $p_header['mtime'] = time(); + } + + // TBC + //for(reset($v_data); $key = key($v_data); next($v_data)) { + //} + + // ----- Set the stored filename + $p_header['stored_filename'] = $p_header['filename']; + + // ----- Set the status field + $p_header['status'] = "ok"; + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privReadCentralFileHeader() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privReadCentralFileHeader(&$p_header) + { + $v_result=1; + + // ----- Read the 4 bytes signature + $v_binary_data = @fread($this->zip_fd, 4); + $v_data = unpack('Vid', $v_binary_data); + + // ----- Check signature + if ($v_data['id'] != 0x02014b50) + { + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read the first 42 bytes of the header + $v_binary_data = fread($this->zip_fd, 42); + + // ----- Look for invalid block size + if (strlen($v_binary_data) != 42) + { + $p_header['filename'] = ""; + $p_header['status'] = "invalid_header"; + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data)); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Extract the values + $p_header = unpack('vversion/vversion_extracted/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len/vcomment_len/vdisk/vinternal/Vexternal/Voffset', $v_binary_data); + + // ----- Get filename + if ($p_header['filename_len'] != 0) + $p_header['filename'] = fread($this->zip_fd, $p_header['filename_len']); + else + $p_header['filename'] = ''; + + // ----- Get extra + if ($p_header['extra_len'] != 0) + $p_header['extra'] = fread($this->zip_fd, $p_header['extra_len']); + else + $p_header['extra'] = ''; + + // ----- Get comment + if ($p_header['comment_len'] != 0) + $p_header['comment'] = fread($this->zip_fd, $p_header['comment_len']); + else + $p_header['comment'] = ''; + + // ----- Extract properties + + // ----- Recuperate date in UNIX format + //if ($p_header['mdate'] && $p_header['mtime']) + // TBC : bug : this was ignoring time with 0/0/0 + if (1) + { + // ----- Extract time + $v_hour = ($p_header['mtime'] & 0xF800) >> 11; + $v_minute = ($p_header['mtime'] & 0x07E0) >> 5; + $v_seconde = ($p_header['mtime'] & 0x001F)*2; + + // ----- Extract date + $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980; + $v_month = ($p_header['mdate'] & 0x01E0) >> 5; + $v_day = $p_header['mdate'] & 0x001F; + + // ----- Get UNIX date format + $p_header['mtime'] = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year); + + } + else + { + $p_header['mtime'] = time(); + } + + // ----- Set the stored filename + $p_header['stored_filename'] = $p_header['filename']; + + // ----- Set default status to ok + $p_header['status'] = 'ok'; + + // ----- Look if it is a directory + if (substr($p_header['filename'], -1) == '/') { + //$p_header['external'] = 0x41FF0010; + $p_header['external'] = 0x00000010; + } + + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privCheckFileHeaders() + // Description : + // Parameters : + // Return Values : + // 1 on success, + // 0 on error; + // -------------------------------------------------------------------------------- + function privCheckFileHeaders(&$p_local_header, &$p_central_header) + { + $v_result=1; + + // ----- Check the static values + // TBC + if ($p_local_header['filename'] != $p_central_header['filename']) { + } + if ($p_local_header['version_extracted'] != $p_central_header['version_extracted']) { + } + if ($p_local_header['flag'] != $p_central_header['flag']) { + } + if ($p_local_header['compression'] != $p_central_header['compression']) { + } + if ($p_local_header['mtime'] != $p_central_header['mtime']) { + } + if ($p_local_header['filename_len'] != $p_central_header['filename_len']) { + } + + // ----- Look for flag bit 3 + if (($p_local_header['flag'] & 8) == 8) { + $p_local_header['size'] = $p_central_header['size']; + $p_local_header['compressed_size'] = $p_central_header['compressed_size']; + $p_local_header['crc'] = $p_central_header['crc']; + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privReadEndCentralDir() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privReadEndCentralDir(&$p_central_dir) + { + $v_result=1; + + // ----- Go to the end of the zip file + $v_size = filesize($this->zipname); + @fseek($this->zip_fd, $v_size); + if (@ftell($this->zip_fd) != $v_size) + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to go to the end of the archive \''.$this->zipname.'\''); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- First try : look if this is an archive with no commentaries (most of the time) + // in this case the end of central dir is at 22 bytes of the file end + $v_found = 0; + if ($v_size > 26) { + @fseek($this->zip_fd, $v_size-22); + if (($v_pos = @ftell($this->zip_fd)) != ($v_size-22)) + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \''.$this->zipname.'\''); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read for bytes + $v_binary_data = @fread($this->zip_fd, 4); + $v_data = @unpack('Vid', $v_binary_data); + + // ----- Check signature + if ($v_data['id'] == 0x06054b50) { + $v_found = 1; + } + + $v_pos = ftell($this->zip_fd); + } + + // ----- Go back to the maximum possible size of the Central Dir End Record + if (!$v_found) { + $v_maximum_size = 65557; // 0xFFFF + 22; + if ($v_maximum_size > $v_size) + $v_maximum_size = $v_size; + @fseek($this->zip_fd, $v_size-$v_maximum_size); + if (@ftell($this->zip_fd) != ($v_size-$v_maximum_size)) + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \''.$this->zipname.'\''); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read byte per byte in order to find the signature + $v_pos = ftell($this->zip_fd); + $v_bytes = 0x00000000; + while ($v_pos < $v_size) + { + // ----- Read a byte + $v_byte = @fread($this->zip_fd, 1); + + // ----- Add the byte + //$v_bytes = ($v_bytes << 8) | Ord($v_byte); + // Note we mask the old value down such that once shifted we can never end up with more than a 32bit number + // Otherwise on systems where we have 64bit integers the check below for the magic number will fail. + $v_bytes = ( ($v_bytes & 0xFFFFFF) << 8) | Ord($v_byte); + + // ----- Compare the bytes + if ($v_bytes == 0x504b0506) + { + $v_pos++; + break; + } + + $v_pos++; + } + + // ----- Look if not found end of central dir + if ($v_pos == $v_size) + { + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Unable to find End of Central Dir Record signature"); + + // ----- Return + return PclZip::errorCode(); + } + } + + // ----- Read the first 18 bytes of the header + $v_binary_data = fread($this->zip_fd, 18); + + // ----- Look for invalid block size + if (strlen($v_binary_data) != 18) + { + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid End of Central Dir Record size : ".strlen($v_binary_data)); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Extract the values + $v_data = unpack('vdisk/vdisk_start/vdisk_entries/ventries/Vsize/Voffset/vcomment_size', $v_binary_data); + + // ----- Check the global size + if (($v_pos + $v_data['comment_size'] + 18) != $v_size) { + + // ----- Removed in release 2.2 see readme file + // The check of the file size is a little too strict. + // Some bugs where found when a zip is encrypted/decrypted with 'crypt'. + // While decrypted, zip has training 0 bytes + if (0) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, + 'The central dir is not at the end of the archive.' + .' Some trailing bytes exists after the archive.'); + + // ----- Return + return PclZip::errorCode(); + } + } + + // ----- Get comment + if ($v_data['comment_size'] != 0) { + $p_central_dir['comment'] = fread($this->zip_fd, $v_data['comment_size']); + } + else + $p_central_dir['comment'] = ''; + + $p_central_dir['entries'] = $v_data['entries']; + $p_central_dir['disk_entries'] = $v_data['disk_entries']; + $p_central_dir['offset'] = $v_data['offset']; + $p_central_dir['size'] = $v_data['size']; + $p_central_dir['disk'] = $v_data['disk']; + $p_central_dir['disk_start'] = $v_data['disk_start']; + + // TBC + //for(reset($p_central_dir); $key = key($p_central_dir); next($p_central_dir)) { + //} + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privDeleteByRule() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privDeleteByRule(&$p_result_list, &$p_options) + { + $v_result=1; + $v_list_detail = array(); + + // ----- Open the zip file + if (($v_result=$this->privOpenFd('rb')) != 1) + { + // ----- Return + return $v_result; + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) + { + $this->privCloseFd(); + return $v_result; + } + + // ----- Go to beginning of File + @rewind($this->zip_fd); + + // ----- Scan all the files + // ----- Start at beginning of Central Dir + $v_pos_entry = $v_central_dir['offset']; + @rewind($this->zip_fd); + if (@fseek($this->zip_fd, $v_pos_entry)) + { + // ----- Close the zip file + $this->privCloseFd(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read each entry + $v_header_list = array(); + $j_start = 0; + for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++) + { + + // ----- Read the file header + $v_header_list[$v_nb_extracted] = array(); + if (($v_result = $this->privReadCentralFileHeader($v_header_list[$v_nb_extracted])) != 1) + { + // ----- Close the zip file + $this->privCloseFd(); + + return $v_result; + } + + + // ----- Store the index + $v_header_list[$v_nb_extracted]['index'] = $i; + + // ----- Look for the specific extract rules + $v_found = false; + + // ----- Look for extract by name rule + if ( (isset($p_options[PCLZIP_OPT_BY_NAME])) + && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) { + + // ----- Look if the filename is in the list + for ($j=0; ($j strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) + && (substr($v_header_list[$v_nb_extracted]['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) { + $v_found = true; + } + elseif ( (($v_header_list[$v_nb_extracted]['external']&0x00000010)==0x00000010) /* Indicates a folder */ + && ($v_header_list[$v_nb_extracted]['stored_filename'].'/' == $p_options[PCLZIP_OPT_BY_NAME][$j])) { + $v_found = true; + } + } + // ----- Look for a filename + elseif ($v_header_list[$v_nb_extracted]['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) { + $v_found = true; + } + } + } + + // ----- Look for extract by ereg rule + // ereg() is deprecated with PHP 5.3 + /* + else if ( (isset($p_options[PCLZIP_OPT_BY_EREG])) + && ($p_options[PCLZIP_OPT_BY_EREG] != "")) { + + if (ereg($p_options[PCLZIP_OPT_BY_EREG], $v_header_list[$v_nb_extracted]['stored_filename'])) { + $v_found = true; + } + } + */ + + // ----- Look for extract by preg rule + else if ( (isset($p_options[PCLZIP_OPT_BY_PREG])) + && ($p_options[PCLZIP_OPT_BY_PREG] != "")) { + + if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header_list[$v_nb_extracted]['stored_filename'])) { + $v_found = true; + } + } + + // ----- Look for extract by index rule + else if ( (isset($p_options[PCLZIP_OPT_BY_INDEX])) + && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) { + + // ----- Look if the index is in the list + for ($j=$j_start; ($j=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) { + $v_found = true; + } + if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) { + $j_start = $j+1; + } + + if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) { + break; + } + } + } + else { + $v_found = true; + } + + // ----- Look for deletion + if ($v_found) + { + unset($v_header_list[$v_nb_extracted]); + } + else + { + $v_nb_extracted++; + } + } + + // ----- Look if something need to be deleted + if ($v_nb_extracted > 0) { + + // ----- Creates a temporay file + $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp'; + + // ----- Creates a temporary zip archive + $v_temp_zip = new PclZip($v_zip_temp_name); + + // ----- Open the temporary zip file in write mode + if (($v_result = $v_temp_zip->privOpenFd('wb')) != 1) { + $this->privCloseFd(); + + // ----- Return + return $v_result; + } + + // ----- Look which file need to be kept + for ($i=0; $izip_fd); + if (@fseek($this->zip_fd, $v_header_list[$i]['offset'])) { + // ----- Close the zip file + $this->privCloseFd(); + $v_temp_zip->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read the file header + $v_local_header = array(); + if (($v_result = $this->privReadFileHeader($v_local_header)) != 1) { + // ----- Close the zip file + $this->privCloseFd(); + $v_temp_zip->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Return + return $v_result; + } + + // ----- Check that local file header is same as central file header + if ($this->privCheckFileHeaders($v_local_header, + $v_header_list[$i]) != 1) { + // TBC + } + unset($v_local_header); + + // ----- Write the file header + if (($v_result = $v_temp_zip->privWriteFileHeader($v_header_list[$i])) != 1) { + // ----- Close the zip file + $this->privCloseFd(); + $v_temp_zip->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Return + return $v_result; + } + + // ----- Read/write the data block + if (($v_result = PclZipUtilCopyBlock($this->zip_fd, $v_temp_zip->zip_fd, $v_header_list[$i]['compressed_size'])) != 1) { + // ----- Close the zip file + $this->privCloseFd(); + $v_temp_zip->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Return + return $v_result; + } + } + + // ----- Store the offset of the central dir + $v_offset = @ftell($v_temp_zip->zip_fd); + + // ----- Re-Create the Central Dir files header + for ($i=0; $iprivWriteCentralFileHeader($v_header_list[$i])) != 1) { + $v_temp_zip->privCloseFd(); + $this->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Return + return $v_result; + } + + // ----- Transform the header to a 'usable' info + $v_temp_zip->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); + } + + + // ----- Zip file comment + $v_comment = ''; + if (isset($p_options[PCLZIP_OPT_COMMENT])) { + $v_comment = $p_options[PCLZIP_OPT_COMMENT]; + } + + // ----- Calculate the size of the central header + $v_size = @ftell($v_temp_zip->zip_fd)-$v_offset; + + // ----- Create the central dir footer + if (($v_result = $v_temp_zip->privWriteCentralHeader(sizeof($v_header_list), $v_size, $v_offset, $v_comment)) != 1) { + // ----- Reset the file list + unset($v_header_list); + $v_temp_zip->privCloseFd(); + $this->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Return + return $v_result; + } + + // ----- Close + $v_temp_zip->privCloseFd(); + $this->privCloseFd(); + + // ----- Delete the zip file + // TBC : I should test the result ... + @unlink($this->zipname); + + // ----- Rename the temporary file + // TBC : I should test the result ... + //@rename($v_zip_temp_name, $this->zipname); + PclZipUtilRename($v_zip_temp_name, $this->zipname); + + // ----- Destroy the temporary archive + unset($v_temp_zip); + } + + // ----- Remove every files : reset the file + else if ($v_central_dir['entries'] != 0) { + $this->privCloseFd(); + + if (($v_result = $this->privOpenFd('wb')) != 1) { + return $v_result; + } + + if (($v_result = $this->privWriteCentralHeader(0, 0, 0, '')) != 1) { + return $v_result; + } + + $this->privCloseFd(); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privDirCheck() + // Description : + // Check if a directory exists, if not it creates it and all the parents directory + // which may be useful. + // Parameters : + // $p_dir : Directory path to check. + // Return Values : + // 1 : OK + // -1 : Unable to create directory + // -------------------------------------------------------------------------------- + function privDirCheck($p_dir, $p_is_dir=false) + { + $v_result = 1; + + + // ----- Remove the final '/' + if (($p_is_dir) && (substr($p_dir, -1)=='/')) + { + $p_dir = substr($p_dir, 0, strlen($p_dir)-1); + } + + // ----- Check the directory availability + if ((is_dir($p_dir)) || ($p_dir == "")) + { + return 1; + } + + // ----- Extract parent directory + $p_parent_dir = dirname($p_dir); + + // ----- Just a check + if ($p_parent_dir != $p_dir) + { + // ----- Look for parent directory + if ($p_parent_dir != "") + { + if (($v_result = $this->privDirCheck($p_parent_dir)) != 1) + { + return $v_result; + } + } + } + + // ----- Create the directory + if (!@mkdir($p_dir, 0777)) + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_DIR_CREATE_FAIL, "Unable to create directory '$p_dir'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privMerge() + // Description : + // If $p_archive_to_add does not exist, the function exit with a success result. + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privMerge(&$p_archive_to_add) + { + $v_result=1; + + // ----- Look if the archive_to_add exists + if (!is_file($p_archive_to_add->zipname)) + { + + // ----- Nothing to merge, so merge is a success + $v_result = 1; + + // ----- Return + return $v_result; + } + + // ----- Look if the archive exists + if (!is_file($this->zipname)) + { + + // ----- Do a duplicate + $v_result = $this->privDuplicate($p_archive_to_add->zipname); + + // ----- Return + return $v_result; + } + + // ----- Open the zip file + if (($v_result=$this->privOpenFd('rb')) != 1) + { + // ----- Return + return $v_result; + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) + { + $this->privCloseFd(); + return $v_result; + } + + // ----- Go to beginning of File + @rewind($this->zip_fd); + + // ----- Open the archive_to_add file + if (($v_result=$p_archive_to_add->privOpenFd('rb')) != 1) + { + $this->privCloseFd(); + + // ----- Return + return $v_result; + } + + // ----- Read the central directory informations + $v_central_dir_to_add = array(); + if (($v_result = $p_archive_to_add->privReadEndCentralDir($v_central_dir_to_add)) != 1) + { + $this->privCloseFd(); + $p_archive_to_add->privCloseFd(); + + return $v_result; + } + + // ----- Go to beginning of File + @rewind($p_archive_to_add->zip_fd); + + // ----- Creates a temporay file + $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp'; + + // ----- Open the temporary file in write mode + if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0) + { + $this->privCloseFd(); + $p_archive_to_add->privCloseFd(); + + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_zip_temp_name.'\' in binary write mode'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Copy the files from the archive to the temporary file + // TBC : Here I should better append the file and go back to erase the central dir + $v_size = $v_central_dir['offset']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = fread($this->zip_fd, $v_read_size); + @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Copy the files from the archive_to_add into the temporary file + $v_size = $v_central_dir_to_add['offset']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = fread($p_archive_to_add->zip_fd, $v_read_size); + @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Store the offset of the central dir + $v_offset = @ftell($v_zip_temp_fd); + + // ----- Copy the block of file headers from the old archive + $v_size = $v_central_dir['size']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($this->zip_fd, $v_read_size); + @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Copy the block of file headers from the archive_to_add + $v_size = $v_central_dir_to_add['size']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($p_archive_to_add->zip_fd, $v_read_size); + @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Merge the file comments + $v_comment = $v_central_dir['comment'].' '.$v_central_dir_to_add['comment']; + + // ----- Calculate the size of the (new) central header + $v_size = @ftell($v_zip_temp_fd)-$v_offset; + + // ----- Swap the file descriptor + // Here is a trick : I swap the temporary fd with the zip fd, in order to use + // the following methods on the temporary fil and not the real archive fd + $v_swap = $this->zip_fd; + $this->zip_fd = $v_zip_temp_fd; + $v_zip_temp_fd = $v_swap; + + // ----- Create the central dir footer + if (($v_result = $this->privWriteCentralHeader($v_central_dir['entries']+$v_central_dir_to_add['entries'], $v_size, $v_offset, $v_comment)) != 1) + { + $this->privCloseFd(); + $p_archive_to_add->privCloseFd(); + @fclose($v_zip_temp_fd); + $this->zip_fd = null; + + // ----- Reset the file list + unset($v_header_list); + + // ----- Return + return $v_result; + } + + // ----- Swap back the file descriptor + $v_swap = $this->zip_fd; + $this->zip_fd = $v_zip_temp_fd; + $v_zip_temp_fd = $v_swap; + + // ----- Close + $this->privCloseFd(); + $p_archive_to_add->privCloseFd(); + + // ----- Close the temporary file + @fclose($v_zip_temp_fd); + + // ----- Delete the zip file + // TBC : I should test the result ... + @unlink($this->zipname); + + // ----- Rename the temporary file + // TBC : I should test the result ... + //@rename($v_zip_temp_name, $this->zipname); + PclZipUtilRename($v_zip_temp_name, $this->zipname); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privDuplicate() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privDuplicate($p_archive_filename) + { + $v_result=1; + + // ----- Look if the $p_archive_filename exists + if (!is_file($p_archive_filename)) + { + + // ----- Nothing to duplicate, so duplicate is a success. + $v_result = 1; + + // ----- Return + return $v_result; + } + + // ----- Open the zip file + if (($v_result=$this->privOpenFd('wb')) != 1) + { + // ----- Return + return $v_result; + } + + // ----- Open the temporary file in write mode + if (($v_zip_temp_fd = @fopen($p_archive_filename, 'rb')) == 0) + { + $this->privCloseFd(); + + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive file \''.$p_archive_filename.'\' in binary write mode'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Copy the files from the archive to the temporary file + // TBC : Here I should better append the file and go back to erase the central dir + $v_size = filesize($p_archive_filename); + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = fread($v_zip_temp_fd, $v_read_size); + @fwrite($this->zip_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Close + $this->privCloseFd(); + + // ----- Close the temporary file + @fclose($v_zip_temp_fd); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privErrorLog() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function privErrorLog($p_error_code=0, $p_error_string='') + { + if (PCLZIP_ERROR_EXTERNAL == 1) { + PclError($p_error_code, $p_error_string); + } + else { + $this->error_code = $p_error_code; + $this->error_string = $p_error_string; + } + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privErrorReset() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function privErrorReset() + { + if (PCLZIP_ERROR_EXTERNAL == 1) { + PclErrorReset(); + } + else { + $this->error_code = 0; + $this->error_string = ''; + } + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privDisableMagicQuotes() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privDisableMagicQuotes() + { + $v_result=1; + + // ----- Look if function exists + if ( (!function_exists("get_magic_quotes_runtime")) + || (!function_exists("set_magic_quotes_runtime"))) { + return $v_result; + } + + // ----- Look if already done + if ($this->magic_quotes_status != -1) { + return $v_result; + } + + // ----- Get and memorize the magic_quote value + $this->magic_quotes_status = @get_magic_quotes_runtime(); + + // ----- Disable magic_quotes + if ($this->magic_quotes_status == 1) { + @set_magic_quotes_runtime(0); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privSwapBackMagicQuotes() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privSwapBackMagicQuotes() + { + $v_result=1; + + // ----- Look if function exists + if ( (!function_exists("get_magic_quotes_runtime")) + || (!function_exists("set_magic_quotes_runtime"))) { + return $v_result; + } + + // ----- Look if something to do + if ($this->magic_quotes_status != -1) { + return $v_result; + } + + // ----- Swap back magic_quotes + if ($this->magic_quotes_status == 1) { + @set_magic_quotes_runtime($this->magic_quotes_status); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + } + // End of class + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclZipUtilPathReduction() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function PclZipUtilPathReduction($p_dir) + { + $v_result = ""; + + // ----- Look for not empty path + if ($p_dir != "") { + // ----- Explode path by directory names + $v_list = explode("/", $p_dir); + + // ----- Study directories from last to first + $v_skip = 0; + for ($i=sizeof($v_list)-1; $i>=0; $i--) { + // ----- Look for current path + if ($v_list[$i] == ".") { + // ----- Ignore this directory + // Should be the first $i=0, but no check is done + } + else if ($v_list[$i] == "..") { + $v_skip++; + } + else if ($v_list[$i] == "") { + // ----- First '/' i.e. root slash + if ($i == 0) { + $v_result = "/".$v_result; + if ($v_skip > 0) { + // ----- It is an invalid path, so the path is not modified + // TBC + $v_result = $p_dir; + $v_skip = 0; + } + } + // ----- Last '/' i.e. indicates a directory + else if ($i == (sizeof($v_list)-1)) { + $v_result = $v_list[$i]; + } + // ----- Double '/' inside the path + else { + // ----- Ignore only the double '//' in path, + // but not the first and last '/' + } + } + else { + // ----- Look for item to skip + if ($v_skip > 0) { + $v_skip--; + } + else { + $v_result = $v_list[$i].($i!=(sizeof($v_list)-1)?"/".$v_result:""); + } + } + } + + // ----- Look for skip + if ($v_skip > 0) { + while ($v_skip > 0) { + $v_result = '../'.$v_result; + $v_skip--; + } + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclZipUtilPathInclusion() + // Description : + // This function indicates if the path $p_path is under the $p_dir tree. Or, + // said in an other way, if the file or sub-dir $p_path is inside the dir + // $p_dir. + // The function indicates also if the path is exactly the same as the dir. + // This function supports path with duplicated '/' like '//', but does not + // support '.' or '..' statements. + // Parameters : + // Return Values : + // 0 if $p_path is not inside directory $p_dir + // 1 if $p_path is inside directory $p_dir + // 2 if $p_path is exactly the same as $p_dir + // -------------------------------------------------------------------------------- + function PclZipUtilPathInclusion($p_dir, $p_path) + { + $v_result = 1; + + // ----- Look for path beginning by ./ + if ( ($p_dir == '.') + || ((strlen($p_dir) >=2) && (substr($p_dir, 0, 2) == './'))) { + $p_dir = PclZipUtilTranslateWinPath(getcwd(), FALSE).'/'.substr($p_dir, 1); + } + if ( ($p_path == '.') + || ((strlen($p_path) >=2) && (substr($p_path, 0, 2) == './'))) { + $p_path = PclZipUtilTranslateWinPath(getcwd(), FALSE).'/'.substr($p_path, 1); + } + + // ----- Explode dir and path by directory separator + $v_list_dir = explode("/", $p_dir); + $v_list_dir_size = sizeof($v_list_dir); + $v_list_path = explode("/", $p_path); + $v_list_path_size = sizeof($v_list_path); + + // ----- Study directories paths + $i = 0; + $j = 0; + while (($i < $v_list_dir_size) && ($j < $v_list_path_size) && ($v_result)) { + + // ----- Look for empty dir (path reduction) + if ($v_list_dir[$i] == '') { + $i++; + continue; + } + if ($v_list_path[$j] == '') { + $j++; + continue; + } + + // ----- Compare the items + if (($v_list_dir[$i] != $v_list_path[$j]) && ($v_list_dir[$i] != '') && ( $v_list_path[$j] != '')) { + $v_result = 0; + } + + // ----- Next items + $i++; + $j++; + } + + // ----- Look if everything seems to be the same + if ($v_result) { + // ----- Skip all the empty items + while (($j < $v_list_path_size) && ($v_list_path[$j] == '')) $j++; + while (($i < $v_list_dir_size) && ($v_list_dir[$i] == '')) $i++; + + if (($i >= $v_list_dir_size) && ($j >= $v_list_path_size)) { + // ----- There are exactly the same + $v_result = 2; + } + else if ($i < $v_list_dir_size) { + // ----- The path is shorter than the dir + $v_result = 0; + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclZipUtilCopyBlock() + // Description : + // Parameters : + // $p_mode : read/write compression mode + // 0 : src & dest normal + // 1 : src gzip, dest normal + // 2 : src normal, dest gzip + // 3 : src & dest gzip + // Return Values : + // -------------------------------------------------------------------------------- + function PclZipUtilCopyBlock($p_src, $p_dest, $p_size, $p_mode=0) + { + $v_result = 1; + + if ($p_mode==0) + { + while ($p_size != 0) + { + $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($p_src, $v_read_size); + @fwrite($p_dest, $v_buffer, $v_read_size); + $p_size -= $v_read_size; + } + } + else if ($p_mode==1) + { + while ($p_size != 0) + { + $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @gzread($p_src, $v_read_size); + @fwrite($p_dest, $v_buffer, $v_read_size); + $p_size -= $v_read_size; + } + } + else if ($p_mode==2) + { + while ($p_size != 0) + { + $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($p_src, $v_read_size); + @gzwrite($p_dest, $v_buffer, $v_read_size); + $p_size -= $v_read_size; + } + } + else if ($p_mode==3) + { + while ($p_size != 0) + { + $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @gzread($p_src, $v_read_size); + @gzwrite($p_dest, $v_buffer, $v_read_size); + $p_size -= $v_read_size; + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclZipUtilRename() + // Description : + // This function tries to do a simple rename() function. If it fails, it + // tries to copy the $p_src file in a new $p_dest file and then unlink the + // first one. + // Parameters : + // $p_src : Old filename + // $p_dest : New filename + // Return Values : + // 1 on success, 0 on failure. + // -------------------------------------------------------------------------------- + function PclZipUtilRename($p_src, $p_dest) + { + $v_result = 1; + + // ----- Try to rename the files + if (!@rename($p_src, $p_dest)) { + + // ----- Try to copy & unlink the src + if (!@copy($p_src, $p_dest)) { + $v_result = 0; + } + else if (!@unlink($p_src)) { + $v_result = 0; + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclZipUtilOptionText() + // Description : + // Translate option value in text. Mainly for debug purpose. + // Parameters : + // $p_option : the option value. + // Return Values : + // The option text value. + // -------------------------------------------------------------------------------- + function PclZipUtilOptionText($p_option) + { + + $v_list = get_defined_constants(); + for (reset($v_list); $v_key = key($v_list); next($v_list)) { + $v_prefix = substr($v_key, 0, 10); + if (( ($v_prefix == 'PCLZIP_OPT') + || ($v_prefix == 'PCLZIP_CB_') + || ($v_prefix == 'PCLZIP_ATT')) + && ($v_list[$v_key] == $p_option)) { + return $v_key; + } + } + + $v_result = 'Unknown'; + + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclZipUtilTranslateWinPath() + // Description : + // Translate windows path by replacing '\' by '/' and optionally removing + // drive letter. + // Parameters : + // $p_path : path to translate. + // $p_remove_disk_letter : true | false + // Return Values : + // The path translated. + // -------------------------------------------------------------------------------- + function PclZipUtilTranslateWinPath($p_path, $p_remove_disk_letter=true) + { + if (stristr(php_uname(), 'windows')) { + // ----- Look for potential disk letter + if (($p_remove_disk_letter) && (($v_position = strpos($p_path, ':')) != false)) { + $p_path = substr($p_path, $v_position+1); + } + // ----- Change potential windows directory separator + if ((strpos($p_path, '\\') > 0) || (substr($p_path, 0,1) == '\\')) { + $p_path = strtr($p_path, '\\', '/'); + } + } + return $p_path; + } + // -------------------------------------------------------------------------------- + + +?> blob - /dev/null blob + 157dd06d93f78abbd3e4e9e59ec8ca2157a26da9 (mode 644) --- /dev/null +++ phpinfo.php @@ -0,0 +1 @@ + blob - /dev/null blob + 67877d8e44a1dc9390168ccfbb5cde14bc0edebf (mode 644) --- /dev/null +++ rss.xml @@ -0,0 +1,57 @@ + + + + + + + Flux RSS - Sylvain.sab + Les mises à jour de Sylvain.sab par Flux RSS + http://sylvain.sab.free.fr/ + fr + 30 + + + http://sylvain.sab.free.fr/img/boutons/btssylvainsab.gif + la page d'accueil + http://sylvain.sab.free.fr/ + 123 + 33 + + + C'est quoi Linux ? + http://sylvain.sab.free.fr/cestquoi/gnu-linux/ + linux + Linux est un système d'exploitation libre. + Sun, 09 Sep 2007 22:00:00 GMT + + C'est quoi les logiciels libres, l'open-source ? + http://sylvain.sab.free.fr/cestquoi/libre/ + libre + Le logiciel libre n'est soumis à aucune contrainte : vous êtes libre de le distribuer, le modifier... + Sun, 09 Sep 2007 22:00:00 GMT + + Configurer Thunderbird + http://sylvain.sab.free.fr/configurer/thunderbird.php + configurer tb + Les règles de filtrage et deux astuces. + Fri, 02 Feb 2007 23:00:00 GMT + + Qu'est-ce que l'hébergement ? C'est quoi un hébergeur ? + http://sylvain.sab.free.fr/cestquoi/web/hebergement.php + c'est quoi l'hébergement + Après l'explication sur les serveurs, j'ai ajouté un petit article sur les hébergeurs et l'hébergement, qui permettent de stocker ses fichiers pour les mettre à disposition en ligne. + Sat, 27 Jan 2007 23:50:00 GMT + + + blob - /dev/null blob + 7f87028ad8f03dd8a3a1725627c1b7ded3dc6ec0 (mode 644) --- /dev/null +++ rss.xslt @@ -0,0 +1,84 @@ + + + + + + + + + +<xsl:value-of select="title" /> + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +

+

+ + [Valid RSS]
+ Cette page est au format RSS 2.0.
+ Elle est conçue pour être lue par des aggrégateurs de flux RSS. +
+ + +
+ + +
+ + + + +
+ +
+ +
+ +
+
+