Journal dpkq, un piocheur de données.

Posté par  (site web personnel) . Licence CC By‑SA.
Étiquettes :
14
1
juil.
2015

Dans le cadre de la mise à jour des utilitaires que j'ai développés, après vous avoir présenté xppq et tmcq, voici maintenant dpkq.

dpkq est un piocheur de données basé sur le framework Epeios. Il pioche au hasard une fiche dans une table stockée dans un fichier XML, et l'écrit dans un autre fichier XML, en l'associant à un fichier XSL de manière à pouvoir l'afficher dans un navigateur Web avec une mise en forme HTML.

Cette description étant loin d'être d'une limpidité exemplaire (désolé, mais je n'en ai pas trouvé de meilleure…), je vais tenter de l'éclaircir en vous détaillant, à titre d’exemple, l'usage pour lequel j'ai développé cet utilitaire.

Étant musicien, je suis naturellement amené à travailler des partitions (musicales, hein, pas celles de mes disques durs). Pour faciliter l'organisation de mes sessions de travail, j'ai écrit un ensemble de fichiers XML contenant les tables suivantes :

  • Composers : contient les fiches relatives aux compositeurs,
  • Instrumentations : il se trouve que je joue, et du piano, et de l'orgue ; contient donc des fiches permettant d'affecter une instrumentation à une œuvre musicale donnée,
  • Collections : certaines œuvres sont regroupées sous forme de recueils ; les fiches de cette table font référence à une fiche instrumentation et généralement à une fiche composer,
  • Pieces : les œuvres proprement dites ; les fiches font référence, soit à une fiche collection, soit à une fiche composer et une fiche instrumentation,
  • Movements : certaines pièces sont décomposées en mouvements ; les fiches font référence à une fiche piece,
  • Voices : pour le œuvres pour piano à 4 mains (pour distinguer la voix primo et la voix secundo) ; les fiches font référence, soit à une fiche piece, soit à une fiche movement,
  • Elements : contient les fiches sur les partition proprement dites ; les fiches font référence, soit à une fiche piece, soit à une fiche movement, soit à une fiche voice,
  • Segments : chaque fiche fait référence à un fiche element, en lui adjoignant une mesure de début, ainsi qu'une mesure de fin.

La notion de faire référence à une fiche est apparentée à la notion de relationnel d'une base de données relationnelle.

Les segments sont en fait répartis dans trois tables différentes. Une table contient les segments des partitions que je suis en train de déchiffrer, une autre ceux sur lesquels, après avoir été déchiffrés, je travaille la musicalité, et une troisième les segments des partitions travaillées que je rejoue régulièrement pour éviter de les oublier. J'ai installé dpkq sur une tablette, et, lors d'une session de travail, je le lance sur l'un des groupes de segments, et dpkq me génère alors un fichier XML qui est affiché dans un navigateur Web sous forme de page HTML. Celle-ci contient toutes les informations sur un segment tiré au hasard parmi tous les segments de la table concernée, notamment les mesures du segment, ainsi que les images des pages de la partition contenant ces mesures.

Bien sûr, dpkq peut être utilisé dans un tout autre contexte et avec des données de toute autre nature…

Un jeu complet et fonctionnel de fichiers de test, ainsi que des détails sur le fonctionnement de dpkq, sont présents sur la page dédiée : http://q37.info/computing/epeios/tools/dpkq/ (en).

Voici le contenu de quelques-uns de ces fichiers (les directives préfixées par dpk: sont les directives traitées par dpkq, les directives préfixées par xpp: sont des directives destinées au préprocesseur XML (en) :

La table Composers (composers_.xml) :

<?xml version="1.0" encoding="utf-8"?>
<xpp:bloc xmlns:dpk="http://q37.info/ns/dpk" xmlns:xpp="http://q37.info/ns/xpp">
    <dpk:table label="Composers">
        <dpk:content DefaultRecordLabelTag="Surname">
            <Composer dpk:label="Bach JC">
                <Surname>Bach</Surname>
                <FirstNames>Johann Christian</FirstNames>
            </Composer>
            <Composer dpk:label="Bach JS">
                <Surname>Bach</Surname>
                <FirstNames>Johann Sebastian</FirstNames>
            </Composer>
            <Composer>
                <Surname>Beethoven</Surname>
                <FirstNames>Ludwig Van</FirstNames>
            </Composer>
            <Composer>
                <Surname>Brahms</Surname>
                <FirstNames>Johannes</FirstNames>
            </Composer>
            <Composer>
                <Surname>Chopin</Surname>
                <FirstNames>Frédéric</FirstNames>
            </Composer>
            <Composer >
                <Surname>Debussy</Surname>
                <FirstNames>Claude</FirstNames>
            </Composer>
            <Composer>
                <Surname>Fauré</Surname>
                <FirstNames>Gabriel</FirstNames>
            </Composer>
            <Composer>
                <Surname>Gershwin</Surname>
                <FirstNames>George</FirstNames>
            </Composer>
            <Composer>
                <Surname>Granados</Surname>
                <FirstNames>Enrique</FirstNames>
            </Composer>
            <Composer>
                <Surname>Grieg</Surname>
                <FirstNames>Edvard</FirstNames>
            </Composer>
            <Composer>
                <Surname>Liszt</Surname>
                <FirstNames>Franz</FirstNames>
            </Composer>
            <Composer dpk:label="Mendelssohn">
                <Surname>Mendelssohn Bartholdy</Surname>
                <FirstNames>Felix</FirstNames>
            </Composer>
            <Composer>
                <Surname>Mozart</Surname>
                <FirstNames>Wolfgang Amadeus</FirstNames>
            </Composer>
            <Composer>
                <Surname>Perterson</Surname>
                <FirstNames>Oscar</FirstNames>
            </Composer>
            <Composer>
                <Surname>Prokofiev</Surname>
                <FirstNames>Sergueï</FirstNames>
            </Composer>
            <Composer>
                <Surname>Rachmaninov</Surname>
                <FirstNames>Sergueï</FirstNames>
            </Composer>
            <Composer>
                <Surname>Ravel</Surname>
                <FirstNames>Maurice</FirstNames>
            </Composer>
            <Composer>
                <Surname>Schubert</Surname>
                <FirstNames>Franz</FirstNames>
            </Composer>
            <Composer>
                <Surname>Schumann</Surname>
                <FirstNames>Robert</FirstNames>
            </Composer>
            <Composer>
                <Surname>Simon</Surname>
                <FirstNames>Claude</FirstNames>
            </Composer>
            <Composer>
                <Surname>Tchaïkovski</Surname>
                <FirstNames>Piotr Ilitch</FirstNames>
            </Composer>
            <Composer>
                <Surname>Widor</Surname>
                <FirstNames>Charles-Marie</FirstNames>
            </Composer>
        </dpk:content>
    </dpk:table>
</xpp:bloc>

et le fichier encapsulant cette table (Composers.xml ; il n'est pas donné pour les autres tables, car présentant peu de différences) :

<?xml version="1.0" encoding="utf-8"?>
<dpk:data xmlns:dpk="http://q37.info/ns/dpk" xmlns:xpp="http://q37.info/ns/xpp">
    <xpp:expand href="composers_.xml"/>
</dpk:data>

La table Instrumentations (instrumentations_.xml) :

<?xml version="1.0" encoding="utf-8"?>
<xpp:bloc xmlns:dpk="http://q37.info/ns/dpk/" xmlns:xpp="http://q37.info/ns/xpp">
    <dpk:table label="Instrumentations">
        <dpk:content>
            <Instrumentation dpk:label="2 hands">
                <Name>Piano two hands</Name>
            </Instrumentation>
            <Instrumentation dpk:label="4 hands">
                <Name>Piano four hands</Name>
            </Instrumentation>
            <Instrumentation dpk:label="Classical">
                <Name>Classical organ</Name>
            </Instrumentation>
            <Instrumentation dpk:label="Hammond">
                <Name>Hammond organ</Name>
            </Instrumentation>
        </dpk:content>
    </dpk:table>
</xpp:bloc>

Et enfin, la table Collections (collections_.xml), dont les fiches font référence à des fiches des deux tables précédentes :

<?xml version="1.0" encoding="utf-8"?>
<xpp:bloc xmlns:dpk="http://q37.info/ns/dpk" xmlns:xpp="http://q37.info/ns/xpp">
    <xpp:expand href="composers_.xml"/>
    <xpp:expand href="instrumentations_.xml"/>
    <dpk:table label="Collections">
        <dpk:aliases label="%RL%" TableLabel="Instrumentations"/>
        <dpk:aliases label="%RL%" TableLabel="Composers">
            <dpk:alias label="C" TableLabel="Composers"/>
        </dpk:aliases>
        <dpk:content DefaultRecordLabelTag="Title">
            <Collection dpk:label="Corner">
                <dpk:insert RecordAlias="Debussy"/>
                <dpk:insert RecordAlias="2 hands"/>
                <Title>Children's Corner</Title>
            </Collection>
            <Collection dpk:label="Romances">
                <dpk:insert TableAlias="C" RecordLabel="Fauré"/>
                <dpk:insert RecordAlias="2 hands"/>
                <Title>3 Romances sans Paroles</Title>
                <Opus>17</Opus>
            </Collection>
            <Collection dpk:label="Fantaisies">
                <dpk:insert RecordAlias="Brahms"/>
                <dpk:insert RecordAlias="2 hands"/>
                <Title>7 Fantaisies</Title>
                <Opus>116</Opus>
            </Collection>
            <Collection dpk:label="Saisons">
                <dpk:insert RecordAlias="Tchaïkovski"/>
                <dpk:insert RecordAlias="2 hands"/>
                <Title>Les Saisons</Title>
                <Opus>37a</Opus>
            </Collection>
            <Collection dpk:label="Preludes 1">
                <dpk:insert RecordAlias="Debussy"/>
                <dpk:insert RecordAlias="2 hands"/>
                <Title>Préludes - Premier livre</Title>
            </Collection>
            <Collection dpk:label="Lyriques 12">
                <dpk:insert RecordAlias="Grieg"/>
                <dpk:insert RecordAlias="2 hands"/>
                <Title>Pièces lyriques</Title>
                <Opus>12</Opus>
            </Collection>
            <Collection dpk:label="Arabesques">
                <dpk:insert RecordAlias="Debussy"/>
                <dpk:insert RecordAlias="2 hands"/>
                <Title>2 arabesques</Title>
                <Opus Catalogue="L">66</Opus>
            </Collection>
            <Collection>
                <dpk:insert RecordAlias="Schumann"/>
                <dpk:insert RecordAlias="2 hands"/>
                <Title>Albumblätter</Title>
                <Opus>124</Opus>
            </Collection>
            <Collection dpk:label="Preludes 28">
                <dpk:insert RecordAlias="Chopin"/>
                <dpk:insert RecordAlias="2 hands"/>
                <Title>24 préludes</Title>
                <Opus>28</Opus>
            </Collection>
            <Collection dpk:label="Espagnoles">
                <dpk:insert RecordAlias="Granados"/>
                <dpk:insert RecordAlias="2 hands"/>
                <Title>12 danses espagnoles</Title>
            </Collection>
            <Collection dpk:label="Sentimentales">
                <dpk:insert RecordAlias="Schubert"/>
                <dpk:insert RecordAlias="2 hands"/>
                <Title>Valses sentimentales</Title>
                <Opus>50</Opus>
                <Opus Catalogue="D">779</Opus>
            </Collection>
            <Collection>
                <dpk:insert RecordAlias="Liszt"/>
                <dpk:insert RecordAlias="2 hands"/>
                <Title>Consolations</Title>
                <Opus Catalogue="S">172</Opus>
            </Collection>
            <Collection dpk:label="Mazurkas 4">
                <dpk:insert RecordAlias="Chopin"/>
                <dpk:insert RecordAlias="2 hands"/>
                <Title>4 Mazurkas</Title>
                <Opus>17</Opus>
            </Collection>
            <Collection dpk:label="Liebesträume">
                <dpk:insert RecordAlias="Liszt"/>
                <dpk:insert RecordAlias="2 hands"/>
                <Title>Liebesträume</Title>
                <Opus Catalogue="S/G">541</Opus>
            </Collection>
            <Collection dpk:label="Faschingsschwank">
                <dpk:insert RecordAlias="Schumann"/>
                <dpk:insert RecordAlias="2 hands"/>
                <Title>Faschingsschwank aus Wien</Title>
                <Opus>26</Opus>
            </Collection>
            <Collection dpk:label="Piano bar">
                <dpk:insert RecordAlias="2 hands"/>
                <Title>Best of piano bar</Title>
            </Collection>
            <Collection dpk:label="Liebeslieder">
                <dpk:insert RecordAlias="Brahms"/>
                <dpk:insert RecordAlias="4 hands"/>
                <Title>Liebeslieder Waltzes</Title>
                <Opus>52a</Opus>
            </Collection>
            <Collection dpk:label="Sonates120">
                <dpk:insert RecordAlias="Brahms"/>
                <dpk:insert RecordAlias="2 hands"/>
                <Title>Sonates pour clarinette et piano</Title>
                <Opus>120</Opus>
            </Collection>
            <Collection dpk:label="Jazz Hammond">
                <dpk:insert RecordAlias="Hammond"/>
                <Title>Home Organist Library Volume 7 - Jazz Pieces</Title>
            </Collection>
            <Collection dpk:label="Big Band Hammond">
                <dpk:insert RecordAlias="Hammond"/>
                <Title>Big Band Specials for Organ</Title>
            </Collection>
            <Collection dpk:label="Oye">
                <dpk:insert RecordAlias="Ravel"/>
                <dpk:insert RecordAlias="4 hands"/>
                <Title>Ma mère l'Oye</Title>
            </Collection>
            <Collection dpk:label="PJazzExercises">
                <dpk:insert RecordAlias="Perterson"/>
                <dpk:insert RecordAlias="2 hands"/>
                <Title>Jazz exercises</Title>
            </Collection>
            <Collection dpk:label="Chopin69">
                <dpk:insert RecordAlias="Chopin"/>
                <dpk:insert RecordAlias="2 hands"/>
                <Title>2 valses</Title>
                <Opus>69</Opus>
            </Collection>
            <Collection dpk:label="Brahms118">
                <dpk:insert RecordAlias="Brahms"/>
                <dpk:insert RecordAlias="2 hands"/>
                <Title>Six pieces for Piano</Title>
                <Opus>118</Opus>
            </Collection>
        </dpk:content>
    </dpk:table>
</xpp:bloc>
  • # Flux des sessions de travail ?

    Posté par  (site web personnel) . Évalué à 3.

    Merci pour cette présentation. En revanche, j'ai du mal à voir l'intérêt du logiciel lors d'une session de travail ? Le hasard est une source d'inspiration ou intégrer dans ton organisation de la session ? quel est l'intérêt de ces fiches pour toi (et donc potentiellement pour les autres) ?

    • [^] # Re: Flux des sessions de travail ?

      Posté par  (site web personnel) . Évalué à 5.

      Par exemple, lorsque l'on travaille sur plusieurs partitions en même temps, on a tendance à les travailler dans un certain ordre, pour être sûr de n'en oublier aucune. Ce faisant, on risque de mettre en place une sorte de réflexe pavlovien.
      Ainsi, supposons qu'après avoir travaillé une partition A, relativement facile, on travaille systématiquement la partition B, avec laquelle on rencontre des difficultés. Même si on ne se focalise pas sur ces difficultés, après avoir travaillé A, notre subconscient peut nous faire aborder la partition B de manière moins sereine, parce qu'il sait que la partition qui suit A est systématiquement plus difficile. Avec dpkq, comme les partitions ne se suivent pas dans le même ordre d'une session à l'autre, ce genre d'appréhension inconsciente ne peut se mettre en place.

      D'autre part, les segments concernant les partitions que je rejoue régulièrement pour ne pas les oublier sont assez nombreux ; il me faut plusieurs jours pour en faire le tour. dpkq me permet de n'en oublier aucun, bien que je ne les joue jamais dans le même ordre, sachant que dpkq ne pioche jamais deux fois le même segment si tous les autres n'ont pas été piochés au moins une fois.

      Quant aux fiches elle-mêmes, il faut savoir qu'une fois que j'ai déchiffré une pièce, je la connais par cœur, donc je ne recours plus qu'exceptionnellement à la partition. La fiche me montrant une image de la partition, avec les numéros des mesures à travailler dans le cadre de cette fiche, cela me suffit à me remémorer la partie à travailler (comme mentionné, je joue par cœur, donc sans l'inconfort d'avoir à suivre la partition sur la tablette). Si j'ai un trou de mémoire, la consultation de la fiche me permet généralement de le combler.
      Au final, une fois travaillées, je peux ranger mes partitions, au lieu de les empiler sur mon piano/orgue pour les avoirs toujours à portée de main… D'un autre coté, si je n'ai que rarement besoin des partitions pour ces pièces, c'est aussi parce que dpkq me permet de me les remémorer de manière régulière, systématique et exhaustive…

      Pour nous émanciper des géants du numérique : Zelbinium !

  • # Ya pas à dire, tu aimes le q

    Posté par  . Évalué à 9.

    xppq, tmcq, dpkq … Mais au fait ça veut dire quoi ces acronymes ?

    • [^] # Re: Ya pas à dire, tu aimes le q

      Posté par  . Évalué à 1. Dernière modification le 01 juillet 2015 à 22:10.

      (deleted)

    • [^] # Re: Ya pas à dire, tu aimes le q

      Posté par  (site web personnel) . Évalué à 2.

      Ce ne sont pas des acronymes, simplement des assemblages de quelques lettres issues de l'intitulé (anglais) du logiciel concerné. La dernière lettre n'a pas de signification particulière.

      Pour nous émanciper des géants du numérique : Zelbinium !

  • # Epeios framework?

    Posté par  . Évalué à 2.

    Je ne trouve pas grand chose a propos de epeios framework dont tu es l'auteur apparemment…

    Tu peux me donner le lien de la doc ou bien tu prevois de nous faire un journal a ce sujet :D

    • [^] # Re: Epeios framework?

      Posté par  (site web personnel) . Évalué à 1.

      Les premières lignes de ce qui est devenu le framework Epeios datent d'il y a plus de quinze ans. Les domaines d'application de ce framework, et par conséquent le nombre de ligne qui le compose, n'ont cessé de s'accroître depuis. Rédiger la documentation correspondante représenterait une tâche titanesque pour une personne seule, sans compter, le framework évoluant sans cesse, le temps qui serait nécessaire rien que pour la tenir à jour.

      J'utilise quotidiennement ce framework, et cette absence de toute documentation ne m'a jamais dérangé (le fait que c'est moi qui l'ai développé n'y est sans doute pas étranger), aussi préfère-je consacrer mon temps au développement et à l'amélioration de ce framework, plutôt qu'à la rédaction d'une documentation qui ne me serait d'aucune utilité. Si je le mentionne systématiquement lorsque l'un de mes logiciels (c'est-à-dire tous) se base sur ce framework, c'est parce que cela a certaines implications pour le logiciel en question. Par exemple, cela implique qu'il soit multi-plateformes et multi-architectures, qu'il possède un mécanisme spécial de gestion des arguments, que j'ai décrit dans ce journal, lorsque c'est un utilitaire en ligne de commande, qu'il utilise une registry interne rempli par un fichier de configuration…

      Ceci dit, il y a cela fort (fort) longtemps, j'avais écrit un début de documentation. J'en ai retrouvé la trace durant mes investigations à l'occasion de la rédaction de ce commentaire. Apparemment, j'en avais même écrit plusieurs versions (voir ici et ici). Je n'ai pas relu, donc je ne garantis rien quant au contenu…

      Pour nous émanciper des géants du numérique : Zelbinium !

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.