Tutorial: Introduction to Control (French only)

I google Translated the original French article, which I use for teaching. I did not proofread this:

Over the years, I have developed a taste for the programming of “physical devices”. I like to control things that interact with the outside world: a microscope stage, a laser, an acquisition board, a camera, a printer, and so on. This taste has been transformed into expertise over the years, and several students come to see me (in my group, at Bliq and in the laboratory of information) with the taste to know more. It’s not always easy to transfer that knowledge, and that’s partly because of how I acquired it.

Indeed, my first contacts with the * hardware * came in the [Commodore-64] (https://en.wikipedia.org/wiki/Commodore_64) in 1983: the purchase of the computer at [Distribution to the Consumer ] (https://en.wikipedia.org/wiki/Distribution_to_consumers) was fine, but the subsequent purchase of a printer [Star NX-1000] (http://www.computerhistory.org/collections/catalog / 102645920) had suddenly multiplied the power of our machine, which otherwise only made drawings and * beeps * without really leaving any traces or change anything in the world around me. If we sent the right orders to the printer, she moved, she wrote, she drew. One day I was forced to pull out a screwdriver because the [joystick] (https://www.s-config.com/repairing-wico-retro-gaming-joysticks/) kept crashing because that we always played at the Olympics (jumping with obstacles asked to move the joystick from left to right without stopping as quickly as possible). I wanted to play, I did not have a joystick anymore because my sister was beating it too hard, I repaired it. Later, many of my friends and I learned to use the “[Copy-21-seconds]” (http://www.c64copyprotection.com/21-second-backup/), which was a hardware modification of the floppy disk that overrode the protection by sending the information read directly to the computer instead of letting the reader process it and block it. I had wires running past my disk drive. I did not understand anything about it, except that I could copy all the games I wanted. It was just as powerful as it was mysterious. I learned the assembly language on the C-64, partly thanks to an obscure book that my mother’s computer friend at the City of Quebec lent me, I discussed different things with other guys 12 years on the * BBS * of Quebec (the ancestor of the Internet), and I spent my evenings programming anything, no matter how: it was all wrong, but it was exciting. In the end, though, it worked. I was tripping.

When I started my PhD in physics at the University of Toronto in 1995, there was a course called * Microprocessor Interfacing Techniques *, given by the very experienced and passionate Jim Drummond. The goal was to show us how to interface the outside world with our computers. A dream class: we had the lectures filled with anecdotes of Prof. Drummond, then the laboratory filled with parts, chips, breadboards, 8088 Turbo PCs (nothing less) and acquisition cards. In addition, we had the * key * of the local to come at any time of day and night. So I finally learned about TTL logic, flip-flops, synchronous and asynchronous counters, scanning, analog output, how to read chip specification sheets, etc. The many bits of information gleaned left and right over the years ended up converging in a coherent whole: I managed to understand the smallest tiny details of a logical circuit while being able to make a sufficient abstraction into functional blocks to finally build a complete system.

With the benefit of 30 years of tapping computers, circuitry, firing fuses, breaking acquisition cards, skipping detectors, fixing * stepper motors * * drivers to graduate, or spending whole evening just to make to light an LED in a basic circuit, I realize that students who come to see me have not often had the chance * to experiment *. This is partly because computers are becoming more complicated, and several layers of complexity have been added for years: the processors are running parallel operations, the famous RS-232 printer or modem port has been replaced by the * Universal Serial Bus * port, and the operating systems, the memory protection, the preemptive multitasking, the security make that today, there is rarely a “memory box” that corresponds to pins on the back of the computer (this [that the C-64 had] (https://www.c64-wiki.com/wiki/User_Port)), and the exact order of the execution of the operations n ‘ is not always known (easily controlled with sys 49152 for example on the C-64, the prediction memory box for games). Thus, experimenting as a novice becomes more and more difficult because the walk is much higher than in 1983 when I started.

So I hope, with a series of small tutorials, to make a basic introduction to Device Control. This will obviously start with extremely simple tutorials for the initiated but which should allow you to acquire the knowledge to do the Control of Devices through a methodical experiment based on experimentation.

In the next article, we will begin with the very simple construction of a tiny chip-based circuit of FTDI DLP-USB245M to get, as simply as possible, access to * digital pins * output and Entrance.

(Français) Les expressions régulières

# Tutoriel

Les expressions régulières

Les expressions régulières permettent de reconnaître des patrons dans du texte et d’en extraire l’information. D’une curiosité de programmeur qui a pris racine avec awk et sed, mais surtout le langage Perl, elles sont maintenant standardisées et disponibles dans presque tous les langages de programmation. Il s’agit d’un outil puissant pour travailler avec toute forme de texte. Dans le cas du scientifique ou de l’ingénieur, je nomme les situations suivantes:

  • Traiter des séries de fichiers de façons générales
  • Isoler des dates

Par exemple: Vous voulez extraire le nom et prénom d’une personne dans le texte suivant:

Côté, Daniel

Vous voulez donc le mot avant la virgule, ensuite, après les espaces, l’autre mot. Vous pourriez lire les caractères un à un, mais qu’arrive-til si vous avez le nom suivant?

De Koninck, Yves

L’analyse peut devenir de plus en plus compliquée et tordue. Ainsi, plutôt que de lire les caractères un à un et de faire l’analyse, vous pouvez utiliser les expressions régulières qui ont été inventées justement pour décrire ce genre de patrons. Dans le cas présent, vous pourriez rapidement extraire le nom et prénom avec l’expression régulière suivante:

\s*(\S.+?),\s*(\S.*?)\s*

Les parenthèses dans les expression régulières représentent les matching groups. Dans notre cas, la première expression entre parenthèses est le nom, la deuxième le prénom, sans les espaces qui peuvent être présents ou non avant ou après le nom. Dans le premier cas, on aurait “Côté” et “Daniel”, alors qu’on aurait “De Koninck” et “Yves” dans le deuxième.

Le langage de base des expressions régulières

Dans leur forme la plus simple, une expression régulière est une suite de caractères avec un indicatif de répétition. Les parenthèses de capture permettent de garder le texte reconnu. On peut ensuite y référer d’une façon qui dépend de l’outil de programmation utilisé ($1, $2, … dans Perl, \1 \2, … dans la boite “Find” de TexWrangler, etc…).

Expression Signification Expression Signification
. N’importe quel caractère * 0 ou plusieurs fois
\s Espace blanc (ou tabulation) + 1 un plusieurs fois
\S Tout sauf un espace blanc ? 0 ou 1 fois
\d Un chiffre {n} n fois
\D Tout sauf un chiffre {n,m} entre n et m fois
^ Début de ligne *? 0 ou plusieurs fois, mais priorité au prochain patron
$ Fin de ligne () Parenthèses de capture
Lettre ou chiffre La lettre ou le chiffre (?:) Paranthèse de regroupement sans capture
\. Le point
\\ Le caractère \

Exemples d’expressions régulières

Objet recherché Expression
Un nom de fichier (.\*?)\\.(...)
Un nom de fichier avec le chemin complet (.\*?)/(.\*?)\\.(...)
Une date de la forme AAA-MM-JJ (\\d{4})-(\d\d)-(\d\d)
Un nom de fichier sous la forme fichier-XXX-YYY-ZZZ.tif ou XXX, YYY et ZZZ sont des chiffres fichier-(\\d{3})-(\\d{3})-(\\d{3})\\.tif{1,2}

Où trouve-t-on les regexps ?

MATLAB

Pour obtenir determiner si du texte coorespond a une expression

matchStr = regexp(filename, ’fichier-\d\d\d-\d\d\d-\d\d\d\.tif{1,2}’,'match')

matchStr aura chaque string qui correspond à l’expression. Pour extraire du texte avec les groupes de capture (i.e. les parenthèses), MATLAB a deux méthodes: par l’ordre ou par nom. Par l’ordre, on fait ceci:

[tokens,matches] = regexp(‘stack-001-002-003.tif’,stack-(\d\d\d)-(\d\d\d)-(\d\d\d)\.tif{1,2},’tokens’,’match’);

tokens{1} aura le premier groupe de capture et ainsi de suite (dans le cas ici: ‘001’, ‘002’, ‘003’), et matches{1} aura la chaine de caractères qui a correspondu en premier (dans le cas ici la chaine au complet), ensuite matches{2} aurait la deuxième s’il y a lieu, etc… L’autre méthode fait appel aux “named tokens”. Ce n’est pas standard regexp, mais MATLAB le fait ainsi:

expressionRegexp = ‘(?\d+)/(?\d+)/(?\d+)’

str = '01/11/2000 20-02-2020 03/30/2000 16-04-2020';

expression = ['(?\d+)/(?\d+)/(?\d+)|(?\d+)-(?\d+)-(?\d+)'];

tokenNames = regexp(str,expression,’names');

MATLAB retournera un array de structures avec chaque element de la structure identifié par month, day ou year:tokenNames(1).month. Plus d’information, tapez dans la fenêtre de commande de MATLAB:doc regexp

Les editeurs de texte

La boite Find de BBEdit/TextWrangler/SublimteText/Emacs, permettent de trouver du texte avec des expressions régulières, mais aussi de le remplacer. Par exemple, avec TextWrangler, changer les commentaires dans du texte de C++ à C. Chaque groupe de capture peut être utiliser dans la boîte de remplacement avec \1, \2, \3 etc…:

textWrangler

Python

Python supporte les expressions régulières. On les utilise comme suit pour extraire les valeurs numériques dans une table de deux colonnes dans un fichier Markdown (par exemple:| 2.0 | 4.0 | mais aussi | .02 | 0.01 |):

matchObj = re.match( "\\|\s*(\.?\d+\.?\d*)\s*\\|\s*(\.?\d+\.?\d*)\s*", line)
if matchObj:
value = float(matchObj.group(1))
x.append(value)
value = float(matchObj.group(2))
y.append(value)
continue

Perl

Perl est bâti autour des expressions régulières. On les utilise comme suit:

if ( $text =~ /(?:+1)?\d{3}?\s*(\d{3}-?\d{4})/ ) {
print “Your phone number without area code is $1”;
}

Plus d’information, tapez dans un terminal Unix: perldoc perlre

Cocoa (iOS ou macOS)

Il existe une classe NSRegularExpression pour faire la reconnaissance de texte. Pour plus d’information, NSRegularExpression dans XCode.

Javascript

Les expressions regulières sont supportés directement dans le langage Javascript. Pour plus d’information: <http://www.w3schools.com/jsref/jsref_obj_regexp.asp>

Mot de la fin

Les expressions régulières sont puissantes et permettent de rapidement vous concentrer sur votre tâche plutôt que de gérer les mondanités ennuyantes des nomenclatures de fichiers, ou les détails d’un texte.

Pour encore plus d’information, “regular expression” dans Google avec le nom de votre langage de choix.

Congratulations Damon DePaoli

Damon received the “Best Overall Poster Presentation” award at the Canadian Neuromodulation Society 10th Annual Scientific Meeting that was held on February 4-6, 2018 in Whistler, British Columbia. The title of his poster : Fiber-based tissue identification for electrode placement in deep brain stimulation neurosurgery.

 

Daniel Côté's laboratory at Neurophotonics Center, Centre de Recherche de l'Institut Universitaire en Santé Mentale de Québec