mardi 21 février 2012
Poésie politique
Dans la rubrique Général
Par Thomas Gunzig
(republié pour cause de commentaire )
Aller au contenu | Aller au menu | Aller à la recherche
mardi 21 février 2012
Dans la rubrique Général
Par Thomas Gunzig
(republié pour cause de commentaire )
mardi 14 février 2012
Dans la rubrique Mysql
Mes données liées à des nœuds ou feuilles d'un arbre et je veux pouvoir faire une recherche en filtrant sur un nœud en espérant trouver toutes les entrées liés à ce nœud ou a sa descendance.
Mes données sont donc
* id_ressource * id_category * ...
Et j'ai un arbre stocké dans une structure classique
* id_category * id_category_parent * ...
1 null 2 null 3 1 4 3 5 3 6 2 7 6 8 6
J'indexe les données sans me préoccuper de l'arbre, juste en stockant l'id_category d'appartenance.
Lorsque que je veux chercher un nœud, je récupère la liste de ses enfants et puis je cherche tous les objets appartenance à un de ces catégories
donc pour la catégorie 2
;filter:id_category,2,6,7,8
Le problème avec cette solution, c'est qu'avec un arbre imposant, on se retrouve avec des filtres très grands.
Pour mon cas, avec un arbre de 20000 catégorie, on se retrouvait avec des filtres de plus de 5000 valeurs !!!
stocker tout le chemin
donc pour l'objet qui est dans la catégorie 8
on stocke 2, 6, 8
3 valeurs à stocker -> 2 possibilités
J'ai donc crée autant de champs catégorie qu'il n'y a de profondeur dans mon arbre (ici 3)
pour chercher les éléments dans le nœud 2 je fais
;filter:id_category_lvl1,2
pour chercher les éléments dans le nœud 6 je fais
;filter:id_category_lvl2,6
pour chercher les éléments dans le nœud 3 je fais
;filter:id_category_lvl2,3
Suite à une nouvelle demande je viens de penser à une solution tout simple et encore plus performante.
La demande était toute simple : pouvoir chercher dans plusieurs nœud en même temps. par exemple 3 et 2
Ma solution 2 ne va pas en effet
;filter:id_category_1,2;filter:id_category_2,3
ca ne retournerait rien puisqu'aucun objet ne peut être dans 2 ET dans 3
Ma solution 1, empirerait le défaut qu'elle a déjà car je me retrouverai avec encore plus de catégories.
En fait quand j'ai mis en place la solution 2 il y a un type d'attribut sphinx que je ne maitrisait pas vraiment, c'est le mva. mais pour le cas qui nous occupe il est parfait.
Je disais en solution 2, 3 valeurs à stocker -> 2 possibilités Je me trompais. Et mva porte bien son nom.
Il me suffit de stocker les 3 valeurs dans un champs MVA
et ma requête redevient
;filter:id_category,2,3
Mieux encore, la puissance de sphinx fait que je peux fabrique la valeur de remplissage de ce champs à l'indexation, par une "autre" requete Sql
C'est expliqué dans la doc.
Note il est un peu tard, je ne suis peut-être pas très clair.
N'hésitez pas à poser vos question et je retravaillerai le texte en conséquence.
dimanche 12 février 2012
Dans la rubrique Logiciels
Je relance ce petit jeu 4 ans plus tard : Que dit firefox à mon propos ?
Le principe est simple:
sur votre blog (ou sur le mien en commentaire) ou sur votre page facebook. vous allez lister 26 adresses web.
Comment ?
dans votre barre d'url
Quand vous avez fini, vous le postez puis vous demandez a vos amis , contacts de faire la même chose.
vendredi 27 janvier 2012
Dans la rubrique Techno du web
la wikipedia:RFC 2325 défini la gestion des machines à café.
mercredi 25 janvier 2012
Dans la rubrique PHP / PEAR
Si vous parlez de php sur votre blog mais aussi d'autres choses.
lundi 23 janvier 2012
Dans la rubrique Général
Cela fait 3ans que nous faisons du cirque en famille, et depuis la rentrée madame se lance dans une nouvelle aventure en programmant un cours pour les toutpitis.
Ce cours s'adresse aux enfants de 2 ans et demi à 4 ans accompagnés d'un adulte. Ils sont dès lors conviés à pratiquer les techniques de cirque ensemble dans le cadre d'activités structurées.
Les ateliers Parents - Boutchou sont centrés sur deux axes :
Le cours se déroule à Braine-le-Comte le vendredi de 18h à 19h à la salle de sport de l'Institut Notre Dame de Bonne Espérance, 101 rue des postes.
Si vous n'avez pas d'enfants si jeune, pas grave, les cours classiques sont pour tous les âges
samedi 21 janvier 2012
Dans la rubrique Logiciels
mercredi 18 janvier 2012
Dans la rubrique Prof et TIc
Tout ce que j'ai twetté en Décembre à propos d’éducation et elearning
dimanche 15 janvier 2012
Dans la rubrique Mysql
jeudi 12 janvier 2012
Dans la rubrique Général
lundi 9 janvier 2012
Dans la rubrique le monde est fou




vendredi 6 janvier 2012
Dans la rubrique Coder
jeudi 5 janvier 2012
Dans la rubrique le monde est fou
L'autre jour on parlait d'euthanasie, j'ai dit à ma femme
Ne me laisse jamais vivre dans cet état végétatif, dépendant d'une machine et alimenté par le liquide d'une bouteille. Si tu me vois dans cet état, débranche les appareils qui me relient à la vie.
Elle s'est levée, a débranché la télé, a éteint l'ordinateur et a jeté mon coca
mardi 3 janvier 2012
Dans la rubrique SNCB-STIB
tout ce que j'ai twetté en décembre à propos des transports
dimanche 1 janvier 2012
Dans la rubrique Techno du web
samedi 31 décembre 2011
Dans la rubrique Mysql
Puisque sphinx ne connaît que des valeurs scalaires pour faire un tri alphabétique, il faut transformer les chaînes de caractères en nombre.
sql_attr_str2ordinal sert à ça.
Sauf que .... ce qu'on stocke c'est un n° d'ordre dans l'index, c'est pas une représentation numérique de la chaîne.
Le nom est bien 2ordinal et pas 2num
Pour confirmation cet extrait de la doc :
9.1.20. sql_attr_str2ordinal (...) When indexing ordinals, string values are fetched from database, temporarily stored, sorted, and then replaced by their respective ordinal numbers in the array of sorted strings. So, the ordinal number is an integer such that sorting by it produces the same result as if lexicographically sorting by original strings. by string values lexicographically.
Donc pour les recherches sur plusieurs indexs ça coince.
En effet si ma chaîne est 3eme dans un index, ca ne veut pas dire qu'elle serait avant celle qui est 3ème, 5ème,100ème dans l'autre index.
Bref en multi index, ça foire.
C'est un problème facile à repérer parce que vos résultats arrivent en petites séries de blocs triés. Comme un 45T dont l'aiguille saute 
C'est bien dommage parce qu'une manière d’accélérer vos indexations et vos recherches c'est de découper les indexs en "portions".
Que faire quand on veut profiter des avantages de ce découpage et des possibilités de trier alphabétiquement ?
Allez Louya, on a un nouveau type de champs. coûteux mais efficace. sql_field_string
En créant un attribut de ce type, et en l'utilisant dans "sort" sur vos chunk... ca marche.
Et en bonus, vous pouvez en récupérer le contenu. C'est-à-dire que si l'info vous suffit , vous ne devez plus aller la rechercher dans votre source.
Transformez vous même la chaîne en nombre 
Si vous utilisez une source Mysql, j'ai une solution. Bof bof pour ca. Utiliser la fonction HEX de mysql.
J'ai expliqué cela il y a quelque temps : StrToNum en Mysql ou comment convertir une chaine en nombre ?
Reste encore 2 autres problèmes à régler mais ça sera pour une autre fois.
le "œ" est-il bien entre "n" et "p" ?
Dans la rubrique Musique, Tv, Ciné, Musées, Cirque
vendredi 30 décembre 2011
Dans la rubrique PHP / PEAR
Tout ce que j'ai twetté en Décembre à propos de php.
mercredi 14 décembre 2011
Dans la rubrique PHP / PEAR
Depuis PHP 5.1.0
array explode ( string $delimiter , string $string , int $limit )
Si le paramètre limit est négatif, tous les éléments, excepté les -limit derniers éléments sont retournés.
$str = 'one|two|three|four';
print_r(explode('|', $str, -1));
résultat
Array
(
[0] => one
[1] => two
[2] => three
)
ref :
mardi 29 novembre 2011
Dans la rubrique Horreur et tranquillité
J'avance, plein d'ennuis dans la tête
Le patron résonne encore Un vieil homme faisant la quête Avec son chien qui dort Secouant son gobelet du macDo 2 pièces d'un franc dedans Lui ne perd jamais au lotto Puisqu'il ne peut y jouer un franc Il rêve de la France Son pays de rêverie Là où il passait son enfance Sur une plage de Normandie
Et nous qui le croisons Trop faible devant ses aveux Rentrant dans notre chaude maison Passant notre chemin en baissant les yeux
samedi 19 novembre 2011
Dans la rubrique Horreur et tranquillité
Pas de quoi en faire un plat Les années passes, pas moi, Cet enfant n'attend que ça Le monde des grands le bouffera Ils ne peuvent pas se sentir Ils passent leur temps à mentir Sans jamais rougir Sans voir les autres souffrir J'imaginais être encore le seul Mais on est une quirielle dans ce linceul Je m'offre une mort à l’œil
samedi 18 juin 2011
Dans la rubrique Horreur et tranquillité
Je n'ai pas su leur dire non
Je n'en ai pas envie mais je le fais
Ce n'est ni sage ni bon
C'est ma faiblesse mais je le sais
Pas besoin d'une voyante pour voir mes défauts
De façon décente aux pires maux
Dans la rubrique Mysql
Cette semaine j'ai réussi à faire un truc avec sphinx que je n'ai pas spécialement trouvé bien documenté donc je le raconte ici.
Quand on utilise une table mysql avec le plugin sphinxSE, on doit obligatoirement commencer par les colonnes
CREATE TABLE t1 ( id INTEGER UNSIGNED NOT NULL, weight INTEGER NOT NULL, query VARCHAR(3072) NOT NULL, group_id INTEGER, INDEX(query) ) ENGINE=SPHINX CONNECTION="sphinx://localhost:9312/test";
mais on peut lui ajouter des colonnes
on a les colonnes qui représentent les attributs scalaires mais aussi des colonnes "virtuelles"
c'est à dire
CREATE TABLE t1 ( id INTEGER UNSIGNED NOT NULL, weight INTEGER NOT NULL, query VARCHAR(3072) NOT NULL, group_id INTEGER, _sph_groupby INTEGER NOT NULL, _sph_count INTEGER NOT NULL, _sph_distinct INTEGER NOT NULL, INDEX(query) ) ENGINE=SPHINX CONNECTION="sphinx://localhost:9312/test";
Si vous utilisez un
WHERE query='test;groupby=attr:nomdunattributscalaire;';
_sph_groupby contiendra la valeur et _sph_count le nombre de matches
Pour donner une "idée" de la vitesse.
J'ai fait une recherche avec un terme courant avec un group by sur un critère qui peut contenir un chiffre de 0 à 9. Dans une collection de plus de 45M rows. Il y a entre 50.000 et 160.000 matches pour chaque ligne de mon group by Et il me donnait le résultat en 300ms
Avec un terme moins répandu et 500x moins de résultats j'avais un temps de réponse de 15ms
lundi 16 mai 2011
Dans la rubrique PHP / PEAR
Pour ne pas devoir utiliser "\n"
J'avais pour habitude de faire
defined('NL') || define('NL',"\n");
et j'avais du code du style
echo 'foo' . NL . 'bar';
En fait depuis PHP 4.3.10 et PHP 5.0.2, la constante PHP_EOL existe nativement pour cela.
echo 'foo' . PHP_EOL . 'bar';
Et l'intérêt principal, est dans les commentaires.
La valeur de PHP_EOL dépends de l'OS. On peut avoir \n, \r\n ou \r comme valeurs.
Ca vaut le coup de relire la liste des constantes préétablies. Ca peut donner des idées.
Dans le même ordre d'idée, un timestamp représentant le début de la demande est disponible dans la variable $_SERVER['REQUEST_TIME'] depuis PHP 5.1.