Notification de bonnes vacances


h1 7/31/2007 04:22:00 PM

Aujourd'hui est mon dernier jour au labo pour cette deuxième année de thèse. Je vais limite avoir du mal à arrêter de bosser, avec toutes ces questions excitantes qui tournent encore dans ma tête, tous ces trucs à écrire. Pour m'aider à décrocher (hum..) j'ai décidé de passer la journée à coder dans liquidsoap, en me concentrant sur deux-trois trucs chiants et pas du tout glorieux, qui ont trait à l'auto-documentation des fonctions définies dans les scripts liq. Cela devient important à mesure que nous accumulons de petites snippets sympas.

Par exemple, j'utilise liquidsoap pour écouter ma musique, et pour écouter Dolebraï (sur laquelle je mixe les interventions de balbinus sur sa number station). Dans les deux cas j'utilise deux petites fonctions pratiques: je parlerai plus tard de la platine interactive qui permet d'appliquer quelques effets audio, quand elle sera finalisée; l'autre fonctionnalité est un petit hack pour afficher à l'écran les metadonnées du flux joué par liquidsoap.

Le principe est simple: attacher à l'évenement on_metadata une fonction qui exécute la bonne commande. Quelle que soit la méthode, il va tout d'abord nous falloir une fonction pour transformer la métadonnée en chaine de caractères.

# Standard function for displaying metadata.
# Uses "Unknown" when a field is empty.
# @param m Metadata packet to be displayed.
def display_metadata(m)
artist = m["artist"]
title = m["title"]
artist = if ""==artist then "Unknown" else artist end
title = if ""==title then "Unknown" else title end
"#{artist} -- #{title}"
end

OSD (On Screen Display)

OSD est une technologie ancestrale de X. On peut l'utiliser simplement avec l'utilitaire osd_cat qui affiche à l'écran (au dessus de toutes les fenêtres) le texte passé sur son entrée standard. Le problème est que les polices ne sont pas lissées, et qu'il est difficile de trouver une couleur de texte lisible quel que soit le fond au moment de l'affichage. Néanmoins, c'est un début..

# Use X On Screen Display to display metadata info.
# @param ~color Color of the text.
# @param ~position Position of the text (top|middle|bottom).
# @param ~font Font used (xfontsel is your friend...)
# @param ~display Function used to display a metadata packet.
def osd(~color="green",~position="top",
~font="-*-courier-*-r-*-*-*-240-*-*-*-*-*-*",
~display=display_metadata,
s)
osd = 'osd_cat -p #{position} --font #{quote(font)}'
^ ' --color #{color}'
def feedback(m)
system("echo #{quote(display(m))} | #{osd} &")
end
on_metadata(feedback,s)
end

Notify

Notify est une technologie plus moderne émanant de l'intiative freedesktop. Elle est donc disponible avec les gestionnaires de bureau principaux, notamment gnome, kde et xfce. Si ça se trouve on peut même l'utiliser indépendamment du gestionnaire de bureau, mais l'idée ici est que l'intégration permet un comportement plus riche et agréable, ainsi qu'une apparence unifiée. Bref. Encore une fois on a un petit outil simple en ligne de commande: notify-send. Et ce n'est pas plus compliqué à utiliser depuis liquidsoap:

# Use notify to display metadata info.
# @param ~urgency Urgency (low|normal|critical).
# @param ~icon Icon filename or stock icon to display.
# @param ~time Timeout in milliseconds.
# @param ~display Function used to display a metadata packet.
# @param ~title Title of the notification message.
def notify(~urgency="low",~icon="stock_smiley-22",~time=3000,
~display=display_metadata,
~title="Liquidsoap: new track",s)
send = 'notify-send -i #{icon} -u #{urgency}'
^ ' -t #{time} #{quote(title)} '
on_metadata(fun (m) -> system(send^quote(display(m))),s)
end

Tout ceci se teste assez simplement. Par exemple, pour faire simple, mettez mes petites fonctions dans un script, ajoutez en dernière ligne un out(notify(playlist("~/ma/musique"))) et c'est parti. Sous Debian les paquets nécessaires sont (liquidsoap et) respectivement xosd-bin et libnotify-bin. Un petit instantané du résultat chez moi:


Et bonnes vacances!

Libellés : ,

Intello - nombriliste - hippie - réactionnaire


h1 7/24/2007 03:02:00 PM

Depuis déja une semaine je suis de retour d'Allemagne, où je présentais le système que j'ai développé en première année. J'ai surtout pas mal bossé à tous ces exposés que je ne suivais pas, et je suis rentré avec plein d'idées à pousser, c'est assez excitant. J'ai appris ce matin que l'article résultant en gros de mon travail de cette année a été accepté à LPAR. Ce travail me tenait assez à coeur, et le suspens était d'autant plus grand que l'article a d'abord été refusé ailleurs dans des conditions assez frustrantes... En tout cas, j'irai en Arménie en Octobre.

Voilà pour le côté recherche, bien rempli. Côté Savonet, Sam Balbinus et Romain ont l'air de se sentir plus franchement en vacances que moi, et passent pas mal de temps sur le projet, ce qui m'y pousse forcément. On commence à étendre les possibilités d'interaction: à terme on n'aura plus besoin de régler les opérateurs de traitement de son à l'aveugle; ça devrait aussi aider à débuguer des trucs complexes comme la détection de beat; plus marrant, on peut imaginer utiliser liquidsoap comme un backend d'un logiciel de DJ. J'ai forcément été de la partie, pour le bricolage dans les coins sombres de liquidsoap, et puis parce que ça m'amuse bien tout simplement. Mais je n'ai clairement pas été à la hauteur de la frénésie de Sam. Pour sa part, Romain a rédigé un article pour DebADay, auquel j'ai contribué un peu, mais pas aussi vite qu'il ne l'espérait. Dans le même temps il préparait un dossier pour les Trophées du Libre. Et il a pour la troisième fois demandé au projet Icecast de lister liquidsoap parmi les streamers compatibles, avec succès! Notre longue absence me fait bien sentir que la liste est loin d'être exhaustive. N'empêche, c'est une liste de choix, et liquidsoap y sort clairement du lot, ça fait plaisir.

Plus que ma très passagère et très relative baisse d'activité de développement, mon manque d'intérêt pour la communication m'a fait me poser des questions, et nous en avons d'ailleurs un peu discuté avec Romain. Ma première réaction a été de me justifier dans l'absolu. Ce qui m'intéresse, ce n'est pas de maintenir un monument, d'assurer le support utilisateur, la portabilité et la backward-compatibility... toutes ces choses, certes très importantes, ne m'excitent pas. Et ce projet est d'abord et avant tout un hobby, je ne veux pas me laisser entraîner dans une direction qui ne me plait pas. Mais qu'est-ce qui me plait? Ce n'est pas très raisonnable, mais je crois qu'il faut avouer que c'est d'abord "coder". J'aime coder, de l'élégance des petites fonctions à la satisfaction de la maitrise de l'ensemble complexe de modules que forme liquidsoap. Sinon, plus généralement, "développer" une idée qui permette d'atteindre un résultat original, de dépasser les limites actuelles.

En fait, tout est dans la portée du "développement". Ça me fait penser à Philip. K. Dick qui présente, en préface du recueil de ses nouvelles, sa vision de la différence entre nouvelle et roman. La nouvelle lui permet de mettre en scène une idée: on pose le décor, les personnages, dans l'unique but de présenter l'idée principale. Dans un roman, les personnages et l'environnement en général doivent être développés plus en profondeur, ils doivent prendre vie, avoir leur caractère. Selon Dick, l'auteur se retrouve du coup prisonnier de ses personnages, dont la vie propre force l'action. Les deux styles ont leurs avantages et inconvénients. Chacun son truc. Quant à Dick, il a écrit les deux. J'ai bien aimé ses romans, mais je dois dire que je suis soufflé quand je lis ses nouvelles: quasimment chaque histoire met en scène une idée étonnante, déroutante, fascinante! Je parle de Dick plus parce que j'adore le lire que parce que j'aime l'analogie, mais vous l'aurez compris, je me vois plutôt écrire des "nouvelles" que des "romans". L'autre tendance me semble glauque au possible: je pense aux armées de développeurs dans l'industrie, qui implémentent des suites bureautiques, de mornes projiciels ou autres automatisations de tâches administratives... En un sens ils peuvent être fiers de faire tourner le monde. Mais bon, comme dit Alan J. Perlis: In computing, turning the obvious into the useful is a living definition of the word "frustration". (Perlis a écrit un paquet d'Epigrams on Programming, c'est une lecture amusante, et on finit toujours par y lire midi à sa porte.)

Bien entendu, peu de choses étant simples dans la vraie vie, je me suis vite rendu compte que ces réflexions ne sont pas honnêtes. Du moins, elles ne représentent qu'une facette de la réalité. J'ai la tête très occupée par la recherche en ce moment, mais ces choses là fluctuent. Je suis clairement touché quand un utilisateur apprécie liquidsoap, quand Xavier Cazin blogue là dessus chez O'Reilly, etc. Il y a là bien sûr un brin d'orgueil. Plus louablement, je crois qu'un des buts de liquidsoap est de montrer comment des courants d'idées actuellement plutôt enfermés dans le milieu de la recherche peuvent être utiles à tout le monde, développeurs comme utilisateurs. Le fait que le projet marche, et qu'il soit apprécié, et qu'il ait même rallié un brin de contributeurs, constitue un début de succès de ce point de vue... ce n'est peut-être pas tout à fait de la pédagogie ni du militantisme, mais il y a un peu de ça.

Le problème des concours de logiciels libres cristallise bien ces questions. J'ai probablement été le premier à envisager de présenter liquidsoap à tel ou tel concours. J'ai toujours repoussé à une prochaine-version-encore-mieux. Sam a poussé et c'est finalement Romain qui a fait le pas. Le bon côté de la chose c'est qu'on risque d'entrer en contact avec de nouveaux gens intéressants, et probablement tomber sur de nouvelles idées. Le domaine est plutôt petit et on s'adresse à des gens plutôt capables techniquement, nous sommes probablement déja suffisamment référencés pour que les utilisateurs ciblés nous trouvent. Mais peut-être un peu de communication plus large nous fera-t-elle atteindre des applications et des gens auxquels nous ne pensons pas actuellement, et réciproquement. Ces pensées positives ne chassent pas l'idée du côté bizarre de tout ça. Pourquoi concourir à un prix, en euros et en matériel ? On se retrouve à lire dans le topic de #savonet: "TODO: Find what to do with money for the project"! Pour caricaturer, on part d'un projet pour le fun et les belles idées, et on arrive à se demander comment dépenser du blé, en vulgaires consommateurs. Ça m'évoque aussi les grosses compagnies qui n'ont que l'objectif d'être les "premières", oubliant complètement l'interêt du client et de la société. Pas de méprise, ces exagérations ne sont que les spectres caricaturaux d'un doute qui me taraude. Mais je crois qu'il est très important de faire gaffe à ne pas dévier par mégarde des objectifs qu'on se fixe. Pour ne pas se réveiller un jour et réaliser qu'on a perdu du temps et de l'énergie (ou pire) à des choses qui ne nous intéressent pas.

Libellés : , ,

Application


h1 7/18/2007 12:21:00 PM

Je suis en conférence, ce qui me laisse plein de temps pour bosser pendant la plupart des exposés... Bremen est plutôt une jolie ville, le campus est super agréable et il fait beau. Blogger s'est mis à me parler en Allemand. Ici j'ai vu Al. Bundy, pour ceux qui connaissent...

Bon sinon, un petit exemple simple m'est venu pour montrer que l'application en Caml n'est pas aussi simple qu'on le pense en présence d'arguments optionels. L'équation f x y = (f x) y, n'est pas toujours vérifiée. En fait, on n'a pas seulement une notion d'application mais bien une multi-application. Si je parle de ça c'est pour mettre au clair l'origine de la multi-abstraction du langage de script de liquidsoap.

# let f ?(a=false) () = a ;;
val f : ?a:bool -> unit -> bool =
# f () ~a:true ;;
- : bool = true
# (f ()) ~a:true ;;
This expression is not a function, it cannot be applied
# f () ;;
- : bool = false

Libellés : , , , , ,

Scoop


h1 7/15/2007 11:49:00 AM

Sam et Balbinus ont frénétiquement commencé un nouveau sous-projet au sein de Savonet: SoapLab! Il s'agit d'une application Gtk à deux facettes. D'abord un ingester, premier maillon du futur système IAS cher à Balbinus: il permet de rapidement examiner un fichier de sa playlist, et d'éditer ses caractéristiques, notamment les points de fade-in/fade-out/crossing. Tout cela bien sûr sur n'importe quelle machine, pas forcément sur le serveur de la radio. Soaplab est aussi un éditeur audio, qui importe/affiche/joue/modifie/exporte une onde sonore. Plutôt classique, mais de bonne facture et surtout, re-utilisant tout le matériel développé dans liquidsoap. Je m'en sers notamment pour inspecter la sortie d'une source liquidsoap.

soaplab --editor '
s = sine(duration=5.)
s = fade.in(duration=2.,type="sin",s)
s = fade.out(duration=2.,type="sin",s)
sequence(merge=true,[s,s,s,s,fallback([])])'




On voit ici quatres pistes de la source s, qui émet des pistes de 5 secondes, sinusoïdales à 440Hz, sur laquelle on a rajouté du fading in et out, de type "sinusoïdal". Les autres types dispos sont dans l'ordre: exponentiel, logarithmique et linéaire.



Libellés : , ,