Kamelot Blog

Aller au contenu | Aller au menu | Aller à la recherche

vendredi 27 janvier 2012

ven
27
jan '12

RFC 2325: pour votre machine à café

la wikipedia:RFC 2325 défini la gestion des machines à café.

mercredi 25 janvier 2012

mer
25
jan '12

5 petites choses qui ne prennent pas beaucoup de temps pour s'investir dans la communauté php

original : http://devzone.zend.com/article/12450-Get-involed-in-the-PHP-community-5-easy-steps-that-take-less-than-5-minutes-each

1 ° Mettez en place un tag "PHP" sur votre Blog

Si vous parlez de php sur votre blog mais aussi d'autres choses.

  • Proposez un tag ou une catégorie dédiée à PHP
  • Proposez un feed rss de ce tag ou catégorie
  • Soyez actif dans cette catégorie
  • Portez cette catégorie à la connaissance des "planets"
    • http://www.planete-php.fr/
    • http://www.planet-php.net/blog/

lundi 23 janvier 2012

lun
23
jan '12

Attention jongleurs un cours de cirque pour les tout petits à Braine-le-comte.

Attention jongleurs

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 :


  • L'acrobatie : Nous profiterons de la grande différence de taille entre l'adulte et l'enfant pour effectuer des figures d'acrobatie tout à fait inédites et spécifiques (incluant par exemple des "portés" qui permettent à l'enfant de réaliser dès le plus jeune âge des prouesses impressionnantes).

  • L'équilibre et la jonglerie : L'enfant et l'adulte s'initieront aux autres techniques de cirque dans des réalisations collectives et complémentaires qui renforceront encore leur complicité. Malgré tout certains moments de travail plus individuel (aussi bien pour l'adulte que l'enfant) seront nécessaires afin d'acquérir une expérience suffisante pour accomplir les activités par équipe.


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

sam
21
jan '12

Rétrospective logiciel Libre de Décembre


mercredi 18 janvier 2012

mer
18
jan '12

Rétrospective Profs et Tics de Décembre

Tout ce que j'ai twetté en Décembre à propos d’éducation et elearning


dimanche 15 janvier 2012

dim
15
jan '12

Rétrospective SGBD de Décembre


jeudi 12 janvier 2012

jeu
12
jan '12

Rétrospective en vrac de Décembre

  • Accueil des personnes handicapées en Wallonie : signature d'un accord entre la Wallonie et la France - RTBF Regions http://awe.sm/5cGms
  • Un tsunami de nuages dans le ciel d’Alabama | Big Browser http://j.mp/vD7Wba
  • Amizour : La semaine sur l'environnement : Participation record des scouts http://j.mp/s1mDF9 - La Dépêche de Kabylie
  • Un trou noir s'apprête à engloutir un nuage de gaz au centre de la Voie Lactée http://j.mp/sRJpOC
  • Ça « nordique walking » à Mons - Bonjour - La Voix du Nord http://j.mp/rW40Za
  • Quand la science s'intéresse aux flocons de neige http://bit.ly/uqG1wf
  • RT @GPeyronnet: "Je ne veux pas former mes employés !" 3 fausses bonnes raisons... http://t.co/SOf6DkGT
  • Choisissez une verrerie adapté à vos cocktails http://bit.ly/rCWQvP
  • Je ne suis pas un Apple addict mais ca ressemble à un "sortir de l'ombre" http://awe.sm/5b6wc
  • Question aux non belges : qui connaît ces bonbons : soucoupe sûres http://awe.sm/5cWIy
  • La nouvelle arme de la gendarmerie : le gyrophare - Vidéo Dailymotion http://awe.sm/5cDHN

lundi 9 janvier 2012

lun
09
jan '12

Rétrospective loufoque de Décembre



vendredi 6 janvier 2012

ven
06
jan '12

Rétrospective programmation de Décembre


jeudi 5 janvier 2012

jeu
05
jan '12

Euthanasie (ré-édit)

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

mar
03
jan '12

Rétrospective SNCB de Décembre

tout ce que j'ai twetté en décembre à propos des transports

  • Nos lignes de chemin de fer améliorées - sudpresse.be http://j.mp/rF6Xc0
  • RT @laurent_local: La SNCF organise une compétition de hackers pour ses futures bornes d'accueil http://t.co/NRVGQXFg (via @olyvyer)

[https://twitter.com/#!/Moosh_be]

dimanche 1 janvier 2012

dim
01
jan '12

Rétrospective jQuery, css, .... de Décembre


samedi 31 décembre 2011

sam
31
dec '11

Sphinx : Tri par titre en multi index ...

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 ?

Solution depuis Sphinx 1.10

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.

Solution avant Sphinx 1.10

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.

  • avant de trier il faut "TRIM" tous les espaces blancs. Et ca, Mysql ne le fait pas aussi bien que php. En effet mysql ne retire que les ASCII 32.
  • pour trier il faut une bonne collation. Et ca je n'ai pas encore trouvé comment faire en sorte que sphinx s'en sorte aussi bien que Mysql
le "œ"  est-il bien entre "n" et "p" ?
sam
31
dec '11

Rétrospective musique de Décembre


vendredi 30 décembre 2011

ven
30
dec '11

Rétrospective php de Décembre

Tout ce que j'ai twetté en Décembre à propos de php.


mercredi 14 décembre 2011

mer
14
dec '11

limit negatif dans explode depuis PHP 5.1.0

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 :

PHP: explode - Manual

mardi 29 novembre 2011

mar
29
nov '11

Le clodo (2) // 30 Novembre 1995

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

sam
19
nov '11

Pas de quoi en faire un plat

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

sam
18
juin '11

Je n'ai pas su leur dire non

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

sam
18
juin '11

Group by avec Sphinx. via SphinxSe

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

  • id
  • weight
  • query
  • group_id
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"

  • _sph_groupby,
  • _sph_count
  • _sph_distinct

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

lun
16
mai '11

Le saviez vous ? PHP_EOL & REQUEST_TIME

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.

lundi 2 mai 2011

lun
02
mai '11

Plusieurs boutons "submit" dans un formulaire

En réponse au post "Plusieurs boutons " submit " dans un formulaire" publié sur Programmation Web|, je ressors un vieux post que j'ai écrit il y a 6 ans.

Je ne le recopie pas, je conseille d'aller le lire parce que les commentaires sont tout aussi intéressants.

Mais en pratique mon idée à l'époque était d'utiliser la même technique que pour les checkbox ou les radio.

On mets un name de la forme name="action[nom_de_mon_action]"

Cela donne 2 avantages

  1. on ne s'occupe que de action et puis on regarde ce qu'il y a dedans.
  2. on a pas du tout à s'inquiéter du contenu de value, ce qui est intéressant pour les formulaires internationalisés.
lun
02
mai '11

Vous utilisez Sphinxsearch ? Dites leur

Si vous avez déployé Sphinx en production, dites leur.

Il suffit de remplir le questionnaire et rejoindre la longue liste.

samedi 30 avril 2011

sam
30
avr '11

Cette folie en moi

Le soleil brûle mes yeux

Et je revois ces images

qui m'arrachent le cœur

J'aimerai plus de douceur

que tout aille mieux

C'est pas l'envie qui me manque

C'est le cri de la démence

Cette folie en moi

Qui me met dans un sale état

mardi 5 avril 2011

mar
05
avr '11

Sphinx : sql_attr_multi ou attribut à valeurs multiple

L'attribut Multi-valued attribute (MVA) de sphinx est une petite merveille que j'ai enfin appréhendé.

Un exemple

des étudiants

Je pars sur un exemple fictif.

Si j'ai des fiches étudiants à indexer. Je peux ajouter des attribut pour les filtrer.

  • date de naissance
  • genre (m=1/f=2)
  • Année (1,2,3,4,5,6)
  • Section (latin-grec=1, électricité=2,...)

Dans tous ces attributs, pour une ressource donnée (pour un étudiant), je n'ai qu'une valeur possible.

pour n'avoir que les garçons j'aurais

filter=genre,1;

pour n'avoir que les sections math (code 4) et sciences (code 9) j'aurais

filter=section,4,9

Si je mets

filter=genre,1;filter=section,4,9

j'aurais les garçons d'une de ces sections.

Complétons l'exemple

Maintenant selon la section j'ai jusqu'à 15 tranches horaires en cours à options (à la carte).

Comme ces cours à option ont des durées variables, l'étudiant doit remplir ses 15 périodes.

En composant avec les 40 options proposées, il peut se retrouver avec 15 cours d'une période ou 3 de 5 périodes ou 2 de 5h + 5 de une ...

Je veux chercher (ca tombe bien j'ai sphinx)

Comment indexer cela si dans ma recherche je veux pouvoir trouver les étudiants qui ont pris une option de type "langue"

Imaginant que dans la liste j'en ai 4 :

  • anglais (code 15),
  • néerlandais (code 18),
  • allemand (code 19)
  • et espagnol (code 21).

Ce qui ne marchera pas (sans les MVA)

Avec sphinx on en peut pas passer plusieurs filtres et dire matcher ce qui passe au moins un de ces filtres

Avec sphinx tous les filtres seront appliqués

Donc je ne peux pas créer 15 attributs (un par tranche) et dire

 filter=attribut_1,15,18,19,21;filter=attribut_2,15,18,19,21;filter=attribut_3,15,18,19,21;....

Parce qu'il faudrait que TOUS les attributs soient matchant pour la liste et donc ne me donnerai que ceux qui ont pris les 4 options et que celles là

Je ne peux pas non plus créer 40 attributs (un par option).

filter=attribut_15,1;filter=attribut_18,1;filter=attribut_19,1;filter=attribut_21,1;

ne me donnerai que ceux qui ont pris les 4 options

Avec les MVA

C'est là que les MVA entrent en jeux.

On va avoir 1 attribut "options" et pour chaque ressource l'attribut va contenir plusieurs valeurs

Lors de la recherche on passe dans la query

 filter=attribut_options,15,18,19,21;

Sphinx va matcher toutes les ressources qui ont au moins une de ces valeurs parmis celles qui lui sont attribuées

Indexation avec des attributs MVA

Maintenant qu'on a la façon de "chercher" il faut encore voir comment indexer cela.

Un petit coup d'oeil sur la doc.

Sphinx

sql_attr_multi = ATTR-TYPE ATTR-NAME 'from' SOURCE-TYPE \
	[;QUERY] \
	[;RANGE-QUERY]
where ATTR-TYPE is 'uint' or 'timestamp' SOURCE-TYPE is 'field', 'query', or 'ranged-query' QUERY is SQL query used to fetch all ( docid, attrvalue ) pairs RANGE-QUERY is SQL query used to fetch min and max ID values, similar to 'sql_query_range'

Si j'ai bloqué tout un temps c'est parce que c'était trop simple.

J'utilise sql_query pour ma source d'indexation.

Il suffit de produire un champs avec des valeurs séparée par des virgules.

puis on met

sql_attr_multi = unit lenomduchamps from field

Et nous y voilà.

Il y a aussi moyen de demander une sous-requete avec FROM query ou ranged-query

sql_attr_multi = uint tag from query; SELECT id, tag FROM tags

Rien compris à mon exemple d'étudiant ?

En voici un autre.

J'ai une liste d'enregistrements, ces enregistrements sont qualifiés par des tags.

C'est à dire qu'on est pas dans un classement par catégories dans un arbre tout simple.

Chaque enregistrement peut être associés à plusieurs tags.

Admettons que j'aie les tag grand, beau, bleu, jaune, ....

J'ai besoin de trouver tous les grands et bleus de ma base

  id name
    ---
   5 bleu
   11 grand

je vais faire une MVA pour pouvoir faire une recherche filter:tag_id,5,11

Tags