Compare commits

...

66 Commits

Author SHA1 Message Date
tTh
e823f5d883 new bug nest 2024-11-12 08:46:37 +01:00
tTh
00db540bbc oups !!! 2024-11-06 14:29:53 +01:00
tTh
470327b596 vive le monde moderne 2024-11-06 14:28:45 +01:00
tTh
6790bb95ab cosmetic 2024-10-24 10:46:01 +02:00
tTh
e27ac13e68 a new little tool 2024-10-16 21:44:18 +02:00
tTh
e298d6ca5d add magick trick 2024-10-11 20:09:03 +02:00
tTh
b776f3de8d cosmetic 2024-10-02 14:24:35 +02:00
tTh
ac1afb5a88 add a trick 2024-09-29 23:57:24 +02:00
tTh
a1c0fddd17 the caturday's really big commit 2024-09-28 20:25:02 +02:00
tTh
dfede4a816 retired section 2024-09-26 00:57:56 +02:00
tTh
784b2d04aa and now, with working code 2024-09-23 20:53:00 +02:00
tTh
435b3195d2 working on roff 2024-09-23 19:32:56 +02:00
tTh
dfdfa7926e cosmetic 2024-09-22 16:51:49 +02:00
tTh
6fad79d67c typo 2024-09-22 16:50:49 +02:00
tTh
9c602777aa + minitroll 2024-09-21 21:36:24 +02:00
tTh
a1f7d1e0f2 ready for paper print ? 2024-09-17 19:03:54 +02:00
tTh
2dd4896b6c add another empty section 2024-09-17 19:03:19 +02:00
tTh
b252bf73a2 bla 2024-09-17 19:02:40 +02:00
tTh
7ed54fc123 more bla 2024-09-17 18:59:10 +02:00
tTh
48b66b3034 more tricks 2024-09-17 18:58:33 +02:00
tTh
2bb29f37e3 greeting tetalab 2024-09-17 18:57:52 +02:00
tTh
b67ce482bf a new empty section 2024-09-17 18:57:20 +02:00
tTh
b98ae9d629 empty chapter 2024-09-17 18:55:56 +02:00
tTh
615289b57e functions demonstartor 2024-09-17 18:55:04 +02:00
tTh
02054433b4 talking about awk 2024-09-17 18:53:54 +02:00
tTh
5723a754a8 bla about UVC 2024-09-17 18:53:09 +02:00
tTh
7e591fc958 add io related text 2024-09-17 18:52:17 +02:00
tTh
3bda7ea69b hide empty chapters 2024-09-17 17:53:46 +02:00
tTh
a1b0ffdabb virer un résidu 2024-09-17 15:51:05 +02:00
tTh
16e1d7707a typo 2024-09-17 11:39:30 +02:00
tTh
716345e270 add a feature 2024-09-17 11:23:05 +02:00
tTh
a1df488c58 cosmetic 2024-09-16 14:31:42 +02:00
tTh
9f129f64d9 no border on listings 2024-09-16 03:50:09 +02:00
tTh
d96238bca4 add SDL2 stuff 2024-09-16 03:26:04 +02:00
tTh
3ea16fbbc8 add some stuff 2024-09-16 03:24:26 +02:00
tTh
f7d11b4178 cosmetic 2024-09-16 03:22:22 +02:00
tTh
28933d542c finished the first awk example 2024-09-16 03:21:41 +02:00
tTh
0ee9005885 + chapitre dessin 2024-09-15 09:38:20 +02:00
tTh
eda5044c35 what is libwebcam ? 2024-09-11 17:25:44 +02:00
tTh
0b3e6d1517 moved source files 2024-09-11 17:22:01 +02:00
tTh
7ee4eb0930 patch on Makefiles 2024-09-10 23:00:32 +02:00
tTh
57973a0bc7 oups... 2024-09-10 14:38:41 +02:00
tTh
f35170113d moving files to a right place 2024-09-10 14:35:26 +02:00
tTh
61286736e3 put files in the right place 2024-09-10 14:27:37 +02:00
tTh
19e3db36ed updating the bug 2024-09-10 12:01:00 +02:00
tTh
3fc33f10ea strangebug.c 2024-09-10 11:38:00 +02:00
tTh
f15aad0c2e découverte de SDL2 2024-09-07 15:36:26 +02:00
tTh
3bd50b2ab5 dessin : un nouveau chapitre 2024-09-05 20:16:19 +02:00
tTh
a83761fea8 add chapter label 2024-09-05 00:52:25 +02:00
tTh
7abf55e44b fine tuning 2024-08-27 10:55:32 +02:00
tTh
1e175bc6ef pimp my plotting 2024-08-19 15:40:56 +02:00
tTh
0707c0192c + lscpu 2024-08-17 10:02:59 +02:00
tTh
13e00baba5 cosmetic 2024-08-17 10:02:17 +02:00
tTh
6aaf9de226 bla + trick 2024-08-17 10:01:32 +02:00
tTh
078d3d6b3a more garbage from op-code field 2024-08-08 16:29:03 +02:00
tTh
97f3cb336d cosmetic 2024-08-08 16:20:27 +02:00
tTh
ae2f0d965e cosmetic 2024-08-08 16:11:05 +02:00
tTh
0480a7a73f add envp pointer from main code 2024-08-08 16:05:30 +02:00
tTh
4b438e7f7a add use_envp 2024-08-08 15:48:54 +02:00
tTh
98334bd25e cosmetic 2024-08-08 15:41:04 +02:00
tTh
f00a06b0c7 more bla 2024-08-08 15:33:18 +02:00
tTh
f3289fc23c very little cosmetic change 2024-08-08 15:30:14 +02:00
tTh
f08879204f corrected an index 2024-08-08 15:29:05 +02:00
tTh
717006e34a add opendmx , cosmetic 2024-08-08 15:28:22 +02:00
tTh
1541deeff0 cosmetic 2024-08-08 15:26:53 +02:00
tTh
48beb52b14 add OpenDMX from Enttec 2024-08-08 15:25:43 +02:00
90 changed files with 1666 additions and 449 deletions

View File

@@ -4,4 +4,4 @@ Astuces diverses pour utiliser un ordinateur sous Linux...
Un travail à l'évolution (trop) lente.
* http://la.buvette.org/devel/docs/tetatricks.pdf
`pdfbook2 tetatricks.pdf --paper=a4paper --short-edge --no-crop`

View File

@@ -57,11 +57,35 @@ mais canonique~:
\lstinputlisting{code/Basic/bywater-1.bas}
Ce qui nous donne à l'exécution~:
\begin{verbatim}
tth@redlady:~/Devel/TetaTricks$ bwbasic code/Basic/bywater-1.bas
Bywater BASIC Interpreter/Shell, version 2.20 patch level 2
Copyright (c) 1993, Ted A. Campbell
Copyright (c) 1995-1997, Jon B. Volkoff
2 4
3 9
4 16
5 25
tth@redlady:~/Devel/TetaTricks$
\end{verbatim}
Première conclusion : affaire à suivre.
% ====================================================================
\section{Yabasic} \index{yabasic}
\begin{quote}
Yabasic implements the most common and simple elements of the BASIC
language; it comes with for-loops and goto with while-loops and
procedures. yabasic does monochrome line graphics, and printing
comes with no extra effort. yabasic runs under Unix and Windows;
it is small (less than 200 KB) and free.
\end{quote}
Première innovation, les numéros de ligne ne sont plus obligatoires.
\lstinputlisting{code/Basic/yabasic-1.bas}

View File

@@ -26,7 +26,7 @@ Ces paramètres sont fournis par des mécanismes planquées
dans la soute du système d'exploitation, et n'ont pas
d'importance pour le moment..
\lstinputlisting[language=c]{code/hello.c}
\lstinputlisting[language=c]{code/C/hello.c}
Un fois passé l'entrée, nous sommes dans la partie active.
Nous appelons à ce moment une fonction de la bibliothèque
@@ -53,7 +53,7 @@ un tableau de chaines de caractères contenant ces différents mots.
Ce petit bout de code va nous afficher tout ça~:
\lstinputlisting[language=c]{code/arguments.c}
\lstinputlisting[language=c]{code/C/arguments.c}
Et voici un exemple d'exécution depuis un shell~:\index{shell}
@@ -75,6 +75,14 @@ En C, les tableaux commencent toujours à l'indice 0.
Pour le traitement des options, il faut sauter à
la page \pageref{getopt}.
. . .
\begin{verbatim}
if (config->optind < config->argc)
for (int i = config->optind; i < config.argc; ++i)
process(config->argv[i]);
\end{verbatim}
% =========================================================
\section{Les variables}
@@ -624,7 +632,7 @@ et un exemple simple d'utilisation.
\section{Analyser une ligne de texte} \index{parser}
Nous désirons implémenter une interface en ligne de commande
(aka CLI\index{CLI}) pour un enchainement simple d'intructions
(aka CLI\index{cli}) pour un enchainement simple d'intructions
assez semblables. On peut aussi voir ça comme la création
d'un \textsl{domain specific language} (aka DSL\index{DSL}).

View File

@@ -7,8 +7,8 @@ D'après Wikipédia :
\begin{quote}
Le DMX512 (Digital Multiplexing) est une norme de transmission de données
utilisée pour le contrôle de l'éclairage et des effets de scène dans le spectacle
vivant.
utilisée pour le contrôle de l'éclairage et des effets de scène dans le
spectacle vivant.
Le protocole DMX512 (qui utilise généralement une liaison
suivant la norme EIA RS 485 et cadencée à 250 kb/s) permet
@@ -26,13 +26,39 @@ appelée une « trame » DMX).
https://ryderdamen.com/blog/enttec-open-dmx-on-linux/
% -----------------------------------------------------
\section{Enttec OpenDMX}
\section{Enttec OpenDMX} \index{OpenDMX} \label{OpenDMX}
D'après le constructeur :
\textsl{
The OPEN DMX USB is a DMX widget used to output
DMX from a computer. Simply connect it using its
USB 2.0 Type B port and launch your compatible
software.
The OPEN DMX USB is discovered as a USB Serial
Device or virtual COM Port dependent on the FTDI
driver installed on your system.
The Open DMX USBs output is processed directly on
the computers processor.
}
Nous allon voir ce qu'il en est exactement.
Après branchement, essayons d'identifier cette interface.
\begin{verbatim}
Bus 001 Device 027: ID 0403:6001
Future Technology Devices International, Ltd FT232 Serial (UART) IC
\end{verbatim}
\begin{verbatim}
SUBSYSTEM=="tty" ATTRS{idVendor}=="0403"
ATTRS{idProduct}=="6001" SYMLINK+="phytotron"
\end{verbatim}
Le tout sur une ligne et dans le fichier
\texttt{/etc/udev/rules.d/70-emttec-opendmx.rules}.
En général une erreur de syntaxe apparait dans
\textit{varlogmessage}.
look at \texttt{tcsendbreak} !
% -----------------------------------------------------

View File

@@ -11,6 +11,10 @@ service à partir de son nom. Un énorme progrès comparé à la
maintenance du fichier \texttt{/etc/hosts} qu'il fallait,
à la vieille époque, télécharger toutes les nuits\dots
Par contre, « \textit{C'est encore de la faute du DNS} »
est devenu, ces dernières années, une excuse crédible.
Il y a de nombreuses raisons qui justifient cette remarque.
% ------------------------------------------------------------
\section{Outils de base}

View File

@@ -175,9 +175,10 @@ XXX\index{XXX}
Pour faire simple, on accède à chaque unité de donnée l'une après l'autre,
comme quand on déroule une bande 6250bpi. Ces unités peuvent être
(restons simple pour commencer) des lignes entières de texte.
Dans l'ancien temps\footnote{F77 rulz the world}, le format de ces
lignes devait être précisement structure, avec des largeurs de champs
fixés.
Dans l'ancien temps\footnote{F66 rulz the world} des cartes
à trous, le format de ces
lignes devait être précisement structurées, avec des largeurs de champs
dans la ligne fixés.
% --------------------------------------------------------
@@ -186,7 +187,51 @@ fixés.
XXX\index{XXX}
C'est pas pareil : d'abord les enregistrements sont tous de la même
taille
taille. Ensuite, on y accède par son rang, son numéro d'ordre dans le
fichier. Dès que j'ai fini de planter les deux arbres en attente,
je vous propose un exemple simple et aussi artificiel que les
autres exemples de ce ouvrage.
% --------------------------------------------------------
\section{Read et Write}
Ces deux opérations (la lecture et l'écriture) sont contrôlables
par plusieurs choses~: les paramètres à l'ouverture,
du fichier, à XXX\index{XXX},
et surtout les chaines de format.
Bienvenue dans le monde du légendaire champ "Hollerith".
\subsection{Les chaines de format}
%
% attention, il y a un hack pour l'affichage du mot "format" !
% Attention, dans "{\small{\textsc{format}}}", les accolades
% exterieures sont indispensables. Affaire à suivre...
%
La chaine de {\small{\textsc{format}}} contrôle la façon dont les
données (nombres, textes ou booleans)
seront présentées à l'affiche ou à l'impression.
Une bonne connaissance, et une longue pratique des chaines de
{\small{\textsc{format}}} est
indispendable pour arriver à l'harmonie ultime bien que rigoureuse,
de vos interminables listings de chiffres abscons.
Nous verrons ensuite comment les utiliser pour faire de la saisie
presque (mais pas complètement) utilisable en milieu
\textsl{enduser}\index{enduser}.
Il y a deux manières de les utiliser~: en ligne de l'instruction
d'écriture/lecture, ou séparément en tant que chaine de caractères.
Pour la clarté de lecture, c'est la seconde que je vais utiliser.
%
%
%
% INSERT BIG "TODO" HERE.
%
%
\lstinputlisting{code/fortran/printty.f90}
% --------------------------------------------------------
@@ -216,7 +261,7 @@ end module
Rien de bien compliqué~:
Un module peut être vu comme une boite qui contient (\texttt{contains})
des procédures (\texttt{function} ou \texttt{subroutine},
des procédures (\texttt{function} ou \texttt{subroutine}),
et qui sera utilisé avec ce genre de petit programme~:
\begin{lstlisting}
@@ -228,9 +273,17 @@ program t
end program
\end{lstlisting}
La première ligne, \texttt{use dummy}, permet d'accéder aux fonctions disponibles
dans le module dummy.
Elle doit être suivie d'un \texttt{implicit none}, pour une raison à éclaircir.
Et ensuite nous pouvons appeler notre procédure.
Mais les modules permettent de faire bien d'autre choses.
% --------------------------------------------------------
\section{Random et Aléa}
Tentative de sranding faite à la rache.
La dernière ligne va vous étonner.
\begin{lstlisting}
@@ -246,15 +299,22 @@ La dernière ligne va vous étonner.
dummy = rand()
\end{lstlisting}
Mais il y a d'autres manières plus rigoureuses d'utiliser les nombres
pseudo-aléàtoires avec le fortan moderne.
% --------------------------------------------------------
% new Thu 24 Nov 2022 02:27:05 AM CET
\section{Options de gfortran} \index{gfortran}
Comme d'habitude avec gcc\footnote{The Gnu Compiler Collection}, les
Comme d'habitude avec gcc\footnote{Giant Complicated Compilords}, les
options sont innombrables. J'ai essayé d'en dégager les plus importantes,
mais ce ne sont probablement pas les seules.
Pour commencer, la plus obligatoire de toutes ces options est sans contexte
le protecteur de base \texttt{-Wall} qui vous protégera de nombreux
maléfices.
% --------------------------------------------------------
\section{Images}
@@ -339,7 +399,7 @@ immédiatement garnir de données pertinentes~:
\end{verbatim}
Une fois en possession de ces données conceptuelles, que l'on peut
aisément voire comme un cheminement, nous allons demander
aisément voir comme un cheminement, nous allons demander
au crayon de se promener sur notre feuille virtuelle en suivant
ce chemin, et enfin de s'arreter de dessiner~:

View File

@@ -63,6 +63,10 @@ Vous voilà prévenus, la suite bientôt\dots
% ================================================================
\section{Les sockets Unix} \index{socket}
Les sockets de la famille AF\_UNIX sont utilisés pour
les communications locales entre applications sur une même machine.
% ================================================================

View File

@@ -1,7 +1,15 @@
\chapter{Open Sound Control}
\index{OSC} \label{chap:OSC}
Wikipedia :
Pour moi c'est une façon simple et élégante de faire discuter des
ordinateurs et je ne dis pas ça parce que j'ai déja pas mal
joué\footnote{https://git.tetalab.org/tTh/gadgets-OSC} avec,
mais parce c'est probablement vrai\dots
% ================================================================
\section{C'est quoi ?}
D'après Wikipedia :
\textsl{OSC est un format de transmission de données entre ordinateurs,
synthétiseurs, robots ou tout autre matériel ou logiciel compatible,
conçu pour le contrôle en temps réel.
@@ -10,11 +18,20 @@ des protocoles UDP\index{UDP} ou TCP\index{TCP} et apporte des
améliorations en termes de rapidité et de flexibilité par rapport
à l'ancienne norme MIDI\index{MIDI}\dots}
% ================================================================
\section{Programmation}
Actuellement, j'utilise (pour le C) \texttt{liblo}\index{liblo}
qui reste simple
à utiliser tout en permettant de descendre à un bas niveau.
Cette bibliothèque est livrée avec deux outils que nous
allons voir maintenant.
qui reste simple à utiliser
tout en permettant de descendre à un bas niveau.
Elle fonctionne sur un modèle asynchrone
(ce qui peut poser des soucis selon le contexte d'utilisation)
et de bonnes possibilités de filtrage selon certains critères.
Cette bibliothèque est livrée avec deux outils de test/debug que nous
allons voir maintenant, et que je vous encourage à apprivoiser.
% ================================================================
@@ -23,28 +40,51 @@ allons voir maintenant.
\textbf{Envoyer :}
Pour envoyer, il faut bien définir une destination. Une fois
de plus, le couple IP adresse/port est utilisé. Ce sont les
deux premiers paramètres.
Pour envoyer des données, il faut bien définir une destination. Une fois
de plus, le triplet IP adresse/port/chemin est utilisé.
Ce sont les trois premiers paramètres de la commande~:
\begin{verbatim}
tth@debian:~$ oscsend localhost 1664 /tmp/kmem is 61 'meg, efface !'
tth@debian:~$
tth@debian:~$ oscsend localhost 1664 /tmp/kmem 'is' 61 'meg, efface !'
\end{verbatim}
La chaine \texttt{is} que vous voyez dans la ligne de commande
décrit le type des paramètres qui suivent~:
\texttt{i} est pour un integer et \texttt{s} pour une
chaine (notez les simples quotes pour passer les caractères
speciaux du shell).
chaine de caractères
(notez les simples quotes autour du texte pour passer les
caractères speciaux du shell, comme l'espace).
Il existe d'autres types de paramètres que nous verrons plus loin.
\vspace{1em} \textbf{Écouter :}
C'est beaucoup plus simple, il suffit de donner le numéro
de port UDP sur lequel nous allons écouter.
L'option \texttt{-L} est utile si vous voulez exploiter
la sortie de oscdump,
par exemple avec "\texttt{oscdump 9000 | cat -n}" pour numéroter
les évènements reçus.
\textbf{Ecouter :}
\begin{verbatim}
tth@debian:~$ oscdump 1664
/tmp/kmem is 61 "meg, efface !"
^C
tth@debian:~$
\end{verbatim}
Pour descendre plus bas dans la pile, on pourra efficacement utiliser
un \textsl{dumper} de messages UDP qui nous montrera le cœur des trames.
Voici ce que l'on voit de l'envoi décrit page \pageref{sendosc}~:
\begin{verbatim}
udp_dumper: listen on port 9000
---+ frame 0 32 bytes t= 6.179 sec.
0 | 2f 64 65 6d 6f 00 00 00 2c 69 73 00 00 00 00 3d | /demo...,is....= |
16 | 6d 65 67 2c 20 65 66 66 61 63 65 20 21 00 00 00 | meg, efface !... |
32 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................ |
\end{verbatim}
On y retrouve certaines des choses le chemin, la liste des types,
le contenu des messages, toutes choses qui seront
décrites en détail dans la page \pageref{trameosc}.
% ================================================================
\section{Exemple de code}
@@ -58,19 +98,26 @@ utilise un thread d'écoute qui appelle des
\textsl{callbacks} préalablement "accrochés",
\textsl{hooked} en vrai langue.
\lstinputlisting[language=c]{code/listen-osc.c}
\lstinputlisting[language=c]{code/OSC/listen-osc.c}
\textbf{Envoyer :}
\textbf{Envoyer :} \label{sendosc}
Cette partie là est beaucoup plus simple.
\lstinputlisting[language=c]{code/send-osc.c}
\lstinputlisting[language=c]{code/OSC/send-osc.c}
J'avoue ne pas encore savoir ce que veut bien dire la
valeur de retour.
% ================================================================
\section{La trame OSC} \label{trameosc}
\textsf{Après tout, ce ne sont que quelques octets.}
% ================================================================
\section{En Perl} \index{Perl}
\begin{verbatim}
@@ -86,9 +133,9 @@ $client->send(['/proc/kcore', 'i', 61, 's', "bla"]);
% ================================================================
% nouveau: Sat Jul 15 07:14:10 UTC 2023
\section{Le routage}
% \section{Le routage}
WIP...\index{XXX}
% WIP...\index{XXX}
% ================================================================
@@ -99,6 +146,10 @@ Beaucoup d'autres logiciels peuvent être controlés par OSC, ou
générer des trames OSC : on peut citer
Processing\index{processing},
Chuck\index{Chuck} (page \pageref{chuck-osc}),
Puredata\index{puredata}.
Certains prétendent même qu'un vieux néo-rural tente de
faire un \textsl{binding} pour le
Fortran\index{fortran} moderne.
\dots
% ================================================================

View File

@@ -11,18 +11,78 @@ Il est de ce fait très orienté vers la manipulation de
données textuelles et contient d'énormes facilités d'utilisation
des expressions régulières.
Il fut un temps, dans le siècle précédent, où il était le maitre
Il fut un temps béni, dans le siècle précédent, où il était le maitre
incontesté du Web\index{web} interactif, de par son intégration
dans le serveur Apache\index{Apache},
et de modules d'écriture de clients http\index{http}.
dans le serveur Apache\index{Apache}
(les fameux scripts \textsc{cgi}\index{cgi}),
et de modules d'écriture de clients http\index{http}
(page \pageref{perlhttp}).
Mais ce temps est-il révolu ? Nous le verrons dans un
prochain épisode.
Le débutant peut facilement n'utiliser qu'un sous-ensemble du langage,
mais ce serait se priver de quelques \textit{patterns} assez
mais ce serait se priver de quelques \textit{design patterns} assez
efficients.
% ------------------------------------------------------
\section{Le texte}
\section{Perl, le départ}
La méthode shebang. Tout le monde connait maintenant le shebang,
ce n'est pas la peine de radoter dessus.
On va donc commencer par le premier exemple, puis enchainer
sur les petits trucs à savoir, en mode « recette à la rache ».
\begin{verbatim}
#!/usr/bin/perl
print "hello world"
\end{verbatim}
La méthode purecli.
\begin{verbatim}
tth@redlady:~ $ echo "print \"hello world\n\";" | perl
hello world
\end{verbatim}
% ------------------------------------------------------
\section{Modèle d'exécution}
% ------------------------------------------------------
\section{Les variables}
Auto-vivification.
% ------------------------------------------------------
\section{Gestion des modules} \index{CPAN}
Tout comme pour le Fortan Moderne, c'est une notion essentielle.
Un exemple très simple, le module Dummy\index{dummy}.
% ------------------------------------------------------
\label{perlhttp}
\section{Le \texttt{http}} \index{http} \index{protocole}
HTTP (Hyper Text Transfert Protocole) est le protocole qui
est à la base du bien connu
\textsl{World Wide Web}
la chose que les gens appelent faussement l'internet.
\index{www}\index{gafam}
L'écosystème Perl est bien équipé pour
agir dans ce monde là.
% Scrapping de la patate en vue !
% https://al.smeuh.org/cgi-bin/express.pritz
% ------------------------------------------------------
\section{Traiter du texte}
Un cas concret~: générer du code en langage \texttt{C} à partir
d'un fichier traité ligne par ligne. Chacune de ces lignes est
@@ -51,21 +111,10 @@ la ligne de commande feront l'affaire.
% ------------------------------------------------------
\section{Gestion des modules} \index{CPAN}
Tout comme pour le Fortan Moderne, c'est une notion essentielle.
% ------------------------------------------------------
\section{Le \texttt{http}}
Scrapping de la patate en vue !
https://al.smeuh.org/cgi-bin/express.pritz
% ------------------------------------------------------
\section {Et en vrai ?}
Quels logiciels sont écrits en Perl ?
\texttt{exiftool - Read and write meta information in files} \index{exiftool}
% ------------------------------------------------------

View File

@@ -9,13 +9,19 @@ gens faire du code en Python,
certains même font de choses très avancées.
Et beaucoup de ces gens essayent de me convaincre que c'est
un langage vraiment trop bien, trop moderne, trop dans la
\textit{vibe} du devops, battery included, toussa.
\textit{vibe} du devops\index{devops}, battery included, toussa.
Quelques uns d'entre eux vont même jusqu'à me parler d'un
certain \textbf{canard} qui faciliterait bien la vie
des preogrammeurs.
Je ne suis pas convaincu.
Parce qu'un langage où, si tu remplaces un caractère \textbf{invisible}
par un autre caractère tout aussi \textbf{invisible}, le programme
ne marche plus, je trouve ça un peu craignos.
Bien entendu, certains vont te dire~: « configurer l'éditeur, gna, gna. »
mais bon, être dépendant de la conf' d'un éditeur pour que les
choses fonctionnent, c'est un peu limite.
\section{Mais quand même...}
@@ -28,3 +34,19 @@ Je ne suis pas convaincu.
\end{figure}
\section{Quelques trucs}
On souhaite parfois partager rapidement quelques fichiers sur
le réseau local. Avec une de batteries incluses, c'est facile.
À l'ancienne :
\begin{verbatim}
$ python -m SimpleHTTPServer 9000
\end{verbatim}
Et maintenant :
\begin{verbatim}
$ python3 -m http.server 9000
\end{verbatim}

View File

@@ -9,7 +9,7 @@
Je n'ai certainement pas la prétention de vous enseigner
les arcanes du \textsl{R project},
je suis (octobre 2023) en pleine périoe de découverte.
je suis (octobre 2023) en pleine période de découverte.
Mais j'ai déja un projet concret en tête, et ce chapitre sera,
dans un premier temps, composé de mes notes de voyage.
@@ -29,7 +29,8 @@ Le caractère \texttt{>} est le prompt de R, il vous invite à taper
des commandes afin qu'il vous explique le sens de la vie.
On peut définir des variables, leur donner une valeur et faire des calculs
avec ces variables,
ce qui est bien suffisant pour commencer. Démonstration~:
ce qui est bien suffisant pour commencer.
Une rapide démonstration~:
\begin{verbatim}
> a <- 22
@@ -96,7 +97,7 @@ La magie du shebang\index{shebang}
Nous disposons d'un fichier SSV
(Space Separated Values)\footnote{C'est nouveau, ça vient de sortir.}
provenant d'un système optico-numérique bi-dimensionnel multi-planaire
(aka Webcam\index{Webcam}).
(aka Webcam\index{webcam}).
Et nous voulons en tirer quelques chiffres et graphiques bien
clinquants,
par exemple les éventuels rapports entre le rouge et le bleu.
@@ -226,6 +227,7 @@ vers \LaTeX, peut-on faire de la 3D\index{3D}, \dots
hist(datas\$V3, breaks=50)
% ======================================================================
\section{Interface avec l'OS}

View File

@@ -47,7 +47,7 @@ Une machine connectée en wifi sur une friboite\footnote{ou le
Cisco sauvage de la salle d'AG, hein, mais ça ne sera
pas le même nameserver.} peut facilement
faire translateur d'adresse pour un réseau branché sur
son eth, à condition de connaitre les
son \texttt{eth}, à condition de connaitre les
incantations magiques
(qui sont ici très linuxisantes) :
@@ -58,7 +58,7 @@ modprobe iptable_nat
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
\end{verbatim}
Ensuite sur les machines du lan, donc le coté ethernet,
Ensuite sur les machines du lan, donc le coté Ethernet,
il faut incanter ce genre de trucs :
\begin{verbatim}

View File

@@ -129,14 +129,16 @@ C'est simple, non ?
%-------------------------------------------------------------------
\section{Le Windowmanager}
\section{Le WindowManager}
Aka \textbf{WM}.
Aka \textbf{WM}\index{WM}.
%
% https://jichu4n.com/posts/how-x-window-managers-work-and-how-to-write-one-part-i/
%
Twm, Fvwm, Mwm... nous avons le choix.
%-------------------------------------------------------------------
\section{XCB}\index{XCB}

View File

@@ -7,17 +7,22 @@
% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
\section{sqlite} \index{sqlite}
Avantages : un produit éprouvé depuis longtemps, toutes
les données placées dans un fichier unique facilement
transportable, vraiment multi-plateforme.
% ----------------------------------------------------------------
\subsection{CLI} \index{cli}
Commandes internes:
Commandes internes (\textsl{meta-commands})~:
Utilisez \textbf{.help} en premier secours !
% ----------------------------------------------------------------
\subsection{Libreoffice} \index{Libreoffice}
Il peut utiliser des bases en SQLite.
% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
@@ -31,33 +36,23 @@ Gnu DBM permet de stocker des paires clef/valeur dans un fichier
de données. Chacune de ces clefs doit être unique, et doit être
liée avec une seule valeur\footnote{Peut-on alors parler
de bijection relationnelle ?}.
On peut appeler ça une table associative,
ou en anglais une \textsl{hashtable},
un terme qui rappelle le principe sous-jacent.
% ----------------------------------------------------------------
\subsection{Exemple en Perl} \index{Perl}
\begin{verbatim}
#!/usr/bin/perl -w
Nous allons extraire une donnée du fichier \texttt{/etc/passwd}
et la stocker en utilisant le nom du \textsl{yuser}
comme clef d'accès.
Une tâche pour laquelle Perl est optimal\footnote{krkrkr}
grâce au mécanisme du \texttt{tie} que je songe à
expliquer\footnote{un de ces jours...} dans le chapitre approprié
vers la page \pageref{chap:Perl}.
use strict;
use GDBM_File;
my $nomdb = "exemple.gdbm";
my (%DB, @champs);
my ($user, $gecos);
open(SOURCE, "< /etc/passwd") or die "source $!";
tie(%DB, "GDBM_File", $nomdb, GDBM_WRCREAT, 0666) or die "gdbm $!";
while (<SOURCE>) {
@champs = split ":", $_;
$user = $champs[0]."\0";
$gecos = $champs[4]."\0";
$DB{$user} = $gecos;
}
untie %DB;
close SOURCE;
0;
\end{verbatim}
\lstinputlisting[language=perl]{code/bdd/mkgdbm.pl}
Vous remarquerez que pour cet exemple, nous avons clef et valeur qui
sont du texte. Alors que DBM est prévu pour stocker des blocs de
@@ -65,6 +60,11 @@ binaire. Pour faciliter la récupération de ces chaines de caractères
par un hypothétique\footnote{Oui, je vais l'écrire bientôt.} programme
en C, le programme Perl rajoute un \texttt{'\textbackslash0'}
(fin de chaine) aux deux champs concernés.
% ----------------------------------------------------------------
\subsection{Exemple en C} \index{C}
XXX \index{XXX}
% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
@@ -76,4 +76,6 @@ Le poids lourd du domaine.
\section{Et le "NoSQL" ?} \index{nosql} \index{troll}
Pour parler de ça, je préfère attendre Vendredi.
% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

View File

@@ -122,7 +122,7 @@ Comme vous le savez tous, un appel système
est \textbf{le} moyen de communication qu'utilise un process
utilisateur pôur demander un service au noyau.
\lstinputlisting[language=C]{code/hello.c}
\lstinputlisting[language=C]{code/C/hello.c}
Un exemple canonique, n'est-il pas ? Ce bout de code affichant
quelque chose à l'écran, il doit bien y avoir un appel au noyau
@@ -196,7 +196,14 @@ Tue Oct 17 08:55:01 CEST 2023
tth@redlady:~$
\end{verbatim}
Simple et efficace.
Simple et efficace. \textbf{Mais\dots}
Mais ça ne marche pas à tous les coups comme vous le montre
clairement cet exemple. L'utilisation de la fonction
\texttt{getenv(3)} est très facilement contournable.
\lstinputlisting[language=C]{code/C/use_envp.c}
% ==============================================================

12
chap/dessin.tex Normal file
View File

@@ -0,0 +1,12 @@
\chapter{Dessiner}
\label{chap:dessin}
%
% new: Thu Sep 5 18:14:20 UTC 2024
%
% =======================================================================
\section{xpaint} \index{xpaint}
% =======================================================================

View File

@@ -1,13 +1,13 @@
% ==============================================================
% TRUCS DE VIEUX
\chapter{trucs de dino}
\chapter{Trucs de dino}
\label{chap:dino}
Je vais, dans ce chapitre, parler de choses que les moins de vingt
ans ne peuvent pas connaitre. Des choses qui existaient
\textsl{bien avant} le Web\index{www}, et pour lesquelles on
peur facilement imaginer des usages alternatifs et amusants !
peut facilement imaginer des usages alternatifs et amusants !
% ==============================================================
@@ -17,12 +17,15 @@ peur facilement imaginer des usages alternatifs et amusants !
Aussi connu sous le nom de « superserveur Internet », ce démon
a fait ses premiers pas dans l'Unix 4.3BSD
et depuis est maintenant remplacé par
\texttt{xinetd}\index{xinetd}, décrit en page \pageref{xinetd}.
\texttt{xinetd}\index{xinetd}, décrit en page \pageref{xinetd},
lequel a peut-être été déja supplanté par un truc qui est
\textit{plus nouveau}.
% --> https://0pointer.de/blog/projects/inetd.html
Inetd a pour but de gérer l'accès à des services réseaux,
qui peuvent être internes ou externes. Un service interne
est entièrement géré par Inetd : on y trouve par exempme
daytime qui permet de connaitre l'heure qu'il est à
est entièrement géré par Inetd : on y trouve par exemple
\textsl{daytime} qui permet de connaitre l'heure qu'il est à
l'autre bout du monde :
\begin{verbatim}
@@ -43,25 +46,38 @@ Il ne reste plus qu'à le mettre en œuvre, en réutilisant
un exemple très ancien\footnote{Août 1998, lors d'une
réunion du CULTe, à Toulouse}, et très simple à
comprendre.
Dans notre cas, inetd sera à l'écoute sur un port tcp.
Dès qu'une demande de connection arrive,
il accepte la connection, lance le process configuré,
puis
connecte ce qui vient du socket au \textsl{stdin} de ce
process, et le \textsl{stdout} de celui-ci à la sortie
vers l'extérieur.
Voir aussi : tcpserver\index{tcpserver}\dots
% Voir aussi : tcpserver\index{tcpserver}\dots
% ---------------------------------------------------------
\subsection{qotd}
\index{qotd}
\index{qotd} \label{qotd}
Le protocole « Quote Of The Day » (\texttt{qotd}) a été
normalise dans le \texttt{rfc865}, écrit en 1983 par John Postel.
Une rapide implémentation du moteur de quote peut être codée en Shell :
Une rapide implémentation du moteur de quote peut être codée avec
quelques lignes de shell~:
\index{fortune}
\begin{lstlisting}[language=sh]
#!/bin/sh
/usr/games/fortune -a -n 500
\end{lstlisting}
\lstinputlisting[language=sh]{code/inet/qotd.sh}
Maintenant, il nous faut dire à Inetd d'appeler ce moteur
chaque fois qu'une connection tcp entrante arrive sur le
port 17.
port 17 (ce numéro du service est défini dans le fichier
\texttt{/etc/services}).
XXX\index{XXX}
Et pour les modernistes qui utilisent \texttt{xinetd}\index{xinetd}
les explications sont en page \pageref{xinetd:qotd}.
% ==============================================================
%

View File

@@ -1,5 +1,10 @@
\chapter{Gadgets}
La rubrique des trucs inutiles, mais pas que.
% https://www.linuxtricks.fr/wiki/zenity-boites-de-dialogue-graphiques-aux-scripts-shell
% ===============================================================
\section{Fortune}
@@ -17,10 +22,9 @@ You are deeply attached to your friends and acquaintances.
tth@plop:~$
\end{verbatim}
Bref, vous voyez le principe : c'est un machin à raconter des
Bref, vous voyez le principe : c'est une machine à raconter des
trucs plus ou
moins aléatoires\footnote{et jamais revenus, il faut bien le
préciser.}. Il y a tout un tas d'options intéressantes,
moins aléatoires. Il y a tout un tas d'options intéressantes,
la principale étant \texttt{-o} pour avoir les fortunes
offensives\index{porn} qui peuvent choquer les âmes
sensibles.

View File

@@ -19,7 +19,7 @@ gnuplot> splot "cam.indoor" using 2:4:3, "cam.indoor" using 5:7:6
Un exemple réel, issu d'un projet d'élevage d'algues
bio-luminescentes dans un frigo bricolé par une jeune stagiaire
fort sympathique.
fort sympathique avec l'aide du Tetalab\index{tetalab}.
Le fichier des données contient cinq champs séparés par des espaces
ou des tabulations.

View File

@@ -1,56 +1,123 @@
\chapter{Graphisme}
\label{chap:graphisme}
Voici quelques notes en vrac sur divers logiciels
ou bibliothèques de fonctions qui permettent
de faire des dessins et des images\dots
Nous verrons ici (dans le désordre) SDL, Povray, Flydraw, Fortran,
et peut-être d'autres dans un avenir incertain.
Mais il en existe d'autres~:
Gnuplot (page \pageref{chap:gnuplot}),
\texttt{gif89a} (page \pageref{chap:gif89a}),
le dessin (page \pageref{chap:dessin}),
les images (page \pageref{chap:image}) et
les photos (page \pageref{chap:photos})\dots
Le sujet est vaste, en fait.
% ------------------------------------------------
% nouveau : Tue Sep 3 11:14:13 UTC 2024
\section{SDL2} \index{SDL} \label{sdl}
\begin{quote}
Simple DirectMedia Layer est une bibliothèque de développement multiplateforme conçue pour fournir un accès de bas niveau à l'audio, au clavier, à la souris,
aux joysticks et à la vidéo (via OpenGL/Direct3D/Metal/Vulkan).
\end{quote}
\textbf{Attention}, à l'heure\footnote{Wed Sep 4 00:40:42 UTC 2024} qu'il est,
j'utilise une version assez ancienne\footnote{Mais je vais me soigner\dots},
donc
ce que vous allez lire à propos de SDL doit être pris avec des pincettes.
D'autre part, la version \textbf{3} est sortie depuis un certain temps,
mais beaucoup de logiciels n'ont pas encore fait la transition.
Nous allons rester pour le moment avec la version 2.
\subsection{Afficher la version}
Et puisque on parle de version, ils ont pris une approche vraiment
interessante (dont je devrais d'ailleurs m'inspirer) dans le cas de
l'édition de lien dynamique.
\begin{verbatim}
SDL_version compiled;
SDL_version linked;
SDL_VERSION(&compiled);
SDL_GetVersion(&linked);
printf("We compiled against SDL version %d.%d.%d ...\n",
compiled.major, compiled.minor, compiled.patch);
printf("But we linked against SDL version %d.%d.%d.\n",
linked.major, linked.minor, linked.patch);
\end{verbatim}
Voici quelques notes en vrac sur divers logiciels qui permettent
de faire des dessins et des images.\dots
% ------------------------------------------------
\section{Flydraw}\index{Flydraw}
\subsection{Mon premier "bug"}
Comment faire des dessins en écrivant des lignes de codes ?
C'est en essayant quelques fonctions de la SDL dans le but de faire
un dégradé\footnote{On a toujours besoin de dégrader...} de couleurs
que je suis tombé sur une anomalie que je n'arrive pas (encore)
a m'expliquer.
\begin{quote}
flydraw is a drawing tool based on an interpreter which parses a
language featuring rich graphic primitives; it uses libgd to output
GIF, JPEG, or PNG\index{PNG} files.
\end{quote}
\lstinputlisting[language=c]{code/SDL2/strangebug.c}
\lstinputlisting{code/dessiner.fly}
C'est peut-être ma totale méconnaissance du sujet qui m'a
fait faire une bêtise àlc, et je ne vois pas laquelle\dots
Une enquête est en préparation.
Pour le moment, les résultats ne sont pas encourageants~:
\begin{verbatim}
tth@fubar:~/Documents/TetaTricks/code$ flydraw < dessiner.fly
bad_parms -100000
tth@fubar:~/Documents/TetaTricks/code$
\end{verbatim}
Mais en s'obstinant un peu au \textsl{cargocult}, il
s'avère que la documentation et le code semble ne sont
pas d'accord. Et les messages d'erreur trop
cryptiques pour moi. Donc, on y arrive.
\begin{figure}[h]
\begin{center}
\includegraphics[scale=0.75]{code/flydraw}
\caption{Flydraw}
\end{center}
\end{figure}
Ceci dit, une lecture attentive du code source\footnote{UTSL!} permettra
de contourner ces petits désagréments, et de rédiger quelques exemples
d'utilisation amusants.
% package source
% http://deb.debian.org/debian/pool/main/w/wims/wims_4.17b+svn13454~dfsg1.orig.tar.gz
% ------------------------------------------------
%
% Fri Sep 27 14:09:45 UTC 2024
% la section sur flydram est partie dans les unused
%
%====================================================================
\section{Povray}\index{Povray}
\section{Povray}\index{Povray}\label{Povray}
\textbf{Persistence Of Vision} est un logiciel de raytracing qui
existe depuis plus de trente ans. C'est un lointain descendant
de DKBtrace. Mais le raytracing, c'est quoi ?
\vspace{2em}
XXX\index{XXX} expliquer le raytracing.
% -----------------------------------------------------------------
\subsection{Première scène}
Le "hello world" du raytracing, c'est la boule miroir au
dessus d'un sol à carreaux, deux éléments.
Mais nous aurons aussi besoin de lumière et d'une caméra
pour y voir quelque chose.
Respectons la tradition, et tentons un EMC\index{EMC}..
\lstinputlisting[]{code/POV/hello.pov}
Quelques explications~:
% -----------------------------------------------------------------
\subsection{Deux langages, \small{\textsl{WTF?}}} \index{wtf}
En fait, les grands fichiers que vous écrivez pour construire
vos scènes contiennent \textbf{deux} langages différents.
Le premier décrit le contenu de la scène : les objets, les
textures, les lumières, la caméra\dots
C'est pour ça qu'il est appelé SDL\index{SDL},
\textsl{Scene Dscription Language}.
Le second est plutôt un langage de
programmation\footnote{Turing complet ?}
avec des variables, des tests, des boucles, des \textsl{io},
et tout ce genre de choses.
Et les deux sont entrelacés, ce qui est une bonne chose,
même si ça conduit à du code qui pique les yeux.
% -----------------------------------------------------------------
% -----------------------------------------------------------------
\subsection{Caméra}
Vous avez des problèmes pour caler les mouvement de la caméra ?
@@ -58,27 +125,30 @@ Vous avez deux trajectoires (mal) calculées pour la
\texttt{location} et le \texttt{look\_at}, et rien ne tombe
en face de l'objectif ? Voici une approche de solution.
La première étape est l'enregistrerement des paramètres de la caméra
La première étape est l'enregistrement des paramètres de la caméra
(préalablement calculés par de savantes mais mauvaises formules)
lors du calcul de la séquence~:
\begin{verbatim}
#if (0 = clock)
#fopen CL "cam.log" create
#fopen CL "WS/cam.log" write
#else
#fopen CL "cam.log" append
#fopen CL "WS/cam.log" append
#end
#write (CL, clock, " ", CamX, " ", CamY, " ", CamZ,
" ", LatX, " ", LatY, " ", LatZ,"\n")
#fclose CL
\end{verbatim}
Et la seconde étape, l'exploitation, ou plutôt la visualisation
Et la seconde étape, l'exploitation avec \textsc{R},
le logiciel de statistiques (que nous verrons bientôt),
ou la visualisation
de ces données avec l'indémodable gnuplot\index{gnuplot}~:
\begin{verbatim}
#!/bin/bash
FILE="cam.log"
FILE="WS/cam.log"
TMPF="/dev/shm/cam.data"
IMAGE="graphe.png"
tail -360 ${FILE} | sort -n > ${TMPF}
@@ -103,9 +173,33 @@ celui de Gnuplot.
% ------------------------------------------------
% updated Fri Sep 27 13:41:54 UTC 2024
\subsection{image\_map}
XXX \index{XXX}
Autre composante essentielle du raytracing, le collage d'une
image sur quelque chose, comme quand vous recouvrez une
boite de Camembert\index{Camenbert} avec du papier peint
des années 50.
Il suffit d'utiliser les pixels de l'image comme pigment.
\begin{verbatim}
plane { -z,0 pigment { image_map {png "Eggs.png"} } }
\end{verbatim}
\textsl{By default, the image is mapped onto the
\textbf{x-y-plane}.
The
image is projected onto the object as though there were a
slide projector somewhere in the -z-direction.
The image
exactly fills the square area from (x,y) coordinates
(0,0) to (1,1) regardless of the image's original size in
pixels.
If you would like to change this default you may
translate, rotate or scale the pigment or texture to map
it onto the object's surface as desired.
}%
\footnote{https://wiki.povray.org/content/Reference:Image\_Map}
% ------------------------------------------------
@@ -206,7 +300,7 @@ material {
\section{Avec Fortran}
plplot\index{plplot} est la piste à explorer.
plplot\index{plplot} est une des pistes à explorer.
% ------------------------------------------------

View File

@@ -20,8 +20,9 @@ foo = read(joy_fd, &js, sizeof(struct js_event));
Quand les choses ne se passent pas comme prévu, quand il
y a des accrocs dans le plan, que le résultat n'est
qu'une video totalement noire de 17 minutes.
dmesg, lshw, lsusb, lspci\dots
qu'une video totalement noire de 17 minutes, que des
octets incongrus arrivent depuis l'Arduino.
dmesg, lscpu, lshw, lsusb, lspci\dots
% -----------------------------------------------------------
% new: Fri Sep 22 11:13:36 UTC 2023
@@ -37,6 +38,20 @@ on some PowerPC machines (PowerMac G4 is known to work).
\end{quote}
% -----------------------------------------------------------
\subsection{lscpu} \index{lscpu}
\begin{verbatim}
tth@redlady:~/Desktop$ lscpu --all --extended
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ
0 0 0 0 0:0:0:0 yes 3800.0000 1600.0000
1 0 0 1 1:1:1:0 yes 3800.0000 1600.0000
2 0 0 2 2:2:2:0 yes 3800.0000 1600.0000
3 0 0 3 3:3:3:0 yes 3800.0000 1600.0000
tth@redlady:~/Desktop$
\end{verbatim}
% -----------------------------------------------------------
\section{Ports série}
\index{rs232} \label{rs232}
@@ -50,7 +65,9 @@ ainsi que la norme ISO 2110 pour la connectique.
\end{quote}
Comment détecter si un \textit{device} correspond bien
à un port série ?
à un port série ? Une fois de plus, la réponse passe
par un \textsl{ioctl}\index{ioctl}.
Même si il est bien caché.
\begin{lstlisting}[language=C]
#include <stdio.h>
@@ -76,6 +93,11 @@ return 0;
}
\end{lstlisting}
En effet, \texttt{tcgetattr(3)} va aller lire le paramétrage
du port associé au descripteur de fichier \texttt{fd}
par l'intermédiaire d'un ioctl (qui aurait pû prévoir ?)
que nous détaillerons un de ces jours.
Et la question qui, je le sens, va venir~: « à quoi peut bien
servir un port série ? » appelle un réponse presque évidente~:
« à plusieurs choses ». Une petite liste~:
@@ -83,13 +105,14 @@ Connecter un Minitel\index{MINITEL}
pour dialoguer avec Ulla Trentsixquinze ? Brancher un
Sportster 14400 pour retrouver Fidonet\index{Fidonet} ?
Discuter avec un équipement avionnique ? Rediriger
l'impression d'un MSX\index{MSX} vers Cups\index{cups} ?
l'impression d'un MSX\index{MSX} ou d'un Alice 32
vers Cups\index{cups} ?
Les possibilités sont infinies. C'est votre imagination qui
est la limite\footnote{Comme à peu près tout dans la vie.}
% -----------------------------------------------------------
\section{Ports //} \label{portparallele}
\section{Ports \textbf{//}} \label{portparallele}
\index{port //}
% http://people.redhat.com/twaugh/parport/html/x623.html
@@ -98,6 +121,23 @@ périphérique \texttt{/dev/parport}
Question: comment faire du \textsl{bitbanging} ?
% -----------------------------------------------------------
\section{USB} \index{USB} \label{USB}
Universal Serial Bus, existe en trois taille.
\begin{verbatim}
tth@redlady:~/Devel/TetaTricks$ lsusb
Bus 004 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 004 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 002 Device 006: ID 093a:2510 Pixart Imaging, Inc. Optical Mouse
Bus 002 Device 002: ID 0461:4e6f Primax Electronics, Ltd
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
\end{verbatim}
% -----------------------------------------------------------
\section{Disques durs}
@@ -158,8 +198,8 @@ idéal, la prédiction des pannes.
\textsl{Check and repair a Linux filesystem}
Fortune du jour : \textsf{Franchement, là, je préfère que ce soit vous qui prenne la
tronçonneuse, parce que là, c'est pas beau à voir\dots}
Fortune du jour : \textsf{Franchement, là, je préfère que ce soit vous qui prenne
la tronçonneuse, parce que là, c'est pas beau à voir\dots}
% -----------------------------------------------------------
\subsection{tune2fs}\index{tune2fs}
@@ -167,6 +207,26 @@ tronçonneuse, parce que là, c'est pas beau à voir\dots}
\textsl{Adjust tunable filesystem parameters on ext2/ext3/ext4
filesystems}\footnote{You can tune a fs, but you can't tuna fish}.
% -----------------------------------------------------------
% nouveau 2 juin 2024
% basé sur mes tentatives pour faire marcher l'interface
% Enttec OpenDMX USB
\section{udev} \index{udev} \label{udev}
\begin{quote}
udev supplies the system software with device events, manages
permissions of device nodes and may create additional symlinks in the
/dev directory, or renames network interfaces. The kernel usually just
assigns unpredictable device names based on the order of discovery.
Meaningful symlinks or network device names provide a way to reliably
identify devices based on their properties or current configuration.
\end{quote}
Avant de rentre dans les détails, nous pouvons aller voir un exemple
concret en page \pageref{OpenDMX} où nous atriburons un nom fixe
à une interface USB.
% -----------------------------------------------------------
\section{Sensors} \index{sensors}
@@ -195,7 +255,7 @@ int retcode;
struct ifreq req;
#if DEBUG_LEVEL
fprintf(stderr, ">>> %s \"%s\" to %p\n", \
fprintf(stderr, ">>> %s ( \"%s\" to %p )\n", \
__func__, ifname, p_flags);
#endif
@@ -225,8 +285,7 @@ if (retcode < 0)
close(fd);
return -1;
}
#if DEBUG_LEVEL
/* display the result */
#if DEBUG_LEVEL /* display the result */
fprintf(stderr, "flags = 0x%04x\n", req.ifr_flags);
#endif
@@ -241,7 +300,6 @@ Hélas, je n'ai pas pu trop tester ce truc sur beaucoup de systèmes,
et je vous propose de ne pas trop lui faire confiance pour une
application critique...
% -----------------------------------------------------------

View File

@@ -3,7 +3,8 @@
Le traitement des images est un art à part entière. Nous allons
voir quelques grands classiques de la catégorie pas du tout
interactif. Le genre de machin que l'on peut ranger au fond
interactif.
Le genre de machin que l'on peut ranger au fond
d'un script shell pour le réutiliser la semaine prochaine.
\begin{itemize}
@@ -27,7 +28,8 @@ et leurs interactions parfois troublantes\dots
Il y a plusieurs binaires dans le paquet : \texttt{convert} pour
la plupart des traitements,
\texttt{display} et \texttt{animate} pour visualiser des images,
\texttt{identify} pour en lire les méta-données.
\texttt{identify} pour en lire les méta-données,
\texttt{montage} pour assembler plusieurs images.
Ils partagent un certain nombre d'options communes.
Certains d'entre eux peuvent avoir un effet destructif%
@@ -190,6 +192,10 @@ On peut aussi procéder autrement, avec les outils PNM\index{PNM} :
pngtopnm \$negatif | ppmtotga -rgb -norle > \$picz
\end{verbatim}
Un volontaire dans la salle pour faire des tests de performance ?
Ma première hypothèse est que le résultat des mesures peut
être assez surprenant.
% ------------------------------------------
\subsection{identify}\index{identify}
@@ -311,7 +317,7 @@ for ((y=0; y<250; y++)) {
Comment faire un \textsl{resize} avec NetPBM ?
Est-il nécessaire d'apprendre la bibliothèque de fonctions
\texttt{libnetpbm}\footnote{Réponse: oui.} ?
\texttt{libnetpbm}\footnote{Réponse: certainement oui.} ?
% -------------------------------------------------------------------

20
chap/livres.tex Normal file
View File

@@ -0,0 +1,20 @@
% ===============================================================
% nouveau du Tue Sep 24 11:50:13 UTC 2024
% ===============================================================
\chapter{Mes livres} \label{chap:livres}
J'aime les livres, parce qu'ils sont bien plus durables que
tout ce que nous propose l'informatique actuelle.
Il faut dire que j'ai commencé l'informatique à la fin des
années 1970, quand ni Altavista, ni Inktomy n'existaient.
Ceux qui avaient de la chance pouvaient parfois voir passer
quelques exemplaires de \textsf{Byte} ou \textsf{Dr Dobbs},
les électroniciens avaient \textsf{Le Haut-Parleur},
et les vraiments chanceux achetaient leur documentation
chez \textsf{Perlor Radio}.
% ===============================================================
% ===============================================================

View File

@@ -2,8 +2,9 @@
\index{man}
\label{chap:manpages}
Guidelines for writing man pages can be found in \texttt{mdoc(7)}.
man is the system's manual pager. Each page argument given to man is
\texttt{man} is the system's manual pager. Each page argument given to man is
normally the name of a program, utility or function. The manual page
associated with each of these arguments is then found and displayed. A
section, if provided, will direct man to look only in that section of

View File

@@ -1,4 +1,5 @@
\chapter{Photographie}
\label{chap:photos}
\index{Photo}
Le domaine de la photographie numérique est vaste.
@@ -37,7 +38,7 @@ connexion possibles, la liste des appareils gérés, et l'éventuel
appareil connecté, si il est sous tension, bien entendu :)
\begin{verbatim}
tth@redlady:~/Photos/Canon600D/2022-12$ gphoto2 --auto-detect
tth@redlady:~/Photos$ gphoto2 --auto-detect
Model Port
----------------------------------------------------------
Canon EOS 600D usb:002,005

View File

@@ -1,6 +1,7 @@
\chapter{\textbf{\textsl{lp0 on fire!}}}
\label{chap:imprimer}
%-----------------------------------------------------------------
L'impression sour Linux semble avoir plusieurs personnalités.
@@ -12,6 +13,8 @@ avec une interface Web et/ou des outils en cli..
Les aspects matériels de la connexion seront vus dans un chapitre adéquat,
en page \pageref{portparallele} pour le port \texttt{//},
et \pageref{rs232} pour le serial.
L'omniprésente connectivité USB\index{USB} demande peut-être
un chapitre à part entière.
%-----------------------------------------------------------------
@@ -33,12 +36,15 @@ Cf le bouquin de Bellanger.
« IPP Everywhere » est une évolution du protocole, publiée en 2013.
Il fournit une base de référence commune pour les imprimantes afin de
prendre en charge l'impression dite "sans pilote" à partir de périphériques
clients. Elle s'appuie sur IPP et précise des règles supplémentaires d'interopérabilité,
telles qu'une liste des
clients. Elle s'appuie sur IPP et précise des règles supplémentaires
d'interopérabilité, telles qu'une liste des
formats de documents que les imprimantes doivent prendre en charge.
\end{quote}
%-----------------------------------------------------------------
%
% https://www.evilsocket.net/2024/09/26/Attacking-UNIX-systems-via-CUPS-Part-I/
%
\section{CUPS} \index{CUPS} \label{CUPS}
@@ -73,7 +79,6 @@ DESCRIPTION
Convert FILE(s) or standard input to PostScript. By default,
the output is sent to the default printer. An output file
may be specified with -o.
Mandatory arguments to long options are mandatory for short
options too. Long options marked with * require a yes/no ar
gument, corresponding short options stand for `yes'.
@@ -86,7 +91,6 @@ DESCRIPTION
\item lgrind
\item src2tex
\item trueprint
\end{itemize}

View File

@@ -2,8 +2,9 @@
\label{chap:reseau} \index{Internet}
Ah, le grand Internet sauvage, il serait temps qu'on en parle un peu.
Nous allons voir dans ce chapitre quelques utilisations
que l'on peut qualifier de «~créatives~».
Nous allons voir dans ce chapitre des logiciels peu connus,
et les quelques utilisations que l'on peut en faire
afin d'avoir le label « techno-futilité ».
Si vous attendiez des choses plus sérieuses, j'ai aussi ça
en magasin : \textsc{dns} page \pageref{chap:DNS},
@@ -34,15 +35,17 @@ il a probablement été remplacé par quelque chose d'encore plus
étrange basé sur \textsl{systemd}\index{systemd},
puisque l'important
ça n'est pas que ça soit mieux, mais que ce soit
\textbf{nouveau}.
\textbf{nouveau}. Il fallait le dire.
\subsection{qotd}
\index{qotd}
% ---------------------------------------------------------
\subsection{Un serveur pour \textsl{qotd}}
\label{xinetd:qotd}
À titre d'exercice, nous allons reprendre l'exemple du serveur
de \textsl{quote of the day} que nous avons déja utilisé avec
Inetd\index{inetd}, et lancer le
petit script par l'intermédiaire de Xinetd.
Inetd\index{inetd} (page \pageref{qotd}),
et lancer notre petit script par l'intermédiaire de Xinetd.
Pour cela, il faut créer dans le répertoire
\texttt{/etc/xinetd.d/}\footnote{Attention, ce répertoire
@@ -52,12 +55,10 @@ est peut-être un debianisme, ymmv.} un fichier nommé
\begin{verbatim}
service qotd
{
disable = yes
disable = no
type = UNLISTED
socket_type = stream
protocol = tcp
user = nobody
server = /usr/local/bin/qotd.sh
}
@@ -65,13 +66,26 @@ server = /usr/local/bin/qotd.sh
Bien entendu, le script \texttt{qotd.sh} décrit en page
\pageref{inetd} sera placé dans le bon répertoire.
Et ouvert aux quatre vents par un
\texttt{sudo chmod a+x /usr/local/bin/qotd.sh} de bon aloi.
\index{fortune}
\lstinputlisting[language=sh]{code/inet/qotd.sh}
Ensuite, il faut demander à Xinetd de relire ses fichiers de
configuration par un signal bien senti et au bon endroit.
configuration par un bon \textsc{SIGHUP} bien senti
et au bon endroit, c'est à dire le PID que l'on pourra
(peut-être) obtenir dans \texttt{/var/run/xinetd.pid},
et paf.
Allons voir si cela fonctionne.
Ah, on me murmure dans l'oreille que Xinetd n'existe plus dans
les Linux modernes, et qu'il existe quelque chose de
\textit{beaucoup mieux}. Je ne sais pas quoi.
Je demande à voir\footnote{Parce que c'est écrit par LP ?}.
% --> https://0pointer.de/blog/projects/inetd.html
% ==============================================================
@@ -92,59 +106,6 @@ Par exemple la comparaison de la mise en œuvre du NAT
avec \texttt{iptables} et \texttt{pfctl} est une source de trolls
sans fin.
% ==============================================================
\section{Iodine}
\index{iodine}\label{iodine}
Iodine, c'est quoi ? C'est un ensemble de logiciels qui permettent
de se brancher sur l'Intertube même si on n'a pas d'accès
«~autorisé~» par la voisine qui a déménagée vers la
lointaine campagne avec sa friboite.
\begin{quote}
This is a piece of software that lets you tunnel IPv4 data through a
DNS server. This can be usable in different situations where internet
access is firewalled, but DNS queries are allowed.
The name iodine was chosen since it starts with IOD (IP Over DNS)
and since iodine has atomic number 53, which happens to be the DNS
port number.
\end{quote}
À ce jour (2 septembre 2013) ce que vous allez lire est basé
sur la version \texttt{0.6.0-rc1} et sera probablement plus ou
moins incompatible avec les versions précedentes ou suivantes, ymmv.
\begin{verbatim}
root@plop:iodine-0.6.0-rc1# bin/iodine teton.mooo.com -f -P m
Opened dns0
Opened UDP socket
Sending DNS queries for teton.mooo.com to 192.168.1.1
Autodetecting DNS query type (use -T to override)..................
iodine: No suitable DNS query type found. Are you connected to a network?
iodine: If you expect very long roundtrip delays, use -T explicitly.
iodine: (Also, connecting to an "ancient" version of iodined won't work.)
\end{verbatim}
\subsection{Coté serveur}
Je pense qu'il faut commencer par voir du coté du DNS
pour déléguer une sous-zone à la machine qui va faire tourner
le serveur iodine. Mais j'en suis pas certain. RTFM.
\subsection{Coté client}
Je n'en sais pas plus non plus...
\begin{verbatim}
sudo bin/iodine -f -P s3cr3tp4ssw0rd i.buvette.org
\end{verbatim}
Donc, n'ayant plus vraiment (pour le moment) le besoin d'utiliser
ce passe-muraille, je vais laisser ce passage en l'état...
% ==============================================================
\section{Outils de diagnostic}
@@ -152,6 +113,8 @@ iftop\index{iftop},
iptraf\index{iptraf}
\dots
Mais c'est toujours la faute du \textsc{dns}\index{dns}.
% -------------------------------------------------------------
\subsection{iperf}
\index{iperf}

View File

@@ -1,7 +1,28 @@
\chapter{scripting}
XXX
Qu'est-ce que le \textsl{scripting} ?
C'est l'art de coller entre eux divers outils logiciels
afin de réaliser une tache donnée.
Le "collage" est fait par un \textbf{script},
lequel est un fichier texte, écrit dans divers
langages (plus ou moins spécifiques) et qui sera lu et exécuté
par un interpréteur.
Je ne vais pas revenir sur l'art du shebang, si vous ne
le connaissez pas, c'est expliqué page \pageref{shebang}.
En bref, c'est la manière dont le script sélectionne
le bon interpréteur lors de son lancement.
Quels sont les langages courrament utilisés pour faire du
script ? Il y a une bonne poignée de réponses à ça.
La première étant souvent « Use The Shell ! »,
et la seconde « tu as songé à awk ? »,
ce qui est tout aussi sensé.
Le shell étant dégrossi page \pageref{chap:shell},
passons directement au langage Awk.
% ===============================================================
\section{Awk} \index{Awk}
Awk est un langage de programmation crée
@@ -9,9 +30,12 @@ par Aho, Kernighan, and Weinberger%
\footnote{The AWK Programming Language, Alfred V. Aho,
Brian W. Kernighan, Peter J. Weinberger, Addison-Wesley, 1988.
ISBN 0-201-07981-X. }.
Son originalité vient du fait qu'il a été conçu principalement
pour traiter ligne par ligne des fichiers tabulés.
C'est son domaine de prédilection, autant en profiter.
Quelques \textsl{oneliners} de bon aloi pour vous donner
une idée du langage\dots
une idée des possibilités du langage\dots
\begin{verbatim}
cat { print $0 } or just 1
@@ -32,15 +56,17 @@ on va procéder en quelque sorte « demi-dalle par demi-dalle ».
\subsection{Un exemple simple}
À partir d'un jeu de données structurées, nous allons générer un
fichier \texttt{.inc} contenant un objet pour Povray\index{Povray}.
fichier \texttt{.inc} contenant la description en
SDL\index{SDL}\footnote{SDL: Scene Description Language}
d'un objet pour Povray\index{Povray}.
Un cas d'école : un élément par ligne, les valeurs sont séparées par
des espaces.
des espaces et/ou des tabulations.
\lstinputlisting[]{code/awk/dataset}
Ces données sont les coordonnées \textsc{x,y,z} et le rayon d'une
petite collection de bubulles. Pratiquement, une représentation
sommaire d'une sphère de povray\footnote{SDL keyword: \texttt{Sphere}}.
sommaire d'une sphère de povray.
Le fichier à générer est en trois partie : l'en-tête, la liste
des bubulles\index{bubulle} et l'en-pied, ce qui est bien raccord
@@ -49,7 +75,129 @@ le voir ici-même~:
\lstinputlisting[]{code/awk/mkunion.awk}
La première ligne est pour le traditionnel
\textsl{shebang}\index{shebang},
avec l'option \texttt{-f} pour que le contenu du script soit lu
par l'interpréteur Awk dès son lancement.
Ensuite, nous trouvons trois blocs délimités par des accolades,
deux d'entre eux étant précédés d'une « instruction ».
% XXX to be continued XXX
Le premier bloc, avec le mot-clef \textsc{BEGIN}, est exécuté
avant la lecture de la première ligne des données en entrée.
Ce qui est le bon moment pour initialiser des variables.
Nous l'utilisons pour créer l'en-tête d'un descripteur
d'objet pour Povray.
Le second bloc (sans label) est exécuté pour chaque ligne lue.
Et c'est ici que nous trouverons la magie.
La ligne lue depuis l'entrée a été découpée selon le
séparateur FS, et les tranches sont connues sous les noms
de \$1, \$2, ... \$N (la ligne entière étant \$0)
que nous utilisons dans la génération de la bubulle.
Et le troisième bloc (\textsc{END}) sera exécuté à la fin, après
la lecture et le traitement du dernier enregistrement,
qui est dans notre cas la dernière ligne.
Et à l'exécution~:
\begin{verbatim}
tth@redlady:~/Devel/TetaTricks/code/awk$ ./mkunion.awk < dataset
#declare Bubulles = object
{
union {
sphere { <17.000000, 9.000000, 4.000000>, 1.500000 }
sphere { <11.000000, 0.800000, 2.300000>, 0.989000 }
sphere { <0.000000, 0.000000, 0.000000>, 1.000000 }
}
}
// 3 bubulles
\end{verbatim}
% ===============================================================
\subsection{Mais ce n'est pas tout !}
Ce premier exemple nous a montré comment, avec quelques
lignes de code facile à comprendre, transformer des
données et faire quelques calculs avec ces données.
Nous avons vu le découpage de la ligne d'entrée, mais
ce n'est pas tout, je suis passé très vite sur ce sont
ces "labels" dont j'ai parlé.
Ce ne sont absolument pas des labels, ni des mot-clefs,
mais quelque chose de bien plus puissant.
C'est le mécanisme qui permet de sélectionner les lignes
sur lesquelles nous voulons appliquer un traitement.
Nous avons déja vu \textsc{BEGIN} et \textsc{END},
pour lancer du code avant-le-début et/ou après-la-fin.
Mais nous pouvons mettre des bouts de code donnant un résultat
booléen, oui/non, qui conditionnera l'exécution du
bloc de code ainsi
préfixé\footnote{J'ai l'impression de pas être très clair ?},
ce qui nous donnera des possibilités de filtrage
surpuissantes.
Par exemple, nous ne voulons pas de bubulle trop
petite, il suffit de précéder le second bloc de l'exemple
déja vu par un test sur la taille qui est dans
le quatrième champ du fichier d'entrée~:
\begin{verbatim}
$4 > 0.999 {
printf(" sphere { <%f, %f, %f>, %f }\n", \
$1, $2, $3, $4 )
}
\end{verbatim}
Vous comprenez maintenant les deux plus importantes choses
que l'on peut trouver dans Awk (/me fan).
XXX to be continued \index{XXX}
% ===============================================================
\subsection{Définir une fonction}
Bien, nous savons maintenant générer des bubulles avec un
filtrage sur la taille, mais nous voudrions maintenant procéder
à des calculs sur les données que nous lisons.
Deux choix s'offrent à nous, soit faire ça directement dans
le deuxième bloc, soit utiliser un sous-programme dédié.
Pour des raisons aussi bien didactiques que de bon sens,
nous allons opter pour la seconde solution.
Mais voyons d'abord la syntaxe d'une fonction, avec en prime
une petite astuce: si vous voulez utiliser Awk dans devoir
lui fournir de données en entrée, c'est simple, mettez tout
dans le bloc \textsc{BEGIN}.
\lstinputlisting[]{code/awk/demo-func.awk}
\begin{verbatim}
tth@redlady:~/Devel/TetaTricks/code/awk$ ./demo-func.awk
---- demo fonction ----
sin(1.000000) = 0.841471
distance from center = 0.707107
\end{verbatim}
La deuxième fonction demande quelques explications, puisqu'elle
met en œuvre un « awkisme » de bon aloi.
En effet, Awk ne connait pas les variables locales à une fonction,
c'est-à-dire connues seulement à l'intérieur de celle-ci.
% ===============================================================
\subsection{Les variables}
Et puisque on en parle...
% ===============================================================
\subsection{Pattern filtering} \index{pattern}
Wesh, regexp.
% ===============================================================

View File

@@ -39,24 +39,47 @@ Thu Oct 5 00:53:01 UTC 2023
tth@redlady:~$
\end{verbatim}
Ces ordres peuvent être des commandes internes à l'interpréteur,
d'autres seront des commandes fournies par des exécutables
externes. Pour le début, la différence n'est pas importante.
Mais comment le shell fait-il pour retrouver tous les outils
dont il a besoin ? Simplement, il connait une liste
d'endroits où aller chercher, une sorte de chemin de recherche,
c'est d'ailleurs pour ça que cette liste
est nommée \texttt{PATH}\index{PATH}.
Il est très simple de la visualiser~:
\begin{verbatim}
tth@redlady:~/Devel/TetaTricks$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
\end{verbatim}
% ==============================================================
\section{Langage}\index{script}
\section{Un langage}\index{script}
Le shell est aussi, et surtout, un langage de programmation, parfois
appelé \textsl{glue-language} parce qu'il permet de "coller" ensemble
plusieurs opérations élémentaires, d'abord avec ses opérateurs internes
et ensuite l'utilisation d'outils
extérieurs\footnote{Grep, Sed, Awk, BwBasic...}
Le shell est aussi, et surtout, un langage de programmation
à part entière.
Il est parfois appelé \textsl{glue-language} parce qu'il permet de
"coller" ensemble plusieurs opérations élémentaires, d'abord avec
ses opérateurs internes et ensuite par l'utilisation d'outils
extérieurs\footnote{Grep, Sed, Awk, BwBasic, Sort, Gfortran...}
divers. C'est \textsl{très} efficace.
Nous allons commencer par voir quelques notions liées à
la création d'un script exécutable, puis d'un enchainement
de commandes.
Nous passerons ensuite aux structures de contrôle, comme les
tests et les boucles.
% --------------------------------------------------------------
\subsection{Le \textsc{shebang}} \index{shebang}
\subsection{Le shebang} \index{shebang} \label{shebang}
Le shebang, c'est ce couple de caractères \texttt{\#!} qui apparait
au tout début d'un script shell.
Le 'she' est l'abréviation de 'sharp', coupant en français. C'est
Le 'she' est l'abréviation de 'sharp', qui veut dire 'coupant' en français.
C'est
probablement une allusion aux cotés tranchants du \texttt{\#}.
Quand au 'bang', c'est le point d'exclamation après l'explosion
de la forkbomb.
@@ -67,6 +90,26 @@ octets. Si les deux premiers sont \textsl{0x23 0x21}, le reste
de la première ligne sera interprété pour lancer un autre exécutable,
avec un traitement particuler des options.
Et à ce momment-là des explications, on entend Serguey qui hurle
du fond de la salle « schmod777 en force ! ».
Et il a bien raison. En effet, ce fichier doit être vu comme
possiblement exécutable selon les droits 'X' qu'il a.
Il y a une commande prévue à cet effet, dont nous allons voir
l'usage à l'instant, avec la création d'un script complet~:
\begin{verbatim}
tth@redlady:~$ echo '#!/bin/bash' > foo.sh
tth@redlady:~$ echo 'printf "%x" 85 >> foo.sh
tth@redlady:~$ chmod u+x ./foo.sh
tth@redlady:~$ ./foo.sh
55
tth@redlady:~$ cat foo.sh
#!/bin/bash
printf "%x\n" 85
tth@redlady:~$
\end{verbatim}
% ==============================================================
\section{Le pipeline}\index{pipeline}\label{pipeline}
@@ -84,43 +127,100 @@ X09:22:29XupX33Xdays,X14:00,XX8Xusers,XXloadXaverage:X0.12,X0.17,X0.17
\end{verbatim}
Bien entendu, on peut utiliser plusieurs tuyaux pour construire
une chaine de traitements\footnote{La
chaine de compilation \textsc{eqn/tbl/roff} est un bon exemple}.
une chaine de traitements%
\footnote{La chaine de compilation \textsc{eqn/tbl/roff} est un bon exemple}.
On peut même « intercepter » ce qui transite par un des tuyaux.
\begin{verbatim}
$
tth@redlady:~/Devel/TetaTricks$ date | tee foo.txt |
tr 'EASLeasl' '34573457'
W3d 53p 25 16:07:01 C35T 2024
tth@redlady:~/Devel/TetaTricks$ cat foo.txt
Wed Sep 25 16:07:01 CEST 2024
\end{verbatim}
% ==============================================================
% new Wed Sep 25 14:00:07 UTC 2024
\section{L'environnement} \index{environ}
Commençons par une petite histoire.
Un jour\footnote{été 2024 ?}, je suis tombé par un hasard
improbable sur une variable d'environnement nommée
\textsc{hostname}. Qui contenait précisément "redlady" !
Tout bien.
Alors, quelques jours avant, vers 2006, je l'ai utilisée
dans un bout de code en C, que j'avais depuis bien
bien longtemps oublié au fond
d'une 8" hard-sectored.
Et là, ça ne marche pas comme je l'espérais.
Voyez ce bout de code~:
\begin{verbatim}
char *nom = "HOSTNAME";
printf("%s -> %s\n", nom, getenv(nom));
\end{verbatim}
Il me renvoit \texttt{HOSTNAME -> (null)}.
Krkrkr.
% ==============================================================
\section{Structures de contrôle}
Les plus importantes sont là : le choix, la boucle, l'attente,
le \textsc{goto}\index{goto} calculé, la sélection,
\textsl{make your choice}.
% --------------------------------------------------------------
\subsection {Les tests}
Deux éléments sont ils-égaux ?
Deux éléments sont ils égaux ? Et d'abord, ces deux éléments
sont-ils comparables ?
% --------------------------------------------------------------
\subsection {Les boucles}
Exemple très simple~:
\begin{verbatim}
for foo in A B C D
do
echo ${foo}
done
\end{verbatim}
Autre exemple, un peu moins simple~:
\begin{verbatim}
for foo in $(seq 0 37 133)
do
printf "foo = %3d\n" ${foo}
done
\end{verbatim}
% ==============================================================
\section{Les fonctions}
Une bonne manière de rendre votre code modulaire, et de réutiliser
des bouts de code à volonté depuis plusieurs programmes.
Une fonction peut accepter des paramètres, qui seront
connus sous les petits noms de
\texttt{\$1 \$2 ... \$n}.
Voici quelques fonctions~:
Voici un fichier contenant quelques fonctions~:
\lstinputlisting{code/shell/fonctions.sh}
Et comment les utiliser~:
Pour les utiliser, il faut d'abord les charger dans le shell courant.
C'est la directive \texttt{source}\index{source} qui s'en charge~:
\lstinputlisting{code/shell/demofonctions.sh}
XXX expliquer "source" \index{XXX}
% ==============================================================
% https://bwog-notes.chagratt.site/2023/le-heredoc/
@@ -128,37 +228,49 @@ Et comment les utiliser~:
\section{Heredoc}
Un nom bien difficile à traduire, peut-être par « document en place » ?
C'est un moyen simple et efficace de mettre des données textuelles
(comme des commandes pour un logiciel particulier)
dans un script afin de les envoyer dans le \textsl{stdin} d'un
logiciel. Par exemple, quelques commandes pour générer un
graphique avec Gnuplot\index{gnuplot} sur la console \textsl{dumb}.
\lstinputlisting{code/shell/heredoc.sh}
Après le \textsl{shebang}, nous avons la création de la variable
pour le titre,
et ensuite l'appel à Gnuplot avec la redirection
\texttt{$<<$ \_\_EOC\_\_} % bug affichage "<<"
qui va envoyer sur le stdin de Gnuplot la suite du
script shell (des commandes gnuplot), jusque au marqueur de fin,
qui est \texttt{\_\_EOC\_\_} dans notre cas.
... et la démonstration~:
\begin{verbatim}
tth@redlady:~/Devel/TetaTricks$ code/shell/heredoc.sh
tth@redlady:~/Devel/TetaTricks/code/shell$ ./heredoc.sh
Here Doc
Here Doc (9946)
1 +--------------------------------------------------------------------+
| +** *** + + + + |
0.8 |-+.......**..........:.**.......:..........:.........sin(x).*******-|
| ** : : * : : : : |
0.6 |-+....**..:..........:....**....:..........:..........:..........:+-|
| * : : * : : : : |
0.4 |-+.**.....:..........:.......*..:..........:..........:..........:+-|
| * : : * : : : : |
0.2 |-*........:..........:.........**..........:..........:..........:+-|
|* : : * : : : |
0 |-+........:..........:..........:**........:..........:..........:+-|
| : : : * : : : *|
-0.2 |-+........:..........:..........:..**......:..........:..........:*-|
| : : : * : : * |
-0.4 |-+........:..........:..........:.....*....:..........:........**:+-|
| : : : * : : * : |
-0.6 |-+........:..........:..........:.......**.:..........:.....**...:+-|
| : : : *: : ** : |
-0.8 |-+........:..........:..........:..........**.........:..**......:+-|
| + + + + *** +** + |
-1 +--------------------------------------------------------------------+
0 1 2 3 4 5 6
1 +-------------------------------------------------------------+
| + + + + + + + + + |
| 0.7*sin(x) ******* |
| ****** ****** |
0.5 |-+ ** ** ** ** +-|
| ** * * ** |
| ** ** ** ** |
| ** ** ** ** |
|* ** ** *|
0 |-+ * * +-|
| ** ** |
| * * |
| * * |
-0.5 |-+ ** ** +-|
| *** *** |
| ******* |
| |
| + + + + + + + + + |
-1 +-------------------------------------------------------------+
0 1 2 3 4 5 6 7 8 9
\end{verbatim}
Je pense que l'exemple est assez parlant.
@@ -175,6 +287,23 @@ Quelle sont les différences entre \texttt{en\_US.UTF-8} et
\texttt{C.UTF-8} ?
% ==============================================================
% https://wiki.fiat-tux.fr/books/d%C3%A9veloppement/page/ajouter-des-couleurs-a-ses-scripts-shell
\section{Écrire en couleur} \index{ANSI} \index{escape}
\begin{verbatim}
BLACK='\033[0;30m'
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
CYAN='\033[0;36m'
WHITE='\033[0;37m'
\end{verbatim}
% ==============================================================
\section{Questions à voir}
\begin{itemize}

View File

@@ -2,10 +2,19 @@
\label{chap:son}
Abordons maintenant un sujet complexe :
le son en général,
le son en général, et en particulier avec Linux.
Vous pouvez aussi regarder
la musique (p. \pageref{chap:musique}) et la
synthèse de sons (p. \pageref{chap:modular}).
Complexe, parce que, il faut bien se le dire
entre nous, je me permet d'affirmer avec vigueur que la gestion du son
dans Linux est horriblement compliquée, pour ne pas dire
totalement bordélique.
C'est un empilement de couches logicielles, chacune destinée à
un usage particulier, et qui passent leur temps à se marcher
sur les pieds.
%------------------------------------------------------------------
\section{ALSA}
@@ -33,6 +42,8 @@ Ensuite, nous avons \texttt{aplay} et \texttt{arecord},
qui permettent d'écouter et d'enregistrer les sets de
James Lewis\footnote{Que ça, c'est de la super noise !}.
Ils partagent beaucoup d'options communes.
\subsection{arecord}
Si vous avez plusieurs cartes son, la sélection du
@@ -48,6 +59,13 @@ arecord -D plughw:CARD=Snowball,DEV=0 -v -r 22050 foo.wav
arecord -D plughw:CARD=H4,DEV=0 -v -c 2 -f S16_LE -r 44100 foo.wav
\end{verbatim}
\subsection{aplay} \index{aplay}
C'est le pendant de arecord pour écouter des fichiers sonores.
Avec pas mal d'options communes.
\subsection{Du code...}
\begin{verbatim}
@@ -129,8 +147,8 @@ serveur de stream comme Icecast\index{icecast}
Libsndfile est essentiellement une très complète bibliothèque
de lecture et écriture de fichiers sons.
Elle permet de gérer facilement un nombre
considérable de formats de fichiers\footnote{Mais ceci est une autre
histoire, que nous verrons peut-être un de ces jours\dots}.
considérable de formats de fichiers,
que nous verrons peut-être un de ces jours\dots.
Elle arrive avec une floppée d'outils en ligne de
commande, dont certains sont assez performants.
@@ -164,11 +182,11 @@ https://www.xiph.org/ao/doc/drivers.html
Pour choisr comment et vers quelle prise physique libao va envoyer
le son, il y a deux choix à faire. La partie logicielle d'une part
(aixs, oss, alsa, jack, sndio\dots)
et la partie matérielle (jack standard, casque audio USB\dots).
et la partie matérielle (jack 3.5 standard, casque audio USB\dots).
%------------------------------------------------------------------
\section{Portaudio} \label{Portaudio} \index{Portaudio}
\section{Portaudio} \label{Portaudio} \index{portaudio}
Une suggestion de Wargreen pour avancer un peu dans la construction
de ma DAW\footnote{Digital Audio Workstation, aka machine à sons}

3
chap/systemd.tex Normal file
View File

@@ -0,0 +1,3 @@
\chapter{systemd}
\label{chap:systemd}

3
chap/systemd.text Normal file
View File

@@ -0,0 +1,3 @@
\chapter{systemd}
\label{chap:systemd}

View File

@@ -5,6 +5,10 @@ de le présenter de façon harmonieuse, tout le monde l'a déja
fait, avec des outils divers et variés et des résultats parfois
(ou souvent) hasardeux.
Heureusement, Unix\index{Unix} a été conçu quasiment dès
le départ avec tout ce qu'il faut pour traiter et
mettre en page du texte.
\section{fmt et ses copains}
\index{fmt}\index{tr}
@@ -33,19 +37,20 @@ condimentum ante in metus iaculis quis congue diam commodo.
%-------------------------------------------------------------
\section{roff}
\index{roff}\label{roff}
\section{La famille \texttt{roff}}
\index{roff}\label{roff} \index{groff}\index{troff}
%
% https://linuxfr.org/users/karchnu/journaux/redecouverte-roff
% https://pjfichet.github.io/utroff/
%
% https://allthingsopen.org/articles/linux-and-unix-experiment-part-2
\textbf{Roff} est l'outil qui a permis à quelques hackers légendaire
de justifier auprès de leur hiérarchie le développement d'une machine
de jeu, il est donc légitime d'en parler, non ?
Après quelques minutes d'expérimentation, un premier souci arrive.
Après quelques minutes d'expérimentation, un premier souci arrive%
\footnote{Mais qui est peut-être causé par l'ancienneté de mon système ?}.
Il semble bien que \texttt{groff} ne sache pas lire les fichiers
encodés en \textbf{utf8}\index{utf8}. Il faut donc utiliser
un hack avec \texttt{recode} en prenant bien soin d'utiliser
@@ -59,7 +64,48 @@ D'un autre coté, c'est \texttt{roff} qui est utilisé pour formater
les pages du manuel Unix. La documentation, c'est important.
C'est pour ça que j'en cause page \pageref{chap:manpages}.
Voyons rapidement un exemple minumum compilable. XXX
Voyons rapidement un exemple minimum compilable\index{EMC},
le fichier
\texttt{premier.roff}~:
\lstinputlisting{code/roff/premier.roff}
Il y a deux choses différentes ici : les instructions de formatage
et le texte en lui-même.
Une instruction est placée en début de ligne.
Elle commence par un point, et est constituée de deux lettres,
eventuellement suivie de paramètres.
Nous avons \texttt{.ti} (\textsl{temporary indent})
qui gère l'indentation de la ligne qui suit,
et \texttt{.sp} (\textsl{spacing})
qui va sauter une ou plusieurs lignes.
Après compilation par la commande
"\texttt{nroff -Tutf8 < premier.roff > premier.text}",
nous obtenons ce résultat~:
\begin{verbatim}
hello world.
Ceci est le premier exemple avec nroff.
je vais essayer quelques variations de mise en page en jouant sur
les diverses marges, puis explorer les "mises en avant" comme le
gras, litalique, le soulignement, toussa. Ensuite il me faudra
solutionner le souci avec UTF8 :(
\end{verbatim}
On peut dire que c'est un bon début, avec juste deux commandes,
on a déja un résultat visible.
Voyons maintenant quelques autres possibilités du roff de base.
Mais une mise en page un peu
avancée peut devenir vite fastidieuse avec ces instructions
de bas niveau.
\subsection{eqn}
@@ -82,6 +128,10 @@ input files into commands that are understood by troff.
input files into commands that are understood by troff.
\end{quote}
\subsection{Autres trucs...}
\texttt{colcrt} : filter nroff output for CRT previewing
%-------------------------------------------------------------
\section{yodl}
\index{yodl}

39
chap/unused/flydraw.tex Normal file
View File

@@ -0,0 +1,39 @@
\section{Flydraw}\index{Flydraw}
Comment faire des dessins en écrivant des lignes de codes ?
\begin{quote}
flydraw is a drawing tool based on an interpreter which parses a
language featuring rich graphic primitives; it uses libgd to output
GIF, JPEG, or PNG\index{PNG} files.
\end{quote}
\lstinputlisting{code/dessiner.fly}
Pour le moment, les résultats ne sont pas encourageants~:
\begin{verbatim}
tth@fubar:~/Documents/TetaTricks/code$ flydraw < dessiner.fly
bad_parms -100000
tth@fubar:~/Documents/TetaTricks/code$
\end{verbatim}
Mais en s'obstinant un peu au \textsl{cargocult}, il
s'avère que la documentation et le code semble ne sont
pas d'accord. Et les messages d'erreur trop
cryptiques pour moi. Donc, on y arrive.
\begin{figure}[h]
\begin{center}
\includegraphics[scale=0.75]{code/flydraw}
\caption{Flydraw}
\end{center}
\end{figure}
Ceci dit, une lecture attentive du code source\footnote{UTSL!} permettra
de contourner ces petits désagréments, et de rédiger quelques exemples
d'utilisation amusants.
% package source
% http://deb.debian.org/debian/pool/main/w/wims/wims_4.17b+svn13454~dfsg1.orig.tar.gz

53
chap/unused/iodine.tex Normal file
View File

@@ -0,0 +1,53 @@
% ==============================================================
\section{Iodine}
\index{iodine}\label{iodine}
Iodine, c'est quoi ? C'est un ensemble de logiciels qui permettent
de se brancher sur l'Intertube même si on n'a pas d'accès
«~autorisé~» par la voisine qui a déménagée vers la
lointaine campagne avec sa friboite.
\begin{quote}
This is a piece of software that lets you tunnel IPv4 data through a
DNS server. This can be usable in different situations where internet
access is firewalled, but DNS queries are allowed.
The name iodine was chosen since it starts with IOD (IP Over DNS)
and since iodine has atomic number 53, which happens to be the DNS
port number.
\end{quote}
À ce jour (2 septembre 2013) ce que vous allez lire est basé
sur la version \texttt{0.6.0-rc1} et sera probablement plus ou
moins incompatible avec les versions précedentes ou suivantes, ymmv.
\begin{verbatim}
root@plop:iodine-0.6.0-rc1# bin/iodine teton.mooo.com -f -P m
Opened dns0
Opened UDP socket
Sending DNS queries for teton.mooo.com to 192.168.1.1
Autodetecting DNS query type (use -T to override)..................
iodine: No suitable DNS query type found. Are you connected to a network?
iodine: If you expect very long roundtrip delays, use -T explicitly.
iodine: (Also, connecting to an "ancient" version of iodined won't work.)
\end{verbatim}
\subsection{Coté serveur}
Je pense qu'il faut commencer par voir du coté du DNS
pour déléguer une sous-zone à la machine qui va faire tourner
le serveur iodine. Mais j'en suis pas certain. RTFM.
\subsection{Coté client}
Je n'en sais pas plus non plus...
\begin{verbatim}
sudo bin/iodine -f -P s3cr3tp4ssw0rd i.buvette.org
\end{verbatim}
Donc, n'ayant plus vraiment (pour le moment) le besoin d'utiliser
ce passe-muraille, je vais laisser ce passage en l'état...
% ==============================================================

View File

@@ -62,7 +62,6 @@ Il existe bien une alternative, mais je n'ai pas encore essayé~:
\# Write out 20 png format frames from a video starting at 3 minutes, 46 seconds.
Tu peux générer les images de transition avec
ImageMagick\index{ImageMagick} :
\texttt{convert a.png b.png -alpha set -channel A
@@ -149,8 +148,6 @@ OMFG! Il manque le son.
% mais où ai-je bien pu trouver ça ?
%
\begin{verbatim}
read -p "*** Press Enter to start recording ***"
"$FFMPEGBIN" \
@@ -226,8 +223,8 @@ Et avec du \textbf{Zenitram} dedans \textit{:)}
\begin{quote}
mpv is a media player based on MPlayer and mplayer2. It supports a wide
variety of video file formats, audio and video codecs, and subtitle
types. Special input URL types are available to read input from a vari
ety of sources other than disk files. Depending on platform, a variety
types. Special input URL types are available to read input from a variety
of sources other than disk files. Depending on platform, a variety
of different video and audio output methods are supported.
\end {quote}
@@ -244,9 +241,11 @@ de codecs, la foultitude de containers, et les nombreuses variantes de
combinaisons codec/container rendent la compréhension de cet univers
assez perturbante.
\subsection{rtmp} \index{rtmp}
\texttt{flvstreamer -r rtmp://lacantine.live-fstreams.cdn02.rambla.be:1935/live-lacantine/live-lacantine-2 | mplayer -}
\index{rtmp}
\texttt{encodedv} - encode a series of images to a digital video stream
\index{encodedv}
% --------------------------------------------------------------------

View File

@@ -21,6 +21,10 @@ image.
\textsl{Video For Linux, second edition.}
%
% PLEASE EXPLAIN !
%
\begin{verbatim}
tth@delirium:~$ v4l2-ctl --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
@@ -43,6 +47,45 @@ Il faut certainement passer par une suite d'appels
\texttt{ioctl}\index{ioctl} après ouverture du device,
mais la documentation est difficile à \textsl{greper}.
% --------------------------------------------------------------------
% nouveau : Tue Sep 3 11:14:13 UTC 2024
\section{libwebcam} \index{libwebcam}
\begin{quote}
The Webcam Library libwebcam is designed to simplify
the development of webcam applications, primarily on Linux but
with an option to be ported to other platforms, in particular
Solaris. It realizes part of what the unwritten Video4Linux user
space library was always supposed to be: an easy to use library
that shields its users from many of the difficulties and problems
of using the V4L2 API directly.
\end{quote}
% --------------------------------------------------------------------
% nouveau du Tue Sep 17 08:03:49 UTC 2024
\section{UVC} \index{UVC}
\begin{quote}
L'USB video device class (aussi appelé USB video class abrégé en UVC)
est un protocole de gestion de périphériques électroniques vidéo via
les ports de type USB\index{USB}.
Il permet de gérer les flux vidéo dans différents encodages, les images fixes,
ainsi que le contrôle des appareils qui le permettent.
\end{quote}
Le jour\footnote{Lundi 17 septembre 2024} même
où je me penche sur cette techno, premier souci~:
\textsl{Le pilote pour les WebCams UVC
standard utilisé pour les caméras USB modernes
nest pas encore au point et nest pas inclus dans les
versions publiées de Haiku.}
% --------------------------------------------------------------------
\section{GameBoy camera}
@@ -81,18 +124,21 @@ fonctionne et le rendu ressemble.
\index{vgrabbj}
D'après la manpage :
« \textit{
« \textit{%
vgrabbj is a program that will grab images from any v4l-capable device
which supports one of the rgb24, rgb32, yuv420, yuv420p, yuyv, or
yuv422 palettes and saves the image as a .jpg, .png, or .pnm file.
} »
Quelques options à connaitre : \texttt{-S} échange des
deux composantes R et B; \texttt{-s <device>} affiche
les capacités du périphérique v4l\index{v4l}.
Quelques options à connaitre :
\texttt{-S} échange des
deux composantes R et B (parfois utile avec des caméras \textit{noname});
\texttt{-s <device>} affiche
les capacités du périphérique v4l\index{v4l} que l'on sélectionne
avec \texttt{-d /dev/vidz0}.
Il y a plus de choses à dire, avec un exemple concret. XXX\index{XXX}
% --------------------------------------------------------------------
\section{Cheese}

View File

@@ -6,7 +6,7 @@
% ==============================================================
\section{Apache, Nginx} \index{Apache} \index{nginx}
Apache (\textsl{A patchy server} et Nginx sont de grands classiques,
Apache (\textsl{A patchy server}) et Nginx sont de grands classiques,
voire même, dans le cas d'Apache, un grand ancien.
Que nous ne verrons pas pour le moment. Je vais plutôt me concentrer
@@ -60,34 +60,21 @@ if you want):
\begin{verbatim}
tth@ramen:~/Houba/Fractales90$ apt show libmicrohttpd12
Package: libmicrohttpd12
Version: 0.9.72-2
Priority: optional
Section: libs
Source: libmicrohttpd
Maintainer: Daniel Baumann <daniel.baumann@progress-linux.org>
Installed-Size: 211 kB
Depends: libc6 (>= 2.17), libgnutls30 (>= 3.7.0)
Homepage: https://www.gnu.org/software/libmicrohttpd/
Tag: role::shared-lib
Download-Size: 109 kB
APT-Sources: http://deb.debian.org/debian bullseye/main amd64 Packages
Description: library embedding HTTP server functionality
GNU libmicrohttpd is a small C library that is supposed to make it
easy to run an HTTP server as part of another application.
Key features that distinguish GNU Libmicrohttpd from other
projects are:
* C library: fast and small
* API is simple, expressive and fully reentrant
* Implementation is HTTP 1.1 compliant
* HTTP server can listen on multiple ports
* Four different threading models (select, poll, pthread, thread pool)
* Support for IPv6
* Support for SHOUTcast
* Support for incremental processing of POST data (optional)
* Support for basic and digest authentication (optional)
* Support for SSL3 and TLS
\end{verbatim}
\lstinputlisting[language=C]{code/inet/plopserver.c}
% ==============================================================
\section{Mais encore ?}
Il doit bien exister des modules Perl pour faire facilement
un serveur web, non ?
Même qu'on pourrait en écrire un rien qu'avec les sockets.
% ==============================================================

View File

@@ -1,4 +1,6 @@
10 CLEAR
20 FOR I=1 TO 10
20 FOR I=2 TO 5
30 PRINT I, I*I
40 NEXT I
50 SYSTEM

View File

@@ -1,5 +1,5 @@
open window 511,511
for x=10 to 495 step 5:for y=10 to 495 step 5
colour x/2,y/2,0
fill rectangle x,y,x+5,y+5
fill rectangle x+1,y+1,x+4,y+4
next y:next x

1
code/C/.gitignore vendored
View File

@@ -1,3 +1,4 @@
fgets-simple
demo-strtok
packtest
use_envp

View File

@@ -2,7 +2,16 @@
# exemples pour le chapitre sur le C
# new Sat Feb 11 12:06:34 CET 2023
all: no-op slowprint fgets-simple packtest
all: no-op slowprint fgets-simple packtest use_envp
# simplified version of the canonical first C program
hello: hello.c Makefile
gcc -Wall $< -o $@
# please show me the command line
arguments: arguments.c Makefile
gcc -Wall $< -o $@
no-op: no-op.c Makefile
gcc -Wall $< -o $@
@@ -19,3 +28,8 @@ demo-strtok: demo-strtok.c Makefile
# added Wed Mar 27 10:01:41 UTC 2024
packtest: packtest.c
gcc -Wall $< -o $@
# added Thu Aug 8 13:44:58 UTC 2024
use_envp: use_envp.c Makefile
gcc -Wall $< -o $@

16
code/C/use_envp.c Normal file
View File

@@ -0,0 +1,16 @@
/* using envp for fun and profit */
#include <stdio.h>
int main(int argc, char *argv[], char *envp[])
{
char *cptr;
int idx = 0;
cptr = envp[idx];
while ( NULL != (cptr=envp[idx]) ) {
fprintf(stderr, "envp[%d] %p --> %s\n",
idx, cptr, cptr);
idx++;
}
return 0;
}

View File

@@ -10,23 +10,9 @@ ex_curses: ex_curses.c Makefile
thread-demo: thread-demo.c Makefile
gcc -Wall -pthread $< -o $@
hello: hello.c Makefile
gcc -Wall $< -o $@
arguments: arguments.c Makefile
gcc -Wall $< -o $@
voirenv: voirenv.c Makefile
gcc -Wall $< -o $@
#------------- OSC -----------------------
osc: send-osc listen-osc
send-osc: send-osc.c Makefile
gcc -Wall $< -llo -o $@
listen-osc: listen-osc.c Makefile
gcc -Wall $< -llo -o $@
#------------- IPC -----------------------

9
code/OSC/Makefile Normal file
View File

@@ -0,0 +1,9 @@
#------------- OSC -----------------------
osc: send-osc listen-osc
send-osc: send-osc.c Makefile
gcc -Wall $< -llo -o $@
listen-osc: listen-osc.c Makefile
gcc -Wall $< -llo -o $@

0
code/OSC/README.md Normal file
View File

48
code/OSC/listen-osc.c Normal file
View File

@@ -0,0 +1,48 @@
/* LISTEN OSC */
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <lo/lo.h>
#define LOCAL_PORT "9000"
/* ------------------------------------------------------- */
void error(int num, const char *msg, const char *path)
{
fprintf(stderr, "liblo server error %d in path %s : %s\n",
num, path, msg);
exit(1);
}
/* ------------------------------------------------------- */
int handler(const char *path, const char *types, lo_arg **argv,
int argc, void *data, void *udata)
{
static int event_number = 1;
printf("------ event #%d :\n", event_number++);
printf("\tpath '%s' types '%s' argc %d\n",
path, types, argc);
printf("\tdata %p\n", data);
// if (NULL!=data) printf("\t >%s<\n", data);
printf("\tudata %p\n", udata);
if (NULL!=udata) printf("\t\t>%s<\n", (char *)udata);
return 0;
}
/* ------------------------------------------------------- */
char signature[] = "Bourtoulots";
int main(int argc, char *argv[])
{
lo_server_thread st;
int count = 0;
st = lo_server_thread_new(LOCAL_PORT, error);
lo_server_thread_add_method(st, "/demo", "is", handler, signature);
lo_server_thread_start(st);
for (;;) {
fprintf(stderr, "%6d I'm alive\n", count++); sleep(10);
}
return 0;
}

View File

@@ -11,8 +11,9 @@ int main(int argc, char *argv[])
lo_address loana;
int foo;
fprintf(stderr, "sending to %s:%s\n", REMOTE_HOST, REMOTE_PORT);
loana = lo_address_new(REMOTE_HOST, REMOTE_PORT);
foo = lo_send(loana, "/dev/kmem", "is", 61, "meg, efface !");
fprintf(stderr, "foo %d\n", foo);
foo = lo_send(loana, "/demo", "is", 61, "meg, efface !");
fprintf(stderr, "got a %d return code ?\n", foo);
return 0;
}

1
code/POV/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
*.png

3
code/POV/Makefile Normal file
View File

@@ -0,0 +1,3 @@
hello.png: hello.pov Makefile
povray -I$< -o$@ -W640 -H0 -Q0

0
code/POV/README.md Normal file
View File

8
code/POV/hello.pov Normal file
View File

@@ -0,0 +1,8 @@
/* HELLO.POV */
#version 3.7;
global_settings { assumed_gamma 1.0 }
#include "colors.inc"
plane { y, 0 }
sphere { <0, 0.50, 0>, 0.333 }
light_source { <-210, 350, -530> color rgb <1, 1, 1>}

3
code/Perl/README.md Normal file
View File

@@ -0,0 +1,3 @@
# Perl
The famous **Pathologic Eclectic Rubish Lister was here** !!!

8
code/Perl/getip.pl Executable file
View File

@@ -0,0 +1,8 @@
#! /usr/bin/perl
use strict;
use LWP::UserAgent ();
my $ua = LWP::UserAgent->new(agent => "curl");
my $url = "https://ifconfig.io";
my $req = HTTP::Request->new('GET' => $url);
my $res = $ua->simple_request($req);
print($res->content());

10
code/Perl/listurls.pl Executable file
View File

@@ -0,0 +1,10 @@
#!/usr/bin/perl
use strict;
use LWP::Simple;
use HTML::Parser;
my $page = get "https://tetalab.org";
my $parser = HTML::Parser->new;
$parser->parse($page);

1
code/SDL2/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
strangebug

4
code/SDL2/Makefile Normal file
View File

@@ -0,0 +1,4 @@
strangebug: strangebug.c Makefile
gcc -Wall $< -lSDL2 -o $@

11
code/SDL2/README.md Normal file
View File

@@ -0,0 +1,11 @@
# Simple DirectMedia Layer
The *[Simple DirectMedia Layer](https://libsdl.org/)
is a cross-platform development library designed
to provide low level access to audio, keyboard, mouse, joystick, and
graphics hardware via OpenGL/Direct3D/Metal/Vulkan.*
Paf, premier essai, [premier souci](strangebug.md) **:)**

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

47
code/SDL2/strangebug.c Normal file
View File

@@ -0,0 +1,47 @@
/*
* Strange Bug ?
*
* gcc -Wall strangebug.c -lSDL2 -o strangebug
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <SDL2/SDL.h>
int main(int argc, char *argv[])
{
SDL_Window *win;
SDL_Renderer *rend;
int foo, idx, idy;
foo = SDL_CreateWindowAndRenderer(256, 256,
SDL_WINDOW_SHOWN, &win, &rend);
if (foo) {
fprintf(stderr,
"Err %d CreateWindowAndRenderer : %s",
foo, SDL_GetError());
exit(1);
}
SDL_SetRenderDrawColor(rend, 255, 0, 0, 0);
SDL_RenderClear(rend);
SDL_RenderPresent(rend);
for (idx=0; idx<256; idx++) {
for (idy=0; idy<256; idy++) {
SDL_SetRenderDrawColor(rend,
127, idx, idy, 0);
SDL_RenderDrawPoint(rend, idx, idy);
}
SDL_RenderPresent(rend);
// SDL_Delay(50); /* Is the bug here ? */
}
SDL_RenderPresent(rend);
sleep(30);
SDL_DestroyRenderer(rend);
SDL_DestroyWindow(win);
return 0;
}

17
code/SDL2/strangebug.md Normal file
View File

@@ -0,0 +1,17 @@
# `strangebug`, ou le bug étrange
Pour mes premiers pas dans la sdl, j'ai voulu faire un gradient de couleur
dans une petite fenêtre, quelque chose de vraiment simple, me diriez-vous,
mais qui cache une chose étrange...
La version que j'ai utilisée pour ça (et qui est <u>très</u> ancienne) est
la 2.0.9 et j'ai beau me creuser la tête, je ne vois pas d'explication *:)*
Voici le [Code source](strangebug.c). Si vous décommentez la ligne
marquée, seul une colonne sur deux est correctement tracée,
comme le montre cette capture d'écran :
![un dégradé plein de rayures](picz/strangebug.png)
*Please explain that ...*

0
code/awk/README.md Normal file
View File

20
code/awk/demo-func.awk Executable file
View File

@@ -0,0 +1,20 @@
#!/usr/bin/awk -f
BEGIN {
print "---- demo fonction ----"
print_sinus(1.0)
print_dist(0.5, 0.5, 0.0)
}
# the simple version
function print_sinus ( value )
{
printf "sin(%f) = %f\n", value, sin(value)
}
# version with local variables.
function print_dist(x, y, z, dist)
{
dist = sqrt(x*x + y*y + z*z)
printf "distance from center = %f\n", dist
}

View File

@@ -1,15 +1,21 @@
#!/usr/bin/awk -f
# create the sdl object: an union of sphere
BEGIN {
print "#declare Bubules = object"
nbre = 0
print "#declare Bubulles = object"
print "{ \nunion { "
}
# active portion of the code
{
printf(" sphere { <%f, %f, %f>, %f }\n", \
$1, $2, $3, $4 )
nbre++
}
# closing sdl structure
END {
print " }\n}"
printf "// %d bubulles\n", nbre
}

0
code/bdd/README.md Normal file
View File

20
code/bdd/mkgdbm.pl Normal file
View File

@@ -0,0 +1,20 @@
#!/usr/bin/perl -w
use strict;
use GDBM_File;
my $nomdb = "exemple.gdbm";
my (%DB, @champs);
my ($user, $gecos);
open(SOURCE, "< /etc/passwd") or die "source $!";
tie(%DB, "GDBM_File", $nomdb, GDBM_WRCREAT, 0666) or die "gdbm $!";
while (<SOURCE>) {
@champs = split ":", $_;
$user = $champs[0]."\0";
$gecos = $champs[4]."\0";
$DB{$user} = $gecos;
}
untie %DB;
close SOURCE;
0;

View File

@@ -1,14 +1,10 @@
/*
*
* spy_getenv.so: spy_getenv.c Makefile
* gcc -Wall -shared -fPIC $< -ldl -o $@
*
*/
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#define __USE_GNU
#include <dlfcn.h>
@@ -18,15 +14,12 @@ char *getenv(char *envname)
{
static char *arrow = "--getenv--> ";
static char *wtf = " --> (nil)";
char *content;
original_getenv orig_getenv;
orig_getenv = (original_getenv)dlsym(RTLD_NEXT, "getenv");
write(STDERR_FILENO, arrow, strlen(arrow));
write(STDERR_FILENO, envname, strlen(envname));
content = orig_getenv(envname);
if (NULL != content) {
write(STDERR_FILENO, "=", 1);
@@ -35,9 +28,7 @@ if (NULL != content) {
else {
write(STDERR_FILENO, wtf, strlen(wtf));
}
write(STDERR_FILENO, "\n", 1);
return content;
}

View File

@@ -1,6 +1,7 @@
plplotting
dessiner
printty
*.png
*.gif

View File

@@ -1,6 +1,14 @@
INCS = -I/usr/include/plplot -I/usr/lib/x86_64-linux-gnu/fortran/modules/plplot
# sinple examples
printty: printty.f90 Makefile
gfortran -g $< $(INCS) -o $@
# more complex garbage
plplotting: plplotting.f90 Makefile
gfortran -g $< $(INCS) -lplplotfortran -o $@
@@ -12,3 +20,4 @@ plot89a.gif: dessiner Makefile
rm -f WS/A????.png
./dessiner
convert -delay 10 -colors 42 WS/A????.png $@
wc -c plot89a.gif

View File

@@ -3,3 +3,8 @@
Pour les explications, il faut aller lire le livre ou
les codes source.
## Dessiner...
Je pense qe l'on devrait parler ici de plplot.

View File

@@ -8,8 +8,8 @@ program dessiner
call plgver(version)
write (*,'(" ",a,a)') 'plPlot version: ', trim(version)
call dessin_X11 (0.12, 1.51, 11)
!! call dessin_dans_un_fichier ()
!! call dessin_X11 (0.12, 1.51, 11)
call dessin_dans_un_fichier ()
contains ! -----------------------------
!------------------------------------------------------
@@ -33,7 +33,7 @@ subroutine dessin_X11 (sha, shb, color)
call plsdev('xwin')
call plinit ()
call plenv (-2.5, 2.5, -2.5, 2.5, 1, 2)
call plenv (-2.5, 2.5, -2.5, 2.5, 1, 1)
amp = 2.06
do i = 1, lg
@@ -52,47 +52,67 @@ subroutine dessin_X11 (sha, shb, color)
end subroutine
!------------------------------------------------------
!- _ __ ___ ___ ___
!- __ _ (_) / _| ( _ ) / _ \ __ _ |__ \
!- / _` | | | | |_ / _ \ | (_) | / _` | / /
!- | (_| | | | | _| | (_) | \__, | | (_| | |_|
!- \__, | |_| |_| \___/ /_/ \__,_| (_)
!- _ __ ___ ___
!- __ _ (_) / _| ( _ ) / _ \ __ _
!- / _` | | | | |_ / _ \ | (_) | / _` |
!- | (_| | | | | _| | (_) | \__, | | (_| |
!- \__, | |_| |_| \___/ /_/ \__,_|
!- |___/
!-
subroutine dessin_dans_un_fichier ()
integer, parameter :: nbpts = 20
real, parameter :: usz = 15.0 ! univers size
integer, parameter :: nbpts = 179
integer, parameter :: nbframes = 99
real, parameter :: usz = 17.0 ! univers size
real :: xa(nbpts), ya(nbpts)
real :: xb(nbpts), yb(nbpts)
real :: x(nbpts), y(nbpts)
integer :: frame, i
real :: coef
character(len=89) :: filename
character(len=89) :: buffer
character(len=3) :: str
print *, 'Dessin dans un fichier'
! build the startup conditions
do i=1, nbpts
x(i) = usz * (rand() - 0.5000)
y(i) = usz * (rand() - 0.5000) * 0.50
coef = real(i) * 0.051
xa(i) = usz * 0.80 * sin(coef*2.0)
ya(i) = usz * 0.70 * (-0.27 + cos(coef*3.0))
xb(i) = usz * 0.11 * (rand() - 0.54)
yb(i) = usz * 0.11 * (rand() - 0.97)
enddo
do frame= 0, 119
! iterate over frames.
do frame= 0, nbframes
coef = real(frame) / real(nbframes)
coef = cos(coef*3.141592654)
write (filename, "(a, i4.4, a)") "WS/A", frame, ".png"
print *, frame, ' => ', trim(filename)
! print *, frame, "!", coef, ' => ', trim(filename)
call plsdev ('pngcairo')
call plsfnam (trim(filename))
call plinit ()
call plenv (-10., 10., -10., 10., 0, 1)
call plenv (-usz, usz, -usz, usz, 0, 1)
call plcol0 (3)
! compute the real picture...
do i=1, nbpts
x(i) = x(i) + 1.2 * (rand() - 0.5000)
y(i) = y(i) + 1.2 * (rand() - 0.5000)
call plline (x, y)
x(i) = xa(i)*coef - xb(i)*(1.0-coef)
y(i) = ya(i)*coef - yb(i)*(1.0-coef)
enddo
write(buffer, "(i3.3)") frame
str = trim(buffer)
call plcol0 (15)
call plstring (x, y, buffer)
! ... and plot it *now*
call plline (x, y)
call plcol0 (15) ! 15 is pure white
call pllab("Apéro level", "Choupitude", "-- Philosophie de comptoir --")
call plend ()
enddo

7
code/fortran/printty.f90 Normal file
View File

@@ -0,0 +1,7 @@
! new: Sun Sep 15 05:04:37 UTC 2024
program hello
implicit none
print *, "This is the 'printty' program"
end

0
code/inet/Makefile Normal file
View File

5
code/inet/README.md Normal file
View File

@@ -0,0 +1,5 @@
# Internet protocols
## Finger
Show us the [code](finger.md) !

View File

7
code/inet/finger.md Normal file
View File

@@ -0,0 +1,7 @@
# Finger
Sur le port 79/tcp.
[https://tools.ietf.org/html/rfc1288](https://tools.ietf.org/html/rfc1288)
[https://www.bortzmeyer.org/1288.html](https://www.bortzmeyer.org/1288.html)

4
code/inet/plopserver.c Normal file
View File

@@ -0,0 +1,4 @@
#include <stdio.h>
int main(int argc, char *argv[])
{ puts("plop"); return 0 }

2
code/inet/plopserver.md Normal file
View File

@@ -0,0 +1,2 @@
# Plop serveur

3
code/inet/qotd.sh Normal file
View File

@@ -0,0 +1,3 @@
#!/bin/bash
/usr/games/fortune -a -n 500

View File

@@ -1,15 +0,0 @@
/* LISTEN OSC */
#include <stdio.h>
#include <lo/lo.h>
#define LOCAL_PORT "9000"
int main(int argc, char *argv[])
{
lo_server_thread st;
st = lo_server_thread_new(LOCAL_PORT, NULL);
return 0;
}

2
code/roff/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
*.text

6
code/roff/Makefile Normal file
View File

@@ -0,0 +1,6 @@
# this is not a serious job !
premier.text: premier.roff Makefile
nroff -Tutf8 < $< > $@

2
code/roff/README.md Normal file
View File

@@ -0,0 +1,2 @@
# La famille des roffs

10
code/roff/premier.roff Normal file
View File

@@ -0,0 +1,10 @@
.ti 12
hello world.
.sp 1
Ceci est le premier exemple avec nroff.
.sp 2
je vais essayer quelques variations de mise en page
en jouant sur les diverses marges,
puis explorer les "mises en avant"
comme le gras, l'italique, le soulignement, toussa.
Ensuite il me faudra solutionner le souci avec UTF8 :(

View File

@@ -1,3 +1,3 @@
#!/bin/sh
. ./fonctions.sh
source ./fonctions.sh
message "hello world"

View File

@@ -1,10 +1,10 @@
#!/bin/bash
TITLE="Here Doc"
TITLE="Here Doc ($$)"
gnuplot << __EOC__
set term dumb
set grid
set term dumb size 72,24
# set grid
set title "$TITLE"
plot [x=0:pi*2] sin(x)
plot [x=0:pi*3] [-1:1] 0.7*sin(x)
__EOC__

View File

@@ -1,4 +0,0 @@
#!/usr/bin/awk -f
{ printf "%5d\t%s\n", NR, $0; }

View File

@@ -24,11 +24,12 @@
\makeindex
\setlength \parindent {2em}
\setlength \parskip {0.30em} % XXX
\setlength \parindent {1.5em}
\setlength \parskip {0.25em} % XXX
%------ reglages des 'listings'
\lstset{frame=single} % dessin d'un cadre autour du listing
\lstset{frame=leftline} % éventuel dessin d'un cadre autour du listing
\lstset{basicstyle=\ttfamily\small}
\lstset{aboveskip=0.7em,belowskip=0.7em}
@@ -55,7 +56,7 @@ Mais elles sont en vrac, et surtout, elles sont reprises
d'une très ancienne version (circa 2011) et donc,
peut-être pas vraiment d'actualité.
\vspace{3em}
\vspace{1em}
Cependant, toute cette ouvrage est en cours de
@@ -82,13 +83,19 @@ En \textbf{mars 2024}, je déménage dans le Gers, au milieu
de la campagne, et le travail sur cette ouvrage peut
reprendre dans des conditions plus sereines.
Je vais même tenter de faire avec seulement l'aide
de mes souvenirs et les manpages.
de mes souvenirs, de ma collection de livres
(qui sera bientôt racontée page \pageref{chap:livres}),
et des indispensables \textsl{manpages}.
C'est rarement facile.
Il faut parfois plonger dans les lignes de code\index{UTSL}.
\vspace{3em}
Le code \LaTeX{} et les fichiers d'exemples sont disponibles
\vspace{2em}
Le code \LaTeX{} de cet ouvrage
et la plupart des fichiers d'exemples sont disponibles
en ligne sur le site du Tetalab.
Your mileage may vary, film at 11\dots
\textsl{Your mileage may vary, film at 11\dots}
\texttt{https://git.tetalab.org/tTh/TetaTricks}
@@ -126,15 +133,16 @@ Your mileage may vary, film at 11\dots
\input{chap/video}
\input{chap/graphisme}
% \input{chap/dessin} % nouveau 5 septembre 2024
\input{chap/gnuplot}
% \input{chap/print}
\input{chap/print}
\input{chap/webcam}
% \input{chap/SCSI}
\input{chap/X11}
\input{chap/wayland} % nouveau septembre 2023
% \input{chap/wayland} % nouveau septembre 2023
\input{chap/Fortran}
\input{chap/scripting}
\input{chap/Arduino}
% \input{chap/Arduino}
\input{chap/Basic}
\input{chap/R} % new octobre 2023
% \input{chap/GMP}
@@ -147,20 +155,20 @@ Your mileage may vary, film at 11\dots
% \input{chap/MINITEL}
% \input{chap/Raspberry}
% \input{chap/Fedora}
% \input{chap/IPv6}
\input{chap/IPv6}
\input{chap/threads}
\input{chap/IPC}
\input{chap/dosbox}
\input{chap/manpages}
\input{chap/grub}
% \input{chap/grub}
\input{chap/photos}
\input{chap/plugins}
\input{chap/Bonjour}
% \input{chap/Bonjour}
\input{chap/ioctl}
\input{chap/debug}
% \input{chap/buzybox}
\input{chap/gif89a}
\input{chap/IRC}
% \input{chap/IRC}
% \input{chap/SCCS} % nouveau 18 mars 2021
\input{chap/Usenet}
\input{chap/DNS}
@@ -168,15 +176,16 @@ Your mileage may vary, film at 11\dots
\input{chap/webserver}
\input{chap/hardware}
\input{chap/gadgets}
\input{chap/sdr}
% \input{chap/sdr}
\input{chap/bdd} % nouveau 26 octobre 2022
\input{chap/slang}
% \input{chap/slang}
\input{chap/curses}
% \input{chap/openwrt}
\input{chap/WiFi}
% \input{chap/GIT}
\input{chap/divers}
% \input{chap/peer2peer}
\input{chap/livres}
% ==============================================================
@@ -185,6 +194,8 @@ Your mileage may vary, film at 11\dots
\textbf{Non, la route est longue, mais la voie est libre.}
\vspace{4em}
Si vous êtes arrivés jusque ici, c'est que vous avez (peut-être ?)
parcouru cet ouvrage, et constaté à quel point il est en friche.
Beaucoup de chapitres sont vraiment incomplets, voire cruellement