Trouve beau tout ce que tu peux
Le blog de Laurent Montané
Images : 1-0/0
Vidéos : 1-0/0
Première page
Page précédente
Images
Catégories
Produire des sources : SciTE
Catégories : Bureautique - Développement

Par : Laurent
Numéro : 704

Ajouter un commentaire
Faire le ménage dans son ordi : CCleaner
Catégories : Bureautique

Par : Laurent
Numéro : 703

Ajouter un commentaire
Ménage dans la barre des tâches : rbTray
Catégories : Bureautique

Par : Laurent
Numéro : 702

Ajouter un commentaire
Million short
Un moteur de recherche utile
Catégories : Internet

Par : Laurent
Numéro : 591

Ajouter un commentaire
Capture2Text
Catégories : Bureautique

Par : Laurent
Numéro : 586

Ajouter un commentaire
MYSQL et UTF-8
Les fonctions RLIKE, ou REGEXP, de MySQL (5.0) ne fonctionne pas en UTF-8
les expressions régulières sont totalement indisponibles

C'est la seule limite actuelle que j'ai rencontrer, mais elle est de taille.
La fonction LIKE marche, au contraire, avec une étonnante efficacité. Nous pouvons donc nous en contenter, pour le projet oBlog, pour la recherche de mot dans les articles. Avec toutefois la perte de fonctionnalité suivante : impossible de tester seulement des mots entiers. Et une exception particulière autour des lettres doubles comme "œ" et d'autres du même genre.


Pour la création de la base et des tables

Nos instructions tourneront autour de ces exemples :

ALTER DATABASE `sauver` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci

CREATE DATABASE `toto` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;


ALTER TABLE `ob_articles` CHANGE `art_titre` `art_titre` VARCHAR( 200 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL
CREATE TABLE `toto`.`article` (`texte` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;


Pour interroger la base depuis le PHP

Il est important de savoir, et de déclarer, si nous fournissons des requêtes rédiger en UTF-8. Il existe une requête pour signaler à MySQL la norme utilisée pour la rédaction des requêtes suivantes. Il est préférable de la lancer directement, et systématiquement, lors de la connexion à la base.

mysql_query("SET NAMES 'utf8'")


Pour gérer les exceptions des lettres doubles

Nous créons une fonction php basé sur le tableau suivant que chacun pour mettre a jour en fonction des situation qu'il a gerer


// exemple de caracteres doubles
    $caracteres_doubles [] = array('æ','ae');
    $caracteres_doubles [] = array('œ','oe');
    $caracteres_doubles [] = array('đ','dj');


function mot_double($mot)
    {
    global $caracteres_doubles;
    $mot_nouveau = $mot;
    foreach ($caracteres_doubles as $caractere)
        $mot_nouveau = mb_ereg_replace($caractere[1],$caractere[0],$mot_nouveau);
    if ($mot_nouveau <> $mot)
        return $mot_nouveau;
    return false;
    }


Puis nous doublons la clause WHERE comme ceci

if (!is_bool($mot_nouveau=mot_double($mot)))
    $where = ' WHERE ((texte LIKE "%'.$mot.'%") OR (texte LIKE "%'.$mot_nouveau.'%")) ';
else
    $where = ' WHERE texte LIKE "%'.$mot.'%"';

Catégories : PHP - SQL - UTF-8

Par : Laurent
Numéro : 40

Ajouter un commentaire
Ballade en UTF-8
Nous avons décidé de programmer oBlog en UTF-8,
soit, mais ce n'est pas si simple.
La théorie n'est pas simple... la pratique est plus compliquée.

Vouloir faire le tour de l'UTF-8, et donc des normes Unicode pour les écritures des langages humains, c'est comme vouloir faire le tour du monde à pieds. Nous ne ferons qu'une ballade pour observer l'horizon dans différent lieu. En fait nous cherchons les conditions et limites actuelles autour de la norme UTF-8, pour les outils d'environnement que nous utilisons.


La première limite à l'utilisation de l'UTF-8 est de disposer de polices de caractères capables d'afficher a l'écran le résultat de notre recherche. La police la plus complète que nous avons rencontrée est celle fournie en standard par Microsoft par exemple : Arial Unicode MS



Pour apercevoir l'ampleur du problème, résumé sur une page, nous pouvons regarder celle-ci : http://www.unicode.org/fr/charts/


Il existe également un module d'extension pour FireFox, qui propose l'utilisation de plus d'un million de caractères !

"International Sideboard 2.9.1" : https://addons.mozilla.org/fr/firefox/addon/10573/


Trouvons également ici un logiciel gratuit pour l'observation des polices en rapport avec les normes Unicode actuelles : http://www.babelstone.co.uk/Software/


Évidement, nous ne traiterons pas tous les cas dans notre source. Mais nous écrirons une source qui permettent une adaptation à ces différentes potentialités en changeant simplement les contenus des tableaux qui résument les situations que le blog devra gérer, pour palier aux limites des fonctions actuelles spécialisées UTF-8 de PHP et MYSQL.

Catégories : UTF-8

Par : Laurent
Numéro : 5

Ajouter un commentaire
Passer en UTF8

Ouvre base user :

mysql_query("SET NAMES 'utf8'")


head : <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>


'formualire :<form action="'.$_SERVER['REQUEST_URI'].'" method="post" accept-charset="UTF-8">


php

initialisation du jeu de caractere UTF8 pour les fonctions du module php MB
    mb_internal_encoding('UTF-8');
    mb_regex_encoding('UTF-8');

htmlentities($variable,ENT_QUOTES,'UTF-8');

html_entity_decode($variable,ENT_QUOTES,'UTF-8');

htmlspecialchars ( string $string [, int $quote_style = ENT_COMPAT [, string $charset [, bool $double_encode = true ]]] )

htmlspecialchars_decode ( string $string [, int $quote_style = ENT_COMPAT ] )

get_html_translation_table ([ int $table = HTML_SPECIALCHARS [, int $quote_style = ENT_COMPAT ]] )

utf8_encode

utf8_decode

strtolower > mb_strtolower

strtoupper > mb_strtoupper

mb_convert_case

mb_substr

mb_strlen


base de donnée :

ALTER DATABASE `sauver` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci

CREATE DATABASE `toto` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

ALTER TABLE `ob_articles` CHANGE `art_titre` `art_titre` VARCHAR( 200 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL

CREATE TABLE `toto`.`article` (`texte` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;

Catégories : PHP - HTML - SQL - UTF-8

Par : Laurent
Numéro : 10

Ajouter un commentaire
Tester si une adresse url existe
Tester à la volée (en JavaScript)
si une adresse url existe ou pas

Nous utiliserons pour cela l'objet XMLHttpRequest mais IL EST LIMITE AU DOMAINE dans lequel il est appellé. Pour dépasser cette limite, nous pouvons utiliser PHP, c'est à dire que XMLHttpRequest interrogera un fichier PHP qui lui interrogera tout le web.

Les fonctions JavaScript (fichier : xmlhttprequest.js)

function xhr_nouveau()
    // creation du Xml http resquest
    // suivant la syntaxe des differents navigateurs
    {
    if (window.XMLHttpRequest)
        return new XMLHttpRequest();
    else if(window.ActiveXObject)
        return new ActiveXObject("Microsoft.XMLHTTP");
    else
        {
        alert('impossible de creer "Xml http resquest"');
        return false;
        }
    }

function xhr_tester_url(adresse)
    {
    // cette fonction est plus lante et necessite PHP (et donc que la page qui l'utisie soit traité par un serveur !)
    // mais elle peut tester toutes les adresse Web (peut importe leur contenu html, image etc...)
    // retourne true si l'adresse a put être verfiée comme valide
    // retourne false sinon
    xhr = xhr_nouveau();
    //si xhr a été crée
        if (xhr!=false)
            {
            // appel de l'adresse en mode synchrone (avec false)(c.a.d on attend le resultat avant de continuer)
                xhr.open('GET','http://test_url.php?adresse='+adresse, false);
            alert('erreur');
                xhr.send(null);
            // retourner true si le resultat est 'OUI'
                if (xhr.responseText=='OUI')
                    return true;
            }
    // pas de xhr ou adresse invalide
    return false
    }

function xhr_tester_url_locale(adresse)
    {
    // retourne true si l'adresse a put être verfiée comme valide
    // retourne false sinon
    xhr = xhr_nouveau();
    //si xhr a été crée
        if (xhr!=false)
            {
            // appel de l'adresse en mode synchrone (avec false)(c.a.d on attend le resultat avant de continuer)
                xhr.open('HEAD',adresse, false);
                xhr.send(null);
            // retourner true si le resultat est 'OUI'
            if(xhr.status  == 200)
                return true;
            }
    // pas de xhr ou adresse invalide
    return false
    }

Le script PHP (fichier : test_url.php)

<?php
//Vérifier la validité d'un adresse URL.
//Permet d'afficher un message si le lien d'une URL est valide ou non.
if (isset($_GET['adresse']))
    {
    $file = @fopen($_GET['adresse'], 'r');
    if ($file)
        {
        echo 'OUI';
        exit;
        }
    }
echo 'NON';
?>

Le fichier HTML qui utilise le script JavaScript

<html>
    <head>
        <title>teste de Xml http resquest</title>
        <script type="text/javascript" src="xmlhttprequest.js"></script>
        </head>
    <body>
    <SCRIPT language="javascript">
        alert ('commencer le premier teste');
        if (xhr_tester_url("http://www.oblog.fr"))
            alert ("l'adresse existe");
        else
            alert ("l'adresse n'existe pas");
            
        alert ('commencer le second teste');
        if (xhr_tester_url_locale("nimportequoi.html"))
            alert ("l'adresse existe");
        else
            alert ("l'adresse n'existe pas");
            
        alert ('commencer le troisieme teste');
        if (xhr_tester_url_locale("tester_xmlhttprequest.html"))
            alert ("l'adresse existe");
        else
            alert ("l'adresse n'existe pas");
        </script>
        c'est fait
        </body>
    </html>

Catégories : PHP - XMLHttpRequest

Par : Laurent
Numéro : 37

Ajouter un commentaire
Bloquer les automates sur un formulaire
Création à la volée d'une image contenant des caracteres
qui devront être reconnus et saisis par un être humain

Avant d'installer ce genre de limitation, il faut considérer le fait que cela empèche l'utilisation du formulaire par les aveugles et les mal-voyants, et donc réfléchir à la nécessité réelle de ce dispositif.

 

Cela dit, voici un exemple d'image générée par ce script :

nouveau

 

Il peut etre appelé dans le html de la facon suivante : <img id='texte_image' src='texte_image.php'>
Il peut être testé dans le php comme ceci  : if ($caracteres_saisis <> $_SESSION['texte_image'])...
Enfin, pour que l'utilisateur de votre formulaire puisse, à volonté changer l'image : <a onclick = "document.getElementById('texte_image').src = 'texte_image.php?'+Math.random()">nouveau </a>

 

Ce script fonctionne avec des polices de caracteres true type (.ttf), mais il est particulierment cohérent avec la police suivante : alfr_ho.ttf. Cette police est libre de droit.

 

 

 

<?php

// script gratuit et libre de droit de oBlog.fr :
// ce script produit une image avec des caracteres, qui devrton être reconnu par un etre humain
// il peut etre appeler dans le html de la facon suivante : <img id='texte_image' src='texte_image.php'>
// et tester dans le php comme ceci  : if ($caracteres_saisis <> $_SESSION['text_image'])...
// pour que l'utilisateur de votre formulaire puisse, à volonté changer l'image : <a onclick="document.getElementById('texte_image').src='texte_image/texte_image.php?'+Math.random()">nouveau </a>
// la police alfr_ho.ttf est libre de droit et disponible sur oBlog.fr : http://oblog.fr/oblog.phtml?article_afficher=27



//mise a nul de la reference session du texte correspondant  a l'image
    session_start();
    $_SESSION['texte_image']='';

// nombre de carateres
    $nombre_caracteres = 6;
    
// taille de l'image et de la police
    $taille_y = 150;
    $taille_max_police = round($taille_y * 0.45);
    $taille_x=round($nombre_caracteres*$taille_max_police*0.9);
    
// police (c'est l'addresse du fichier qui doit être présent sur votre site)
    $fichier_police = 'alfr_ho.ttf';
    
// Création de l'image (vide)
    $image = imagecreatetruecolor($taille_x, $taille_y);
    
// Création des couleurs
    define('ROUGE',0);
    define('VERT',1);
    define('BLEU',2);
    $couleur_lettre = array(ROUGE =>0, VERT =>0, BLEU =>0);
    $couleur_fond = array(ROUGE =>255,VERT =>255,BLEU =>255);
    
//remplissage du fond
    $couleur = imagecolorallocate($image,$couleur_fond[ROUGE],$couleur_fond[VERT],$couleur_fond[BLEU]);
    imagefilledrectangle($image, 0, 0, $taille_x-1, $taille_y-1, $couleur);

// ecriture des caracteres
    // construction de la couleur
        $couleur = imagecolorallocate($image,$couleur_lettre[ROUGE],$couleur_lettre[VERT],$couleur_lettre[BLEU]);
    // police (c'est une URL...)
        $fichier_police = 'alfr_ho.ttf';
    // caracteres possible dans l'image
        // sont absents les caracteres ambigus dans un affichage déformé
        $alphabet='acefgimnopsuvwxyz';
        $taille_alphabet = strlen($alphabet);
    // ecriture des caracteres
    $x_lettre = 10;
    for ($i=1;$i<=$nombre_caracteres;$i++)
        {
        // choix d'un caractere
            $caractere=$alphabet[mt_rand(0,$taille_alphabet-1)];
        // taille de la police
            $taille_police = round($taille_max_police*mt_rand(70,100)/100);
        // choix d'un ange d'ecriture entre -15 et 15 degré
            $angle=mt_rand(-20,20);
        // ecriture de la lettre dans l'image
            $rectangle=imagettfbbox  ($taille_police,$angle,$fichier_police, $caractere);
            imagettftext($image, $taille_police, $angle, $x_lettre,($taille_y/5*3), $couleur, $fichier_police, $caractere);
        // calcul du declage en x
            $rectangle=imagettfbbox  ($taille_police,$angle,$fichier_police, $caractere);
            $x_lettre = round(($x_lettre+$rectangle[2]-$rectangle[0])*0.92);
        // sauvegarde de la lettre dans la reference session
            $_SESSION['texte_image'].=$caractere;
        }
        
// deformations en Y
    $longueur_min=40;
    $longueur_max=70;
    $amplitude_min = 5;
    $amplitude_max = 8;
    $x_fin=0;
    $x_debut=0;
    
    // definition des deformations successives
        while ($x_debut<$taille_x)
            {
            $courbe['longueur'] = round(mt_rand($longueur_min,$longueur_max));
            $courbe['x_debut']=$x_debut;
            $courbe['x_fin']=$x_debut+$courbe['longueur'];
            if ($courbe['x_fin']>=$taille_x-1-$longueur_min)
                {
                $courbe['x_fin']>$taille_x-1;
                $courbe['longueur']=$courbe['x_fin']-$courbe['x_debut'];
                }
            if (mt_rand(-1,1)>=0)
                $sens=1;
            else
                $sens=-1;
            $courbe['amplitude']=mt_rand($amplitude_min,$amplitude_max)*$sens;
            $courbes[]=$courbe;
            $x_debut=$courbe['x_fin']+1;    
            }
            
    // application des courbes
        $image_temporaire_1 = imagecreatetruecolor ($taille_x, $taille_y);
        for ( $x=0 ; $x < $taille_x ; ++$x )
            {
            $y_decale=0;
            foreach ($courbes as $courbe)
                if (($x > $courbe['x_debut']) and ($x <$courbe['x_fin']))
                    {
                    $x_courbe = $x - $courbe['x_debut'];
                    $radian=($x_courbe/$courbe['longueur']*M_PI*2);
                    $y_decale = round(((1-cos($radian)) * $courbe['amplitude']));
                    break;
                    }
            for ( $y=0 ; $y < $taille_y ; ++$y )
                {
                $y_courbe = $y+$y_decale;
                if ($y_courbe<0) $y_courbe = 0;
                if ($y_courbe>=$taille_y) $y_courbe = $taille_y-1;
                $couleur=imagecolorat($image, $x, $y_courbe);
                imagesetpixel($image_temporaire_1,$x,$y,$couleur);
                }
            }

// deformations en X
    $longueur_min=40;
    $longueur_max=70;
    $amplitude_min = 2;
    $amplitude_max = 4;
    $y_fin=0;
    $y_debut=0;
    // definition des courbes
        $courbes=array();
        while ($y_debut<$taille_y)
            {
            $courbe['longueur'] = round(mt_rand($longueur_min,$longueur_max));
            $courbe['y_debut']=$y_debut;
            $courbe['y_fin']=$y_debut+$courbe['longueur'];
            if ($courbe['y_fin']>=$taille_y-1-$longueur_min)
                {
                $courbe['y_fin']>$taille_y-1;
                $courbe['longueur']=$courbe['y_fin']-$courbe['y_debut'];
                }
            if (mt_rand(-1,1)>=0)
                $sens=1;
            else
                $sens=-1;
            $courbe['amplitude']=mt_rand($amplitude_min,$amplitude_max)*$sens;
            $courbes[]=$courbe;
            $y_debut=$courbe['y_fin']+1;    
            }
        
    // application des courbes
        for ( $y=0 ; $y < $taille_y ; ++$y )
            {
            $x_decale=0;
            foreach ($courbes as $courbe)
                if (($y > $courbe['y_debut']) and ($y <$courbe['y_fin']))
                    {
                    $y_courbe = $y - $courbe['y_debut'];
                    $radian=($y_courbe/$courbe['longueur']*M_PI*2);
                    $x_decale = round(((1-cos($radian)) * $courbe['amplitude']));
                    break;
                    }
            for ( $x=0 ; $x < $taille_x ; ++$x )
                {
                $x_courbe = $x+$x_decale;
                if ($x_courbe<0) $x_courbe = 0;
                if ($x_courbe>=$taille_x) $x_courbe = $taille_x-1;
                $couleur=imagecolorat($image_temporaire_1, $x_courbe,$y);
                imagesetpixel($image,$x,$y,$couleur);
                }
            }

// retourner l'image codée en JPEG
header("Content-type: image/jpeg");
imagejpeg($image);
?>
Catégories : PHP - Sécurité

Par : Laurent
Numéro : 27

Ajouter un commentaire