vendredi 13 août 2010

BONJOUR

The old BONJOUR project has been a free-source initiative within the once isolated world of Université de Montréal. (Later, one introduced the GNU project to me by stating it was a planetary BONJOUR!) Despite BONJOUR has long been lost in the dust, it is fun to remember!

I found bits and pieces of BONJOUR files and history in my computer files, which I'm now making public to amuse some friends and old participants. This is almost all French, however. In these old files, I found a fairly good description of the project. There is an overall presentation of Bonjour which I found and saved from an old curriculum vitæ. There is also a non-null intersection between Bonjour participants and the Solange group.

As all this code is meant for defunct CDC mainframes, operating systems and tools (see Control Data times for some anecdotes), there is no point in exactly retaining the old project structure, so I shuffled things around a bit to increase legibility. I made one HTML page for each project name, and a terse table of contents with pointers for all these names. Each project page has sections hinting at the real origin for the contents of this section. For anyone wanting to scrutinize the sources, the following information might have some use: Compil comes from the COMPIL part of SYSF, Docum0 to Docum9 come from SYSD, Include comes from SYSI, and Source comes from either SYSF or SYSS. (The few SYSF sources are maintenance-related, these are: FAIREB, INS, LAZB, LAZBDIR, LAZI, NPSTAT, PACK, SB, SUBMIT, SUPSYSR, and TX.)

File names were limited to seven letters or digits, with no case distinction. Some source management, like conditional code or included files, was achieved through the UPDATE program, using directives like *deck, *incl or *if in the source. Lines were usually limited to 72 characters because of punched cards.

We were experimenting with French support, using bang-bang code, on a system which was hostile even to mere ASCII. In the BONJOUR sources now published, all the bang-bang has been converted to UTF-8. Line sequence prefixes (each source line beginning with something like 14560=) for Telum EDIT have been eliminated.

mardi 10 août 2010

Solange

Dans les années 1980, le Centre de Calcul de l'Université de Montréal a développé (audacieuse nouveauté pour l'époque!) un système de messagerie nommé MU, qui permettait la création de groupes de discussion. Solange a été l'un d'eux, où les participants laissent joyeusement tomber la pression, sous le couvert d'un pseudonyme.

Origine


Le nom Solange provient de Solange Harvey, qui tenait alors un Courrier du cœur dans un quotidien de l'époque. Au départ, quiconque faisant partie de ce petit groupe pouvait envoyer un message commençant par "Solange, j'ai un problème!", suivi de la description d'une difficulté personnelle, réelle ou inventée. Chaque participant en recevait copie et pouvait fabriquer une réponse. L'originateur était alors gratifié en retour d'une collection de conseils, plus ineptes, farfelus et drôles les uns que les autres.

Les pseudonymes n'ont pas protégé l'anonymat des participants bien longtemps. Une sympathie, puis une amitié s'est progressivement développée entre les membres du groupe Solange, et nos missives se sont souvent éloignées du schéma initial, pour couvrir une grande variété de sujets et d'intérêts, avec la gentillesse et l'humour comme trame de fond. Encore aujourd'hui, plusieurs membres de Solange gardent contact, et se connaissent par leur surnom.

Membres de Solange


Il faudrait bien que j'essaie d'établir la liste complète des membres, mais je n'ai pas beaucoup de mémoire pour les noms. Oh, quelques contributeurs de BONJOUR s'y sont retrouvés, mais on y discutait plutôt d'autre chose. Évidemment, jamais je n'oublierai:
  • le zap (Denis Fortin)
  • fog ou F-rond-G, en référence à l'opérateur de composition fonctionnelle (Francis Gendreau),
  • cigit (Claude Goutier),
  • ddn ou le docte (Jean-François Lamy),
  • glem ou Gilles le Magnifique (Gilles Hurteau),
  • le créateur en référence au roman Simulacron 3 de Daniel Galouye (Marc Feeley),
  • bgirl…elle en référence au personnage de Bat Girl dans le film (Nicole Pigeon),
  • il comme contraste avec …elle (Isabelle Leveau),
  • 4@k!1$m ou cataclysme (André Tiphane),
  • azor en référence au mouton noir dans le Seigneur des Alpages (Marc-André Parent),
  • f'murr comme auteur du même,
  • lireln qui fait référence au Pascal francisé par Olivier Lecarme mais aussi à la consonance Lyre-Hélène (Claude Cardin),
  • tag ou encore tueur à gags, parce que ses plaisanteries tombaient souvent à plat (Marc Durand),
  • geronne (Pierrette Bertrand),
  • jynx (ou jinks?) (Jean-Yves Soucy),
  • dragon soyeux (Serge Froment),
  • iznogoud comme grand méchant vizir qui veut devenir calife à la place de Icule el Poussah (Bertrand Sénécal?),
  • (François Gagnon),
  • gudule,
  • swap,
  • Et sans m'oublier, icule en tant que suffixe diminutif tout usage (François Pinard).

Il y en a quelques autres que ma mémoire ne réussit malheureusement pas à retenir correctement. Ceux qui savent, aidez-moi à compléter cette liste!

Solange (je veux dire, les membres de Solange!) doit en théorie se rencontrer avec régularité, à tel jour et telle heure précises à chaque dix ans, an Wendy's sur Décarie ou, si ce Wendy's n'existe plus, à l'hamburgererie la plus proche. Je dois pourtant avoir l'information plus précise quelque part… Mais où?!

Citations de Solange


En classant de très vieux listings imprimés chez moi, j'ai retrouvé quelques citations que les gens de Solange s'étaient partagées, et que je répète ici. Les citations viennent d'ailleurs, bien sûr, mais ce sont de beaux souvenirs pour moi.

Vignault


Jamais les fleurs du temps d'aimer
N'ont poussé dans un coeur fermé
La nuit, le jour, l'été, l'hiver
Il faut dormir le coeur ouvert.

Gilles Vignault, La navette, nov. 81

Lurette


Pour mieux apprécier ce texte, il faut en comprendre le contexte. Nous avions questionné 4@k!1$m, qui pensait alors à la prêtrise, si le fait de faire l'amour n'allait pas lui manquer. Il nous avait alors répondu qu'il pensait y survivre, et que toute façon, il n'avait pas fait l'amour depuis belle lurette.

Voici une vieille lettre que l'Icule m'adressa un soir de pluie.

"En ce moment, Belle Lurette apportait elle-même à 4@ une tasse de thé. C'était plus qu'une distinction, c'était une faveur. Il y a, dans la manière dont une femme s'acquitte de cette fonction, tout un langage; mais les femmes le savent bien; aussi est-ce une étude curieuse à faire que celle de leurs mouvements, de leurs gestes, de leurs regards, de leur ton, de leur accent, quand elles accomplissent cet acte de politesse en apparence si simple. Depuis la demande: Prenez-vous du thé? — Voulez-vous du thé? — Une tasse de thé? — froidement formulée, et l'ordre d'en apporter donné à la nymphe qui tient l'urne, jusqu'à l'énorme poème de l'Odalisque venant de la table à thé, la tasse à la main, jusqu'àu pacha du coeur et la lui présentant d'un air soumis, l'offrant d'une voix caressante, avec un regard plein de promesses voluptueuses, un physiologiste peut observer tous les sentiments féminins, depuis l'aversion, depuis l'indifférence, jusqu'à la déclaration de Phèdre à Hippolyte. Les femmes peuvent là se faire, à volonté, méprisantes jusqu'à l'insulte, humbles jusqu'à l'esclavage de l'Orient. Belle Lurette fut plus qu'une femme, elle fut le serpent fait femme, elle acheva son oeuvre diabolique en marchant jusqu'à 4@, une tasse de thé à la main."

Cigit, 1984-03-21

Rostand


"Atome dérisoire, predu dans le cosmos inerte et démesuré, il sait que sa fiévreuse activité n'est qu'un petit phénomène local, éphémère, sans signification et sans but. Il sait que ses valeurs ne valent que pour lui, et que, du point de vue sidéral, la chute d'une empire, ou mème la ruine d'un idéal, ne compte pas plus que l'effondrement d'une fourmilière sous le pied d'un passant distrait.

Aussi n'aura-t-il d'autre ressource que de s'appliquer à oublier l'immensité brute, qui l'écrase et qui l'ignore. Repoussant le stérile vertige de l'infini, sourd au silence effrayant des espaces, il s'efforcera de devenir aussi incosmique que l'univers est inhumain; farouchement replié sur lui-même, il se consacrera humblement, terrestrement, humaintement, à la réalisation de ses desseins chétifs, où il feindra de prêter le même sérieux que s'ils visaient à des fins éternelles."

Rostand (J.), L'homme. Collections Idées, Gallimard

Gigit, 1984-12-04

Raissa Maritain


Le lac

Le lac plein de maisons de verre
Bercé de leur masse fragile
Abri des âmes sincères
Qui l'habitent comme une île.

Depuis si longtemps en silence
La lune et l'étoile s'y balancent
Des rames entrent par les fenêtres
Des voiles agitées s'y reflètent

Et les âmes se souviennent
D'aventures très anciennes
Dans les maisons de la terre.

Raïssa Maritin, Au creux du Rocher

vendredi 6 août 2010

Twitter thoughts

Twitter is an interesting communication media, overwhelming and terse at the same time. I merely want to summarize bits of my experience using it.

On reciprocating


Twitter is a strange animal. It is easy to get in and out. There is a wide variety of people, interests and opinions in there. I cannot easily dismiss the value of that diversity, and am tempted to follow many for the only sake of better opening my human horizon and spirit. But I quickly saw that I need efficient means so it does not consume much of the little free time I still have. One may not really appreciate or enjoy the benefits of Twitter without inversting some time in it, so the equilibrium that would best fit who I am is a bit uneasy.

So, after legitimate enthusiasm, I got a bit carried under too much pollution of uninteresting tweets, and I was torn between the desire of keeping links, and not spending too much time at evaluating and managing my Following list.

Twitter is assymetrical. We do not have to follow back each other. Nevertheless, I quite value the richness of experience that comes out of relations which are not fully volatile, and by following back, I want to increase the probability that it all happens. To some extent, I expect the same from those I follow. Now, there are exceptions. Some tweets are produced by research centers or news publishers; and some people are more of an institution than an individual — I would not expect that such entities reciprocate, I then have the feeling of subscribing in some more traditional way.

Initial clean out


As a newcomer to Twitter, I've been surprised at first by the high number of followers I got in the first few days and weeks of presence, after only a very modest announcement on my Web site. I followed back everyone, soon shuddering that I would be just unable to give everyboy the attention he (or she) deserves. And indeed, I had not enough free time to keep up with the stream. So, even if uncomfortable, I let the experience mature for a while, long enough to develop some sounded criteria that could drive a revision of who I was following back, so breaking the symmetry. Here there are:
  • If one indiscriminately follows tons of people, one is likely more interested in statistics, or robots, than communication. If I was following that many people, I would merely drown everyboy and be blind to most of them. I'm not tempted to follow people who do not hesitate to drown me in their crowd; I just do not believe they have much interest in me, if any. So, despite one's tweets may have an absolute value in themselves, and hint towards who that person is, I've more chance building up on these hints if that person sees me.
  • When one tweets for marketing purposes, his ads are usually intertwined with empty proverbs, gratuitous citations, and other pathetic tries to crank up some artificial value to his verbiage, and create customership. (There are exceptional marketers which may be worth following nevertheless, but this is not the average!)
  • Futile quizzes, trolls and teases all around for triggering reactions and creating Twitter activity, begging for retweets; all that gives me the feeling that the user did not get a life yet. So why would I bother?
  • Reading should be a pleasure, which is destroyed when one swears at every three words, or is otherwise unwilling to write his own language correctly. I do not enjoy deciphering a meaning through tons of orthographical mistakes.
  • Some people sent ten tweets in a row (or none at all) when they initially subscribed half a year ago, and stay fully silent after that. Oh, I do not expect people to tweet every day. All the contrary, I even appreciate the calm of silence, given that when it is broken, this is for substance rather than noise. Yet, there are lower limits to sparseness.

My following policy


For now, I may describe my current policy for following back by the following points:
  • I'm quite opened to follow anyone who contact me for the pleasure of any real exchange (besides selling me something of converting me to some cause).
  • I'll usually reciprocate to a new follower, given he (or she) already follows no more than a moderate amount of people, and already has in his (or her) relatively recent tweets anything that brings at least the shadow of a common interest or curiosity — that is, anything that could be built upon.
Moreover, I may often be slow to reply, as I do not have much free time to do so.

Choosing a Twitter client


The few Twitter tools I initially tried left me on my appetite, really, as they did not give what I needed to handle my initial flow of Twitter users and tweets. So I decided to look around for many clients of different type (browser plugins, as well as applications based on curses, GTK, AIR, and others). Twitter is a nice idea, but I'm not so satisfied with the available readers. For example, Pidgin has two readers for it, taking opposite directions (one chat per user, one chat for all users), none of them is really usable in my opinion. I stuck with TweetDeck for a while, and despite it is fairly popular, I do not understand how people suffer its quirks.

I knew what I would like to have, but hade no time to write it. So, I perused some Twitter API libraries, merely to see what could be done. This is how I sketched the fairly vaporous TweeTabs project, just to put in writing what I'm looking for, (not so) secretely hoping that someone would pick on the idea and write it. To my own suprise, I found bits of free time, enough to get a (barely) usable TweeTabs tool, which replaced TweetDeck in my habits. But more time was required for developing and completing that project. So I welcomed a solution on which I stumbled in the meantime, that is Seesmic, which I much like, and am using since then.

samedi 27 mars 2010

Letter to NtEd-users

This is a letter to Jörg Anders, and the nted-users mailing list.

This morning, I felt like creating a draft of a musical score, and boil it in various ways. Direct Lilypond, which I sometimes do, would have been a bit heavy for this exploratory work, so I looked around for helping tools, and found NtEd, which looked both usable and useful. There is a great deal of work captured into that package, and I'm quite grateful, Jörg, that you created it, and made it available to all of us. Thanks a lot for this.

Ubuntu Karmic offers version 1.5.1, which I used most of the day. Yet this afternoon, already hooked, I fetched sources for 1.9.18, recompiled and installed them. This was surprisingly easy and smooth, and given the complexity of the thing, I admire a job well done! Moreover, a few little bugs or irritations from 1.5.1 merely vanished, so it was worth reinstalling. This version also implements some fairly interesting new features. In particular, I enjoyed the MIDI input features, and the quality of the writing style in the generated Lilypond source.

Finally, I peeked at all archives from the nted-users mailing list, which happily enough, were not too voluminous. Notable is your apparent hate of the idea of a Windows port — not that I need any, of course, but even if I do not much praise Microsoft, I feel much more neutral, by comparison! ☺ Another astonishing remark is this sentence you wrote on 2010-02-02: Actually I want the perfect music notation and playing tool. Which is quite a challenge and undertaking!

So, I dare a few comments, hoping you'll forgive me. I do not have much experience with NtEd yet, so many things surely escape me.

My main struggle today was about cutting and pasting between voices and staves, or restricting some operations to be per-voice (or maybe a few chosen voices). Currently, there does not seem to be a way to extract a single voice to a (maybe temporary) stave, or two combine all voices from two staves into a single stave (presuming that there is no more than four voices in both). Or to paste into a voice without erasing the other voices in the same staves. Or to switch a selection from one voice to another. It might even be useful to insert within a voice (the voice equivalent of insert block) without changing the others.

Even if this was not my case today, let's presume one is working at a fugue, or any kind of ricarcere. The various themes and counter-subjects have to be repeated and mixed from a voice to another, and before the harmony gets perfect, the musician would like to try in various ways. An score editor like NtEd should ideally ease such works. Moreover, the themes have to be transposed (one voice at a time), and even, in some more complex but not so unusual cases, reversed (symmetry around an horizontal axe), elongated (doubling the time of each note) or squeezed (halving the time of each note). I quote this merely to illustrate possible usages.

(For the record, someone else presented a similar request on the mailing list, a while ago.)

What is the purpose of asking the paper size, once some MIDI has been collected? Could not it be deduced from the preferences, the same as it is done already for the main NtEd edit page?

When two voices collide (are in unison) on one beat and then diverge on the following beat, while the lower note (say) stay the same, I did not find a way to create a tie between the two lower notes. It works, however, if the initial beat has no unison: a tie is then obeyed. I append a .ntd file to this message for illustrating my attempt. Of course, one may simulate a tie with a slur (I did not try). While it would be acceptable visually, the MIDI rendering would differ.

Thanks for listening and, of course, for giving me such a nice tool!

mardi 2 février 2010

Recode and thread-safety

Someone just asked me about thread-safety of the Recode library. This exchange might interest other Recode users, so I save it here. At least until I revise and integrate this information elsewhere! ☺
  • My boss is asking if it [the Recode library] is thread-safe… I read the online documentation … but I couldn't find a word about that. Hope you can help me provide a good answer!
For me, a good answer is an honest one! The truth is that I never checked through actual testing that it is thread-safe. On the other hand, I designed the library so it should be.

Long ago, when Ulrich Drepper, who maintains GNU libc, wanted to add various character set support in libc, he asked me if we could manage to use Recode for it, and asked me to produce a reentrant library out of Recode, because threading considerations were getting hot everywhere in libc. At the same time, Richard Stallman accepted that I change the license of Recode from GPL to LGPL, so it could later be recycled into libc. So did I: the extraction of a library out of the code, and the change of license.

I did not want to dive deep into the intricacies of thread control and exclusion, because there were too many implementations to consider at the time, all different, and with the reputation of having each its own flurry of bugs. I rather tried to design the library so to clearly minimize the danger of threading problems, as far as possible, but completely avoided thread related library calls.

A bit later, Ulrich shared a design he had in head for implementing the iconv specs in libc, and suggested that I rewrite the Recode library to support it. This would have implied that I significantly restrict or weaken Recode specs. My opinion was that we should not make ourselves miserable for the only sake of following questionable new standards. We did not reach an agreement, and so, the Recode library did not get used in GNU libc.
  • In my code, I initialize a single RECODE_OUTER, and I use that variable everytime I call recode_new_request(). Every thread uses it's own RECODE_REQUEST.
This is exactly how I meant it to be used in threading contexts. I'm not so sure, by now, that this is the best approach, because producing a RECODE_OUTER per thread currently implies a non-negligible CPU overhead, as well as duplication of in-memory descriptions. On the other hand, this is indeed the safe way to proceed.
  • Can you please explain a little bit what thread issues could happen if two threads call any of the following functions at the same time?

     recode_new_request(outer);
     recode_scan_request (request, conversion);
     recode_string (request, string);
     recode_delete_request (request);


Before everything, I assumed that thread-safety is to be already guaranteed in malloc and free, and common I/O operations. If these are not thread-safe, the Recode library is surely not. Moreover, no thread exclusion is explicitly taken, nowhere in the Recode library itself.

There should not be any problem, by design, because requests are derived out of outers. But once again, I never tried it myself, and I've nothing to substantiate an assertion that there is no bug in that area. If I myself had the problem for my own needs, I would probably not fear using the Recode library, but that is surely no guarantee for others.

Writing this reply helps at shaking my memory, and something comes to my mind. I'm not even sure I'm right, as I thought about this quite a while ago. There are a few places in the code where pre-conditioning is computed on the fly at execution time. There are slight time windows in which the same pre-conditioning might be simultaneously computed by different threads. Both threads would then compute the exact same tables, so it is not important about which thread will finally write the pointer to the structure last, obliterating the same pointer from other threads. This might cause some memory to be spoiled. This might also induce a problem at cleanup time if there is any cleanup in such area, as I think there is no cleanup for preconditioning. To make this fully clean would require threading exclusions (or locks).

If you happen to know gettext machinery, which Recode uses here and there, but not in the library part, so far that I remember, there are similar problems. For each place where the gettext macro is expanded, the expansion contains a cache; gettext saves the translation on the first call, and uses the cached copy on subsequent calls. If two threads were using gettext simultaneously, two translations would occur, both yielding the same result, both caching them in the same cache, and one of the translation would be spoiled. (I may be wrong!)

In any case, if someone was reporting a lack of re-entrance somewhere, I would undoubtedly consider it as a bug, that I would happily correct. However, if a threading bug was building over some obscure area (I should rather say: one that I'm not aware of! ☺), requiring a deeper knowledge of internals for a few likely incompatible libraries, and asking for complex auto-configuration machinery, it would likely fall outside my competence to solve it.