Clavier Scrabble

Publié dans Projets | 3 commentaires

Clavier Microsoft
L’idée du clavier Scrabble est venu comme ça pouf au cours d’un repas. « Ce qui est fou quand on y pense, c’est que les claviers azerty et qwerty, ils ont été créé exprès pour nous ralentir… Avant tu vois les gens tapaient trop vite à la machine à écrire, alors les machines se coinçaient. Du coup ils ont réfléchi et ont mis les lettres qu’on tape souvent l’une après l’autre le plus loin possible, histoire de ralentir la cadence et d’éviter le blocage. Dire qu’aujourd’hui on perd un temps fou à cause de ça… Il suffirait de prendre l’ordre d’importance des lettres dans le scrabble pour… éh mais c’est pas bête ça ! »
Hé c’est vrai quoi, pourquoi ne pas recréer un clavier, un vraiment bien ! Si vous programmez un peu, ça vous est sûrement arriver de galérer à taper certaines combinaisons de lettres quand vous n’aviez qu’une seule main (bah oui, faut bien boire son coca de temps en temps !) ou de passer en qwerty parce que sur ces saletés de clavier < ou >+Alt c'est tout près de Maj+Alt. Et puis cette fichu touche Windows mal placée, l'accent circonflexe (^) sur lequel on est toujours en train d'appuyer au lieu de faire un dollar ($). Et puis les touches < ou >, supr, fin, début, changent souvent de place entre 2 claviers. C'est fatiguant... Bref, disons le, nos claviers azerty ne sont vraiment pas coder friendly. Il parait que les qwerty le sont plus, je demande à voir.

En tout cas, l'idée du clavier Scrabble (on verra si elle se concrétise) est la suivante :

  • Réorganiser les lettres sur le clavier pour écrire vite en se trompant moins
  • Ajouter 2 ou 3 pédales pour les touches Ctrl, Alt et Maj (par exemple) !

Continuer la lecture

Forcer le téléchargement d’un fichier

Publié dans PHP | Laisser un commentaire

Lorsque j’ai conçu la Bnbox v.3 j’aurais bien aimé savoir ce que j’ai découvert il y a peu. Comment forcer le téléchargement d’un fichier sur un site Web ? Par exemple un fichier PDF (so beautiful!) ou un fichier mp3 sont en général directement lus par les navigateurs récents. Mais il peut être pratique, parfois, d’éviter au visiteur la manipulation Clic droit > Enregistrer la cible du lien sous….

<?php
/**
 * Force le téléchargement d'un fichier
 * 
 * @param string $filePath Emplacement du fichier sur le serveur web
 * @param string $fileNameToDl=<em> Nom du fichier que l'utilisateur va télécharger (si on souhaite le rendre différent de celui d'origine)
 * @post Ouvre une fenêtre permettant le téléchargement du fichier
 * /
function forcerTelechargement($filePath, $fileNameToDl=</em>)
{
    header('Content-Description: Téléchargement le fichier '.$fileName);
    header('Content-Type: application/octet-stream'); // On peut mettre text/gif, etc...
    header('Content-Length: '.filesize($path.'/'.$fileName));
    header('Content-disposition: attachment; filename='.($fileNameToDl != NULL ? $fileNameToDl : basename($filePath))); // Nom du fichier téléchargé par l'utilisateur. On peut donc mettre ce qu'on veut.
    header('Pragma: no-cache');
    header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
    header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date dans le passé pour ne vraiment pas avoir de cache
    readfile($filePath); // Ouvre le fichier dans le buffer : d'après le geader, ce sera une fenêtre de téléchargement
    exit();
}

forcerTelechargement('./document/exemple.pdf');

Continuer la lecture

Les jours où l’on déteste IE

Publié dans Geekeries | Laisser un commentaire

Le jour où l’on déteste IE c’est par exemple le jour où l’on découvre que pour utiliser des répertoires virtuels avec de l’url-rewriting (ex. : pages/page-magique.html redirige vers index.php?id=15 alors que le dossier pages/ n’existe pas), il ne faut pas mettre de slashs à la fin de l’url de base dans @@ ///

Comment importer une grosse base de données

Publié dans SQL | Un commentaire

Ce billet aurait aussi pu se nommer « Vive la ligne de commandes ! ».
Je pense arriver au bout de mes peines avec ma grosse tables de 3 millions de tuples (qui n’en fait d’ailleurs toujours pas 3 millions, alors j’espère que ça tiendra le coup quand tous les tuples seront là), et j’ai notamment pas mal galéré pour la transférer d’une base de données à une autre. (local -> serveur de développement) Si on utilise PHP, ou PhpMyAdmin, pour transférer sa BDD, on se retrouve vite avec de très long temps d’attente et avec une machine qui rame jusqu’à la mort. Quelques idées pour survivre entier à ce calvaire :
sql

  • Préférer le transfert à l’aide de fichiers. Car le copier/coller de requêtes fonctionnent pour de petites tables, mais ça fait très vite ramer votre machine de course pour de grosses tables. Il suffit d’exporter les tables de son choix via PhpMyAdmin (à l’accueil d’une base > exporter : pour exporter les tables de son choix. A l’accueil d’une table > exporter : pour exporter directement la table en question), puis dans les importer via PhpMyAdmin, ou en ligne de commandes. Il vaut mieux éviter de cocher la case « Insertion Complète » qui créé une seule requête INSERT INTO table (val1, val2) VALUES ('blabla', 'bloublou'), ('blibli', 'bleble'), ..., ('blublu', 'bloblo'); ce qui peut être un peu trop lourd. Mieux vaut créer autant de requêtes qu’il y a d’insertions dans ce cas. (le mieux serait de faire une requête pour une trentaine d’insertions, c’est vraiment plus rapide, mais cela oblige à coder tout ça soit même. Edit: apparemment, il faut choisir « Insertions Etentdues ».)
  • Préférer l’utilisation des lignes de commandes. Pour plusieurs raisons : plus de problèmes avec les timeout de MySQL ou de PHP puisqu’on effectue une commande à la fois. (sauf si on commande est trop lourde. Dans le cas d’une insertion complète par exemple), on contrôle réellement tout ce qui se passe en temps réel et on peut réellement tout arrêter en temps réel. (suffit de fermer le terminal quoi !), on ne passe par aucun intermédiaire et c’est donc vraiment plus rapide.

Continuer la lecture

Parlons de sitemaps

Publié dans XML | Laisser un commentaire

A vrai dire il y a 2 types de sitemaps, puisque 2 utilisations possible des dites sitemaps :

  • La sitemap pour les visiteurs, plus communément appelée « Plan du Site ». Son but est d’aider le visiteur à se repèrer, elle doit donc être jolie, bien mise en forme, et ne pas contenir trop de liens. Google n’aime pas quand le nombre d’urls sur une page approche les 100, donc une sitemap ne doit afficher que les liens importants, et à la rigueur les articles en vues.
  • La sitemap pour les robots, comme les robots de moteur de recherche. Son but est d’aider les moteurs de recherche à indexer plus rapidement toutes les pages d’un site Internet. Qu’importe la beauté, c’est donc la structure du fichier qui compte puisqu’un protocole a été mise en place pour standardiser tout ça. Une sitemap peut contenir autant d’url que l’on veut, tant que l’on s’y prend bien. (puisqu’en fait on peut créer plusieurs sitemaps que l’on liste avec une sitemapindex)

Je vais m’attarder un tout petit peu sur le deuxième type de sitemaps puisque j’ai dû générer la sitemaps d’un site de plus de 3 millions de pages, ce qui m’a un peu forcé à me pencher sur la question. (j’étais bien guidé cela dit !)

Le protocole Sitemap

Sitemap classique

Deux choix pour les sitemaps classiques * Un fichier texte avec tous les urls à la ligne. Pas top. * Un fichier XML bien mis en page avec possibilité de spécifier certaines options. Bien mieux ! C’est là dessus que je vais m’attarder.
Voici la tête d’une petite sitemap XML avec 3 urls :

 <?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
   <url>  
      <loc>http://la-bnbox.fr/cahier.html</loc>
      <lastmod>2009-07-10</lastmod>
      <changefreq>weekly</changefreq>
      <priority>0.8</priority>
   </url>
   <url>
      <loc>http://la-bnbox.fr/t18-francais.cahier</loc>
      <lastmod>2009-07-25</lastmod>
      <changefreq>weekly</changefreq>
      <priority>0.7</priority>
   </url>
   <url>
      <loc>http://la-bnbox.fr/554-Prepa-PSI--Penser-l-Histoire---Introduction.cahier</loc>
      <lastmod>2009-07-25</lastmod>
      <changefreq>yearly</changefreq>
      <priority>0.5</priority>
   </url>
</urlset>

L’entête est assez classique, mais on peut noter que l’encodage est en UTF-8 et qu’il faut qu’il soit en UTF-8.
Et on peut résumer un bloc pour un url de cette manière :
Continuer la lecture

Lire un fichier CSV (Excel) avec PHP

Publié dans PHP | Un commentaire

Je viens de découvrir 2 petites fonctions PHP bien utiles pour s’occuper d’un fichier Excel. (ou équivalent) Si vous avez déjà essayé de traiter un fichier Excel avec PHP, vous savez sûrement qu’il faut préalablement enregistrer ce fichier au format CSV (Comma-Separated Values), vos colonnes sont alors séparées par des points virgules ( ; ) et vos lignes par un retour à la ligne. Donc un fichier CSV ressemble à ceci :
case1;case2;"case 3 avec des espaces";case4
case5;case6;"case 7 avec des espaces";case8

A partir de la, au premier abord, on s’apprête à utiliser des regex (preg_match_all par exemple) pour lire le fichier, mais ce serait perdre un peu de temps pour pas grand chose. En effet, il existe 2 fonctions pour lire et écrire un fichier CSV en PHP : fgetcsv et fputcsv.
Continuer la lecture

Documentation d’un module toolbar en PHP objet

Publié dans Projets | Laisser un commentaire

Je parle ici d’une toolbar, ou BBcodeBar, permettant d’utiliser facilement du BBcode (du BNcode pour être précis) lorsque l’on écrit un article ou que l’on poste sur un forum, un commentaire… (que sais-je encore !) Bref, quelque chose qui ressemble à ça :
Exemple de toolbar
Voilà déjà pas mal de temps que j’utilise la même toolbar sur mes sites Internet. C’est une toolbar que j’ai créé et qui est basé sur une mod conçue à l’origine pour le système de forum FluxBB (ex-PunBB) par Vin100. A chaque fois, je la modifie et je galère pour l’intégrer correctement au site du momenet, et surtout je me retape tout le travail dès que je dois modifier quelque chose. Voilà pourquoi depuis quelques jours, quand l’envie me prend, je développe une version PHP objet de cette toolbar de façon à la rendre plus portable, plus paramétrable et aussi plus performante. J’approche désormais de la fin, et donc de la première publication d’une version 1. Voici donc un premier jet de documentation, entre autre, pour vérifier que rien n’a été oublié.

But

  • Créer une toolbar permettant d’utiliser facilement du BBcode (user friendly)
  • Créer un système de gestion de toolbars complet et paramètrable : génération de plusieurs toolbars, paramétrage du contenu des toolbars, désactivable ou désinstalable en 1 clic (surtout coder friendly)
  • Mettre en pratique mes connaissances en PHP objet, et améliorer celles en Javascript

Continuer la lecture

Tout ce qu’il faut savoir pour crawler tranquilement

Publié dans PHP | Laisser un commentaire

Ah, avant toute chose qu’est-ce que j’entends par le mot « crawler » ? On pourrait appeler ça « scrapper », « looter », voir même « pirater ». En fait l’idée est de créer un petit programme dont le but va être de récupérer des informations sur un site Web qui se trouve en ligne (ou pas). Exactement comme fait le GoogleBot ou les autres robots de moteurs de recherche. Et comme font aussi les robots qui cherchent des adresses e-mails pour faire du spam… Bref, on voit qu’il peut y avoir un petit problème éthique derrière le scrolling, mais c’est une discipline qui peut être tout à fait noble et utile autant pour le crawleur que pour le crawlé. Mais je ne vais pas faire de débat philosophique, plutôt parler technique.
Durant le stage que j’effectue actuellement, j’ai pas mal l’occasion de crawler des sites Web, voici donc un résumé de fonctions ou de techniques qui peuvent être utiles.

Le crawling en résumé

L’idée principale est de faire automatiquement rapidement ce que l’on aurait dû faire à la main en mettant beaucoup de temps. Pour cela, on fait une petite étude des urls du site que l’on souhaite crawler. Par exemple, si c’est une liste d’article, les pages de chaque article auront peut-être un url avec quelque chose du genre : article.php?id=1452112. A partir de la :

 $url = 'article.php?id={id}'; for($i=1; $i<=$nbArticle; $i++) {
	$urlAScroller = str_replace('{id}', $i, $url);
	$content = file_get_contents($urlAScroller);
	// Regex et explode sur $content pour récupérer les informations souhaitées }

Continuer la lecture

De la pédagogie des tutoriels sur le Web (et ailleurs)

Publié dans Geekeries | 2 commentaires

Voilà tout de même un petit bout de temps que je me farcie des tutoriels dans le domaine de l’informatique, que ce soit dans des livres, ou sur la Toile elle même. Et je remarque quand même quelques trucs : * Quand il y a trop de gros pavés à lire, je ne lis qu’en diagonale ou je zappe tout de suite. Parfois, lorsque c’est intéressant, je reviens dessus. * Lorsqu’il n’y a pas d’exemples, il est rare que je prenne plus de quelques minutes pour essayer de comprendre. * Lorsque la mise en page et propre est aérée, lorsque des illustrations complètent les propos : j’ai tendance à plus prendre le temps de lire et de comprendre. %%% Bref, j’ai l’impression que pour faire un bon tutoriel dans le domaine de l’informatique (et ça doit fonctionner pour plein d’autres choses), il faut, idéalement : # Introduire brièvementle sujet pour savoir ce que l’on va apprendre, donner envie. # Expliquer brièvement avec des illustrations ou des schémas explicatifs. # Donner des exemples, si possible testables en ligne, expliqués et décortiqués. # Reste à expliquer en détails, avec tableaux de propriétés, tout ce que vous voulez. ((/public/Divers/schema_peda.png|De la pédagogie des tutoriels|C|De la pédagogie des tutoriels, juil. 2009)) Bref, j’ai encore beaucoup de choses à apprendre. (et d’outils à développer pour pouvoir faire tout ça en moins de 30 minutes)

Coloration syntaxique du code sous Dotclear

Publié dans Dotclear | Un commentaire

Un autre titre aurait pu être : Comment tu fais pour [que] le code PHP il soit tout joli en couleur et tout Oo ! (comme l’a si bien dit j-b)
En fait, c’est assez simple il suffit de faire un tour sur le site officiel de Dotclear et de télécharger le plugin SyntaxeHl. Reste à l’installer dans l’administration (Système > Extensions > Installer ou mettre à jour une extension) en uploadant directement le fichier ZIP du plugin.
Gestion des extensions
Reste encore à activer le plugin (si besoin) dans le gestionnaire d’extensions (Système > Extensions > Gestion des extensions), et dans les paramètres du blog (Tableau de bord > Paramètre du blog > tout en bas) : et voilà le travail !
Lorsque vous utilisez la syntaxe Wiki, il vous suffit alors de faire précéder votre code par ///[nom du langage en minuscule] et de la faire suivre par ///.

Lorsque vous utilisez la syntaxe XHTML, en théorie c’est < nom du langage en minuscule >< / nom du langage en minuscule >, mais moi ça ne fonctionnait pas. (c’est une des raisons qui me pousse à utiliser la syntaxe Wiki)

Un petit exemple ?
///[ php ]
$var = 'PHP';
echo 'Ceci est du code '.$var;
///

donne

$var = 'PHP';
echo 'Ceci est du code '.$var;