Le blog de syeric

Les risques qui pesent sur le logiciel libre.

Bonjour !

Voici un excellent article paru sur le site candidats.fr, qui a pour but de mobiliser les politiques sur les questions du logiciel libre en ces temps d'élection. Il s'agit de répertorier les risques majeurs pour ces logiciels.

1 Brevets logiciels

En France comme en Europe, les logiciels ne sont pas brevetables car ils relèvent des méthodes et des algorithmes – au même titre que les mathématiques. Or depuis plusieurs années, de grandes entreprises poussent le principe du brevet logiciel, arguant qu'il favoriserait l'innovation. C'est tout le contraire : en interdisant l'accès à une méthode, le cycle d'innovation en informatique étant très court, un brevet logiciel gèle l'innovation au lieu de la stimuler. Contrairement au droit d'auteur qui protège aujourd'hui les créations logicielles, les brevets logiciels sont discriminatoires envers les PME éditrices de logiciels (libres ou propriétaires) qui n'ont pas les moyens de financer les coûts de recherche d'antériorité et de litiges pour protéger leurs logiciels mais aussi pour les commercialiser sans risque. Le principe de brevet logiciel est fondamentalement incompatible avec le Logiciel Libre. Il suppose d'importants frais de mise en oeuvre et des restrictions d'usage. S'il était introduit en Europe, il freinerait brutalement le développement et l'utilisation du Logiciel Libre.

Il faut s'opposer à ce qui n'est qu'un cheval de Troie pour une poignée de grands éditeurs principalement extraeuropéens qui seront les seuls, avec les avocats spécialisés, à bénéficier de l'insécurité juridique liée.

2 Vente liée

Actuellement, la liberté d'accès au marché ne s'applique pas réellement au Logiciel Libre. Pour le marché « grand public » le Logiciel Libre se heurte aux ententes entre éditeurs de logiciels et fabricants de matériels, bien que leur comportement (vente liée, absence d'information du consommateur) soit sanctionné par le code de la consommation, et malgré les négociations menées par la DGCCRF pour mettre un terme à cette situation.

Il existe également une discrimination quant à l'accès à la commande publique, aux services publics et plus généralement aux données publiques. Cela résulte du choix des formats utilisés : les pouvoirs et les services publics ne choisissent pas toujours des formats dits « ouverts », implémentables dans tout logiciel. Or le choix de formats fermés a pour conséquence de limiter l'accès aux documents aux seuls utilisateurs des logiciels (propriétaires) qui savent les lire. Par exemple, le fait qu'une administration diffuse pour ses appels d'offre des documents dans un format fermé peut interdire de fait l'accès à la commande publique aux utilisateurs de Logiciels libres. De même, le format choisi par certains services publics pour diffuser leurs contenus en rend l'accès quasiment impossible aux utilisateurs de Logiciels libres (Radio France, France Télévision). Il en va de même pour la plupart des données publiques (cartes géographiques, documents officiels...). Suite aux demandes de nombreux internautes, l'Assemblée Nationale a décidé cette année de diffuser « la séance en direct » dans un format ouvert, pour garantir à tous un égal accès aux débats parlementaires. Il faut encourager à reproduire de telles initiatives. C'est d'ailleurs tout le sens du Référentiel Général d'Interopérabilité, annoncé de longue date, qui devra être mis en oeuvre lors de la prochaine législature.

3 DADVSI

La loi sur le droit d'auteur à l'ère du numérique (DADVSI, Droit d'Auteur et Droits Voisins dans la Société de l'Information) adoptée l'an dernier a donné lieu, au nom de la lutte contre la contrefaçon, à des extensions abusives du droit d'auteur. Cette loi a introduit dans notre droit des dispositions qui portent atteinte à la neutralité de la technique, c'est à dire le principe selon lequel une technologie n'est en soi ni bonne ni mauvaise : seuls les usages que l'on en fait sont justes ou condamnables. Sous prétexte que les utilisateurs d'un logiciel libre pourraient le modifier pour réaliser des copies illégales, cette loi exclut ainsi les auteurs de logiciels libres du marché des lecteurs multimedia capables de lire des oeuvres protégées. Il en résulte une aggravation de la discrimination à l'accès au marché pour les développeurs de logiciels libres, ainsi qu'une discrimination envers leurs utilisateurs.

Concrètement, la protection juridique des mesures techniques (ou DRM) a pour conséquence de rendre juridiquement hasardeuse l'élaboration d'un logiciel indépendant à code source ouvert capable de lire un film ou une musique protégés. Les utilisateurs de Logiciels libres n'ont de ce fait pas accès aux plateformes de vente de musique en ligne lorsque les morceaux de musique sont protégés par des mesures techniques. Par ailleurs les articles dits "Vivendi" qui incriminent les plateformes de peertopeer ne contenant pas de DRM sous prétexte qu'elles sont, entre autres, utilisées pour échanger sans autorisation d'oeuvres posent également un problème majeur au logiciel libre. On tend ici à censurer des auteurs de logiciels libres à leur interdire l'utilisation de la technologie P2P alors que ce sont les utilisateurs qui portent éventuellement atteinte, par leurs actes, à la propriété intellectuelle de certains auteurs et de leurs ayantdroits et que les auteurs de logiciels libres ne sont pas en mesure de les en empêcher, par essence.

In fine cette loi est donc discriminatoire. Elle fait peser injustement une lourde insécurité juridique sur les auteurs de logiciels libres. Certains ont préféré s'exiler, à l'instar du responsable du projet de peertopeer Azureus parti aux ÉtatsUnis, pays qui comme de nombreux autres abandonne progressivement le mirage de la protection juridique des mesures techniques face aux effets pervers multiples qu'elle engendre. Une révision de la loi DADVSI est indispensable.

4 Informatique dite « de confiance »

En plus des revendications faites au titre de droits de propriété inexistants en droit européen ou sous le fallacieux prétexte de la lutte contre la contrefaçon, des revendications exagérées faites au nom de la sécurité informatique se multiplient également pour tenter de justifier la mise en place de nouveaux obstacles à la libre concurrence.

Certains acteurs dominants, comme Microsoft, essayent ainsi de restreindre l'interopérabilité avec leurs logiciels aux seuls logiciels certifiés “conformes” à leurs critères. Ils imposent de passer des tests de certification fort coûteux qui excluent de facto les auteurs bénévoles et les PME. L'aboutissement d'une telle démarche est l'informatique dite “de confiance” qui empêche dans les faits, par des moyens techniques, la mise en oeuvre de l'interopérabilité aux logiciels non certifiés, c'est à dire la communication entre deux logiciels indépendants. De telles pratiques et mécanismes doivent être rejetés.

Comme l'expliquait un rapport sur la sécurité des systèmes d'informations rédigé par le député Pierre Lasbordes en 2005, « l'émergence de cette informatique de confiance conduirait un nombre très limité de sociétés à imposer leur modèle de sécurité à la planète, en autorisant ou non, par la délivrance de certificats numériques, des applications à s'exécuter sur des PC donnés » ; ce qui pose, en plus des risques pour la vie privée et la sécurité nationale, d'évidents problèmes de libre concurrence



http://www.candidats.fr/

A bientôt !

Sylvain

Le menu transparent

Bonjour !

Alors, comment ça marche cette bête là ? Vous allez voir, c'est pas si difficile ;-)

Déjà, commençons par rendre à César : je me suis très largement inspiré du blog de Sahid Ferdjaoui qui est au passage de grande qualité.

Et puis je me suis dit, son menu transparant me plait bien, alors pourquoi essayer de faire de même sur mon Dotclear ?

C'est partit ! Commencez par éditer votre fichier style.css, contenu dans le répertoire du style que vous avez appliqué. Il diffère très certainement du miens mais vous devriez vous en sortir. Rajouter à la fin :

[css]
/*menu transparent*/
div#header_2 {
	background: #fff url(img/page.png) repeat-y center top;
	height:30px;
	width:auto;
	font-size:13px;
	padding:4px 5px 0px 0px;
}
div#header_2 ul {
	list-style-type:none;
}
/*definition du bouton sur lequel il faudra passer */
div#header_2 div#menu span.bouton {
	position:absolute;
	left:260px; /*a modifier en fonction de votre thème !*/
	top:200px; /*pareil*/
	cursor:pointer;
	font-family:arial, "lucida console", sans-serif;
	background-color:#f3f3f3;
	border:1px solid #ccc;
}
div#header_2 div#menu span.bouton img { margin:0px 5px 0px 3px }
div#header_2 div#menu span.bouton div { padding-top:3px; margin-right:3px }
div#header_2 div#menu span.bouton:hover {
	background-color:#fdfdfd;
	border:1px solid #888
}
div#header_2 div#menu div#mainMenu { display:none; }
div#header_2 div#menu div#mainMenu a { text-decoration:none; color:#000; }
div#header_2 div#menu div#mainMenu a:hover { text-decoration:none; border:none; }


div#header_2 div#menu:hover div#mainMenu {
	position:absolute;
	top: 210px;
	left:260px;
	
	display:block;

	background-color:#F5F5FF;
	padding-right:6px;
	padding-bottom:6px;
	width:200px;
	
	z-index:50;

}
div#header_2 div#menu div#mainMenu div#search{
	background: transparent;
	color: inherit;
	line-height: 2.3em;
}
	
	#search fieldset, #search p{
		margin: 0;
		padding: 0;
	}

	#q{
		padding-left: 18px;
		background: #fff url(img/q.png) no-repeat 4px center;
	}

div#header_2 div#menu div#mainMenu ul {
	list-style-type : none;
	margin-top : 0.15em;
}
div#header_2 div#menu div#mainMenu li {
	list-style : square;
	margin-top : 0.15em;
	color : #999;
}
div#header_2 div#menu div#mainMenu li:hover {
	color : #425176;
}

div#header_2 div#menu div#mainMenu h2 {
	color: #4a629f;
	margin: 0 0 1ex 0;
	text-align: left;

}

div#header_2 div#menu div#mainMenu h3 {
	font-size: 1em;
	margin: 0;
}
div#header_2 span.bouton2 {
	position:absolute;
	left:390px;
	top:202px;
	cursor:pointer;
	font-family:arial, "lucida console", sans-serif;
	background-color:#f3f3f3;
	border:1px solid #ccc;
}

/* ombres
**************/
.shadow {
	float:left;
	background-color:#fff;
	background: url(img/shadowAlpha.png) no-repeat bottom right; /* ff */
	background: url(img/shadow.gif) no-repeat bottom right; /* ie */
	margin: 0px 0 0 30px;
	
	opacity: 0.8;
	-moz-opacity: 0.8;
	-khtml-opacity: 0.8;
	FILTER: alpha(opacity=80);
}

Bon, voilà ! Pour les images à la fin, les voilà :

http://ssaleur.free.fr/blog2/dotclear/themes/Blue%20Geek/img/shadowAlpha.png http://ssaleur.free.fr/blog2/dotclear/themes/Blue%20Geek/img/shadow.gif Il faut les mettre dans le dossier img de votre thème.

Bien ! Ensuite, il faut éditer votre fichier template.php, toujours dans le dossier de votre thème. Vous aurez une section, si le fichier est bien commenté, qui concerne "sidebar". La dedans se trouve votre menu. Vous remarquerez la ligne :

[php]
	<div id="calendar">
	<h2>Calendrier</h2>
	<?php #Affichage du calendrier
	dcCalendar('<table summary="Calendrier">%s</table>'); ?>
	<span></span>
	</div>

C'est le calendrier. En dessous commence le menu, avec search. Bien ! Copiez ce qui vous intéresse. Moi par exemple j'ai pris search, catégories et archives. Ca ressemble à ça :

[php]
	<div id="search">
		<form action="<?php dcInfo('search'); ?>" method="get">
		
			<h2><label for="q">Rechercher</label></h2>
			<p class="field"><input name="q" id="q" type="text" size="10"
			value="<?php dcSearchString(); ?>" accesskey="4" />
			<input type="submit" class="submit" value="ok" /></p>
		
		</form>
	</div>
	<div id="categories">
		<h2>Cat&eacute;gories</h2>
		<?php dcCatList(); ?>
	</div>
	
	<div id="archives">
		<h2>Archives</h2>
		<?php dcMonthsList(); ?>
	</div>



Bien, alors ensuite, rendez vous un peu plus haut dans le fichier. Juste en dessous de :

[php]
<div id="top">
	<h1><a href="<?php dcInfo('url'); ?>"><?php dcInfo(); ?></a></h1>
</div>

Et ensuite, c'est parti !

[php]
<div id="header_2">
	<div id="menu">
		<span class="bouton"><div>Navigation rapide</div></span>
			<div id="mainMenu" class="shadow">
				<div style="background-color:#fff; padding:10px; background-color:#f6f6f6; border:3px solid #aaa">
						<div id="search">
							<form action="<?php dcInfo('search'); ?>" method="get">
								<h2>Rechercher</h2>
								<p class="field"><input name="q" id="q" type="text" size="10" value="<?php dcSearchString(); ?>" accesskey="4" />
								<input type="submit" class="submit" value="ok" /></p>
							</form>
						</div>
	
						<div id="categories">
							<h2>Cat&eacute;gories</h2>
							<?php dcCatList(); ?>
						</div>
	
						<div id="archives">
							<h2>Archives</h2>
							<?php dcMonthsList(); ?>
						</div>
	
				</div>
		</div>
	
	</div>
</div>

Ca y'est, le menu transparent est en place ! Vous remarquerez que ce que nous avons copié avant se retrouve exactement dans notre ajout.

Voilà voilà !

A bientôt

Sylvain

Sacré Steve !

Bonjour !

Depuis plusieurs années, Steve Ballmer, le PDG de Microsoft, ainsi que ses acolytes sortes des super blagues : Les systèmes GNU / Linux et les logiciels libres violeraient plus de 200 brevets de Microsoft.

Cela met à chaque fois la communauté du libre en émoi. Pour l'instant, aucune action judiciaire ou même l'ombre d'un preuve n'a été amorcée... Certains libristes ont appelé non sans ironie Steve à dévoiler le code source de ses produits afin de vérifier ses propos, dans une lettre ouverte (anglais) qui est bien sûr restée lettre morte...

Récemment, Linus Tornvalds a réagit à ces attaques. Selon lui, Microsoft ne cherche pas à protéger sa propriété intellectuelle mais à instiller le doute et la crainte dans l'esprit des nombreuses sociétés qui éditent ou utilisent des produits Linux

Il ajoute, dans son ton comme d'habitude assez provocateur, que Microsoft viole sans doute plus de brevets que Linux.

Il demande également à la firme d'être plus précise dans ces brevets en les nommant. Il estime que la plupart seraient invalidés. Mais que si violation il y avait, il ne faudrait que peu de temps aux développeurs du libre pour réécrire le code...

Le représentant juridique de la Free Software Fundation estime quant à lui que breveter des algorithmes (car les programmes en sont) revient à vouloir breveter des nombres et que donc, ils seraient forcément invalidés devant une cours...

Toujours est-il que rien n'avance, et qu'aucune preuve n'est avancée... C'est quand même dommage de tomber bas au point de jouer la démagogie... Ils commencent à entrevoir le début de l'échec commercial et technique et se retranchent donc derrière la diffamation... La meilleure preuve pour l'échec technique ? Regardez la dernière mouture de Internet Explorer et comparez la avec Firefox... Ils ne se sont pas ennuyé, ils ont carrément fait du copier / coller ! Mais ils sont déjà en retard par rapport à l'original...

Bref, c'est pour moi les premiers signes que Microsoft sont inquiets pour l'avenir ! Et je crois que si il y a bien un point sur lequel ils ont raison, c'est bien celui là :)


A bientôt !

Sylvain

Une nouvelle série !

Salut !

http://www.dailymotion.com/video/x1y7uw_linux-fausse-pub

C'est sûr, ça va faire un tabac !!!

Dans le même genre, mais en anglais malheureusement...

http://www.youtube.com/watch?v=rjh2XNVbNDo

A bientôt !

Sylvain

Notebook avec bouton fermer pygtk

Salut !

Python est un langage que j'affectionne particulièrement. La syntaxe n'est pas très lourde, c'est orienté objet et ça s'avère très puissant. De plus, il est portable sous windows et mac. Associé à la bibliothèque graphique pygtk, on peut faire des trucs très sympa :)

J'ai galèré un bon moment avant d'arriver à faire un notebook (plusieurs onglets dans la même fenêtre) avec un bouton "fermer" dans l'onglet. Je donne donc la solution si il y en a que ça intéresse ;-)

[python]
#!/usr/bin/env python
# -*- coding:utf-8 -*-

#  notebook.py

import pygtk
pygtk.require('2.0')
import gtk

class NotebookExample:
    def add_icon_to_button(self,button):
	"Fonction pour ajouter un bouton fermer"
	#création d'une boite horizontale
        iconBox = gtk.HBox(False, 0)   
	#Création d'une image vide     
        image = gtk.Image()
	#On récupère l'icone du bouton "fermer"
        image.set_from_stock(gtk.STOCK_CLOSE,gtk.ICON_SIZE_MENU)
	#On enlève le relief au bouton (donné en attribut)
        gtk.Button.set_relief(button,gtk.RELIEF_NONE)
	#On récupère les propriétés du bouton
        settings = gtk.Widget.get_settings(button)
	#On affecte à w et h les dimensions
        (w,h) = gtk.icon_size_lookup_for_settings(settings,gtk.ICON_SIZE_MENU)
	#On modifie ces dimensions
        gtk.Widget.set_size_request(button, w + 4, h + 4)
        image.show()
	#On met l'image dans la boite
        iconBox.pack_start(image, True, False, 0)
	#On ajoute la boite dans le bouton
        button.add(iconBox)
        iconBox.show()
        return 

    def create_custom_tab(self,text, notebook, frame):
        "Crée une tab customisée avec un label et un bouton fermer"
	#On crée une eventbox
        eventBox = gtk.EventBox()
	#On crée une boite horizontale
        tabBox = gtk.HBox(False, 2)
	#On crée un label "text" (text donné en attribut)
        tabLabel = gtk.Label(text)
	#On crée un bouton
        tabButton=gtk.Button()
	#On lui affecte la méthode remove_book
        tabButton.connect('clicked',self.remove_book, notebook, frame)

        #On ajoute l'image au bouton en utilisant la méthode add_icon_to_button
        self.add_icon_to_button(tabButton)
                
        eventBox.show()
        tabButton.show()
        tabLabel.show()
	#On attache label et bouton à la boite
        tabBox.pack_start(tabLabel, False)       
        tabBox.pack_start(tabButton, False)

        tabBox.show_all()
	#On ajoute la boite à l'eventbox
        eventBox.add(tabBox)
        return eventBox
    
    
    def remove_book(self, button, notebook, frame):
	"Fonction de suppression de page"
	#On supprime la page. Le secret, c'est de donner comme argument le widget enfant de la page, ici un cadre frame.
        notebook.remove(frame)
        # On actualise le widget
        notebook.queue_draw_area(0,0,-1,-1)

    def delete(self, widget, event=None):
        gtk.main_quit()
        return False

    def __init__(self):
        window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        window.connect("delete_event", self.delete)
        window.set_border_width(10)

        #On crée un nouveau notebook
        notebook = gtk.Notebook()
        window.add(notebook)
        notebook.show()

        # On ajoute quelques pages
        for i in range(5):
            page_number = i + 1
            frame = gtk.Frame("Frame %d" % page_number)
            frame.set_border_width(10)
            frame.set_size_request(100, 75)
            frame.show()
            label = gtk.Label("Dans la Frame %d" % page_number)
            frame.add(label)
            label.show()
            
            eventBox = self.create_custom_tab("Tab %d" % page_number, notebook, frame)
            notebook.append_page(frame, eventBox)
        # Page que nous verrons à l'ouverture (page 4)
        notebook.set_current_page(3)
        window.show()

def main():
    gtk.main()
    return 0

if __name__ == "__main__":

    NotebookExample()

    main()



Et voilà ! A l'exécution de ce script, vous obtiendrez ça :



A bientôt !

Sylvain

Script upload d'image pour phpbb et wiki

Satut !

Mon camarade de linuxpourlesnuls llooll et moi même avons développé un script qui permet d'uploader une image et d'en générer une miniature, un peu à la manière de rockhosting par exemple. Nous avons fait une version pour phpbb, qui va donner en retour le BBcode à insérer dans un post, et une version wiki (dokuwiki, je sais pas si la syntaxe est la même sur tous les systèmes de wiki) qui permet en plus de choisir la mise en page.

Pour le mettre en place, je vous recommande d'utiliser un ftp différent de votre forum. En effet laisser un moyen d'entrée est toujours délicat. Donc sur ce ftp, free par exemple, il faut créer deux répertoires à la racine, pics et minis, qui vont contenir respectivement les images de taille originale et les miniatures. Il faut ensuite mettre le script ci-dessous, par exemple upload.php, à la racine. Certains champs sont à changer pour votre site ;-) En l'état, seuls png et jpeg sont acceptés. Mais accepter des gifs est facile, je vous laisse le faire ;-) Pour une meilleure lisibilité du code, faites un copier / coller dans un fichier ;-) Une remarque, php n'est pas sensible à l'indentation mais je l'ai fait pour que ce soit plus facile à lire et à déboguer ;-)

[php]
<?php
//Création de la fonction str_split si PHP < 5
if (!function_exists("str_split")) 
{
	function str_split($str,$length = 1) 
	{
		if ($length < 1) return false;
		$strlen = strlen($str);
		$ret = array();
		for ($i = 0; $i < $strlen; $i += $length) 
		{
			$ret[] = substr($str,$i,$length);
		}
	return $ret;
	}
} 
//Récupération du chemin actuel
$pos=strrpos($_SERVER['REQUEST_URI'],"/");
$chemin="http://".$_SERVER['HTTP_HOST'].substr($_SERVER['REQUEST_URI'],0,$pos)."/";
// on défini le répertoire où sont stockées les images de grande taille
$dir = 'pics';
// on défini le répertoire où seront stockées les miniatures
$dir_mini = 'minis';
// on défini une variable $ratio qui vaudra 150 dans notre cas (150 pixels). En fait, pour nos miniatures, nous allons respecter le ratio de l'image originale, mais nous allons forcer sa taille à 150 pixels, soit en hauteur soit en largeur (tout dépend de l'orientation de notre image : paysage ou portrait).
$ratio = 150;
$liste = "abcdefghijklmnopqrstuvwxyz0123456789";
$liste=str_split($liste);
// on teste si le formulaire permettant d'uploader un fichier a été soumis
if (isset($_POST['ok'])==1) 
{
    // on teste si le champ permettant de soumettre un fichier est vide ou non
	if (empty($_FILES['image']['tmp_name'])) 
	{
        // si oui, on affiche un petit message d'erreur
		$erreur = 'Aucun fichier envoyé.';
	}
	else 
	{
		$NomImage = "";
		while(strlen($NomImage) != 8)
		{
			$NomImage .= $liste[rand(0,35)];
		}
		$file_upload=$NomImage;
		// on examine le fichier uploadé en récupérant de nombreuses informations sur ce fichier (je vous suggère de regarder la documentation de la fonction getimagesize pour de plus amples informations)
		$tableau = @getimagesize($_FILES['image']['tmp_name']);
		if ($tableau == FALSE) 
		{
            // si le fichier uploadé n'est pas une image, on efface le fichier uploadé et on affiche un petit message d'erreur
			unlink($_FILES['image']['tmp_name']);
			$erreur = 'Votre fichier n\'est pas une image.';
		}
		else 
		{
			$extension_fichier = array_pop(explode(".", $_FILES['image']['name']));
			$file_upload.=".".$extension_fichier;
			// on teste le type de notre image : jpeg ou png
			if ($tableau[2] == 2 || $tableau[2] == 3) 
			{
			// si on a déjà un fichier qui porte le même nom que le fichier que l'on tente d'uploader, on modifie le nom du fichier que l'on upload
			if (is_file('pics/'.$file_upload)) $file_upload = '_'.$file_upload;
			// on copie le fichier que l'on vient d'uploader dans le répertoire des images de grande taille
				copy ($_FILES['image']['tmp_name'], $dir.'/'.$file_upload);
			// il nous reste maintenant à générer la miniature
			//on regarde si les dimensions sont pas inférieures a 150 pixels
		if (($tableau[0] < $ratio) && ($tableau[1] < $ratio))
		{
		//si c'est le cas, ben on copie aussi le fichier dans minis
			copy ($_FILES['image']['tmp_name'], $dir_mini.'/'.$file_upload);
		}
		else
		{
			if(($tableau[0] < $ratio) && ($tableau[1] > $ratio))
			{
				//si l'une des dimensions est inferieure au ratio
				if ($tableau[2] == 2) // si notre image est de type jpeg
				{
					$src = imagecreatefromjpeg($dir.'/'.$file_upload);
					$im = imagecreatetruecolor(round(($ratio/$tableau[1])*$tableau[0]), $ratio);
					imagecopyresampled($im, $src, 0, 0, 0, 0, round(($ratio/$tableau[1])*$tableau[0]), $ratio, $tableau[0], $tableau[1]);
					imagejpeg ($im, $dir_mini.'/'.$file_upload);
				}
				elseif ($tableau[2] == 3) 
				{
					$src = imagecreatefrompng($dir.'/'.$file_upload);
					$im = imagecreatetruecolor(round(($ratio/$tableau[1])*$tableau[0]), $ratio);
					imagecopyresampled($im, $src, 0, 0, 0, 0, round(($ratio/$tableau[1])*$tableau[0]), $ratio, $tableau[0], $tableau[1]);
					imagepng ($im, $dir_mini.'/'.$file_upload);
				}
			
			}
			elseif(($tableau[0] > $ratio) && ($tableau[1] < $ratio))
			{
				if ($tableau[2] == 2) // si notre image est de type jpeg
				{
					$src = imagecreatefromjpeg($dir.'/'.$file_upload);
					$im = imagecreatetruecolor($ratio, round(($ratio/$tableau[0])*$tableau[1]));
					imagecopyresampled($im, $src, 0, 0, 0, 0, $ratio, round($tableau[1]*($ratio/$tableau[0])), $tableau[0], $tableau[1]);
					imagejpeg ($im, $dir_mini.'/'.$file_upload);
				}
				elseif ($tableau[2] == 3) 
				{
					$src = imagecreatefrompng($dir.'/'.$file_upload);
					$im = imagecreatetruecolor($ratio, round(($ratio/$tableau[0])*$tableau[1]));
					imagecopyresampled($im, $src, 0, 0, 0, 0, $ratio, round($tableau[1]*($ratio/$tableau[0])), $tableau[0], $tableau[1]);
					imagepng ($im, $dir_mini.'/'.$file_upload);
				}
			}
			else
			{
				if ($tableau[2] == 2) 
				{
					// on crée une image à partir de notre grande image à l'aide de la librairie GD
					$src = imagecreatefromjpeg($dir.'/'.$file_upload);
					// on teste si notre image est de type paysage ou portrait
					if ($tableau[0] > $tableau[1]) 
					{
						$im = imagecreatetruecolor($ratio,round(($ratio*$tableau[1])/$tableau[0]));
						imagecopyresampled($im, $src, 0, 0, 0, 0, $ratio, round(($ratio/$tableau[0])*$tableau[1]), $tableau[0], $tableau[1]);
					}
					else 
					{
						$im = imagecreatetruecolor(round(($ratio/$tableau[1])*$tableau[0]),$ratio);
						imagecopyresampled($im, $src, 0, 0, 0, 0, round($tableau[0]*($ratio/$tableau[1])), $ratio, $tableau[0], $tableau[1]);
					}
					// on copie notre fichier généré dans le répertoire des miniatures
					imagejpeg ($im, $dir_mini.'/'.$file_upload);
				}
				elseif ($tableau[2] == 3) 
				{
					$src = imagecreatefrompng($dir.'/'.$file_upload);
					if ($tableau[0] > $tableau[1]) 
					{
						$im = imagecreatetruecolor($ratio,round(($ratio*$tableau[1])/$tableau[0]));
						imagecopyresampled($im, $src, 0, 0, 0, 0, $ratio, round(($ratio/$tableau[0])*$tableau[1]), $tableau[0], $tableau[1]);
					}
					else 
					{
						$im = imagecreatetruecolor(round(($ratio/$tableau[1])*$tableau[0]),$ratio);
						imagecopyresampled($im, $src, 0, 0, 0, 0, round($tableau[0]*($ratio/$tableau[1])), $ratio, $tableau[0], $tableau[1]);
					}
					imagepng ($im, $dir_mini.'/'.$file_upload);
				}
			}
		}
                // on redirige l'administrateur vers l'accueil de la partie admin
                //header('location: index.php');
		//Génération du BBCode
		echo "<img src=\"url de votre logo\" width=\"781\" height=\"67\"><br><br><form name=\"up\"><input type=\"textarea\" name=\"txt2paste\" value=\"[url=".$chemin.$dir."/".$file_upload."][img]".$chemin.$dir_mini."/".$file_upload."[/img][/url]\" readlony size=\"100\"></form><input type=\"button\" onclick=\"javascript:document.up.txt2paste.select();\"
style=\"font-family: Arial,Verdana,Helvetica;font-size: 11px; color:#330033 ;font-weight:bold;\"
value=\"Tout s&eacute;lectionner\"><br><br>Apr&egrave;s avoir tout s&eacute;lectionn&eacute;, n'oubliez pas de copier ! Puis collez le dans la fen&ecirc;tre de postage</font></p><br><br><br><br><br><br><input type=\"button\" value=\"Fermer la fen&ecirc;tre\" onclick=\"window.close()\" />";
                exit();
	}
	else 
	{
                // si notre image n'est pas de type jpeg ou png, on supprime le fichier uploadé et on affiche un petit message d'erreur
                unlink($_FILES['image']['tmp_name']);
                $erreur = 'Votre image est d\'un format non supporté.';
	}
}  
}
}
?>
<form method="post" enctype="multipart/form-data" target="_self">
<img style="width: 781px; height: 67px;" alt="logo" src="url de votre logo"><br>
<br>Bienvenue sur l'applet d'upload d'image de votre site !<br>
<br>Choisissez votre image (Attention, format jpeg ou png)<br>
<br>Envoyez puis faites un copier / coller de l'INTEGRALITE du code qui vous est fourni <br> (penser au clic droit, "s&eacute;lectionner tout")<br>
<br>
<br>
<table width="100%">
<tbody>
<tr>
<input name="ok" value="1" type="hidden">
S&eacute;lectionnez ici votre image !<br><br>
<input name="image" type="file">&nbsp;<input name="go" value="Envoyer" type="submit">
</tr>
</tbody>
</table>
</form>
<?
if (isset($erreur))
{
	echo "<b><font color=\"red\">!!!!!&nbsp;&nbsp;&nbsp;".$erreur."&nbsp;&nbsp;&nbsp;!!!!</b><br>";
}
?>



Maintenant la variante pour wiki. Elle se met en place exactement de la même manière.

[php]
<?php
//Création de la fonction str_split si PHP < 5
if (!function_exists("str_split")) 
{
	function str_split($str,$length = 1) 
	{
		if ($length < 1) return false;
		$strlen = strlen($str);
		$ret = array();
		for ($i = 0; $i < $strlen; $i += $length) 
		{
			$ret[] = substr($str,$i,$length);
		}
	return $ret;
	}
} 
//Récupération du chemin actuel
$pos=strrpos($_SERVER['REQUEST_URI'],"/");
$chemin="http://".$_SERVER['HTTP_HOST'].substr($_SERVER['REQUEST_URI'],0,$pos)."/";
// on défini le répertoire où sont stockées les images de grande taille
$dir = 'pics';
// on défini le répertoire où seront stockées les miniatures
$dir_mini = 'minis';
// on défini une variable $ratio qui vaudra 150 dans notre cas (150 pixels). En fait, pour nos miniatures, nous allons respecter le ratio de l'image originale, mais nous allons forcer sa taille à 150 pixels, soit en hauteur soit en largeur (tout dépend de l'orientation de notre image : paysage ou portrait).
$ratio = 150;
$liste = "abcdefghijklmnopqrstuvwxyz0123456789";
$liste=str_split($liste);
// on teste si le formulaire permettant d'uploader un fichier a été soumis
if (isset($_POST['ok'])==1) 
{
    // on teste si le champ permettant de soumettre un fichier est vide ou non
	if (empty($_FILES['image']['tmp_name'])) 
	{
        // si oui, on affiche un petit message d'erreur
		$erreur = 'Aucun fichier envoyé.';
	}
	elseif (isset($_POST['position'])==0)
	{
		$erreur = 'Aucune position sp&eacute;cifi&eacute;e';
	}
	else 
	{
		$NomImage = "";
		while(strlen($NomImage) != 8)
		{
			$NomImage .= $liste[rand(0,35)];
		}
		$file_upload=$NomImage;
		// on examine le fichier uploadé en récupérant de nombreuses informations sur ce fichier (je vous suggère de regarder la documentation de la fonction getimagesize pour de plus amples informations)
		$tableau = @getimagesize($_FILES['image']['tmp_name']);
		if ($tableau == FALSE) 
		{
            // si le fichier uploadé n'est pas une image, on efface le fichier uploadé et on affiche un petit message d'erreur
			unlink($_FILES['image']['tmp_name']);
			$erreur = 'Votre fichier n\'est pas une image.';
		}
		else 
		{
			$extension_fichier = array_pop(explode(".", $_FILES['image']['name']));
			$file_upload.=".".$extension_fichier;
			// on teste le type de notre image : jpeg ou png
			if ($tableau[2] == 2 || $tableau[2] == 3) 
			{
			// si on a déjà un fichier qui porte le même nom que le fichier que l'on tente d'uploader, on modifie le nom du fichier que l'on upload
			if (is_file('pics/'.$file_upload)) $file_upload = '_'.$file_upload;
			// on copie le fichier que l'on vient d'uploader dans le répertoire des images de grande taille
				copy ($_FILES['image']['tmp_name'], $dir.'/'.$file_upload);
			// il nous reste maintenant à générer la miniature
			//on regarde si les dimensions sont pas inférieures a 150 pixels
		if (($tableau[0] < $ratio) && ($tableau[1] < $ratio))
		{
		//si c'est le cas, ben on copie aussi le fichier dans minis
			copy ($_FILES['image']['tmp_name'], $dir_mini.'/'.$file_upload);
		}
		else
		{
			if(($tableau[0] < $ratio) && ($tableau[1] > $ratio))
			{
				//si l'une des dimensions est inferieure au ratio
				if ($tableau[2] == 2) // si notre image est de type jpeg
				{
					$src = imagecreatefromjpeg($dir.'/'.$file_upload);
					$im = imagecreatetruecolor(round(($ratio/$tableau[1])*$tableau[0]), $ratio);
					imagecopyresampled($im, $src, 0, 0, 0, 0, round(($ratio/$tableau[1])*$tableau[0]), $ratio, $tableau[0], $tableau[1]);
					imagejpeg ($im, $dir_mini.'/'.$file_upload);
				}
				elseif ($tableau[2] == 3) 
				{
					$src = imagecreatefrompng($dir.'/'.$file_upload);
					$im = imagecreatetruecolor(round(($ratio/$tableau[1])*$tableau[0]), $ratio);
					imagecopyresampled($im, $src, 0, 0, 0, 0, round(($ratio/$tableau[1])*$tableau[0]), $ratio, $tableau[0], $tableau[1]);
					imagepng ($im, $dir_mini.'/'.$file_upload);
				}
			
			}
			elseif(($tableau[0] > $ratio) && ($tableau[1] < $ratio))
			{
				if ($tableau[2] == 2) // si notre image est de type jpeg
				{
					$src = imagecreatefromjpeg($dir.'/'.$file_upload);
					$im = imagecreatetruecolor($ratio, round(($ratio/$tableau[0])*$tableau[1]));
					imagecopyresampled($im, $src, 0, 0, 0, 0, $ratio, round($tableau[1]*($ratio/$tableau[0])), $tableau[0], $tableau[1]);
					imagejpeg ($im, $dir_mini.'/'.$file_upload);
				}
				elseif ($tableau[2] == 3) 
				{
					$src = imagecreatefrompng($dir.'/'.$file_upload);
					$im = imagecreatetruecolor($ratio, round(($ratio/$tableau[0])*$tableau[1]));
					imagecopyresampled($im, $src, 0, 0, 0, 0, $ratio, round($tableau[1]*($ratio/$tableau[0])), $tableau[0], $tableau[1]);
					imagepng ($im, $dir_mini.'/'.$file_upload);
				}
			}
			else
			{
				if ($tableau[2] == 2) 
				{
					// on crée une image à partir de notre grande image à l'aide de la librairie GD
					$src = imagecreatefromjpeg($dir.'/'.$file_upload);
					// on teste si notre image est de type paysage ou portrait
					if ($tableau[0] > $tableau[1]) 
					{
						$im = imagecreatetruecolor($ratio,round(($ratio*$tableau[1])/$tableau[0]));
						imagecopyresampled($im, $src, 0, 0, 0, 0, $ratio, round(($ratio/$tableau[0])*$tableau[1]), $tableau[0], $tableau[1]);
					}
					else 
					{
						$im = imagecreatetruecolor(round(($ratio/$tableau[1])*$tableau[0]),$ratio);
						imagecopyresampled($im, $src, 0, 0, 0, 0, round($tableau[0]*($ratio/$tableau[1])), $ratio, $tableau[0], $tableau[1]);
					}
					// on copie notre fichier généré dans le répertoire des miniatures
					imagejpeg ($im, $dir_mini.'/'.$file_upload);
				}
				elseif ($tableau[2] == 3) 
				{
					$src = imagecreatefrompng($dir.'/'.$file_upload);
					if ($tableau[0] > $tableau[1]) 
					{
						$im = imagecreatetruecolor($ratio,round(($ratio*$tableau[1])/$tableau[0]));
						imagecopyresampled($im, $src, 0, 0, 0, 0, $ratio, round(($ratio/$tableau[0])*$tableau[1]), $tableau[0], $tableau[1]);
					}
					else 
					{
						$im = imagecreatetruecolor(round(($ratio/$tableau[1])*$tableau[0]),$ratio);
						imagecopyresampled($im, $src, 0, 0, 0, 0, round($tableau[0]*($ratio/$tableau[1])), $ratio, $tableau[0], $tableau[1]);
					}
					imagepng ($im, $dir_mini.'/'.$file_upload);
				}
			}
		}
                // on redirige l'administrateur vers l'accueil de la partie admin
                //header('location: index.php');
		//Génération du BBCode
		if (($_POST['position'])=='gauche')
		{
			echo "<img src=\"url de votre logo\" width=\"X\" height=\"Y\"><br><br><form name=\"up\"><input type=\"textarea\" name=\"txt2paste\" value=\"[[".$chemin.$dir."/".$file_upload."|{{".$chemin.$dir_mini."/".$file_upload."}}]]\" readlony size=\"100\"></form><input type=\"button\" onclick=\"javascript:document.up.txt2paste.select();\" style=\"font-family: Arial,Verdana,Helvetica;font-size: 11px; color:#330033 ;font-weight:bold;\" value=\"Tout s&eacute;lectionner\"><br><br>Apr&egrave;s avoir tout s&eacute;lectionn&eacute;, n'oubliez pas de copier ! Puis collez le dans la fen&ecirc;tre de postage</font></p><br><br><br><br><br><br><input type=\"button\" value=\"Fermer la fen&ecirc;tre\" onclick=\"window.close()\" />";
			exit();
		}
		elseif (($_POST['position'])=='centre')
		{
			echo "<img src=\"url de votre logo\" width=\"X\" height=\"Y\"><br><br><form name=\"up\"><input type=\"textarea\" name=\"txt2paste\" value=\"[[".$chemin.$dir."/".$file_upload."|{{&nbsp;".$chemin.$dir_mini."/".$file_upload."&nbsp;}}]]\" readlony size=\"100\"></form><input type=\"button\" onclick=\"javascript:document.up.txt2paste.select();\" style=\"font-family: Arial,Verdana,Helvetica;font-size: 11px; color:#330033 ;font-weight:bold;\" value=\"Tout s&eacute;lectionner\"><br><br>Apr&egrave;s avoir tout s&eacute;lectionn&eacute;, n'oubliez pas de copier ! Puis collez le dans la fen&ecirc;tre de postage</font></p><br><br><br><br><br><br><input type=\"button\" value=\"Fermer la fen&ecirc;tre\" onclick=\"window.close()\" />";
			exit();
		}
		elseif (($_POST['position'])=='droite')
		{
			echo "<img src=\"url de votre logo\" width=\"X\" height=\"Y\"><br><br><form name=\"up\"><input type=\"textarea\" name=\"txt2paste\" value=\"[[".$chemin.$dir."/".$file_upload."|{{&nbsp;".$chemin.$dir_mini."/".$file_upload."}}]]\" readlony size=\"100\"></form><input type=\"button\" onclick=\"javascript:document.up.txt2paste.select();\" style=\"font-family: Arial,Verdana,Helvetica;font-size: 11px; color:#330033 ;font-weight:bold;\" value=\"Tout s&eacute;lectionner\"><br><br>Apr&egrave;s avoir tout s&eacute;lectionn&eacute;, n'oubliez pas de copier ! Puis collez le dans la fen&ecirc;tre de postage</font></p><br><br><br><br><br><br><input type=\"button\" value=\"Fermer la fen&ecirc;tre\" onclick=\"window.close()\" />";
			exit();
		}
	}
	else 
	{
                // si notre image n'est pas de type jpeg ou png, on supprime le fichier uploadé et on affiche un petit message d'erreur
                unlink($_FILES['image']['tmp_name']);
                $erreur = 'Votre image est d\'un format non supporté.';
	}
}  
}
}
?>
<form method="post" enctype="multipart/form-data" target="_self">
<img style="width: Xpx; height: Ypx;" alt="logo" src="url de votre logo"><br>
<br>Bienvenue sur l'applet d'upload d'image de nom du site!<br>
<br>Choisissez votre image (Attention, format jpeg ou png)<br>
<br>Choisissez la position de votre image dans l'article (gauche, centr&eacute; ou droite)</b>
<br>Envoyez puis faites un copier / coller de l'INTEGRALITE du code qui vous est fourni <br> (penser au clic droit, "s&eacute;lectionner tout")<br>
<br>
<br>
<table width="100%">
<tbody>
<tr>
<input name="ok" value="1" type="hidden">
S&eacute;lectionnez ici votre image !<br><br>
<input name="image" type="file">&nbsp;
<br>
<br>Choisissez la position de votre image !<br>
<input name="position" type="radio" value="gauche"> A gauche<br>
<input name="position" type="radio" value="centre"> Centr&eacute;<br>
<input name="position" type="radio" value="droite"> A droite<br><br>
<input name="go" value="Envoyer" type="submit">
</tr>
</tbody>
</table>
</form>
<?
if (isset($erreur))
{
	echo "<b><font color=\"red\">!!!!!&nbsp;&nbsp;&nbsp;".$erreur."&nbsp;&nbsp;&nbsp;!!!!</b><br>";
}
?>



Et voila !

A bientot !

Sylvain

Bienvenue !

Bonjour !

Alors voilà, c'est partit ! Dans ce blog, je vais parler sérieux :-p

Non, rassurez vous, j'aime bien les trucs simples ;-)

Je vais parler informatique libre bien sûr mais programmation avec mes réalisations et celles auxquelles je participe ;-)

Tout ce qui va exister sur ce blog, vous pouvez en profiter si vous le désirez ! Je suis pas bon en programmation au point d'exiger des royalties et ce n'est pas du tout ma philosophie...

Bref, n'hésitez pas à venir commenter ce que je vais mettre ;-)


A bientôt !

Sylvain