Compare commits

..

219 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
tTh
fd3a4b8336 *t vs t[] 2024-08-08 13:56:21 +02:00
tTh
3f76689640 corrected an index 2024-08-08 12:50:56 +02:00
tTh
055a470a2b corrected an index 2024-08-08 12:48:06 +02:00
tTh
e9acd130ea work done on print chapter 2024-08-08 08:43:58 +02:00
tTh
6a025f9503 bla 2024-07-11 02:25:38 +02:00
tTh
352ab26ba7 + abcde 2024-07-11 02:24:13 +02:00
tTh
f7b5af5a9b wesh scanf ! 2024-07-11 02:23:30 +02:00
tTh
326926aa16 cosmetic 2024-07-07 19:54:33 +02:00
tTh
58ba52762c add a chapter about DMX512 2024-06-04 01:37:47 +02:00
tTh
66bc3d19c4 add code/C/packtest.c 2024-03-27 11:05:42 +01:00
tTh
0818f87582 dernier commit avant le Gers 2024-03-11 02:20:47 +01:00
tTh
c5b0e17bbb cosmetic + kbhit 2024-02-22 21:39:39 +01:00
tTh
f53ee92b02 add advanced section 2024-02-22 20:08:21 +01:00
tTh
b1ebd390b4 now you can specifiy the slowdown 2024-01-12 03:43:49 +01:00
tTh
70545d9355 need a lot of work 2024-01-11 02:08:26 +01:00
tTh
ca1b226a13 wtf? 2024-01-11 02:07:04 +01:00
tTh
6ad95e84ff fine tuning 2024-01-11 01:49:15 +01:00
tTh
c09df69af3 a chapter about make 2024-01-11 01:42:44 +01:00
tTh
95c17583f5 add some info on config of ImageMagick 2023-12-11 09:55:45 +01:00
tTh
2a24703136 more bla 2023-11-29 14:12:03 +01:00
tTh
da080e47e3 add a nasty R chapter 2023-11-29 14:10:57 +01:00
tTh
72892afeff raler un peu 2023-10-13 22:05:00 +02:00
tTh
c3e227f472 a 771 lines diff 2023-10-08 21:56:41 +02:00
tTh
c6fe2224bf more on strtok 2023-09-03 22:24:56 +02:00
tTh
42ead5b695 no more fedora 2023-09-03 22:24:28 +02:00
tTh
ef609cbb57 little edits 2023-09-03 20:30:43 +02:00
tTh
b404dde88b cosmetic 2023-09-03 07:49:40 +02:00
tTh
9d08631b32 demo de strtok 2023-09-01 12:37:36 +02:00
tTh
db14adeb86 cosmetic 2023-09-01 11:06:31 +02:00
tTh
bfef02de49 little clean 2023-07-15 11:45:22 +02:00
tTh
a1f8b096e3 talking about fgets 2023-07-15 09:55:13 +02:00
tTh
8ba88d2b8d fgets investigations 2023-07-15 09:19:50 +02:00
tTh
aeeefe061d bla 2023-07-14 21:17:27 +02:00
tTh
07ae0d5a8a exemple minimal compilable 2023-07-14 16:09:53 +02:00
tTh
97909fdcd4 summer is coming 2023-06-29 11:23:11 +02:00
tTh
52b7bbe6ef #sundaycommit 2023-04-02 23:32:29 +02:00
tTh
28c260ea5e first gif89a with fortran & plplot 2023-03-21 15:03:09 +01:00
tTh
0db76fef58 assez pour ce soir 2023-03-21 00:16:54 +01:00
tTh
aa4f0664cb premier dessin avec plplot 2023-03-07 20:49:36 +01:00
tTh
04eeae6de9 cosmetic 2023-03-06 14:43:24 +01:00
tTh
aa3d078e21 tweak fortran pages 2023-03-04 12:48:05 +01:00
tTh
6c2d6476b8 new chapter: Basic 2023-03-03 21:27:18 +01:00
tTh
6546d1d5c0 add a TODO 2023-03-03 20:21:15 +01:00
tTh
a47c1f6d7a bricolages... 2023-02-11 12:19:00 +01:00
tTh
43202ab62e parce que... 2023-02-09 23:41:16 +01:00
tTh
51395297e7 last commit of january 2023-01-29 22:16:13 +01:00
tTh
c52abb9fda dernier commit 2022 2022-12-31 15:39:58 +01:00
tTh
87fb8ed834 time to sleep... 2022-12-16 20:41:32 +01:00
tTh
75a94fc6c7 cosmetic 2022-10-30 22:51:57 +01:00
tTh
d8369bef0a commit nocturne 2022-10-05 06:08:23 +02:00
tTh
9e8a6b3411 a new tool from tth 2022-10-04 19:31:50 +02:00
tTh
5a610e0926 technical commit 2022-10-04 19:27:24 +02:00
tTh
14b3ef6c3b on se lance sur ABC 2022-10-04 19:26:53 +02:00
tTh
11d559eade clean output messages 2022-10-04 05:47:23 +02:00
tTh
cb76c0350f rester bien sagement en ASCII 2022-10-03 17:45:11 +02:00
tTh
73a611e55f + voirenv 2022-09-12 01:39:21 +02:00
tTh
f79ae3ef80 more bla 2022-09-12 01:36:48 +02:00
tTh
1fabb2c89f cosmetic + G2 2022-09-12 01:21:21 +02:00
tTh
f2acdcef9b go tth, go ! 2022-09-12 01:20:28 +02:00
tTh
9e882d49cb add some ugly code 2022-09-12 01:18:07 +02:00
tTh
3794eb2608 small additions 2022-06-24 03:19:32 +02:00
tTh
d1d3b7c94e patch a bug after file renaming 2022-06-10 10:42:15 +02:00
tTh
2efd5bec74 un nouveau départ 2022-06-09 21:15:48 +02:00
tTh
37b18ecbef nouveau depart 2022-06-09 21:08:46 +02:00
tth
7dea31c24c small patches for a grey sunday 2022-04-03 11:56:49 +02:00
tth
53c0dfbf8a more bla... 2022-04-01 14:23:45 +02:00
tth
89abb2bb04 + Zenitram 2022-03-18 21:40:44 +01:00
tth
fa3b83fa25 bla... 2022-02-16 00:53:49 +01:00
tth
a6ff3f5086 un petit push, parfois 2022-01-29 22:46:41 +01:00
tth
6cbac48848 + portaudio 2022-01-24 21:24:11 +01:00
tth
2f27b7f29e bla 2022-01-19 23:31:51 +01:00
tth
2b54a9d6bb + astronomie 2022-01-02 02:42:48 +01:00
tth
03eaf267ef first commit of 2020+2 2022-01-01 00:16:33 +01:00
tth
b9bef8329a last commit of 2020+1 2022-01-01 00:04:23 +01:00
tth
b36e5ea983 more bla, again 2021-12-23 20:06:52 +01:00
tth
09a846f9b1 xform - yesno.c 2021-11-18 14:36:08 +01:00
tth
8a17ec60c5 + playsample.ck 2021-11-03 09:08:40 +01:00
tth
7dba31d281 windowmanager 2021-11-03 09:05:49 +01:00
tth
b0a682c849 more blabla again 2021-10-30 15:54:36 +02:00
tth
25055fed70 on avance pas à pas... 2021-10-23 14:25:18 +02:00
tth
3e2fb4a408 apero time 2021-10-19 19:07:28 +02:00
tth
7a4ae87c0e some bla 2021-10-15 23:22:38 +02:00
tth
f19fefe41d more work on osc 2021-10-04 23:28:19 +02:00
tth
2d3bd8ed8b more bla from Terreblanque 2021-10-04 22:24:01 +02:00
tth
e4a3917481 \pagestyle{plain} 2021-10-04 21:48:41 +02:00
tth
eb01334c91 oups 2021-09-29 10:03:59 +02:00
tth
7eb97bdec7 last commit before tb 2021-09-29 10:01:34 +02:00
tth
f0f7ce96b4 moving C near front page 2021-09-27 16:24:37 +02:00
tth
a97b8b9193 moving C near front page 2021-09-27 16:09:50 +02:00
tth
b04f51b032 more bla in C chapter 2021-09-27 00:57:38 +02:00
tth
b7af954be6 bla 2021-09-24 12:21:31 +02:00
tth
0d88b1a694 more bla 2021-09-22 13:17:46 +02:00
tth
01a177cae9 limiter profondeur table des matières 2021-09-18 10:20:29 +02:00
tth
0ad7108d5a more bla, and more bugs 2021-09-16 18:53:40 +02:00
tth
d20a832a8d first working plugin demo 2021-09-16 18:31:11 +02:00
tth
3437173612 attributs everywhere ? 2021-09-10 10:17:33 +02:00
tth
9fd7a01bee mute empty chapters 2021-09-04 12:45:15 +02:00
tth
7e051e3caa better messages 2021-08-30 12:23:49 +02:00
tth
f5b9cf17dc bla 2021-08-28 17:06:26 +02:00
tth
97f9196db6 IPC : added some bugs 2021-08-25 07:18:34 +02:00
tth
e306830003 not useless 2021-08-24 20:28:43 +02:00
tth
ea90f9ca02 quote 2021-08-23 11:46:02 +02:00
tth
2ea16e48ef bla 2021-08-23 11:34:22 +02:00
tth
459cf8a8c8 le langage C 2021-08-23 09:54:19 +02:00
tth
323fc07633 le fichier de config 2021-08-22 09:33:09 +02:00
tth
5105779eb6 + warning 2021-08-18 18:52:09 +02:00
tth
646e3aacc9 + exemple ipc/signal 2021-08-18 09:49:28 +02:00
tth
b56f05cd3c + conclusion 2021-08-18 09:16:24 +02:00
tth
1c8ce9899c OMFG ! a ducplicated chapter ! 2021-08-16 10:14:54 +02:00
tth
d753d27d94 bla 2021-08-16 09:26:14 +02:00
tth
3e4a076c44 + no-op.c 2021-08-13 09:24:46 +02:00
tth
214305d24e bla 2021-08-03 10:23:57 +02:00
tth
8874dfb569 no-op.c is an useless shell filter 2021-08-03 10:22:52 +02:00
tth
7025a58cb0 correct a bad pageref 2021-08-03 10:21:30 +02:00
tth
363be76256 correct a bad pageref 2021-08-03 10:20:58 +02:00
tth
87f36070d5 + crossref 2021-08-01 14:53:41 +02:00
tth
b40e73ba5c Hello C 2021-07-30 23:45:42 +02:00
tth
fb0fbed34c un léger doute ? 2021-07-10 07:53:46 +02:00
tth
747423bb37 nmcli time 2021-07-08 11:48:35 +02:00
tth
d4a086df5b +++ 2021-06-29 09:58:52 +02:00
tth
99510bdd92 beeeep 2021-06-29 09:58:26 +02:00
tth
dc2bee28a7 + povray 2021-06-28 08:51:43 +02:00
tth
7cde6b27d2 bla 2021-06-28 08:39:26 +02:00
tth
e91a971b9f + a faq 2021-06-27 04:32:47 +02:00
tth
d1e780418c bla 2021-06-27 02:02:19 +02:00
tth
608d55ab0c fix a pageref bug 2021-06-26 19:17:02 +02:00
tth
6aab581e78 to be continued... 2021-06-26 07:39:01 +02:00
tth
7ff89e9513 bla 2021-06-26 07:38:18 +02:00
tth
819dbc393f minor bla 2021-05-04 10:33:30 +02:00
tth
77ab20a390 git is a mess 2021-04-15 22:50:39 +02:00
tth
0126ca5b57 +SCCS 2021-03-30 10:20:21 +02:00
tth
b5c957ebc4 +SCCS 2021-03-30 10:20:02 +02:00
tth
a3251d7931 bla 2021-03-17 19:24:30 +01:00
tth
5a442d1842 liquidsoap loglevel 2021-02-17 17:07:18 +01:00
tth
cea41eb6fd funny itemize 2021-02-17 16:54:16 +01:00
tth
deb7efb14c bla 2021-02-04 14:39:31 +01:00
tth
7f8c827e01 - 2 typos 2021-02-04 12:16:18 +01:00
tth
3f54d04c63 oh please baby, say uptime 2021-02-04 09:58:41 +01:00
tth
93a4668dd1 + section pipeline 2021-02-04 09:56:36 +01:00
tTh
b631c95100 last commit before wwz 2021-01-20 04:53:48 +01:00
tTh
22fb197e00 gory patches from Mutah 2021-01-12 09:12:07 +01:00
tTh
2a7624eb75 another big push 2020-12-22 22:53:57 +01:00
tTh
7722aef9d3 oh, this is a commit ! 2020-12-12 04:13:54 +01:00
tTh
499944159f beurk beurk 2020-12-11 15:07:40 +01:00
tTh
2b73698aef work on streaming 2020-12-11 15:06:59 +01:00
tth
99eae15038 blabla again 2020-11-27 14:44:53 +01:00
tth
c6d8042995 my Perl is rusted... 2020-11-27 14:43:55 +01:00
tth
8684520c5a more blabla again and again 2020-11-25 14:24:19 +01:00
tth
76c10fe9f4 bonaldi !!! 2020-11-25 11:29:26 +01:00
tth
958a1b7152 another bla 2020-11-24 00:42:06 +01:00
tth
4f82cc967b more code 2020-11-24 00:40:57 +01:00
tth
d7626104d4 two new empty chapters 2020-11-24 00:37:36 +01:00
tth
f9dad7c33d https://studiorats.fr:8443/stream 2020-11-22 21:07:05 +01:00
191 changed files with 8627 additions and 564 deletions

18
.gitignore vendored
View File

@@ -1,17 +1,15 @@
log.*
# *.png
MANIFEST
tarball
main.aux
main.idx
main.ilg
main.ind
main.log
main.pdf
main.toc
code/a.out
code/foo
tetatricks.aux
tetatricks.idx
tetatricks.ilg
tetatricks.ind
tetatricks.log
tetatricks.pdf
tetatricks.toc

View File

@@ -1,8 +1,3 @@
# exemples du bouquin
ex_curses: ex_curses.c Makefile
gcc -Wall $< -o $@ -lncurses
TOTAR = chap/*.tex chap/*.png *.tex *.c Makefile *.sh *.awk

View File

@@ -1,4 +1,7 @@
# TetaTricks
Astuces diverses...
Astuces diverses pour utiliser un ordinateur sous Linux...
Un travail à l'évolution (trop) lente.
`pdfbook2 tetatricks.pdf --paper=a4paper --short-edge --no-crop`

24
chap/Arduino.tex Normal file
View File

@@ -0,0 +1,24 @@
\chapter{Arduino}
\label{chap:arduino} \index{Arduino}
% ---------------------------------------------------------------------------
\section{Installation de l'IDE}\index{IDE}
Elle semble un peu plus \textit{tricky} que celle de son cousin Processing.
Pour commencer, allez donc chercher le logiciel dans une version adaptée
à votre système dans \texttt{http://arduino.cc/}.
% ---------------------------------------------------------------------------
\section{Hello blinky}
La première étape est évident : faire clignoter une LED\index{LED}
% ---------------------------------------------------------------------------
\section{Beep Beep}
La seconde étape ne l'est pas moins.
% ---------------------------------------------------------------------------

166
chap/Basic.tex Normal file
View File

@@ -0,0 +1,166 @@
% ----------------------------------------------------------
\chapter{Basic}
\label{chap:Basic}
\index{dosbox}\index{Basic}
% ====================================================================
% https://www.theregister.com/2023/03/28/nostalgic_for_basic/
% https://retrofun.pl/2023/12/18/was-basic-that-horrible-or-better/
% ====================================================================
% \section{BASIC} \index{BASIC}
C'est probablement un des premiers langages interactifs utilisable par le
peuple et les gens. Déja, à ce titre, dénonce que ce langage
demande un peu de curiosité, il a traversé soixante ans
d'informatique, et il existe encore.
Mais pour moi, le véritable intérèt
est dans la multitude et la diversité des implémentations.
Des minis catatoniques des années 60 aux micros-ordinateurs 8 bits,
des dizaines de versions souvent incompatibles ont vues le jour.
Un nom pour citer un exemple ? « Locomotive », ça ira ?
Dans un premier temps, je vais les lister sommairement, et
ensuite j'aurais une idée sur lesquels seront les plus funs
à explorer, voire sauront trouver leur place dans un
environnement dédié à la techno-futilité, concept très
tendance dans certains milieux.
Pour en savoir plus : \textsc{Dartmouth Time Sharing System}
% ====================================================================
\section{Bywater} \index{bywater}
\begin{quote}
The Bywater BASIC Interpreter (bwBASIC) implements a large superset of the
ANSI\index{ANSI} Standard for Minimal BASIC (X3.60-1978)
and a significant subset of the ANSI Standard for
Full BASIC (X3.113-1987) in C.
\end{quote}
\begin{verbatim}
Bywater BASIC Interpreter/Shell, version 2.10
---------------------------------------------
Copyright (c) 1993, Ted A. Campbell
for bwBASIC version 2.10, 11 October 1993
\end{verbatim}
Le mode interactif me semble un peu rustre, mais utilisable à l'ancienne.
Les messages d'erreur sont du genre \textsc{bdos error on a, select}.
Je n'ai pas réussi à faire une sauvegarde du programme\footnote{J'ai
renoncé au bout de 30 secondes}, ce qui limite son \textsl{utilisability}.
Heureusement, on peut utiliser son éditeur de texte favori pour écrire
le code source, et le lancer en mode batch. Voici un exemple rudimentaire
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}
Et on peut faire des images qui clignotent :)
\lstinputlisting{code/Basic/yabasic-2.bas}
C'est vraiment dommage que l'on ne puisse mettre de gif89a\index{gif89a}
dans un livre imprimé\dots
% ====================================================================
\section{sdlBasic} \index{sdlBasic}
http://www.sdlbasic.altervista.org/main/
% ====================================================================
\section{Brandy}
\index{BBC} \index{Acorn}
\begin{quote}
Brandy is an interpreter for BBC BASIC V, the dialect of BASIC that
Acorn Computers supplied with their ranges of desktop computers that
use the ARM processor such as the Archimedes and Risc PC, and is still
in use on these and compatibles.
\end{quote}
https://www.bbcbasic.co.uk/index.html
% ====================================================================
\section{FreeBASIC} \index{FreeBASIC}
\begin{quote}
When used in its "QB" language mode, FreeBASIC provides a high level
of support for programs written for QuickBASIC\index{QuickBASIC}.
Many programs written for QuickBASIC will compile and run in this mode
with no changes needed.
\end{quote}
https://www.freebasic.net/
% ====================================================================
\section{BASIC-256} \index{BASIC-256}
\begin{quote}
BASIC-256 is an easy to use version of BASIC designed to teach anybody
(especially middle and high-school students) the basics of computer
programming.
It uses traditional control structures like gosub, for/next, and goto,
which helps kids easily see how program flow-control works.
It has a built-in graphics mode which lets them draw pictures
on screen in minutes, and a set of detailed, easy-to-follow tutorials
that introduce programming concepts through fun exercises.
\end{quote}
https://basic256.org/
% ====================================================================
\section{Benchmark}
Nous avons une liste de Basics, il faut maintenant les comparer.
Il y a le très classique (et très ancien) crible d'Eratostène, mais
nous pouvons trouver mieux en fouillant dans les archives.
% ====================================================================
\section{Et ailleurs ?}
L'interpréteur \texttt{Qbasic} de Microsoft fonctionne très bien
dans Dosbox~: à lire en page \pageref{Qbasic}. Son prédécesseur,
\texttt{GWBASIC} marche très bien aussi.
% ====================================================================

830
chap/C.tex Normal file
View File

@@ -0,0 +1,830 @@
\chapter{Le langage C}
\label{C}\index{C}
Un chapitre un peu particulier, puisque c'est le début d'une
initiation au langage C pour les non-codeurs qui souhaitent
rentrer dans le sujet à la dure.
Certaines des explications qui vont suivre ne sont pas très
rigoureuses, mais montrent bien les principes généraux et
les erreurs classiques. La futilité des exemples est assumée.
Les détails nécessaires seront présentés dans la suite.
% =========================================================
\section{Hello World}
Hop, on y va...
Le tout début de la vie d'un programme écrit en C est l'appel par
le \textsl{runtime}\footnote{\texttt{crt0.s}} d'une fonction
nommée \texttt{main} qui recevra deux paramètres\footnote{%
En fait trois, mais restons simple.}
dont l'utilisation est décrite un peu plus bas.
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/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
standard : \texttt{puts}
qui a pour but d'afficher sur l'écran le texte
passé en paramètre.
Voila, c'est fait. Dans les règles de l'art.
Nous savons dire « bonjour » au monde.
Point suivant~: dire bonjour à quelqu'un d'autre. Et pour
cela il nous fait récupérer un argument depuis la ligne
de commande.
% =========================================================
\section{Arguments}
Expliquons maintenant les deux paramètres
\texttt{argc} et \texttt{argv} du point d'entrée du programme
(la fonction main).
Le premier est le nombre de "mots" détectés par l'interpréteur
de commande qui va lancer votre proggy, et le second est
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/C/arguments.c}
Et voici un exemple d'exécution depuis un shell~:\index{shell}
\begin{verbatim}
$ ./arguments un deux "trois quatre"
0 ./arguments
1 un
2 deux
3 trois quatre
$
\end{verbatim}
Nous constatons que la première valeur affichée est en fait
le nom de notre programme, ou plutôt le chemin vers le fichier
exécutable, et surtout que son indice est 0, ce qui semble
logique\footnote{Rez-de-chaussée, premier étage, toussa\dots}.
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}
En gros, une variable du C est une zone de mémoire destinée
à contenir une valeur.
Une variable peut être caractérisée par trois choses~:
son nom, son type, et sa portée.
\textbf{Le nom} : Il doit commencer par une
lettre\footnote{To be ASCII or not to be ?} majuscule ou minuscule,
laquelle peut être suivie d'un nombre suffisant de lettres, de chiffres
et du caractère 'souligné'. La différence de casse est signifiante.
\textbf{Le type} : C'est une désignation du genre d'information
que l'on peut stocker dans une variable.
\textbf{La portée} :
% =========================================================
\section{Les fonctions}
Nous avons vu brièvement dans la première section de ce chapitre
la fonction \texttt{main} et ses deux paramètres.
Il est temps de préciser les détails.
Une fonction a un unique point d'entrée\footnote{Qui a déja joué
avec le ENTRY du Fortran ?}, avec une éventuelle liste
de paramètres,
et une tout aussi éventuelle unique valeur de retour.
XXX\index{XXX}
% =========================================================
\section{Entrées / Sorties}
\index{stdin} \index{stdout} \index{stderr}
Il est évident qu'un logiciel qui n'a aucun moyen de communiquer
avec le monde extérieur a bien moins d'utilité qu'un bon ed.
Dans le schéma «~classique~» d'une utilisation interactive,
ces échanges ont lieu par
le truchement d'un terminal, qui peut tout aussi bien
être une \textsl{real glasstty} ou une fenêtre d'un émulateur
graphique de terminal, comme \texttt{xterm}.
\subsection{Les trois flux canoniques}
\texttt{stdin}, \texttt{stdout} et \texttt{stderr}\dots
Par défaut, au lancement du programme, ces trois canaux
d'entrée/sortie sont pré-connectés, et donc directement
utilisables.
Le premier (\texttt{stdin}), l'entrée standard, est connecté
au clavier du consoliste\footnote{De quel roman est tiré ce terme ?},
le second (\texttt{stdout}), la sortie standard, permet d'afficher
les résultats du programme sur l'écran,
et le troisème (), la sortie d'erreur, permet d'afficher
les éventuels messages d'erreur.
La différence entre \textsl{out} et \textsl{err} est expliquée
plus loin.
\subsection{IO de base}\index{getchar}\index{putchar}
Les fonctions \texttt{getchar} et \texttt{putchar} sont les plus
simples.
Avec elles, on peut lire un caractère depuis \texttt{stdin},
et afficher un caractère dans \texttt{stdout}. Tout cela semble
très bien, mais la fonction de lecture est piégeuse
"\textsc{It's a trap}", comme nous allons bientôt le voir.
Vous devez logiquement penser que si nous allons lire un caractère
depuis l'entrée du programme, nous pouvons utiliser une variable de
type \texttt{char}, puisque ce type est prévu pour stocker un
caractère. Seulement, pour indiquer l'abscence de caractère,
la fin du fichier, il nous faut une valeur \textsl{out of band}
et donc getchar renvoit en fait un \texttt{int} dont une valeur
particulière sera nommée \texttt{EOF}, \textsl{end of file}.
\begin{verbatim}
while (EOF != (foo=getchar())) { ....
\end{verbatim}
Voilà un piège éliminé, et vous trouverez un exemple complet
un peu plus loin.
\subsection{Écrire : \texttt{printf}}
\index{printf}
La fonction \texttt{printf} permet d'afficher sur la sortie
standard le contenu d'une (ou plusieurs)
variable sous diverses présentations,
qui sont contrôlables par un tout petit
DSL\footnote{\textsl{domain specific language}}\index{DSL}~:
la chaine de format.
\begin{verbatim}
int bar, foo = 42;
bar = printf ("foo = %d\n", foo);
\end{verbatim}
La première ligne déclare deux variables dont une (foo) est
initialisée à une valeur connue. La seconde ligne appelle
la fonction '\texttt{printf}' avec les paramêtres appropriés et
conserve la valeur de retour de celle-ci.
Le premier de ces paramêtres, \texttt{"foo = \%d\textbackslash{}n"},
est appelé \emph{chaine de format}. C'est une chaine de caractères,
que l'on peut classer en trois catégories~:
\begin{itemize} % ------------
\item{\textsl{caractères crus} : ils sont directements poussés vers
la sortie. La plupart d'entre eux donnent le résultat attendu.}
\item{\textsl{codes de format} : les fragments qui commencent par le
caractère '\%'. Ils servent à contrôler l'apparence de ce qui va
suivre.
Par exemple \texttt{\%x} va afficher un \texttt{int} en hexadécimal}.
\item{\textsl{échappements} : les caractères précédés d'un
'\textbackslash' ou \textsl{backslash}\footnote{barre-penchée-du-8}
permettent d'inclure dans la chaine de format des caractères
non imprimables.
Par exemple, \texttt{'\textbackslash{}n'} va générer le caractère
\textsl{newline} qui marque la fin d'une ligne de texte.
}
\end{itemize} % ------------
Quand à la valeur de retour, elle contient le nombre de caractères
effectivement écrits. Ce nombre peut être différent du nombre attendu
en cas d'erreur, par exemple si le disque est saturé.
Ce nombre, que beaucoup de gens négligent, peut être utilisé pour un
affichage de multiples données en limitant la longueur des lignes~:
\begin{verbatim}
int foo, nbre = 0;
for (foo=0; foo<1000; foo++) {
nbre += printf("%d ", foo);
if (nbre > 62) {
putchar('\n'); nbre = 0;
}
}
\end{verbatim}
% ---------------------------------------------------------
%
% voir aussi ~/code/network/README.md
%
\subsection{Lire : \texttt{fgets}}
\index{fgets}
Cette fonction a pour but de lire une ligne de texte depuis
une entrée (stdin, fichier, socket\index{socket}...)
et de la ranger en mémoire.
Mais commençons par lire la documentation\index{RTFM} de cette fonction,
en nous concentrant sur ces deux passages, avant de passer à
un exemple\footnote{encore en phase de méditation}.
Voici deux extraits de ce que nous affirme la page du manuel~:
\begin{verbatim}
DESCRIPTION
fgets() reads in at most one less than size characters from stream and
stores them into the buffer pointed to by s. Reading stops after an
EOF or a newline. If a newline is read, it is stored into the buffer.
A terminating null byte ('\0') is stored after the last character in
the buffer.
RETURN VALUE
fgets() returns s on success, and NULL on error or when end of file oc
curs while no characters have been read.
\end{verbatim}
Prenez le temps d'y réfléchir, et essayons un cas simple d'utilisation
pour examiner le comportement de cette fonction. Nous allons
boucler sur la lecture d'une ligne depuis l'entrée standard dans
un buffer d'une taille fixée, puis afficher le nombre de caractères
que nous avons reçus.
\lstinputlisting[language=c]{code/C/fgets-simple.c}
% ---------------------------------------------------------
%
%
\subsection{Lire : \texttt{scanf}}
\index{scanf}
Avez-vous bien révisé la section qui cause des pointeurs ?
Êtes-vous prèt à d'étranges comportements ?
À ne plus savoir où peut être la tête de lecture ?
Alors les subtilités de \texttt{scanf} vont vous plaire.
Nous allons commencer par un exemple simple~: la lecture
de deux nombres entiers depuis l'entrée standard.
Les valeurs lues seront stockée dans deux variables
de type \texttt{int}.
\begin{verbatim}
#include <stdio.h>
...
int foo, bar, nbread;
nbread = scanf("%d %d", &foo, &bar);
\end{verbatim}
Le premier argument est une chaine de caractères contenant
des directives de conversion, semblables à celles
du printf.
Dans cette exemple, nous avons deux fois \texttt{"\%d"}
séparées par une espace. Cette directive veut dire
« lire les chiffres qui arrivent et les convertir
en nombre entier quand il n'y en a plus », une
simple règle de conversion.
Les deux arguments suivants sont les adresses des deux variables
destinées à recevoir les valeurs lues,
ou, en langage commun « faut mettre ÇA LÀ ».
Ce sont donc des pointeurs, on les reconnait au
caractère \& qui précède leur nom.
Quand à la valeur retournée par la fonction scanf, elle
présente un grand intérêt car elle contient le nombre
de lectures élémentaires qui se sont bien passées.
Tous les cas d'erreur ne sont pas couvert, mais c'est
suffisant pour traiter les cas simples de la discipline.
Donc, en toute rigueur, le code que nous venons de voir
devrait s'écrire, en utilisant comme il se doit
le \textsl{yoda coding} pour le test de cette valeur
de retour~:
\begin{verbatim}
...
int foo, bard;
if (2 != scanf("%d %d", &foo, &bar)) {
fputs("FAIL\n", stderr)
abort();
}
...
\end{verbatim}
\textit{To be continued...}
% ---------------------------------------------------------
\subsection{Les fichiers}\index{fopen}\index{fclose}
Lire et écrire depuis les flux gérés par le système, c'est bien, mais
c'est mieux de pouvoir faire la même chose depuis ou vers un fichier
enregistré. Il nous faut un moyen pour se 'connecter' à un ficher, et
y balancer des trucs à grand coup de printf.
Ce mécanisme passe par la fonction \texttt{fopen} et \texttt{fclose}.
La première va nous renvoyer (si tout se passe bien) un pointeur
sur une structure opaque de type \texttt{FILE *} qui pourra être
utilisé dans la suite des opérations. Voici son prototype~:
\begin{verbatim}
#include <stdio.h>
FILE *fopen(const char *pathname, const char *mode);
\end{verbatim}
Le premier paramêtre est le nom du fichier concerné, possiblement avec
son chemin d'accès (absolu ou relatif), comme \texttt{"foo.fimg"},
\texttt{"/var/tmp/foo.data"} ou \texttt{"./bla.txt"}.
Le second est le mode d'accès à ce fichier. Ce mode précise, entre
autres, si nous souhaitons lire ou écrire dans ce fichier.
La valeur retournée par cette fonction est un pointeur qui peut
être égal à \texttt{NULL} en cas d'erreur~: par exemple le fichier
n'existe pas ou ne peut pas être crée.
Notre fichier est maintenant ouvert, la fonction \texttt{fprintf} va
nous permettre d'écrire quelque chose dedans. Elle est analogue au
\texttt{prinf} vu un peu plus tôt, sauf qu'elle demande un
argument supplémentaire, et c'est justement le pointeur retourné
par \texttt{fopen}~:
\begin{verbatim}
int fprintf(FILE *stream, const char *format, ...);
\end{verbatim}
% =========================================================
\section{Quelques filtres Unix}\label{filtre-unix}
Ce qu'on appelle un "filtre" est un logiciel destiné à transformer
les données qui le traversent. Pour bien comprendre, le mieux,
comme d'habitude, est un exemple. Il est un peu artificiel,
car il s'agit d'éliminer les lettres \textsc{o} et \textsc{p},
sans raison valable. Le voici~:
\lstinputlisting[language=c]{code/C/no-op.c}
Démonstration immédiate~:
\begin{verbatim}
$ echo apopoz | ./no-op
az
$ ./no-op < no-op.c | head -5
/*
* n-.c is an useless shell filter
*/
#include <stdi.h>
#include <ctye.h>
$
\end{verbatim}
Vous voulez un autre exemple ? En voici un, parfois utile pour des
simulations de terminal de \textsl{tipiak}\footnote{Le texte vert ou
orange sur fond noir est de rigueur.} sur une ligne en boucle de
courant à 300 Bauds, le tout pour un film que l'on souhaite classable
en série Z.
\lstinputlisting[language=c]{code/C/slowprint.c}
% \vspace{2em}
Vous prendrez bien soin de contempler le traitement d'un éventuel
paramètre passé par la ligne de commande,
et surtout le calcul alambiqué\footnote{On doit quand même
pouvoir faire plus clair\dots}
pour convertir une vitesse en Bauds à un délay acceptable
par \texttt{nanosleep(2)}.
Pour une explication plus détaillée sur les mécanismes
utilisés et les usages possibles d'un tel filtre,
il faut voir le concept de pipeline du shell en
page \pageref{pipeline}.
% =========================================================
\section{Les pointeurs}\label{pointeur}\index{pointeur}
\textbf{Ah, enfin, on a failli attendre !}
Qu'est-ce qu'un pointeur ?
La réponse est multiple et parfois obscure, et c'est
le pointeur qui fait à la fois la force et la faiblesse du C.
Pour faire simple, un pointeur est une variable qui contient
l'adresse dans la mémoire d'une autre variable.
Mais en fait c'est un peu plus subtil :
un pointeur « connait » le type (donc la taille)
de l'objet pointé, et peut donc « parcourir » un tableau de ces objets.
\begin{verbatim}
Objet tableau[N];
Objet *ptr;
ptr = tableau; // *ptr désigne tableau[0];
ptr++; // *ptr désigne tableau[1];
\end{verbatim}
\index{XXX}
XXX il y a encore beaucoup à dire, et de quoi bien rire \textsl{:)}
% https://hackthedeveloper.com/function-pointer-in-c/
\subsection{Pointeurs et chaines}
\begin{verbatim}
char *text = "this is a text";
char text[] = "this is a text";
\end{verbatim}
Vous le voyez, le piège ?
\subsection{Pointeurs et fonctions}
Exemple classique : qsort.
% =========================================================
\section{Le préprocesseur}\index{cpp}
\textbf{Attention !} L'utilisation abusive du préprocesseur
peut générer des trolls de plusieurs centaines de posts.
Nous avons déja abordé de loin la directive \texttt{\#include},
qui fait partie du préprocesseur, comme toutes les lignes
de code commençant par le caractère \textbf{\#}.
Le concept de base, qu'il faut bien capter, est que le
préprocesseur pratique des \emph{substitutions de texte}.
Pratiquement, il se passe ça~:
\begin{verbatim}
#define NUMID 1664
#define FLAVOUR "tisane"
printf("La %d c'est de la %s\n", NUMID, FLAVOUR);
\end{verbatim}
Ces trois lignes de code
(deux directives pour cpp et un appel classique de fonction)
seront converties en une seule ligne de C.
\begin{verbatim}
printf("La %d c'est de la %s\n", 1664, "tisane");
\end{verbatim}
C'est donc cette ligne qui sera ensuite passée au vrai compilateur
pour être traduite en codes opératoires, dont l'exécution
affichera une maxime dont la véracité demande à être vérifiée
par l'expérimentation. Mais ça n'est pas fini.
Ce sympathique \textsf{préproc'}%
\footnote{Certains l'appellent même tendrement « mon cépépé »
avec un regard de guimauve mal grillée.}
nous permet aussi de faire
de la compilation conditinnelle, et ça, c'est cool parce que
ça ouvre la porte à plein de choses.
Par exemple, l'instrumentation du code afin de faciliter
les tests et le debug.
\begin{verbatim}
...
#ifdef TRACEUR
fprintf(stderr, "pid %d was here.\n", getpid());
#endif
...
\end{verbatim}
Et à la compilation, il vous faut passer l'option
\texttt{-DTRACEUR} à Gcc pour que ce message de trace soit
pris en compte.
% ---------------------------------------------------------
\subsection{Les macros}
Une chose très fourbe dont voici un exemple ?
\begin{verbatim}
#define pixidx (fi,x,y) (((y)*fi->width)+(x))
#define getRpix (fi,x,y) (fi->R[ pixidx(fi,(x),(y)) ])
#define getGpix (fi,x,y) (fi->G[ pixidx(fi,(x),(y)) ])
#define getBpix (fi,x,y) (fi->B[ pixidx(fi,(x),(y)) ])
\end{verbatim}
Finalemant, ça n'est pas si compliqué que ça.
Il suffit juste de savoir protéger les choses fragiles
avec des parenthèses. Partout.
% =========================================================
\section{Unités de compilation}
Jusque à maintenant, nous n'avons vu que des programmes dont
le code source n'était que dans un seul fichier, ce qui devient
vite ingérable pour un gros projet. C permet facilement
de faire de la compilation séparée~: chacun des fichiers source
est compilé indépendament en un fichier \textsl{objet}, lesquels
seront ensuite \textbf{liés} pour obtenir l'exécutable final.
Mais découper un gros logiciel en plusieurs fichiers source
a d'autres avantages.
Bien maitrisé, c'est une technique assez sereine.
Elle permet d'isoler des données spécifiques qu'il serait
bien plus lourd et périlleux d'utiliser d'une autre façon.
% =========================================================
\section{Les structures}
Une structure est une sorte de boite dans laquelle on peut
ranger plusieurs variables afin de les manipuler comme
une seule entité. Les utilisateurs de 80 colonnes voient
tout de suite de quoi il s'agit.
XXX trouver un exemple parlant et décalé\dots
% =========================================================
\section{Gestion de la mémoire}
\index{malloc} \index{free}
Nous avons déja entrevu la gestion « implicite » de la mémoire
avec les variables locales. Il est temps de passer à une gestion
explicite de celle-ci~:
les fonctions \texttt{malloc} et \texttt{free} sont là pour ça.
La première fonction demande au mc/p de nous préter une certaine quantité
de mémoire, que nous pourront utiliser à notre guise.
Et la seconde restitue cette zone mémoire au système sous-jacent.
Un rapide synopsis minimal d'utilisation~:
\begin{verbatim}
int foo, *ptr;
if (NULL==(ptr=malloc(sizeof(int)*NBITEMS))) abort();
for (foo=0; foo<NBITEMS; foo++) ptr[foo] = rand();
do_something(ptr);
free(ptr);
\end{verbatim}
Pour les besoins de la démo, nous avons deux variables, l'une
est entière (\texttt{foo}) et l'autre, \texttt{ptr}, est
un pointeur sur $N$ entiers.
Ce pointeur est initialisé sur la seconde ligne par un appel
à la fonction \texttt{malloc(3)} avec en paramètre le
nombre d'\textbf{octets} que nous voulons emprunter.
Ce nombre est ici calculé en multipliant le nombre de case
désiré par la taille de la case, une bonne occasion de
découvrir l'opérateur \texttt{sizeof}\dots
La boucle \texttt{for} de la ligne suivante insère des données
pertinentes dans notre tableau. Lesquelles données seront
habilement traitées sur la ligne suivante par l'appel
de cette fonction~:
\begin{verbatim}
void do_something(int values[])
{
int foo;
double sum = 0.0;
for (foo=0; foo<NBITEMS; foo++) sum += (double)values[foo];
printf("sum is %g\n", sum);
}
\end{verbatim}
Et finalement, nous avons réussi à générer un \textsl{useless number}.
Notre mission est terminée, nous rendons notre bloc de mémoire
au mc/p avec \texttt{free(ptr);}.
% =========================================================
\section{Gérer les options}\index{getopt}\label{getopt}
\begin{verbatim}
#include <unistd.h>
int getopt(int argc, char * const argv[], const char *optstring);
extern char *optarg;
extern int optind, opterr, optopt;
\end{verbatim}
La page de man de getopt(3) contient des explications détaillées
et un exemple simple d'utilisation.
% =========================================================
% Sun Sep 3 05:48:37 UTC 2023
%
%
\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
assez semblables. On peut aussi voir ça comme la création
d'un \textsl{domain specific language} (aka DSL\index{DSL}).
Pour être cohérent avec le shell, nous allons utiliser la
même méthode de séparation des mots sur la ligne à
décomposer~:
utiliser une liste pré-définie de séparateur de champs,
comme le \$IFS du shell.
Pour simplifier l'exemple, toutes les commandes susceptibles d'être
tapées
seront structurées de la même manière.
\subsection{la fonction \texttt{strtok}} \index{strtok}
Cette fonction nous permet de « découper » notre ligne de commande
en \textsl{tokens} par un ensemble de
caractères de séparation appelé \texttt{delim} dans cet extrait
du man\index{man}.
\begin{verbatim}
#include <string.h>
char *strtok(char *str, const char *delim);
The strtok() function breaks a string into a sequence of zero or more
nonempty tokens. On the first call to strtok(), the string to be
parsed should be specified in str. In each subsequent call that should
parse the same string, str must be NULL.
\end{verbatim}
Concrètement, nous allons utiliser deux séparateurs très classiques,
l'espace et la tabulation \texttt{ delim = "\symbol{92}t ";}.
on peut ensuite aller regarder dans la mémoire ce qui s'y passe~:
\begin{verbatim}
--- chaine d'origine
66 6f 6f 20 20 20 62 61 72 09 71 75 75 78 20 77 69 7a 00
f o o b a r q u u x w i z
--- 1er strtok
66 6f 6f \0 20 20 62 61 72 09 71 75 75 78 20 77 69 7a 00
f o o b a r q u u x w i z
got [foo]
\end{verbatim}
Donc, \texttt{strtok} a détecté le premier caractère de séparation,
ici un espace, qui est juste après le premier mot de la ligne à analyser,
et l'a remplacé par un '\symbol{92}0', le marqueur de fin de chaine.
Le premier mot (foo) a bien été isolé.
on peut constater que la chaine de départ est modifiée, ce qui
risque de causer des soucis, mais on en parlera plus tard.
\subsection{Le programme complet}
\lstinputlisting[language=c]{code/C/demo-strtok.c}
% =========================================================
\section{Erreurs classiques}
Le C est un langage parsemé de fosses, de chausse-trapes et de
pièges fourbes et sournois. Sans parler des UBs, hein\dots
\begin{itemize}
\item{Variables non initialisées.}
\item{Sortir d'un tableau (par le haut ou par le bas).}
\item{Dépassement de la taille d'une chaine.}
\item{Libérer deux fois la mémoire.}
\item{\textsl{file pointer} invalide.}
\end{itemize}
% =========================================================
\section{Random} \index{ramdom} \label{c-random}
XXX \index{XXX}
Un ordinateur est déterministe.
% =========================================================
\section{Debug} \index{Debug}
Des outils et astuces en page \pageref{chap:debug}.
\begin{quote}
splint is an annotation-assisted lightweight static checker.
It is a tool for
statically checking C programs for security vulnerabilities and coding
mistakes.
If additional effort is invested in adding annotations to programs,
splint can perform stronger checking.
\end{quote}
% =========================================================
\section{Legalize}
"The two forms of conforming implementation are hosted and freestanding.
A conforming hosted implementation shall accept any strictly conforming
program. A conforming freestanding implementation shall accept any
strictly conforming program in which the use of the features specified
in the library clause (Clause 7) is confined to the contents of the
standard headers <float.h> , <iso646.h> , <limits.h> , <stdalign.h> ,
<stdarg.h> , <stdbool.h> , <stddef.h> , <stdint.h> , and <stdnoreturn.h>
. Additionally, a conforming freestanding implementation shall accept
any strictly conforming program in which the use of the features
specified in the header <string.h> , except the following functions:
strdup , strndup , strcoll , strxfrm , strerror ." (4p6)
https://devblogs.microsoft.com/oldnewthing/20230109-00/?p=107685
% =========================================================
\section{Dessiner}
% XXX insert blabla here
\subsection{G2} \index{g2} \label{g2}
\begin{quote}
\textbf{g2} is a simple to use graphics library for 2D graphical applications
written in \textit{ANSI C}. This library provides a comprehensive set of
functions for simultaneous generation of graphical output on different
types of devices.
\end{quote}
\lstinputlisting[language=c]{code/g2/un_dessin.c}
%
% XXX EXEMPLE TROP MINIMALISTE !!!
%
% =========================================================
%
% Message-ID: <ur80s3$677$1@dont-email.me>
%
\section{Advanced}
Direct from Usenet (\texttt{comp.lang.c}):
\textsl{I did an experiment where is possible to create "sets" of warnings.}
\begin{verbatim}
#define SAFE_REGION \
_Pragma("GCC diagnostic push") \
_Pragma("GCC diagnostic error \"-Wenum-compare\"")\
_Pragma("GCC diagnostic error \"-Wparentheses\"")\
_Pragma("GCC diagnostic error \"-Wuninitialized\"")
#define RESTORE \
_Pragma("GCC diagnostic pop")
enum E1 { A };
enum E2 { B };
SAFE_REGION
int main() {
int a, b;
if (a = b){}
if (A == B){}
}
RESTORE
\end{verbatim}
\begin{quote}
J'avoue avoir mis un certain temps à capter. Je vais attendre
le \textsl{follow-up} de Bart pour avoir confirmation.
\end{quote}
% =========================================================
\section{La suite?}
% Message-ID: <657f1dd4$0$10079$426a74cc@news.free.fr>
% NNTP-Posting-Date: 17 Dec 2023 17:12:04 CET
Étudier les différents modêles de mémoire partagée.
% =========================================================
\section{Ailleurs dans cet ouvrage}
Il y a plein d'autres exemples de code en C, sur des sujets
divers comme Open Sound Control (page \pageref{chap:OSC}) ou
libsndfile (page \pageref{chap:son}).
Et pour les gens du système~:
l'utilisation des signaux (page \pageref{get-signal}),
le chargement dynamique d'un \textsl{plug-in} (page \pageref{ex_dlopen}),
les \texttt{ioctl}, \dots
% =========================================================

69
chap/DMX512.tex Normal file
View File

@@ -0,0 +1,69 @@
\chapter{DMX512}
\index{DMX} \label{chap:DMX}
% -----------------------------------------------------
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.
Le protocole DMX512 (qui utilise généralement une liaison
suivant la norme EIA RS 485 et cadencée à 250 kb/s) permet
de contrôler 512 canaux (9 bits d'adressage) en affectant à
chacun une valeur comprise entre 0 et 255 (8 bits de données par
canal). La transmission numérique unidirectionnelle se fait de
façon sérialisée par liaison symétrique, et chaque appareil
reçoit en même temps l'ensemble des 512 valeurs (ce qui est
appelée une « trame » DMX).
\end{quote}
% -----------------------------------------------------
\section{Open Light Architecture} \index{OLA}
https://ryderdamen.com/blog/enttec-open-dmx-on-linux/
% -----------------------------------------------------
\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}
@@ -18,8 +22,9 @@ maintenance du fichier \texttt{/etc/hosts} qu'il fallait,
\subsection{host}
\index{host}
C'est vraiment la commande \textit{vanilla} pour tout ce qui touche à la
résolution de nom. Elle propose les premières options de base,
C'est vraiment la commande \textit{vanilla} pour tout ce qui touche
à la résolution de nom.
Elle propose les premières options de base,
avec une syntaxe facile à retenir. Elle existe, sous des formes
légèrement déviantes, dans une grande partie des
OS\footnote{même dans le sale, c'est dire.} existants de nos jours.
@@ -64,21 +69,26 @@ Authoritative answers can be found from:
tth@tranxene:~$
\end{verbatim}
% ------------------------------------------------------------
\subsection{dig}
\index{dig}
% https://jvns.ca/blog/2021/12/04/how-to-use-dig/
Dig (\textit{domain information groper}) est un outil d'interrogation
des serveurs DNS. Par défaut, il questionne les serveurs
listés dans \texttt{/etc/resolv.conf}.
Pour résoudre récursivement un nom de domaine à partir de la racine :
\$ dig +trace <nom.de.domaine>
\texttt{\$ dig +trace <nom.de.domaine>}
Pour obtenir le reverse d'une adresse IP :
\texttt{\$ dig +trace -x <adresse.ip>}
Pour le reverse d'une adresse IP :
\$ dig +trace -x <adresse.ip>
% ------------------------------------------------------------
% \subsection{delv}
@@ -97,12 +107,15 @@ Pour le reverse d'une adresse IP :
Un outil très basique conçu et bricolé par Tonton~Th au siècle
dernier lors d'un séjour hivernal à Frontignan-plage.
Hélas, les sources
semblent définitivement perdues. Si quelqu'un a une piste\dots
semblent définitivement perdues dans les ténèbres
de l'Undernet profond. Si quelqu'un a une piste\dots
Une ré-écriture s"impose\dots
Une ré-écriture s'impose, en repartant sur les mêmes bases.
En utilisant les mêmes fonctions qu'une application basique.
Peut-être aussi en lui trouvant un nom plus \textsl{fun}\dots
% ------------------------------------------------------------
\section{DHCP} \index{DHCP}
\section{DHCP} \index{DHCP} \index{dhcpd}
\begin{quote}
The DHCP protocol allows a host to contact a central server which maintains a
@@ -111,6 +124,18 @@ client may request an address from this pool, and then use it on a temporary
basis for communication on network.
\end{quote}
Question : comment peut-on « écouter » les requètes et les réponses
DHCP sur notre réseau local pour détecter le rogue-machin ?
Probablement avec \texttt{tcpdump}\index{tcpdump},
et c'est à l'essai
dans la page \pageref{tcpdump}.
Un compagnon privilégié du DHCP est le système PXE\index{PXE}
qui permet de \textsl{booter} des images ISOs stockées sur
un serveur du réseau local.
% https://www.geoffray-levasseur.org/tutoriels-2/un-pxe-pour-les-unir-tous/
% ------------------------------------------------------------
\section{dnsmasq}
\index{dnsmasq}

View File

@@ -1,25 +1,44 @@
\chapter{Fedora}
\label{chap:Fedora} \index{Fedora}
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
\section{Gestion des paquets}
Les paquets sont du modèle RPM\index{RPM} à la mode
de Red-Hat et DNF\index{dnf} semble être l'outil de prédilection
pour les gérer.
pour les gérer. Un peut l'équivalent de \texttt{apt} de Debian ?
Pour mettre à jour~:
\texttt{\# dnf upgrade'}
Pour chercher un binaire précis~:
\texttt{\# dnf provides '*/interpolator'}
Pour installer un nouveau jouet~:
\texttt{\# dnf install gfortran}
\subsection{trucs}
<blz\_rg\_> faut sans doute passer le enable de 0 à 1 dans le fichier
/etc/yum.repo.d/le\_repo\_en\_question dans le paragraphe
[fedora***-debuginfo]
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
\section{Firewall}
Krkrkr, UPD\index{UDP} est bloqué en entrée ? Wtf ?
Krkrkr, UDP\index{UDP} est bloqué en entrée ? Wtf ?
\textsf{\textsc{<doug713705> welcome to firewalld}}
\textsf{\textbf{<doug713705> welcome to firewalld}}
\begin{quote}
firewalld provides a dynamically managed firewall with support for network/firewall zones to define the trust level of
network connections or interfaces. It has support for IPv4, IPv6 firewall settings and for ethernet bridges and has a
separation of runtime and permanent configuration options. It also supports an interface for services or applications to add
firewall rules directly.
\end{quote}
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
\section{Include dir}
@@ -34,6 +53,48 @@ de gcc :
\texttt{gcc \$(COPT) -I/usr/include/netpbm -c \$<}, dont la
portabilité est à vérifier.
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
\section{Gni ?}\index{memtest86}
\label{memtest86:fedora}
Ayant des soucis de \textsf{kernelpanic}%
\footnote{[90821.154795] fonderie: Corrupted page table at address 7f58478cd000}
avec une ancienne machine
Dell\footnote{d'origine catalano-ariégeoise} j'ai voulu faire un
test approfondi de la RAM. DNF m'a permis de trouver le paquet
\texttt{memtest86+}, puis de l'installer (comme je procède
depuis le siècle dernier) afin de l'avoir sous la main au prochain
reboot. Non. Rien.
Mmmm... Reboot, un shell root, et je découvre \texttt{memtest-setup}
qui semble pouvoir faire une partie du travail. La manpage
confirme. Action.
\begin{verbatim}
[tth@laserbox ~]# memtest-setup
GRUB 2 template installed.
Do not forget to regenerate your grub.cfg by:
# grub2-mkconfig -o /boot/grub2/grub.cfg
Setup complete.
[tth@laserbox ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
Generationg Grub configuration file ...
Found memtest image: /boot/elf-memtest86+-5.31
done
[tth@laserbox ~]# _
\end{verbatim}
Angoisse\dots
Et j'ai eu raison. Le memtest apparait bien dans le menu de grub,
mais bon, il fait un gros \textbf{paf} dès le lancement en me
parlant d'une \textsf{unexpected interrupt} vraiment féroce.
Relisons calmement la page de man~:
% XXX insert manpage here
XXX\index{XXX}
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
\section{Comment installer ffmpeg ?}

447
chap/Fortran.tex Normal file
View File

@@ -0,0 +1,447 @@
\chapter{Fortran} \label{chap:Fortran} \index{Fortran}
\begin{quote}
Fortran (\textsc{FORmula TRANslator}) est, avec le Cobol\index{Cobol},
un des premiers langages évolués. Il a été conçu après la seconde
guerre mondiale, en 1954, par
John Warner Backus, ingénieur en radiophonie chez IBM\index{IBM},
\end{quote}
Pourquoi j'ai redécouvert un langage de ma jeunesse, et pourquoi
vous devriez vous aussi y jeter un regard attentif. Il y a plein
de bonnes choses, la septième va vous tenir compagnie.
% ========================================
%
% un petit historique ?
%
\section{On the big irons}
TODO\index{XXX}
\section{FORTRAN77}
Dernière version à exiger le format '80 colonnes' des cartes perforées,
cette version est aussi (aux yeux de vieux dinos) la plus pure,
à cause d'instructions comme le \textsl{computed goto} ou le
mythique \textsl{comefrom}\footnote{Keyword: Datamatic}.
Nom officiel : \texttt{ANSI X3.9-1978}.
L'incarnation \texttt{g77}\index{g77} n'existe plus, meis peut être
à-priori émulable en jouant avec les options de \texttt{gfortran}
et un brin de shell.
% ============****************===============
% https://linuxfr.org/users/vmagnin/journaux/taptempo-fortran
% https://en.wikipedia.org/wiki/Fortran_95_language_features
\section{Gfortan} \index{gfortran}
Puis ce langage du passé a subi une évolution lente vers quelque
chose de bien plus moderne : le Fortran 90.
Les dinos vont devoir s'adapter.
Et songer à utiliser un \texttt{gfortran} moderne,
un élément de la Gnu Compiler Collection\index{gcc}.
Comme pour tous les langages de programmation,
il est obligatoire d'avoir l'exemple canonique, donc le voilà.
Il faut l'enregister dans un fichier nommé \texttt{hello.f90}
pour que le compilateur puisse admettre que c'est écrit
en \textsl{free form format}.
\begin{lstlisting}
$ cat hello.f90
program hello
implicit none
print *, "hello world"
end
$ gfortran -Wall hello.f90 -o hello && ./hello
hello world
$
\end{lstlisting}
% --------------------------------------------------------
%
% https://fortranwiki.org/fortran/show/Command-line+arguments
%
\section{Args \& Env}
Un fort beau programme que ce \textsc{helloworld}, mais il est un peu
fermé au monde extérieur.
Quand on lance un programme, il peut recevoir des instructions
par (mais pas que) deux canaux : les arguments de la ligne de commande
et les variables d'environnement.
\begin{lstlisting}
program rum_me
implicit none
integer :: nbarg, foo
character(len=32) :: arg
nbarg = IARGC()
if (nbarg .GT. 0) then
do foo=1, nbarg
call GETARG(foo, arg)
print *, foo," ", arg
enddo
endif
end
\end{lstlisting}
Si un des arguments doir être vu comme une valeur numérique,
il faut convertir la chaine de caractères avant usage.
Exemple pour un nombre flottant~:
\begin{lstlisting}
character(len=89) :: arg
real :: cx
call getarg(2, string)
read (string, *) cx
\end{lstlisting}
% --------------------------------------------------------
\section{Tableaux}
Rank, Size, \textsc{allocatable}, toussa\dots
Amies du C, soyez d'entrée prévenues, en Fortran, l'indice
par défaut du premier élément d'un tableau est \textbf{1},
mais cette valeur peut être modifiée à la déclaration
du tableau. Ce qui permet des \textsl{of-by-anynumber}
du plus bel effet.
% --------------------------------------------------------
% new 29 decembre 2022
\section{Nombres complexes}
Partie imaginaire : \texttt{ipart = aimag(cmplx)}.
% --------------------------------------------------------
% nouveau 4 mars 2023
\section {Les structures}\index{type}
Une « structure », c'est comme une petite boite dans laquelle on peut
mettre des variables de différentes natures.
Les accès à chacune de ces variables sont idépendants les uns des autres.
\begin{lstlisting}
type t_pixrgb
integer :: r, g, b
integer :: alpha = 0
end type
t_pixrgb :: pixel
pixel%r = 0x55
\end{lstlisting}
Nous verrons plus loin l'importance de cette notion.
% ========================================
\section{Fichiers}
Pour qui vient du C et de la philosophie Unix, la gestion
des fichiers en Fortran est assez déroutante%
\footnote{Par contre, pour un dino des \textsl{big irons}\dots}.
Il semble qu'il y ait deux concepts orthogonaux :
\begin{itemize}
\item Direct access \textit{vs.} Sequential access
\item Formtated \textit{vs.} Unformated
\end{itemize}
\textit{Open, Read, Write, Inquire, toussa\dots}
% --------------------------------------------------------
\subsection{Ouvrir un fichier}
C'est la première étape : attacher un fichier à un numéro d'unité.
Il y a une foultitude d'options, nous allons commencer par les
plus courantes.
% --------------------------------------------------------
\subsection{Sequentiel texte}
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{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.
% --------------------------------------------------------
\subsection{Indexé} \index{index}
XXX\index{XXX}
C'est pas pareil : d'abord les enregistrements sont tous de la même
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}
% --------------------------------------------------------
\section{Modules}
Une notion essentielle, à mon avis, pour écrire des programmes
au-delà de 104 lignes. Oui, j'avoue, j'ai bien changé depuis
l'époque où je confectionnait des procédures \textsl{monobloc}
de 1337 lignes, avec une bonne centaine de \texttt{GOTO} dedans.
Il serait bon de voir un exemple du monde réel. Ou juste un
exemple basique. Mais avec des explications. Parce que ce n'est pas
vraiment évident. Mais c'est un concept balaize.
Nous allons donc créer un module qui ne fait quasiment rien, ce qui
limitera le nombre de pannes possibles dans la suite des opérations.
\begin{lstlisting}
module dummy
implicit none
contains
subroutine print_dummy
print *, 'this is the dummy subroutine'
end subroutine
end module
\end{lstlisting}
Rien de bien compliqué~:
Un module peut être vu comme une boite qui contient (\texttt{contains})
des procédures (\texttt{function} ou \texttt{subroutine}),
et qui sera utilisé avec ce genre de petit programme~:
\begin{lstlisting}
program t
use dummy
implicit none
print *, '=== programme de test ==='
call print_dummy
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}
integer, dimension(3) :: tarray
integer :: t3
real :: dummy
call itime(tarray)
t3 = 3600*tarray(1) + 60*tarray(2) + tarray(3)
write(0, '(A,3I3,A,I6)') "sranding: ", tarray, " --> ", t3
call srand(t3)
! after initializing the random generator engine,
! you MUST use it for initializing the initializer
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{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}
La bibliothèque \textbf{Plplot} semble être un bon choix pour commencer,
mais il existe bien d'autres options.
Par exemple \textbf{g2} (vue en page \pageref{g2}) semble être utilisable
avec les vieux F77, et possiblement avec un Fortran moderne, il faut juste
un peu de \textsc{rtfm}.
Nous allons donc commencer par PlPlot, pour envisager ensuite les alternatives.
% --------------------------------------------------------
%
% $ dillo /usr/share/doc/plplot-doc/html/index.html &
%
\subsection{Plplot} \index{plplot} \label{ploplt}
Commençons directement par un EMC\footnote{Exemple Minimal Compilable}
qui ne va pas faire grand chose, à part initialiser la machinerie
interne de Plplot qui est assez avancée.
Il y a beaucoup de paramètres réglables, mais aussi des fonctions
qui gèrent pour vous les valeurs « par défaut ».
Voyez cette exemple comme un \textsl{boilerplate} simple
ou un \textsc{HelloWorld}~:
\lstinputlisting{code/fortran/plplotting.f90}
Il ne se passe pas grand chose, sauf qu'on a une proposition de
choisir le type de sortie.
Dans la version que j'ai (XXX\index{XXX}), on a le choix entre
X-Window, PostScript mono ou couleur, Xfig, PNG, SVG, et bien
d'autres dont certains, pour moi, assez ésotériques.
D'autre part, avec cette méthode, il semble impossible de
préciser la taille de l'image.
Mais la démonstration est faite.
Il faut quand même regarder de plus près la subroutine
\texttt{plenv()} (\textsl{Set up standard window and draw box})
qui initialise simplement un contexte graphique 2D somme toute
assez classique. Elle prend six paramètres. Les quatre premiers
sont les coordonnées flottantes de deux coins du papier,
le cinquième controle l'échelle des axes, et le dernier
controle le tracé des boites autour du graphique.
Nous avons les bases, commençons donc à dessiner.
Premièrement, nous allons chosir de démarrer automatiquement
dans une fenètre X11,
en gardant le reste de la configuration avec ses valeurs par défaut.
Pour cela, il suffit de rajouter \texttt{call plsdev('xwin')} juste avant
l'appel à \texttt{plinit},
Ensuite, pour mettre en évidence notre art,
nous allons choisir une couleur pour l'encre (qui est d'un
rouge du meilleur effet par défaut en mode "xwin"),
puis écrire quelques légendes canoniques, donc inutiles, .
\begin{verbatim}
call plcol0 (15) ! pure white
call pllab ("Fuzzfactor", "Yoyodines", "Some nice plots")
\end{verbatim}
Il est maintenant temps de poser un premier trait de crayon numérique
sur notre feuille blanche numérique\footnote{Actuellement noire, mais
nous trouverons bien comment changer ça}.
La forme de ce tracé sera donnée par une suite de coordonnées
flottantes \textsl{x/y}
stockées dans deux tableaux parallèles que nous allons
immédiatement garnir de données pertinentes~:
\begin{verbatim}
integer, parameter :: lg = 500
real :: x(lg), y(lg)
real :: k
integer :: i
k = 0.1
do i = 1, lg
x(i) = k * sin(real(i)/3.0)
y(i) = k * cos(real(i)/5.0)
k = k * 1.006021
enddo
\end{verbatim}
Une fois en possession de ces données conceptuelles, que l'on peut
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~:
\begin{verbatim}
call plcol0 (12)
call plline (x, y)
call plend ()
\end{verbatim}
Au passage, vous pouvez remarquer la magie du Fortran moderne~:
il n'est plus nécessaire de signifier la dimension des tableaux
lors de l'appel de la procédure.
Dans ce mode de fonctionnement interactif,
il vous faudra utiliser la touche
\textsl{<enter>} pour sortir\footnote{Une de mes prochaines tâche sera
de regarder comment quitter avec le '\textbf{q}' canonique}.
Nous verrons pas la suite comment écrire des fichiers 'image'
vectoriels ou bitmap en mode \textsl{batch}.
Enfin une ouverture vers les Gifs animées\index{gif89a}.
% --------------------------------------------------------
\section{Questions en attente}
\index{XXX}
\begin{itemize}
\item Comment déclarer une variable statique dans une procédure ?
\item Pourquoi ne pas parler de DISLIN ?
\item Est-il possible de causer à \texttt{libsndfile} ?
\item Comment caler une chaine à gauche avec un \textsc{format} ?
\item Is there a \texttt{-fortran} option for making comments with
\texttt{boxes} + \texttt{figlet}\index{figlet} ?
\end{itemize}
% --------------------------------------------------------
\section{Réponses}
\textsl{<Pas de réponse>}
Voilà, c'est tout pour le moment\dots
% ========================================

View File

@@ -6,6 +6,9 @@ aux quatre coins des interwebs. Je ne vais donc pas m'étendre
plus que ça, pour passer tout de suite à un cas particulier
\footnote{que je n'arrive pas encore à vraiment maitriser}.
Un des premiers ancêtres connus de Git est
\textsc{sccs}\index{SCCS}.
% --------------------------------------------------------------------
\section{Démarrage}
@@ -18,6 +21,13 @@ $ > README.txt
$ git add README.txt
\end{verbatim}
Personnellement, à ce moment, je suis perdu, et je galère souvent
avec git, désolé, je suis cablé comme ça. Alors je me soigne.
C'est pour ça que ce chapitre est incohérent, puisqu'il n'est
rempli que d'incertitudes.
% --------------------------------------------------------------------
\subsection{Setup du serveur}
Sur le serveur distant, dans un endroit accessible par
@@ -78,11 +88,25 @@ the file ~/.gitconfig-deb will be included; its content:
email = morph@debian.org
\end{verbatim}
That results in my personal address being used on all repos not part of Debian, where i use my Debian email address. This approach can be extended to every other git configuration values.
% --------------------------------------------------------------------
That results in my personal address being used on all repos not part of Debian,
where i use my Debian email address. This approach can be extended to every
other git configuration values.
\section{Krkrkr...}
% ====================================================================
% nouvelle section 15 avril 2021 -
\section{Questions ouvertes}
Tout cela semble bien compliqué.
Ahem\dots
Comment exclure par \textsl{.gitignore} tous les fichiers \texttt{foo.html} ?
% ====================================================================
\section{Trucs}
git archive --format tgz --prefix=my-project/
--output /tmp/my-project.tar.gz HEAD
% ====================================================================

9
chap/GMP.tex Normal file
View File

@@ -0,0 +1,9 @@
\chapter{GMP}
\textsl{GNU Multiprecision Library} est une bibliothèque logicielle
de calcul multiprécision sur des nombres entiers, rationnels
et en virgule flottante. Elle permet de traiter des nombres avec
\textbf{beaucoup} de digits.
\section{Fibonaci}

178
chap/IPC.tex Normal file
View File

@@ -0,0 +1,178 @@
\chapter{IPC} \index{IPC}
\label{chap:IPC}
\textit{Inter Process Communication.}
Il existe deux familles bien distinctes. Nous allons donc
les voir dans le plus grand des désordres, en commençant
par les grands classiques.
% ================================================================
% https://lwn.net/Articles/414618/
% https://lwn.net/ml/linux-kernel/20220103181956.983342-1-walt@drummond.us/
\section{Signal} \index{signal}
nous allonc commencer par le plus simple mécanisme d'IPC~:
le signal.
Et pour ça, nous allons utiliser (encore une fois ?) un exemple
futile, certes, mais simple à comprendre.
Nous avons un programme qui tourne en boucle en effectuant des
taches complexes (simulées pour l'exemple par une nanosieste) et
nous souhaitons pouvoir lui demander d'afficher l'avancée de la
chose.
\label{get-signal}
\lstinputlisting[language=c]{code/get-signal.c}
Quand ce processus recevra le signal, la fonction \texttt{attraper}
sera appelée de façon \textsl{asynchrone} et positionnera le drapeau.
C'est dans le terme \textsl{asynchrone} que le diable a caché
les détails.
\begin{verbatim}
fubar $ ./get-signal &
[1] 14001
fubar $ kill me, my pid is 14001
kill -USR1 14001
fubar $ count is 22
kill %1
fubar $
[1]+ Terminated ./get-signal
fubar $
\end{verbatim}
Comme on peut le constater, le principe est simple. Un signal est
une interruption d'un processus qui, en dehors de sa présence, ne
transfère que peu d'information. Le principe est simple, d'accord,
mais la mise en œuvre l'est moins.
Cet exemple peut être considéré comme obsolète, et la
\textsl{manpage}\footnote{Mais qui lit le man, de nos jours ?}
confime bien.
\begin{quote}
The only portable use of signal() is to set a signal's disposition to
SIG\_DFL or SIG\_IGN. The semantics when using signal() to establish a
signal handler vary across systems (and POSIX.1 explicitly permits this
variation); \textbf{do not use it for this purpose}.
\end{quote}
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.
% ================================================================
\section{shared memory} \index{shared}
Mémoire partagée.
% ================================================================
\section{named pipe} \label{named-pipe}
\index{fifo}
Un « FIFO » (ou « tube nommé ») peut être vu comme une sorte de
boite à lettres
dans laquelle on peut glisser un message à l'intention du
processus qui aura crée cette boite, avec un nom pré-défini afin
que l'expéditeur du message sache où le déposer.
\begin{quote}
A FIFO special file is similar to a pipe, except that it is created in a different way.
Instead of being an anonymous communications channel, a FIFO special file is entered
into the filesystem by calling mkfifo().
\end{quote}
Hop, une rapide démonstration. J'avais tout d'abors pensé à un
exemple minimaliste, puis je me suis dit~: « Et pourquoi ne pas
enmbarquer une charge utile dans le message ? », aussitôt dit
aussitôt fait.
L'émetteur mettra un \textsl{timestamp} dans le corps du message,
et le récepteur affichera l'écart avec le \textsl{timestamp} local.
Ce marqueur temporel sera obtenu par l'appel à
\texttt{gettimeofday(2)} \index{gettimeofday}
pour tenter d'avoir une précision
significative.
% ----------------------------------------------------------------
\subsection{Émetteur}
Son role est simple~: il met le timestamp dans l'enveloppe, et
la poste vers l'adresse qu'on lui passe sur la ligne de commande.
\lstinputlisting[language=c]{code/fifo-tx.c}
Vous remarquerez que nous nettoyons le message avant utilisation
avec un \texttt{memset(3)}, une étape trop souvent oubliée.
% ----------------------------------------------------------------
\subsection{Récepteur}
Pour faire simple, le récepteur des messages va passer l'intégralité
de son temps scotché devant la boite aux lettres, et attraper le
message dès son arrivée. Dans notre jargon, nous appellons ça
la méthode \textsl{buzzy-wait}.
Sauf que ça n'est pas tout à fait ça.
\lstinputlisting[language=c]{code/fifo-rx.c}
J'avoue ne pas avoir encore bien capté le deuxième argument
de mkfifo, mais la lecture de
\texttt{fifo(7)} et de \texttt{pipe(7)} peut être
utile pour comprendre\footnote{modulo les références circulaires.}
la chose\dots
% ----------------------------------------------------------------
\subsection{Timestamp} \index{timestamp}
Comme promis un peu plus haut, le code est très simple.
C'est juste dommage qu'une fonction aussi utile ne fasse
pas partie de la \textsl{stdlib} du langage C\index{C},
alors qu'elle le mérite.
\lstinputlisting[language=c]{code/dtime.c}
Cecit dit, la précision, ou plutôt la résolution,
est très dépendante du matériel,
de sa gestion par le système d'exploitation,
et et aussi\footnote{Mais faut-il s'étonner ?}
du \textsc{bofh} local.
\begin{quote}
The time returned by gettimeofday() is affected by discontinuous jumps
in the system time (e.g., if the system administrator manually changes
the system time). If you need a monotonically increasing clock, see
clock\_gettime(2).
\end{quote}
% ----------------------------------------------------------------
\subsection{Message}
Pour des raisons pas si évidente que ça, les messages transmis
doivent tous avoir la même taille. Nous allons donc définir
une structure (page ???) contenant les données à transmettre.
\lstinputlisting[language=c]{code/my-fifo.h}
C'est rudimentaire, mais ça fera l'affaire pour claquer un Bonaldi.
% ----------------------------------------------------------------
% ================================================================

View File

@@ -7,12 +7,12 @@
\section{hybrid}
\index{hybrid}
C'est le serveur utilisé par Smeuh. Une vrai galère à
configurer.
C'est le serveur anciennement utilisé par Smeuh. Il semble que
ce soit une vrai galère à configurer.
On se retrouve vite dans des situations critiques, du genre
un \#canal où il n'y a plus de @op, et donc, on ne peut
plus changer le topix, et là, \textbf{ça craint vraiment} !
plus changer le topic, et là, \textbf{ça craint vraiment} !
% ==============================================================
@@ -35,5 +35,18 @@ pinpin0: çhârsèt ?
/SET autoclose_windows OFF
\end{verbatim}
\textbf{Question :} comment enregistrer un chan' ?
% ==============================================================
\section{hexchat}
\index{hexchat}
Client graphique bien efficace.
% ==============================================================
\section{Les "bots"}
Hello Dotanick.
% ==============================================================

View File

@@ -28,14 +28,30 @@ Un exemple de message basique, c'est celui-ci, exprimé en
hexadécimal\index{hexa.} :
\texttt{93 5B 3A} un message qui va déclencher, sur le canal 3,
la note \textsf{Sol5}, à
un niveau assez bas. Et c'est l'instrument à l'autre bout di fil
un niveau assez bas. Et c'est l'instrument à l'autre bout du fil
qui va générer le signal audio.
% ---------------------------------------------------------
\section{Seq24}\index{seq24}
Seq24 has a unique convention for entering and editing notes that seems
confusing at first but quickly makes sense once you use it once or twice.
\begin{itemize}
\item{Right-click to activate the pen tool, and left-click (while still
holding the right-click button) to draw a note.}
\item{Left-click to select a note. Left-click and drag to draw a
selection box.}
\item{Middle-click and drag to modify the length of a selected note.}
\end{itemize}
% ---------------------------------------------------------
\section{Outils de base}
Le sous-système ALSA vient avec quelques utiltaires bien pratique
dans un usage d'exploration.
\subsection{aseqdump}
\index{aseqdump}
@@ -50,8 +66,32 @@ tth@plop:~/Muzak/Samples$ aseqdump -l
0:0 System Timer
0:1 System Announce
14:0 Midi Through Midi Through Port-0
20:0 nanoKONTROL nanoKONTROL MIDI 1
\end{verbatim}
Voici ce qu'on obtient quand on remue les boutons d'un
nanoKontrol de Korg, et voyez bien qu'on retrouve les
trois octets dont on causait l'autre jour. Le premier
contient à la fois le numéro ce canal et le type d'évènement,
le second le numéro du contrôle concerné, et le troisième
la nouvelle valeur~:
\begin{verbatim}
tth@fubar:~/Documents/TetaTricks$ aseqdump -p 20
Waiting for data. Press Ctrl+C to end.
Source Event Ch Data
20:0 Control change 1, controller 45, value 127
20:0 Control change 1, controller 45, value 0
20:0 Control change 1, controller 14, value 120
20:0 Control change 1, controller 14, value 119
\end{verbatim}
Un exemple d'utilisation d'un nanoKontrol pour piloter Chuck
se trouve (peut-être) aux alentours de la
page \pageref{chuck-midi}.
% -------------------------
\subsection{aconnect}
Maintenant que nous savons ce qui rentre dans notre machine,
@@ -59,6 +99,18 @@ il est temps de savoir comment le faire ressortir. Il faut
donc créer une connexion quelque part au tréfond des tables
obscures de la kernelle.
\subsection{aseqnet}
\begin{quote}
aseqnet is an ALSA sequencer client which sends and receives
event packets over the network.
\end{quote}
\subsection{pmidi}
Jouer un fichier MIDI (aka \textsl{midifile}) au travers du
séquenceur ALSA.
% ---------------------------------------------------------
\section{ALSA tips}
\index{ALSA}
@@ -106,7 +158,8 @@ Client 128 : "TiMidity" [User]
Plutôt que de passer par la couche ALSA, il est aussi possible
d'attaquer directement le \textit{device}, et de blaster soi-même
tous les petits octets directement sur le fil. Voici un petit
exemple en Python\footnote{Oui, je sais, c'est un langage de djeunz,
exemple en
Python\index{Python}\footnote{Oui, je sais, c'est un langage de djeunz,
mais bon, ça fait plaisir à mon gamin}, facilement transposable
dans un langage plus sérieux :
@@ -137,7 +190,6 @@ for valeur in range(30,90):
tx.close()
\end{lstlisting}
% ---------------------------------------------------------
\section{Et en Perl ?}
@@ -159,12 +211,57 @@ MIDI::Simple (3pm) - procedural/OOP interface for MIDI composition
MIDI::Track (3pm) - functions and methods for MIDI tracks
\end{verbatim}
Un petit essai, par exemple extraire la valeur du \textsc{bpm}
d'un fichier \texttt{.mid} ?
\lstinputlisting[language=perl]{code/midifile.pl}
Voilà enfin du code qui n'est pas fini\dots
% ---------------------------------------------------------
% nouveau 4 octobre 2022
%
% https://wiki.linuxaudio.org/wiki/abcmiditutorial
\section {ABC notation} \index{ABC}
ABC, développé par Chris Walshaw, est un format conçu pour noter
la musique en utilisant du texte brut.
Il a été conçu à l'origine pour les airs folkloriques d'origine
ouest-européenne qui peuvent être écrits sur une seule portée,
mais a depuis été étendu à la notation de partitions complètes
de diverses musiques.
Un exemple :
\lstinputlisting{code/ABC/paddy.abc}
Je vous préviens d'entrée : je découvre l'univers ABC en même temps
que j'écris ces lignes.
Je vais donc raconter plein de bétises\footnote{Ça va, on est au courant.}
du genre \textsc{Ne faites pas ça à la maison}.
\subsection{Header}
\subsection{Partition}
% ---------------------------------------------------------
\section{midish} \index{midish}
Vous avez aimé \textsl{packet filter} ? Alors vous allez
adorer midish\dots
% ---------------------------------------------------------
\section{Et après ?}
OSC\index{OSC} (page \pageref{chap:osc}) semble une possibilité
pour aller au-delà.
OSC\index{OSC} (page \pageref{chap:OSC}) semble une possibilité
pour aller au-delà. Mais, \textsl{amho}, rien ne pourra vraiment
remplacer le midi tel que nous le connaissons depuis les années 80.
You can read more about USB MIDI here:
https://www.midi.org/midi-articles/basic-of-usb
% ---------------------------------------------------------

7
chap/Makefile.tex Normal file
View File

@@ -0,0 +1,7 @@
\chapter{Makefile}
\label{chap:Makefile}
\index{Makefile} \index{make}
"make -C dir" tells "make" to change to the specified directory before
doing anything else.

33
chap/Maths.tex Normal file
View File

@@ -0,0 +1,33 @@
\chapter{Maths}
\label{chap:Maths}
Les mathématiques sont un outil indispensable dans la vie de tous
les jours, même si on ne s'en rend pas forcément compte.
Je ne vais pas vous faire un cours complet, j'en suis bien
incapable. Je vous conseille plutôt de demander ça à
monsieur schmod777, bien plus qualifié que moi.
Je vais me contenter (et c'est un peu l'esprit de cet ouvrage)
de répertorier les petites choses qui rendent la vie plus facile.
Nous verrons des \textit{tips} de géométrie que vous utiliserez
avec profit dans vos codes Povray, par exemple.
Je songe ensuite aborder certains aspects de la théorie du
signal, dans le but pratique de brotcher du son.
\section{En vrac}
\begin{verbatim}
double stddev(const auto *x, int N)
{
double sum = 0, sum_sq = 0;
for (int i = 0; i < N; i++) {
sum += x[i];
sum_sq += x[i]*x[i];
}
return sqrt((sum_sq - sum*sum/N)/(N-1));
}
\end{verbatim}

View File

@@ -1,45 +1,156 @@
\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. Il utilise le réseau au travers
des protocoles UDP\index{UDP} ou TCP\index{OSC} et apporte des
améliorations entermes de rapidité et flexibilité par rapport
conçu pour le contrôle en temps réel.
Il utilise le réseau IP\index{IP} au travers
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
allos 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.
% ================================================================
\section{oscdump \& oscsend}
\index{oscdump}\index{oscsend}
Ecouter :
\textbf{Envoyer :}
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 !'
\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 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.
\begin{verbatim}
tth@debian:~$ oscdump 1664
/tmp/kmem is 61 "meg, efface !"
^C
tth@debian:~$
\end{verbatim}
Envoyer :
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}
tth@debian:~$ oscsend localhost 1664 /tmp/kmem is 61 'meg, efface !'
tth@debian:~$
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}
TODO\index{TODO}
\textbf{Ecouter :}
Attention, là, nous arrivons sur un domaine plus
hardu\footnote{Un beau néoligisme, n'est-il pas ?}.
En effet, la mécanique interne de \texttt{liblo}
utilise un thread d'écoute qui appelle des
\textsl{callbacks} préalablement "accrochés",
\textsl{hooked} en vrai langue.
\lstinputlisting[language=c]{code/OSC/listen-osc.c}
\textbf{Envoyer :} \label{sendosc}
Cette partie là est beaucoup plus simple.
\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}
use Net::OpenSoundControl::Client;
$client = Net::OpenSoundControl::Client->new(
Host => $target, Port => $port)
or die "Could not start client: $@\n";
$client->send(['/proc/kcore', 'i', 61, 's', "bla"]);
\end{verbatim}
% ================================================================
% nouveau: Sat Jul 15 07:14:10 UTC 2023
% \section{Le routage}
% WIP...\index{XXX}
% ================================================================
\section{Autres logiciels}
Beaucoup d'autres logiciels peuvent être controlés par OSC.
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
% ================================================================

134
chap/Perl.tex Normal file
View File

@@ -0,0 +1,134 @@
\chapter{Perl} \label{chap:Perl} \index{Perl}
Également connu sous le nom de
\textsl{Pathologically Eclectic Rubbish Lister}%
\footnote{collectionneur pathologique de déchets variés},
Perl est un langage qui a été crée en 1987 par Larry Wall comme un
substitut moderne au classique combo shell/sed/awk.
\index{shell} \index{sed} \index{awk}
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 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}
(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{design patterns} assez
efficients.
% ------------------------------------------------------
\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
de la forme \texttt{ID un texte quelconque.} avec ID qui est
une courte chaine alphabétique. Le résultat de la conversion
sera \texttt{char *p\_ID "un texte quelconque.";} et pourra
être utilisé par un \texttt{\#include "fichier.h"} bien
classique.
\subsection{Le traitement}
Ce traitement peut être décomposé en deux actions emboitées~:
d'une part traiter une ligne,
et d'autre part, traiter un fichier plein de lignes.
La première va être encapsulée dans un module Perl.
\lstinputlisting[language=perl]{code/id2h.pm}
\subsection{L'interface}
Quand à l'interface utilisateur, quelques arguments sur
la ligne de commande feront l'affaire.
\lstinputlisting[language=perl]{code/id2h.pl}
% ------------------------------------------------------
\section {Et en vrai ?}
Quels logiciels sont écrits en Perl ?
\texttt{exiftool - Read and write meta information in files} \index{exiftool}
% ------------------------------------------------------
\section{RFC 8589}
RFC 8589 is an “informational” RFC that serves as a guide for
developers of applications, such as email clients, Web browsers
and more, to implement the “leaptofrogans” URI scheme
(see also the official URI schemes registered with the IANA).
Nobody is under any obligation, but RFC 8589 establishes a clear
path for enabling direct links to Frogans sites in online content.
\section{oneliners}

52
chap/Python.tex Normal file
View File

@@ -0,0 +1,52 @@
\chapter{Python} \label{chap:Python} \index{Python}
\section{Pourquoi je n'aime pas Python}
Depuis des lustres, autour de moi, je vois de plus en plus de
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\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...}
\begin{figure}[h]
\begin{center}
\includegraphics[scale=0.75]{chap/chronometre}
\caption{Chronometre}
\end{center}
\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}

239
chap/R.tex Normal file
View File

@@ -0,0 +1,239 @@
\chapter{R}
\index{R}
% new: Mon Oct 9 07:44:09 UTC 2023
% https://raw.githubusercontent.com/wurli/r-best-practice/main/cheatsheet.jpg
% ======================================================================
Je n'ai certainement pas la prétention de vous enseigner
les arcanes du \textsl{R project},
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.
\begin{quote}
R is a language which bears a passing resemblance to the S language
developed at AT\&T Bell Laboratories.
It provides support for a variety of statistical and graphical analyses.
R is a true computer language which contains a number of control-flow
constructions for iteration and alternation.
It allows users to add additional functionality by defining new functions.
\end{quote}
% ======================================================================
\section{Les bases}
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.
Une rapide démonstration~:
\begin{verbatim}
> a <- 22
> b <- 7
> a ; b
[1] 22
[1] 7
> a / b
[1] 3.142857
\end{verbatim}
Les choses semblent simples, nous avons approximé $\pi$.
Les deux premières lignes affectent des valeurs aux variables a et b.
La troisième demande l'affichage de ces variables, et la quatrimème
fait le calcul du nombre qu'il faut apprendre aux sages..
% ----------------------------------------------------------------------
\subsection{Variables}
Elles sont auto-vivifiantes\footnote{Si quelqu'un a un meilleur terme,
je sui preneur}, c'est-à-dire qu'elles existent dès qu'elles
sont référencées, il n'y a pas de déclaration préalable à faire.
Enfin, avec R, il ne faudrait pas parler de variables, mais
d'objets, lesquels contenant les variables.
Ces objets/variables peuvent être de différents types : chaines de caractères,
valeurs numériques, booléens\dots
% ----------------------------------------------------------------------
\subsection{Builtins}
Quelques fonctions de base, plus ou moins vaguement expliquées.
\vspace{1em}
\begin{tabular}{|l|p{7cm}|}
\hline
\textbf{Fonction} & \textbf{Signification} \\
\hline
foo <- 3.14159 & Affectation d'une valeur à une variable \\
ls() & Liste les objets actuellement chargé. \\
help(foobar) & Avoir de l'aide sur la chose \textsl{foobar}, %
abréviation: ?foobar \\
class(pixel) & Classe de l'objet (numeric, data.frame, ...) \\
str(foobar) & Information sur l'objet 'foobar' \\
\hline
\end{tabular}
% ----------------------------------------------------------------------
\subsection{Scripting}
\textbf{R --vanilla --quiet < mon-script.R}
La magie du shebang\index{shebang}
% Heredoc ?
% ======================================================================
\section{Un cas concret}
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}).
Et nous voulons en tirer quelques chiffres et graphiques bien
clinquants,
par exemple les éventuels rapports entre le rouge et le bleu.
Pour la facilité de la mise en page, nous allons utiliser un fichier
contenant seulement huit lignes de données,
alors qu'un cas réel en comprend quelques centaines de milliers.
Voici les quelques lignes de ce fichier~:
\begin{verbatim}
X Y R G B
0 0 0.000000 0.000000 0.000000
240 0 3967.814941 1983.907471 0.000000
480 0 7935.629883 3967.814941 0.000000
720 0 11903.445312 5951.722656 0.000000
0 240 0.000000 3967.814941 7935.629883
240 240 3967.814941 5951.722656 7935.629883
480 240 7935.629883 7935.629883 7935.629883
720 240 11903.445312 9919.537109 7935.629883
\end{verbatim}
Vous pouvez remarquer que les noms de colonnes sont sur la première
ligne du fichier, et qu'il y a deux types de données~:
les coordonnées x/y qui sont des nombres entiers, et les composantes
de couleur (r/g/b) qui sont des valeurs flottantes.
% ----------------------------------------------------------------------
Il nous faut maintenant charger ces données dans le logiciel.
La fonction \texttt{read.delim} est là pour ça, il faut juste lui
passer les options convenantes pour notre fichier de données~:
signaler la présence de l'entête avec les noms de colonnes et
le type du séparateur entre champs.
\begin{verbatim}
> pixels <- read.delim("foo.txt", header=TRUE, sep=' ')
> pixels
X Y R G B
1 0 0 0.000 0.000 0.00
2 240 0 3967.815 1983.907 0.00
3 480 0 7935.630 3967.815 0.00
4 720 0 11903.445 5951.723 0.00
5 0 240 0.000 3967.815 7935.63
6 240 240 3967.815 5951.723 7935.63
7 480 240 7935.630 7935.630 7935.63
8 720 240 11903.445 9919.537 7935.63
> class(pixels)
[1] "data.frame"
> pixels$G
[1] 0.000 1983.907 3967.815 5951.723 3967.815 5951.723 7935.630 9919.537
\end{verbatim}
Si vous avez fait cette manipulation, bravo, vous êtes maintenant
un \textsl{data-scientist} reconnu. Mais il nous reste beaucoup
de choses à apprendre. Le voyage n'est pas fini.
Il est temps d'explorer (ou exploiter ?) un peu nos données.
% ======================================================================
\section{Statistiques}
Oui, c'est un peu pour ça que \textbf{R} a été conçu.
Hélas ce n'est pas un domaine qui m'est familier, alors ce que
vous allez lire doit être pris avec des pincettes aussi bien
du coté des maths sous-jacentes que de la méthodologie.
\begin{verbatim}
> mean(pixels$R) ; mean(pixels$G)
[1] 5951.723
[1] 4959.769
\end{verbatim}
% ======================================================================
\section{Graphiques}
Bah c'est pas simple, alors j'ai activé le \textsl{rach-system} et je
suis arrivé à ce petit truc qui me permet de faire de la
\texttt{gif89a}\index{gif89a}, donc je suis content.
Vous allez voir, c'est assez simple, mais le diable\index{Prada}
se cache dans les détails, et un peu aussi dans la doc tortueuse.
% ----------------------------------------------------------------------
\subsection{x/y}
Un des classiques du genre.
\begin{verbatim}
R --vanilla --quiet << __EOR__
pixels <- read.delim("cumul.txt", header=TRUE, sep=' ')
png(filename="cumul.png", width=640, height=480)
plot(pixels\$X, pixels\$B, pch=".",
main="$title", sub="tTh 2023",
xlab="composante rouge",
ylab="composante bleu")
quit(save="no")
__EOR__
\end{verbatim}
Détaillons un peu le script~:
comme dans l'exemple précédent, nous chargeons nos données dans un
\textsl{data.frame}. Ensuite nous spécifions une sortie vers un
fichier image au format PNG\index{PNG}, avec une taille d'image fixée.
Finalement, nous traçons notre image avec l'instruction \texttt{plot}
et ses nombreux paramêtres.
Je vais détailler ceux qui sont utilisés dans cet exemple, et je vous rappelle
que \texttt{help(plot)} est là pour vous aider.
\begin{itemize}
\item \texttt{pch} : type de la plume utilisée
\item \texttt{main} : titre principal de la page
\item \texttt{sub} : sous-titre, placé tout en bas
\item \texttt{xlab} : label de l'axe des X
\item \texttt{ylab} : label de l'axe des Y
\end{itemize}
Avec ça, nous pouvons déja faire quelgues diagrammes corrects
\footnote{Voire même on peut tenter de la gif89a\index{gif89a}},
mais d'autres paramêtres devraient retenir notre attention, comme
la gestion des marges et des couleurs, comment exporter proprement
vers \LaTeX, peut-on faire de la 3D\index{3D}, \dots
% ----------------------------------------------------------------------
\subsection{Histogramme}
hist(datas\$V3, breaks=50)
% ======================================================================
\section{Interface avec l'OS}
% ======================================================================

7
chap/README.md Normal file
View File

@@ -0,0 +1,7 @@
# Les chapitres
Le label d'un chapitre est de la forme
`chap:filename`.

34
chap/SCCS.tex Normal file
View File

@@ -0,0 +1,34 @@
%
% nouveau 18 mars 2021
%
\chapter{SCCS}
\index{SCCS} \label{chap:SCCS}
C'est suite à une discussion dans DaLFP\index{DaLFP} que je me suis
lancé dans une plongée vers le passé~: la (re-)découverte d'un des
premiers systèmes de gestion de version. Un voyage qui commence par
la recherche des originaux\dots
Wikipédia fr nous permet de situer le contexte historique~:
\textit{Il a été développé en 1972 par Marc J. Rochkind au Laboratoires Bell
pour les System/370 dIBM puis a été porté sur Unix pour être inclus
dans la version standard ainsi que dans les spécifications de ce
système dexploitation.}
C'est assez sommaire comme description, n'est-il pas ?
% http://sccs.sourceforge.net/man/sccs.me.html
% -------------------------------------------------------------
\section{Débuter}
% -------------------------------------------------------------
\section{Approfondir}
% -------------------------------------------------------------
\section{Conclusion}
% -------------------------------------------------------------
% et voilà, c'est la fin du voyage

View File

@@ -17,6 +17,8 @@ in the United States used for the purposes of trading information,
sharing news, discussing new and exciting developments,
and collaborating on research results and projects.}
% ==================================================================
\section{slrn}
\index{slrn}
\label{slrn}
@@ -31,11 +33,18 @@ be extended using the embedded S-Lang interpreter.
printf 'set wrap_flags 7\nset wrap_width 72\n' >> .slrnrc
\end{verbatim}
% ==================================================================
\section{leafnode}
\index{leafnode}
Leafnode est l'outil essentiel si on désire troller au fond du jardin,
en dehors du rayon d'action de sa box.\index{troll}
en dehors du rayon d'action de sa box.\index{troll} On peut le voir
comme une sorte de proxy, mais pas que. Il permet aussi d'agréguer
plusieurs feeds, ce qui permet de combler les trous, et de donner accès
à Usenet à votre réseau local.
% ==================================================================
\section{INN}
\index{INN}
@@ -43,3 +52,11 @@ en dehors du rayon d'action de sa box.\index{troll}
Voilà, c'est le moment de parler de l'engin fondamental de ce réseau
de discussions. INN.
% ==================================================================
\section{fufe} \index{fufe}
N'y allez pas, \textbf{It's a trap !}
% ==================================================================

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}
@@ -69,7 +69,23 @@ echo "nameserver 192.168.0.254" >> /etc/resolv.conf
Normalement, ça devrait marcher. D'un autre coté, ce texte
date de 2011, et l'arrivée de \texttt{systemd}\index{systemd}
a peut-être cassée des choses.
a peut-être cassée des choses. Et c'est ce que nous allons
voir dès maintenant\dots
\textsl{9 juillet 2021} : C'est tout vu, ça ne fonctionne pas, et
je pense que c'est la rêgle iptables qui n'est plus d'actualité,
ou le paramêtre \texttt{wlan0} qui a (encore ?) changé de nom.
% ==============================================================
% nouveau juillet 2021 à Valensole
\section{Le NAT avec \texttt{nmcli}}
\index{nmcli}
Nmcli est un outil en ligne de commande pour contrôler
NetworkManager. Il a été prévu pour être scriptable.
% ==============================================================

View File

@@ -1,6 +1,19 @@
\chapter{X11}
\label{chap:X11}\index{X11}
L'écosysteme X11 semble être en fin de carrière pour plusieurs
raisons~: sa complexité
\textsl{mille-feuilles} accumulée au fil des décennies, ses
failles de sécurité réelles ou potentielles, la difficulté
de sa maintenance; raisons qui trainent depuis trop
longtemps\dots
À l'heure actuelle (Octobre 2023) le successeur/remplaçant du
vénérable X11 « \texttt{Wayland}\index{wayland} » commence tout
juste à arriver dans les distributions Linux et à la
page \pageref{chap:wayland}. Mais il reste un long chemin
à parcourir pour une transition sans larme.
%-------------------------------------------------------------------
\section{Les fontes}
@@ -12,25 +25,39 @@ $ fc-list | awk -F ":" '{print $1}' | sort -u
Comment faire pour visualiser la plénitude des formes de mes fontes ?
\begin{verbatim}
tth@debian:~/Devel/TetaTricks$ man fontimage
No manual entry for fontimage
See 'man 7 undocumented' for help when manual pages are not available.
tth@debian:~/Devel/TetaTricks$
\end{verbatim}
Wtf\index{Wtf} ?
%-------------------------------------------------------------------
\section{Xephyr}
\section{Xephyr}\index{Xephyr}
D'après la manpage :
\textit{Xephyr is a kdrive server that outputs to a window on a pre-existing
\textsl{Xephyr is a kdrive server that outputs to a window on a pre-existing
"host" X display. Think Xnest but with support for modern
extensions like composite, damage and randr.}
extensions like composite, damage and randr.
Unlike Xnest\index{Xnest} which is an X proxy, i.e. limited to the
capabilities of the host X server, Xephyr is a real X server which
uses the host X server window as "framebuffer" via fast SHM XImages.}
Ça semble attirant à première vue, mais l'utilisation n'est pas
si simple qua ça.
Ça peut sembler attirant à première vue, mais l'utilisation n'est pas
si simple que ça.
Par exemple, quelle est la méthode à mettre en œuvre pour avoir
le clavier en Azerty\index{azerty} ?
XXX\index{XXX}
%-------------------------------------------------------------------
\section{Numlock}
Vous l'avez voulu, le voici~:
\begin{verbatim}
#include <X11/XKBlib.h>
#include <X11/extensions/XKB.h>
@@ -71,34 +98,90 @@ protocole de X11. \textsl{Big win, bro !}
La démarche d'utilisation n'étant pas immédiate, nous allons
commencer par un petit exemple : déplacer un Xlogo sur l'écran.
Et comme un petit script vaut mieux qu'un long discours~:
\lstinputlisting[language=sh]{code/move-xlogo.sh}
La première étape est le lancement de la cible en arrière-plan.
La seconde est la récupération de l'indentifiant
(interne à X11) de la fenêtre concernée.
\begin{verbatim}
$ xlogo &
[3] 2674
$ WIN=$(xdotool search -name xlogo)
$ echo $WIN
69206019
$
\end{verbatim}
Voilà\footnote{en français dans le texte}, nous savons maintenant
Voilà\footnote{En français dans le texte.}, nous savons maintenant
à quelle fenêtre causer : par son numéro d'identification.
Le problême des multiples fenêtres du même nom sera abordé
ultérieurement.
Déplaçons donc notre widget\dots
ultérieurement. Nous pouvons maintenant déplacer notre widget
avec vigueur\dots
\begin{verbatim}
$ xdotool windowmove $WIN 10 10
$
\end{verbatim}
C'est simple, non ?
%-------------------------------------------------------------------
\section{Le WindowManager}
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}
Vous avez pratiqué la \textsl{Xlib} ? Avez-vous aimé ?
\textsc{[oui]} et \textsc{[non]} sont deux réponses valables.
Et si vous ne savez pas quoi répondre, c'est que vous n'avez
pas compris la question.
\begin{quote}
The X protocol C-language Binding (XCB) is a replacement for Xlib
featuring a small footprint, latency hiding, direct access to the
protocol, improved threading support, and extensibility.
\end{quote}
%
% https://xcb.freedesktop.org/tutorial/basicwindowsanddrawing/
%
%-------------------------------------------------------------------
\section{Xforms}\index{Xforms}
À première vue\footnote{Avril 2021}, un toolkit sympa, très abordable
en C, mais le premier exemple du tutorial d'initiation ne fonctionne
pas vraiment comme il devrait. Mais quand même une affaire à suivre.
\lstinputlisting[language=c]{code/xform/yesno.c}
Compilation: \texttt{gcc yesno.c -lforms -o yesno}
En fait, je ne me souviens plus du petit souci qui m'a fait négliger
trop lontemps ce discret toolkit graphique, mais ça avait
quelque chose à voir avec
la constante \texttt{FL\_BORDER\_BOX} qui
\textbf{ne} fait \textbf{pas} le borderbox.
http://xforms-toolkit.org/examples.html
%-------------------------------------------------------------------

13
chap/astronomie.tex Normal file
View File

@@ -0,0 +1,13 @@
\chapter{Astronomie}
\label{chap:astronomie}
FITS, siril...
% ------------------------------------------
\section{FITS}\index{FITS}
C'est le format canonique des fichiers d'astronome.

View File

@@ -2,6 +2,8 @@
\index{backup}
% https://blog.flozz.fr/2023/10/15/borgbackup-sauvegarde-sur-une-machine-distante-via-ssh/
% ===============================================================
\section{Geb...}
@@ -34,3 +36,23 @@ trop les temps de backup ?
Quid de juste rsync sur ton serveur et faire les tgz à l'autre bout
(tu profiteras ainsi pleinement du coté incrémental d'rsync) ?
% ===============================================================
\section{rsync}\index{rsync}
\index{XXX}
\textsl{A fast, versatile, remote (and local) file-copying tool.}
% ===============================================================
\section{Divers}
https://changelog.complete.org/archives/10160-how-why-to-use-airgapped-backups
Perhaps surprisingly, \texttt{tar} in listed incremental mode can solve this
problem for non-ZFS users. It will keep a local cache of the state
of the filesystem as of the time of the last run of tar, and can
generate new tarballs that reflect the changes since the previous
run (even deletions). This can achieve a similar result to the ZFS
send/receive, though in a much less elegant way.

81
chap/bdd.tex Normal file
View File

@@ -0,0 +1,81 @@
\chapter{Bases de données}
\label{chap:bdd} \index{SQL}
% ----------------------------------------------------------------
% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
\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 (\textsl{meta-commands})~:
Utilisez \textbf{.help} en premier secours !
% ----------------------------------------------------------------
\subsection{Libreoffice} \index{Libreoffice}
Il peut utiliser des bases en SQLite.
% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
\section{GDBM} \index{GDBM}
\begin{quote}
GDBM - The GNU database manager. Includes dbm and ndbm compatibility.
\end{quote}
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}
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}.
\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
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}
% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
\section{Postgresql}
Le poids lourd du domaine.
% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
\section{Et le "NoSQL" ?} \index{nosql} \index{troll}
Pour parler de ça, je préfère attendre Vendredi.
% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

61
chap/boot.tex Normal file
View File

@@ -0,0 +1,61 @@
\chapter{boot}
Le boot (aka bootstrap) est le processus de démarrage d'un ordinateur
depuis la mise sous tension, jusque à l'arrivée du shell.
Il varie grandement selon l'architecture matérielle de la machine~:
\texttt{amd64} pour les pécés de tous les jours, ou bien
\texttt{ARM}\footnote{Acorn Risc Machine}\index{ARM} comme sur
le \textsl{Raspeberry Pi}.
\begin{quote}
\textbf{boot :}\footnote{http://www.catb.org/jargon/html/B/boot.html}
\textit{[techspeak; from by one's bootstraps]}
To load and initialize the
operating system on a machine. This usage is no longer jargon
(having passed into techspeak) but has given rise to some derivatives
that are still jargon.
\end{quote}
\section{BIOS}\index{BIOS}
À l'origine, sur les ordinateurs de type \texttt{PC} tels que les
a voulu BigBlue\index{IBM}, régnait en maitre absolu le BIOS,
\textsl{aka Basic Input/Output System}.
Un bout de code minimaliste, bien rangé dans sa ROM, et disponible
dès la mise sous tension du bouzin.
% =========================================================
\section{PXE} \index{PXE} \label{PXE}
PXE est le sigle de \textsl{Pre-boot eXecution Environment}.
En gros, ça permet de démarrer un système stocké ailleur sur
le réseau, comme une image d'installation d'un Linux ou un
système de secours. Ce qui est vraiment pratique, car ça
évite la valse des clefs USB. Il nécessite la présence
d'un serveur dhcpd \index{dhcpd}.
% https://www.geoffray-levasseur.org/tutoriels-2/un-pxe-pour-les-unir-tous/
% =========================================================
\section{amd64}\index{amd64}
Voir Grub, le bootloader.
\section{ARM}
XXX\index{XXX}.
\section{rc.local}
L'exécution de ce script est la toute dernière étape du démarrage d'un
système de la famille Unix\index{Unix} avant le passage au
mode multi-utilisateur.
\textsl{Spécial dedikass to Fred Fermion}
Et dans ce contexte (la fin du boot), que peut-on faire à partir du
rc.local ?

21
chap/buzybox.tex Normal file
View File

@@ -0,0 +1,21 @@
\chapter{Buzybox}
\label{chap:buzybox}
\index{buzybox}
Buzybox est un peu le couteau suisse des systèmes Unix minimalistes,
tels que ceux que l'on peut trouver dans des routeurs WiFi
(OpenWrt\index{OpenWrt}, par exemple. Cf page \pageref{chap:openwrt}),
ou des systèmes embarqués de toutes natures.
%
% https://opensource.com/article/21/8/what-busybox
%
\begin{quote}
BusyBox is an open source (GPL) project providing simple implementations
of nearly \textbf{400} common commands, including ls, mv, ln, mkdir, more, ps,
gzip, bzip2, tar, and grep. It also contains a version of the programming
language awk, the stream editor sed, the filesystem checker fsck, the
rpm and dpkg package managers, and of course, a shell (sh) that provides
easy access to all of these commands.
\end{quote}

81
chap/cd-dvd.tex Normal file
View File

@@ -0,0 +1,81 @@
\chapter{CD \& DVD}
\label{chap:cd-dvd}
\index{cdrom} \index{dvd}
Vous allez bien dire : « Encore un truc de vieux\dots ».
Oui, peut-être, mais il y a quand même pas mal d'usages
assez cools pour ces technologies du passé, l'auto-radio
de votre vieille voiture, par exemple.
Nous allons
en explorer quelques uns.
% ++++++++++++++++++++++++++++++++++++++++++++++++++
\section{CD Audio}
Un CD audio ne contient pas de système de fichier, il ne peut
donc pas être lu de manière conventionnelle.
Il faut donc passer par des logiciels adaptés, qui vont
directement aller dire le contenu du disque, puis
convertir les pistes en fichiers audio conventionnels.
\subsection {Riping}
\index{abcde} \index{cdparanoia}
Le \textsl{ripage} est l'action d'extraire les pistes d'un
cd audio pour les convertir en fichier numérique audio
au format désiré.
Il existe plusieurs méthodes, la première va vous satisfaire,
et nous verrons (peut-être) les autres la semaine prochaine.
Un des outils utilisés est \texttt{cdparanoia}. Les nombreuses
options décrites dans la manpage montrent à quel point ce logiciel
est complet et compliqué. Heureusement, il y a une surcouche,
\texttt{abcde}\footnote{A better CD Encoder}, qui facilite
bien les choses. Passons immédiatement à l'œuvre en tentant
d'encoder un cd audio\footnote{Mylene Farmer, Ainsi soit je...}
vers des fichiers encodées en Ogg\index{ogg}.
Voici la ligne de commande minimale que nous allons utiliser,
pour ensuite y ajouter quelques autres options :
\begin{verbatim}
$ abcde -o ogg
\end{verbatim}
Oh, mais il y a une jolie animation en asciiart pour suivre
le déroulement des opérations.
Parmi les (nombreuses) options possibles, on trouve
\texttt{-p Pads track numbers with 0's}
\textsl{||}
% --------------------------------------------------------
\subsection {Mastering}
\begin{quote}
The Disc Description Protocol (DDP) is used by disc manufacturers as input
format for their glass mastering process, and thus is the format of choice
used by mastering engineers when sending out audio CD masters for replication.
\end{quote}
% --------------------------------------------------------
\subsection{Voir aussi...}
libcdio-utils
setcd - Control the behaviour of your cdrom device
% ++++++++++++++++++++++++++++++++++++++++++++++++++
\section{DVD}
% --------------------------------------------------------
% --------------------------------------------------------

BIN
chap/chronometre.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

View File

@@ -6,47 +6,139 @@
\index{curses}
En fait, nous allons plutôt parler de \textbf{ncurses} qui est
l'implémentation actuelle de l'ancêtre \texttt{curses}. Voic ce
qu'en dit une page de man :
l'implémentation actuelle de l'ancêtre \texttt{curses}.
Voici ce qu'en dit une page de man~:
\begin{quote}
The ncurses library routines give the user a terminal-independent
method of updating character screens with reasonable optimization.
This implementation is ``new curses'' (ncurses) and is the approved
replacement for 4.4BSD classic curses, which has been discontinued.
The ncurses library routines give the user a terminal-independent
method of updating character screens with reasonable optimization.
This implementation is ``new curses'' (ncurses) and is the approved
replacement for 4.4BSD classic curses, which ha been discontinued.
\end{quote}
Plus concrètement, Curses est un moyen optimisé de gestion des
écrans textes (Rappellez-vous notre ami le \textsc{Minitel}) afin
de créer des interfaces 'full-screen'. Vous pouvez adresser
chaque cellule de votre écran (la case où l'on peut mettre
un caractère) pour y écrire quelque chose, en gérant des
attributs tels que gras ou souligné.
\section{premier exemple}
% =========================================================
\section{Les principes}
\begin{itemize}
\item{Indépendance de l'écran physique}
\item{Fenêtre et sous-fenêtre}
\item{Deux écrans : stdscr et curscr}
\end{itemize}
Au tout début était le terminal canonique, la \textsc{Teletype}.
C'est dans le doux cliquetis de la vénérable \texttt{ASR33}
que se sont échaffaudées les premières lignes du code, écrites
avec \textsl{the only true one}\footnote{ed}.
Ensuite sont arrivés les terminaux à écran vidéo, les fameuses
\textsl{Glass TTYs}, qui ne tardèrent pas à se munir d'un
curseur adressable, ce qui permet alors d'écrire un caractère
à n'importe quelle endroit de l'écran.
Adm3a, vt52, Qume 60...
Une structure essentielle dans curses est l'écran,
appelé \textsl{screen} dans l'original. C'est une matrice
rectangulaire de cellules caractère/attribut et quelques
données associées.
Pourquoi deux écrans ? La mécanique interne de curses
maintient en interne deux écrans (qui sont en fait des fenêtres
de la taille de l'écran physique) connus sous les noms de
\texttt{stdscr} et \texttt{curscr}.
Le premier est celui que voit l'application, et qu'il peut manipuler
avec les fonctions (genre \texttt{mvaddstr})
que nous verrons très bientôt.
Et le second est l'image interne que se fait la mécanique de l'écran
physique, donc ce que voit le yuser.
% =========================================================
\section{Premier exemple}
Bien entendu, nous commencerons par l'ECM traditionnel de rigueur.
\lstinputlisting[language=C]{ex_curses.c}
\lstinputlisting[language=C]{code/ex_curses.c}
La première étape consiste à initialiser et configurer le moteur
interne de ncurses, et à régler l'interaction clavier/écran.
Ensuite, avec \texttt{mvaddstr}, nous écrivons le texte passé
en paramètre à une position fixée ligne,colonne
dans un écran virtuel
qui sera ensuite transféré dans l'écran réel
dans un écran virtuel (qui n'existe qu'en mémoire)
qui sera ensuite transféré dans l'écran réel (celui qui est affiché)
par le \texttt{refresh()}.
Dans ma grande mansuétude, je n'aurais pas l'audace de vous montrer
une capture d'écran, puisque je me permet de supposer que vous
avez pris le temps de compiler l'exemple, et de voir par vous même
ce que ça donne.
\section{astuces}
% =========================================================
\section{Bell and whistles}
\subsection{Attributs}
Voici comment centrer sur la ligne du haut
un texte écrit en \textbf{gras} grace à l'attribut
\texttt{A\_BOLD} :
\begin{verbatim}
attron(A_BOLD);
mvaddstr(0, (COLS / 2) - (strlen(text) / 2), text);
attroff(A_BOLD);
\end{verbatim}
Il existe tout un tas d'autres attributs:
\texttt{A\_UNDERLINE} pour le soulignement ou
\texttt{A\_BLINK} pour clignoter, par exemple.
La liste complète est dans le man~: \texttt{attr(3NCURSES)},
avec plein
de fonctions spécialisées dans le traitement des attributs.
% =========================================================
\section{Les fenêtres}
% =========================================================
\section{Astuces}
\subsection{kbhit} \index{kbhit} \label{kbhit}
Dans une boucle interactive, on va utiliser \texttt{getch()}, qui va
bloquer tant qu'on n'a pas tapé sur une touche. Mais que faire si
on veut utiliser, en plus du clavier, un autre périphérique de
saisie, genre un Joystick\index{joystick} ?
saisie (genre un Joystick\index{joystick}) sans rester en attente ?
Bien entendu, on peut utiliser \texttt{select(2)}, mais cela nécessite
de connaitre le \textit{file descriptor} auquel est attaché le clavier.
Dans le contexte classique, on peut assumer que ce sera le \texttt{fd}
associé à \textit{stdin}, mais il est imprudent de compter là-dessus.
---> voir \texttt{newterm(3)}
Sauf que, Unix, c'est bien foutu ---> voir \texttt{fileno(3)}
% =========================================================
\section{Et pour continuer ?}
Il existe des bibliothèques pour faire des interfaces
\textsl{wimp}\footnote{Window, Icon, Mouse, Pulldown}
assez avancées.
% =========================================================

View File

@@ -5,8 +5,112 @@ Quand plus rien ne marche, reste-il encore un espoir ?
Il existe bien entendu des outils \textsl{mainstream}
tels que le classique \texttt{gdb}\index{gdb}, mais il en existe
une foultitude d'autres, injustement méconnus.
En voici quelques-uns.
Nous allons en voir quelques-uns en essayant de nous baser
sur des cas quasiment réels.
Et non, je ne vais pas vous parler du vénérable \texttt{ddt}
des antiques systèmes CP/M, ni même du \texttt{debug} des
anciens DOS, bien que tous deux méritent votre attention.
% ==============================================================
\section{Gdb}\index{gdb}
GDB is a source-level debugger, capable of breaking programs at
any specific line, displaying variable values, and determining
where errors occurred. Currently, gdb supports C, C++, D,
Objective-C, Fortran, Java, OpenCL C, Pascal, assembly, Modula-2,
Go, and Ada. \textsc{A must-have for any serious programmer}.
\subsection{Clickaconvi}
\textbf{DDD} is a graphical front-end for GDB and other command-line debuggers.
Using DDD, you can see what is going on “inside” another program while
it executes—or what another program was doing at the moment it crashed.
\textbf{xxgdb} is a simple but powerful graphical interface to the GNU
debugger gdb. A more powerful (but slower and much bigger) interface
is available in the ddd package.
% --------------------------------------------------
% novembre 2020, panique dans le kernel de la Fedora
%
\subsection{Un cas réel}
J'ai un programme, écrit en C, qui est assez agressif sur
le calcul flottant et les accès disque,
et qui se fait tuer en cours de route,
avec un message inquiétant du kernel
\texttt{[95335.731943] fonderie: Corrupted page table at address
7fffe82d6000} qui me laisse perplexe.
\begin{verbatim}
[tth@laserbox Sauvageonnes]$ gdb ~/Devel/FloatImg/Fonderie/fonderie
GNU gdb (GDB) Fedora 10.1-2.fc33
This GDB was configured as "x86_64-redhat-linux-gnu".
Reading symbols from /home/tth/Devel/FloatImg/Fonderie/fonderie...
(gdb) run -I 'G/?????.fimg' -O 'Png' -w 0 -x 0 -T 80
Starting program:
/home/tth/Devel/FloatImg/Fonderie/fonderie
-I 'G/?????.fimg' -O 'Png' -w 0 -x 0 -T 80
Missing separate debuginfos, use:
dnf debuginfo-install glibc-2.32-2.fc33.x86_64
*** /home/tth/Devel/FloatImg/Fonderie/fonderie :
compiled by tTh, Nov 25 2020 10:19:10
pid 1949
\end{verbatim}
Là, on attend vingt minutes que le logiciel tripote plein
d'images en virgule flottante. C'est long.
\begin{verbatim}
54 / 1784
Program terminated with signal SIGKILL, Killed.
The program no longer exists.
Missing separate debuginfos, use:
dnf debuginfo-install pnglite-0.1.17-1.fc33.21.x86_64
zlib-1.2.11-22.fc33.x86_64
(gdb)
\end{verbatim}
On est donc bien avancé, \texttt{SIGKILL}, dans ce cas-là,
c'est le noyau qui flingue\index{bfg9000} le processus.
Mais pour quelle raison, et à quel endroit dans le programme ?
Avec un peu de chance, gdb a conservé une trace des dernières
microscondes de la fonderie.
\begin{verbatim}
(gdb) backtrace
No stack.
(gdb)
\end{verbatim}
Bah non, il nous avait bien prévenu :
\textit{The program no longer exists}, point suivant.
% ==============================================================
\section{Valgrind}
Reprenons le premier exemple précédemment traité avec Gdb, et
tentons de résoudre l'énigme avec Valgrind.
\begin{verbatim}
(gdb) quit
[tth@laserbox]$ man valgrind
[tth@laserbox]$ valgrind fonderie -I 'G/?????.fimg' -O 'Png' \
-w 0 -x 0 -T 80
==2388== Memcheck, a memory error detector
==2388== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==2388== Using Valgrind-3.16.1 and LibVEX; rerun with -h for copyright info
\end{verbatim}
Là, on attend vingt heures que le logiciel tripote plein
d'images en virgule flottante. C'est très long. Je me
demande même si ce n'est pas un roblock total.
% ==============================================================
@@ -18,18 +122,12 @@ 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.
\begin{lstlisting}[language=C]
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("Hello world.\n");
return 0;
}
\end{lstlisting}
\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
qui traine par là. Nous allons donc le chercher%
qui traine par là pour écrire vers la sortie standard.
Nous allons donc le chercher%
\footnote{En trichant un peu, je l'avoue, je connais son nom.}
\begin{verbatim}
@@ -82,51 +180,36 @@ oh surprise, contient votre nom de login.
Et justement, vous avez un programme sous la main que vous suspecter
d'avoir un problème relationnel avec cette variable.
Il nius faut donc remplacer le getenv de la libc par notre propre
Il nous faut donc remplacer le getenv de la libc par notre propre
version qui va écouter et exfiltrer l'utilisation de cette
fonction.
\begin{lstlisting}[language=C]
/*
spy_getenv.so: spy_getenv.c Makefile
gcc -Wall -shared -fPIC $< -ldl -o $@
*/
\lstinputlisting[language=C]{code/debug/spy_getenv.c}
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#define __USE_GNU
#include <dlfcn.h>
typedef char * (*original_getenv)(const char *envname);
Et à l'utilsation~:
char *getenv(char *envname)
{
static char *arrow = "--getenv--> ";
static char *wtf = " --> WTF ?";
char *content;
\begin{verbatim}
tth@redlady:~$ LD_PRELOAD=~/Devel/TetaTricks/code/debug/spy_getenv date
--getenv--> TZ --> (nil)
--getenv--> TZ --> (nil)
Tue Oct 17 08:55:01 CEST 2023
tth@redlady:~$
\end{verbatim}
original_getenv orig_getenv;
orig_getenv = (original_getenv)dlsym(RTLD_NEXT, "getenv");
Simple et efficace. \textbf{Mais\dots}
write(STDERR_FILENO, arrow, strlen(arrow));
write(STDERR_FILENO, envname, strlen(envname));
content = orig_getenv(envname);
if (NULL != content) {
write(STDERR_FILENO, "=", 1);
write(STDERR_FILENO, content, strlen(content));
}
else {
write(STDERR_FILENO, wtf, strlen(wtf));
}
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.
write(STDERR_FILENO, "\n", 1);
return content;
}
\end{lstlisting}
Simple et efficace.
% ==============================================================
\lstinputlisting[language=C]{code/C/use_envp.c}
% ==============================================================
\section{Cflow et Slint}
Deux outils pour savoir quoi nettoyer dans du code C un peu relou.
% ==============================================================

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,14 +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} !
\textsl{bien avant} le Web\index{www}, et pour lesquelles on
peut facilement imaginer des usages alternatifs et amusants !
% ==============================================================
@@ -18,13 +17,15 @@ ans ne peuvent pas connaitre. Des choses qui existaient
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}
@@ -45,38 +46,64 @@ 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
% ---------------------------------------------------------
\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}.
% ==============================================================
%
% https://www.bortzmeyer.org/1288.html
%
\section{Finger} \index{finger} \label{finger}
\textbf{finger} — user information lookup program
Sur le port 79/tcp.
https://tools.ietf.org/html/rfc1288
https://www.bortzmeyer.org/1288.html
% ==============================================================
\section{gopher}
\section{Gopher}
\index{gopher}
Sur le port 70.
Sur le port 70/tcp.
\begin{quote}
The Internet Gopher(tm) software and documentation is copyright (c)
1991, 1992, 1993, 1994 by the University of Minnesota.
\end{quote}
% ==============================================================

View File

@@ -25,6 +25,10 @@ Question : qui tombe à l'eau ?
printf '\033]11;lemonchiffon2\a'
\end{verbatim}
Pour être honnete, je n'ai pas la moindre idée de ce que
cela veut dire. Mais j'imagine que le \texttt{*a} à la
fin est destiné à activer la cloche.
% ==============================================================
\section{fdupes}
\index{fdupes}\label{fdupes}
@@ -33,5 +37,26 @@ Un utilitaire pour découvrir les fichiers dupliqués dans
votre disque dur qui se remplit trop vite à votre gout.
% ==============================================================
\section{g77: Command not found}
Lors d'une fin de soirée, je me suis retrouvé à fouiller
dans ma portion du Ternet, et je suis tombé sur un très
vieux truc. Des fractales en \textsc{fortran77}, avec
des incantations comme celle-ci dans le Makefile~:
\begin{verbatim}
map_henon: map_henon.f
g77 $(G77OPT) map_henon.f -o map_henon -limage
\end{verbatim}
Hélas, je n'ai pas de commande \texttt{g77} dans ma machine,
que faire ? En écrire une ?
% ==============================================================
\section{qemu}
\index{qemu}\label{qemu}
http://sven.stormbind.net/blog/posts/deb\_qemu\_local\_openwrt/
% ==============================================================

View File

@@ -1,18 +1,94 @@
% ----------------------------------------------------------
\chapter{Dosbox}
\index{dosbox}
\index{dosbox}\label{chap:dosbox}
%
% https://susam.net/blog/good-quality-dosbox-video-capture.html
%
Dosbox est un émulateur de machine MS-DOS avec le son et
le graphique. Il ne nécessite pas de système d'exploitation.
% ----------------------------------------------------------
\section{Configuration}
La configuration de Dosbox est par défaut dans le fichier
\texttt{\$HOME/.dosbox/dosbox-0.74-2.conf}. Vous remarquerez
que le numéro de version est \textbf{dans} le nom de
ce fichier. Ce fichier est abondamment commenté.
C'est à la fin de celui-ci, dans la section
\texttt{autoexec} que vous pouvez rajouter ce genre de lignes~:
\begin{verbatim}
mount C: /home/tth/Essais/DosBox/C
mount D: /home/tth/Essais/DosBox/D
keyb fr
\end{verbatim}
% ----------------------------------------------------------
\section{In an Out}
\textbf{Q:} J'ai téléchargé un warez de Qbasic\footnote{%
cf. page \pageref{chap:Basic}}
pour jouer avec,
le l'archive 7z ne contient qu'un fichier \texttt{.img}.
Que puis-je faire pour jouer enfin à snake ?
\textbf{Q:} Il y a plusieurs réponses possibles.
La plus évidente est de passer par le système hote pour
lire le contenu de cette image :
\begin{verbatim}
tth@fubar:~/DosBox/QBasic-1.1 $ su -
Password:
root@fubar:~# cd ~tth/DosBox/QBasic-1.1
-bash: cd: too many arguments
root@fubar:~# cd ~tth/DosBox/QBasic-1.1 /
root@fubar:/home/tth/DosBox/QBasic-1.1 # ls
disk01.img winworldpc.com.txt
root@fubar:/home/tth/DosBox/QBasic-1.1 # mount -o loop,ro disk01.img /mnt
root@fubar:/home/tth/DosBox/QBasic-1.1 # ls /mnt
QBASIC.EXE QBASIC.HLP
\end{verbatim}
Ceci dit, il y a encore plus simple : « mounter » l'image disque afin
qu'elle soit directememt utilisable depuis le prompt Dosbox.
Consultons vite la doc\footnote{/usr/share/doc/dosbox/README.gz},
juste pour constater que c'est un peu technique.
\begin{verbatim}
IMGMOUNT DRIVE [imagefile] -t [image_type] -fs [image_format]
-size [sectorsbytesize, sectorsperhead, heads, cylinders]
IMGMOUNT DRIVE [imagefile1 imagefile2 .. imagefileN] -t cdrom -fs iso
\end{verbatim}
% ----------------------------------------------------------
\section{Popcorn}
\index{Popcorn}
\textbf{Popcorn} est un jeu de cassebrique écrit dans les années
80 pour tirer la quintessence des cartes graphiques CGA\index{CGA}.
Écrit, sans le moindre doute, au « ras du métal ». Une des
merveilles de l'ancien temps.
% ----------------------------------------------------------
\section{Qbasic} \index{Qbasic} \label{Qbasic}
% ----------------------------------------------------------
\section{Fractint}
La première chose qu'il faudrait regarder, c'est les options de la
ligne de commande, pour pouvoir batcher des animations\dots
% ----------------------------------------------------------

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.
@@ -35,10 +39,33 @@ Ensuite, il faut utiliser \texttt{strfile}\index{strfile} qui
va préparer une version indexée de notre fichier texte afin
qu'il soit utilisable par fortune.
Un petit exemple ?
Bah yen a pas\dots
Le pendant graphique est \texttt{xcowsay}.
% ===============================================================
\section {Figlet} \index{figlet}
\textsl{Display large characters made up of ordinary screen characters.}
Il y a énormément d'option, en voici une première~:
\texttt{-W} permet d'espacer un peu les caractères.
\begin{verbatim}
tth@redlady:~/Devel/TetaTricks$ figlet -W figlet
__ _ _ _
/ _| (_) __ _ | | ___ | |_
| |_ | | / _` | | | / _ \ | __|
| _| | | | (_| | | | | __/ | |_
|_| |_| \__, | |_| \___| \__|
|___/
\end{verbatim}
% ===============================================================
\section{/usr/games/}
On trouvera dans ce répertoire une collections de jeux anciens,
@@ -75,13 +102,28 @@ ___________
| *** . * |
| ** *.** |
___________
tth@plop $ bcd "we make porn" | tr ']' 'x'
________________________________________________
/WE MAKE PORN |
| x x x |
| x x xxxx |
|x |
|1111x1111111111111111111111111111111111111111111|
|22222x222222222222222222222222222222222222222222|
|333333333333333333333333333333333333333333333333|
|444x44444444444444444444444444444444444444444444|
|5x5555x5555x555555555555555555555555555555555555|
|x66666666x66666666666666666666666666666666666666|
|77777777x777777777777777777777777777777777777777|
|888888888888888888888888888888888888888888888888|
|9999999999x9999999999999999999999999999999999999|
|________________________________________________|
\end{verbatim}
Certains esprits ouverts pensent que
\texttt{fortune}\index{fortune} est aussi un
générateur de données futilement complexes.
D'autres songent à MXDoctor\index{emacs} ou Camélia.
D'autres penseront à MX-Doctor\index{emacs} ou Camélia.
\subsection{Les animations}
@@ -90,6 +132,28 @@ vraiment\footnote{Enfin, si, j'essaye de confectionner
un soft pour fabriquer des flipbooks à partir de portnawak}
faire d'animation imprimable.
% ===============================================================
\section{Faire \textsl{beep-beep}}
Dans le temps, les ordinateurs de type IBM-PC n'avaient qu'un tout
petit \textsl{buzzer} pour se faire entendre\footnote{Négligeons les
ventilateurs en première approche.} avec seulement 1 bit de résolution.
On pouvait quand même modifier la fréquence et jouer de petites
mélodies.
\begin{verbatim}
$ beep -f 1000 -n -f 2000 -n -f 1500
$ beep -f 300.7 -r 2 -d 100 -l 400
$ cat codes.txt | beep -c -f 400 -D 50 -l 10
$ beep -f 1000 -r 2 -n -r 5 -l 10 --new
\end{verbatim}
% ===============================================================
\section{Les nhorloges}
Xclock, Oclock, Swisswatch, Xdaliclock...
% ===============================================================
@@ -97,4 +161,3 @@ faire d'animation imprimable.

View File

@@ -32,6 +32,7 @@ et reçu le petit nom
de \textsc{gif89a}. Il y a toujours la limitation à 256 couleurs
et un seul niveau de transparence. Contraintes qui n'étaient pas si
génantes que ça à l'époque vu les terminaux visés.
Contraintes qu'un artiste numérique peut comprendre et accepter.
% ==================================================================
@@ -46,21 +47,56 @@ convert -delay 20 -loop 0 a.png b.png c.png foo.gif
\end{verbatim}
Le \textsl{delay} est exprimé en millisecondes. On peut aussi
rajouter l'option \texttt{-loop nnn}\footnote{ add Netscape loop
rajouter l'option \texttt{-loop nnn}\footnote{aka: add Netscape loop
extension to your GIF animation} avec nnn qui est le nombre de
boucle que doit faire l'animation. La valeur 0 demandant une
boucle infinie.
boucle infinie. Deux fois\footnote{Vous connaissez Chuck Norris ?}.
Et ensuite, vouv pouvez voir votre logo en flamme avec la
commande \texttt{animate foo.gif} sur votre super écran
(s)vga\index{VGA}.
(s)vga\index{VGA} 14 pouces.
Je pense\footnote{Avis personnel d'après ma louche.} que la compression
de cette commande n'est pas optimale, peut-être parce qu'elle
n'utilise pas les \textsl{subblocs} que permet ce format.
% ==================================================================
\section{Manipulation}
XXX\index{XXX}
% ==================================================================
\section{Exemples pratiques}
Dans un Makefile\footnote{Les makefiles, c'est le bien !}~:
\begin{verbatim}
indoor.gif: $(DEPS)
convert \
`ls -rt1 frames/indoor/????.png | tail -99` \
-delay 120 \
-resize 28% \
-normalize \
-colorspace gray \
-colors 31 \
-dither none \
$@
\end{verbatim}
% ==================================================================
\section{gifsicle}
'Gifsicle' manipulates GIF images. Its most common uses include combining
single images into animations, adding transparency, optimizing animations for
space, and printing information about GIFs.
% ==================================================================

View File

@@ -4,14 +4,32 @@
\chapter{Gnuplot}
\index{Gnuplot}\label{chap:gnuplot}
Gnuplot - an interactive plotting program
There is an on-line demo collection at http://gnuplot.info/demo
\begin{verbatim}
gnuplot> splot "cam.indoor" using 2:4:3, "cam.indoor" using 5:7:6
\end{verbatim}
% -------------------------------------------------------------------
\section{Exemple : le phytotron}
\index{phytotron}
Un exemple réel, issu d'un projet d'élevage d'algues
bio-luminescentes dans un frigo bricolé par une jeune stagiaire
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.
Le premier champ est
un \textsl{timestamp} exprimé en secondes depuis l'\textsl{epoch},
et les quatre suivants sont des températures en degrés Celsius.
\begin{verbatim}
#!/bin/bash
# THIS IS A KLUDGE
# THIS IS A KLUDGE
nbsamp=3000 # nombre d'echantillon
@@ -22,10 +40,6 @@ fi
DATAFILE="serial/foo.dat"
IMAGE="graphe.png"
TMPFILE="/dev/shm/tmpdata"
echo $nbsamp
wc -l ${DATAFILE}
tail -${nbsamp} < ${DATAFILE} > ${TMPFILE}
gnuplot << __EOC__
@@ -42,10 +56,58 @@ set yrange [ 10.0 : 40.0 ]
plot "${TMPFILE}" using 1:3 title " inside" with lines, \
"${TMPFILE}" using 1:4 title "ambient" with lines
__EOC__
display ${IMAGE} &
\end{verbatim}
\textsf{Bon, un de ces jours, il faudrait que je ressorte des archives
l'enregistrement d'un été dans le dd2, pour que vous puissiez voir
le résultat de ce script en « pour de vrai ».}
% -------------------------------------------------------------------
\section{Paramétrer la plume}
Largeur, couleur, odeur, toussa.
% -------------------------------------------------------------------
\section{La 3D avec \texttt{splot}} \index{splot}
gnuplot> help set view
The `set view` command sets the viewing angle for `splot`s. It controls how
the 3D coordinates of the plot are mapped into the 2D screen space. It
provides controls for both rotation and scaling of the plotted data, but
supports orthographic projections only. It supports both 3D projection or
orthogonal 2D projection into a 2D plot-like map.
% -------------------------------------------------------------------
\section{Des trucs...}
Comment générer un signal carré~:
% https://lcamtuf.substack.com/p/square-waves-or-non-elephant-biology
\begin{verbatim}
set samples 2000
odd_h(x, n) = sin(x * (2*n - 1)) / (2*n - 1)
plot sum [n=1:20] 4/pi * odd_h(x, n)
\end{verbatim}
% -------------------------------------------------------------------
\section{Questions}
Supposons que nous ayons sous le coude un fichier contenant
\emph{six cent mille} lignes de données, qui ne représentent que
trente secondes d'enregistrement d'une valeur de Virgo\index{Virgo},
comment faire pour plotter les échantillons $N$ à $N+42$ ?
for example \texttt{plot a.dat every 2}.
% -------------------------------------------------------------------

View File

@@ -1,7 +1,308 @@
\chapter{Graphismes}
\chapter{Graphisme}
\label{chap:graphisme}
\section{Flydraw}\index{Flydraw}
Voici quelques notes en vrac sur divers logiciels
ou bibliothèques de fonctions qui permettent
de faire des dessins et des images\dots
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.
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}
% ------------------------------------------------
\subsection{Mon premier "bug"}
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.
\lstinputlisting[language=c]{code/SDL2/strangebug.c}
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.
% ------------------------------------------------
%
% Fri Sep 27 14:09:45 UTC 2024
% la section sur flydram est partie dans les unused
%
%====================================================================
\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 ?
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'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 "WS/cam.log" write
#else
#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 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="WS/cam.log"
TMPF="/dev/shm/cam.data"
IMAGE="graphe.png"
tail -360 ${FILE} | sort -n > ${TMPF}
gnuplot << __EOC__
set term png size 720,720
set output "${IMAGE}"
set ytics 2
set xtics 2
set grid front
set title "Rush Camera"
plot "${TMPF}" using 2:4 title "Cam", \
"${TMPF}" using 5:7 title "Lat" with dots
__EOC__
display "${IMAGE}" &
\end{verbatim}
Dans ce cas, il s'agit d'une animation de 360 images, ce qui explique
la commande \texttt{tail} au début du script. Ensuite les deux clauses
\textsl{using 2:4 / 5:7} permettent de sélectionner les deux
coordonnées X et Z, dans le repère POVray, qui n'est pas le même que
celui de Gnuplot.
% ------------------------------------------------
% updated Fri Sep 27 13:41:54 UTC 2024
\subsection{image\_map}
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}
% ------------------------------------------------
\subsection{height\_field}
Les champs d'altitude... Toute une histoire...
\begin{verbatim}
#declare Champ_Altitude = object
{
height_field {
png "WS/hf5.png" gamma 1.8
}
pigment { color Cyan }
scale 2
}
\end{verbatim}
Le paramètre \texttt{gamma} est injustement méconnu.
% ------------------------------------------------
\subsection{Random} \index{ramdom}
C'est un peu différent de ce à quoi les programmeurs « classiques »
sont habitués\footnote{Voir le random du C page \pageref{c-random}}.
Avant de pouvoir obtenir des nombres aléatoires, il faut créer et
initialiser un générateur~:
\texttt{\#declare RND = seed(13.37);}
Vous noterez au passage le fort degré alcolique de ce délicieux Corbière que je
déguste en ce moment même.
Ensuite, pour obtenir le résultat du tirage, on utilise le \textsl{handler}
que l'on vient d'obtenir~:
\texttt{\#local foo = rand(RND);}
Par contre, on va obtenir un résultat bien classique~:
\textsl{The numbers are uniformly distributed, and have values between
0.0 and 1.0,}
Pourquoi nous faut-il plusieurs générateurs ? La réponse est dans
la documentation\footnote{\texttt{https://wiki.povray.org/}}~:
\textsl{Multiple random generators are very useful in situations where you use
rand() to place a group of objects, and then decide to use rand()
in another location earlier in the file to set some colors or place
another group of objects.
Without separate rand() streams, all of your objects would move
when you added more calls to rand().
This is very annoying.}
Ce qui nous conduit vers une autre question. Les PRNG sont des machines
déterministes. C'est à dire qu'à conditions identiques au départ,
nous aurons toujours la même séquence en sortie.
... \index{XXX}
% ------------------------------------------------
\subsection{Trucs à voir}
Des bouts de code piochés à droite et à gauche...
\begin{verbatim}
#declare VIRGINIA =
transform {
matrix < 1, 1, 0,
0, 1, 0,
0, 0, 1,
0, 0, 0 >
}
box { 0, 1
transform {VIRGINIA}
}
\end{verbatim}
Pour faire un vaisseau spatial (Thomas de Groot dans povray.binaries.images)
\begin{verbatim}
// the color bleeding is done by emission color:
material {
texture {
pigment {rgb <0.50, 1.00, 1.00>}
finish {
specular 0 roughness 0.001
emission rgb <0.50, 1.00, 1.00>*5
diffuse 1
reflection {0} conserve_energy
}
}
}
\end{verbatim}
% ================================================
\section{Avec Fortran}
plplot\index{plplot} est une des pistes à explorer.
% ------------------------------------------------
% ------------------------------------------------

View File

@@ -3,11 +3,17 @@
Successeur pour certaines distributions du vénérable
\texttt{lilo}\footnote{Linux Loader}\index{lilo},
le Grub, aka \textsl{Grand Unified Bootloader} est nettement plus
complexe, mais permet (parait-il) de faire beaucoup plus de choses
complexe, mais permet (parait-il) de faire beaucoup plus de choses.
\section{Astuces}
Pour installer \texttt{memtest86+} dans une Fedora, c'est en page
\pageref{memtest86:fedora}.
\section{Questions}
\begin{itemize}
\item comment passer la carte VGA\index{VGA} en 80x43 ?
\item comment booter un disque FreeDOS\index{FreeDOS} ?
\end{itemize}

View File

@@ -1,18 +1,59 @@
\chapter{Hardware}
\label{chap:hardware}
% -----------------------------------------------------------
\section{Joystick}\index{joystick}
La manette de jeu est un périphérique que j'affectionne particulièrement.
\begin{verbatim}
int foo, joy_fd;
struct js_event js;
joy_fd = open(joy_device , O_RDONLY);
foo = read(joy_fd, &js, sizeof(struct js_event));
\end{verbatim}
% -----------------------------------------------------------
\section{Diagnostics}
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
\subsection{lshw} \index{lshw}
\begin{quote}
lshw is a small tool to extract detailed information on the hardware
configuration of the machine. It can report exact memory configuration,
firmware version, mainboard configuration, CPU version and speed, cache
configuration, bus speed, etc. on DMI-capable x86 or IA-64 systems and
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}
\index{rs232} \label{rs232}
\begin{quote}
RS-232 (parfois appelée EIA RS-232, EIA 232 ou TIA 232) est
@@ -24,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>
@@ -50,27 +93,59 @@ 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~:
Connecter un Minitel\index{MINITEL}
pour dialoguer avec Ulla Trentsixquinze ? Brancher un
Sportster 14400 pour retouver Fidonet\index{Fidonet} ?
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 \textbf{//}} \label{portparallele}
\index{port //}
% http://people.redhat.com/twaugh/parport/html/x623.html
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}
Iozone ? Bonnie ? Smart\index{smart} ? UUID\index{uuid} ?
Ddrescue ?
Ddrescue\index{ddrescue} ?
\subsection{blkid}
\subsection{blkid \& lsblk}
À mi-chemin entre le matériel et le système, la commande
\texttt{blkid}\index{blkid} affiche quelques informations
@@ -85,6 +160,24 @@ et surtout les partitions qu'ils contiennent~:
\item PARTUID
\end{itemize}
\vspace{1em}
Quand à \texttt{lsblk}\index{lsblk}, elle affiche
le même genre d'information, mais en plus joli
(j'ai utilisé l'option \texttt{-i} pour que le résultat
passe mieux à l'impression)~:
\begin{verbatim}
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 232.9G 0 disk
+-sda1 8:1 0 18.6G 0 part /
+-sda2 8:2 0 3.8G 0 part [SWAP]
+-sda3 8:3 0 488M 0 part /boot
+-sda4 8:4 0 210G 0 part /home
\end{verbatim}
% -----------------------------------------------------------
\subsection{Smart}\index{smart}
@@ -98,21 +191,47 @@ idéal, la prédiction des pannes.
\begin{verbatim}
smartctl -a /dev/sda
Print a large amount of SMART information for drive /dev/sda .
smartctl -s off /dev/sdd
Disable SMART monitoring and data log collection on drive /dev/sdd .
\end{verbatim}
% -----------------------------------------------------------
\subsection{fsck}\index{fsck}
\subsection{fsck}\index{fsck}\index{fuck}
\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}
% -----------------------------------------------------------
\subsection{tune2fs}\index{tune2fs}
\textsl{Adjust tunable filesystem parameters on ext2/ext3/ext4
filesystems}
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}
L'outil pour connaitre la température de votre CPU surmené.
% -----------------------------------------------------------
@@ -136,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
@@ -166,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
@@ -182,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,9 +3,18 @@
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}
\item{ImageMagick}
\item{Gmic}
\item{NetPBM}
\item{Portable Network Graphic}
\item{TIFF}
\end{itemize}
% -------------------------------------------------------------------
\section{ImageMagick}\index{ImageMagick}
@@ -16,7 +25,18 @@ de maitre Brunus},
l'abondance d'options des outils ImageMagick est vraiment énorme,
et leurs interactions parfois troublantes\dots
\subsection{\texttt{geometry}}
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{montage} pour assembler plusieurs images.
Ils partagent un certain nombre d'options communes.
Certains d'entre eux peuvent avoir un effet destructif%
\footnote{En plus d'avoir un nom de série $Z$.},
vous êtes prévenus.
\subsection{L'option \texttt{-geometry}}
C'est une notion importante, car elle est utilisée comme paramètre
par beaucoup d'options. C'est avec ça que l'on peut définir des
@@ -24,57 +44,107 @@ choses comme la taille (largeur et hauteur) d'une image, ou
la position d'un texte dans l'image, ou une zone sur laquelle
on va travailler.
Et c'est assez compliqué, mais pas que.
\begin{tabular}{|l|p{7cm}|}
\hline
Code & Signification \\
\hline
scale\% & Height and width both scaled by specified percentage. \\
scale-x\%xscale-y\% & Height and width individually scaled by specified percentages. (Only one \% symbol needed.) \\
width & Width given, height automagically selected to preserve aspect ratio. \\
xheight & Height given, width automagically selected to preserve aspect ratio. \\
widthxheight & Maximum values of height and width given, aspect ratio preserved. \\
widthxheight\^ & Minimum values of width and height given, aspect ratio preserved. \\
widthxheight! & Width and height emphatically given, original aspect ratio ignored. \\
widthxheight> & Shrinks an image with dimension(s) larger than the corresponding width and/or height argument(s). \\
widthxheight< & Enlarges an image with dimension(s) smaller than the corresponding width and/or height argument(s). \\
area@ & Resize image to have specified area in pixels. Aspect ratio is preserved. \\
x:y & Here x and y denotes an aspect ratio (e.g. 3:2 = 1.5). \\
\hline
\end{tabular}
% !!!
% est-il nécessaire de traduire ce tableau ?
\subsection{Écrire du texte}
Voici un exemple concret
(tiré du script d'encodage du \textsc{cloître}\index{cloître})
qui montre l'essentiel pour bien débuter. C'est une fonction
écrite en bash\index{bash} qui rajoute un texte sur une image. :
écrite en bash\index{bash} qui rajoute un texte sur une image~:
\begin{verbatim}
function tagpic
{
infile="$1"
outfile="$2"
texte="$3"
txtfont=" -font Utopia "
fontsize=" -pointsize 96 -kerning 6 "
color=" -fill Gray20 -stroke White "
txtopts=" -antialias -alpha off $txtfont "
convert $infile \
${txtopts} \
${txtfont} ${fontsize} \
${color} \
-gravity South \
-annotate +0+85 "${texte}" \
$outfile
}
\end{verbatim}
\lstinputlisting[language=sh]{code/tagpic.sh}
Une petite commande toute bête pour rajouter la date facilement à une photo
daprès les données EXIF\index{EXIF}~:
\begin{lstlisting}
convert nom_du_fichier_source.jpg -gravity SouthEast \
-font Fudd-Regular -pointsize 40 -fill white \
-annotate +20+20 "%[exif:DateTimeOriginal]" \
-quality 100 nom_du_fichier_destination.jpg
\end{lstlisting}
Quelques explications semblent nécessaires, parce que certaines
options sont un peu ésotériques...
options sont un peu ésotériques et parfois inter-dépendantes\dots
\begin{tabular}{|l|p{7cm}|}
\hline
Code & Signification \\
\hline
-txtfont & \\
-fontsize & taille des caractères \\
-kerning & espacement entre les caractères \\
-color & couleur de l'encre \\
-stroke & couleur 'bord' de caractère \\
-strokewidth & largeur de la bordure \\
-txtopts & \textsl{Gni?} \\
-gravity & vers quel point cardinal le texte va-t-il être \textsl{tiré} ? \\
-annotate & \texttt{+30+30 "texte à écrire"} \\
\hline
\end{tabular}
Pour avoir la liste des couleurs disponibles : \texttt{convert -list color}
et celles des polices de caractère : \texttt{convert -list font}.
\begin{itemize}
\item{txtfont}
\item{fontsize}
\item{colors}
\item{txtopts}
\item{-gravity}
\item{-annotate}
\item{Comment mettre une couleur de fond à ce texte ?}
\item{Et un texte semi-transparent ?}
\end{itemize}
\subsection{Faire des GIFs animées}\index{GIF}
% ------------------------------------------
% faire des affiches
\subsection{montage}\index{montage}
Ces images clignotantes sont l'essence même du Web\index{Web}
moderne depuis 1992, et \texttt{convert} sait très bien les
générer.
\begin{quote}
create a composite image by combining several separate images. The images are
tiled on the composite image optionally adorned with a border, frame,
image name, and more.
\end{quote}
Krkrkr\dots
% ------------------------------------------
\subsection{Faire des GIFs animées}\index{gif89a}
Ces petites images clignotantes sont l'essence même du
Web\index{web} moderne depuis 1992 malgré leurs limitations,
et \texttt{convert} sait très bien\footnote{modulo un taux de
compression pas génial.} les générer.
Encore un grand merci à Compuserve\index{Compuserve} pour cette
création essentielle à l'art graphique moderne.
\begin{verbatim}
convert -delay 20 -loop 0 a.png b.png c.png foo.gif
\end{verbatim}
Ce sujet pertinent est abordé plus en détails en
page \pageref{chap:gif89a}
page \pageref{chap:gif89a} avec, nous l'espérons, un exemple
de dithering avec la palette de couleur \texttt{EGA}\index{EGA}.
% ------------------------------------------
\subsection{Extraire une partie de l'image}
@@ -87,19 +157,142 @@ POSITION="+R12+0"
convert -crop ${DIMENSION}${POSITION} +repage $img $dst
\end{verbatim}
\textsl{Use +repage to completely remove/reset the virtual canvas meta-data
from the images.} En gros, on en a besoin quand une opération va
changer la dimension de l'image.
\textsl{Use +repage to completely remove/reset the virtual canvas
meta-data from the images.}
En gros, on en a besoin quand une opération va
changer la dimension de l'image. En détail, j'ai pas tout compris.
% ------------------------------------------
\subsection{conversion vers TGA} \index{TGA}
On trouve encore en circulation de très vieux logiciels qui ne savent lire
qu'un encore plus ancien format : \textsl{Targa file format}.
Et dans une variante bien précise : mode \textsc{rgb} et non compressé%
\footnote{Un jour, peut-être, ça va changer\dots}.
Il nous faut donc une incantation bien précise avec, heureusement, des
arguments aux noms évocateurs :
\begin{lstlisting}
GOTO_TGA ()
{
convert $1 \
-compress none \
-alpha off \
-colorspace RGB \
-type truecolor \
$2
}
\end{lstlisting}
On peut aussi procéder autrement, avec les outils PNM\index{PNM} :
\begin{verbatim}
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}
Cette commande nous fournit un ensemble d'informations\footnote{aka metadata}
pertinentes sur un fichier image~: format, résolution, couleur ou n/b,
nombre de bits par pixel\dots
\begin{verbatim}
tth@konrad:~/GravityField $ identify WS/nanim//00000.pgm graph.png
WS/nanim//00000.pgm PGM 2048x2048 2048x2048+0+0 16-bit Grayscale
Gray 20.5765MiB 0.690u 0:00.690
graph.png PNG 640x640 640x640+0+0 8-bit sRGB 102c 18165B 0.000u 0:00.000
\end{verbatim}
https://imagemagick.org/script/escape.php
Et ces données peuvent être utilisé pour rajouter une simili
\textsc{IA}\footnote{Sorry, private joke inside\dots}
% ------------------------------------------
%
% http://al.howardknight.net/?ID=170228531600
%
\subsection{Configuration}
La configuration est dans le répertoire \texttt{/etc/ImageMagick-6/}, et
on y trouve en particulier le fichier
\texttt{policy.xml}\footnote{Le XML, c'est comme la violence...}
certaines ressources, comme la mémoire utilisable, peuvent être réglées.
\begin{verbatim}
$ identify -list resource
Resource limits:
Width: 16KP
Height: 16KP
List length: 18.446744EP
Area: 128MP
Memory: 256MiB
Map: 512MiB
Disk: 1GiB
File: 768
Thread: 4
Throttle: 0
Time: unlimited
\end{verbatim}
Vous pouvez aussi tenter de comprendre le contenu du fichier
\texttt{thresholds.xml} puis revenir me l'expliquer juste après
ma sieste, je pense que ça permet de jouer sur différentes méthodes
de \textsl{dithering}, par exemple pour faire du Bayer.
% ------------------------------------------
\subsection{Trucs}
\begin{itemize}
\item{convert -average frame*.png output.png}
\item{convert -brightness-contrast 20\% foo.png bar.png}
\end{itemize}
Il y en plein d'autres, des tricks \textsl{àlc} à découvrir.
Ce sera, pour vous amis lecteurs, une dure mission à assumer.
% ------------------------------------------
\subsection{Ressources}
Le futur livre de Brunus.
Réclamez les premiers drafts dans
l'IRC\index{IRC} \texttt{libera.chat\#paulla} \textit{:)}
\texttt{http://www.fmwconcepts.com/imagemagick/index.php}
% https://legacy.imagemagick.org/Usage/resize/
% -------------------------------------------------------------------
\section{Gmic}\index{Gmic}
XXX\index{XXX}
\textsl{Perform generic image processing operations, through the G'MIC
language interpreter. gmic: GREYC's Magic for Image Computing.}
Existe aussi en plugin pour Gimp\index{Gimp}.
Gmic se base sur une grosse\footnote{énorme, même. dans les deux sens\dots}
bibliothèque de fonctions écrite
en \texttt{C++}\index{C++} dont l'utilisation est bien
documentée dans le livre ???\index{XXX} mais nécessite quand même
de solides bases dans les subtilitées fourbes du \texttt{C++}.
Gmic existe aussi en plugin pour Gimp\index{Gimp} avec une interface
pleine de curseurs et de boutons, qui facilite (ou pas) l'exploration
des possibles.
% -------------------------------------------------------------------
@@ -122,24 +315,96 @@ for ((y=0; y<250; y++)) {
\subsection{Questions}
Comment faire un resize ?
Comment faire un \textsl{resize} avec NetPBM ?
Est-il nécessaire d'apprendre la bibliothèque de fonctions
\texttt{libnetpbm}\footnote{Réponse: certainement oui.} ?
% -------------------------------------------------------------------
\section{Portable Network Graphic}\index{PNG}
Voici le problème du soir%
\footnote{\textsl{trollday}Fri Nov 13 00:07:19 CET 2020} :
\footnote{\textsl{trollday} Fri Nov 13 00:07:19 CET 2020} :
j'utilise pour lire ce format de fichier la bibliothèque
\texttt{pnglite} qui a de gros soucis avec beaucoup de
ceux-ci, par exemple ceux qui sont en \texttt{sRGB} crées
par des outils essentiels comme POVray\index{POVray}.
par des outils essentiels comme POVray\index{Povray}.
Il serait bon de voir la \texttt{libpng} officielle.
pngcrush ?
pngcrush ? optipng ?
\texttt{pngtopnm \$png | pnmtopng > \$goodpng}
% -------------------------------------------------------------------
\section{Tag Image File Format} \index{TIFF} \label{TIFF}
\begin{quote}
Yes, but tiffcp is by far the most significant case. And perhaps one of the
most used of the tools. I may not be impartial on this, though :-) because I
use it heavily.
\end{quote}
\begin{verbatim}
tiffcp combines one or more files created according to the Tag Image
File Format, Revision 6.0 into a single TIFF file. Because the output
file may be compressed using a different algorithm than the input
files, tiffcp is most often used to convert between different compres
sion schemes.
\end{verbatim}
% -------------------------------------------------------------------
\section {EXIF} \index{EXIF}
Un \textit{tag} EXIF est un petit morceau d'information nommée inclus
dans un fichier image. Il peut contenir des données comme la sensibilité
ISO\index{ISO} du capteur, ou le modèle d'objectif utilisé.
D'autres informations en page \pageref{whatisExdif}
% -------------------------------------------------------------------
\section{Cimg} \index{Cimg}
\texttt{Cimg} est l'énorme bibliothèque de fonctions
(écrites en \texttt{C++}\footnote{\textsc{wtf?}}) sur lesquelles
est basé Gmic. C'est long à compiler, ça produit des binaires
énormes, mais il semble bien que ça puisse faire des trucs géniaux.
Peut-être\footnote{Les rêves ne sont pas interdits.}, existe-il une
interface pour le Fortran moderne ?
\subsection{\textsc{hello world}}
\begin{lstlisting}
#define cimg_use_png
#include "CImg.h"
using namespace cimg_library;
#define BLUR 0.35
int main(int argc,char **argv)
{
if (3 != argc) {
fprintf(stderr, \
"Usage: %s infile.png outfile.png\n", argv[0]);
exit(1);
}
CImg<unsigned char> imgIn (argv[1]);
CImg<unsigned char> imgOut = \
imgIn.get_norm().blur(BLUR).normalize(0, 255);
imgOut.save(argv[2]);
return 0;
}
\end{lstlisting}
Un concept interessant, mais pas évident au premier abord. Un peu comme
les branchements dans Chuck\index{Chuck} ou les pipes du shell\dots
\subsection{Questions...}
\begin{itemize}
\item{Comment virer le canal alpha à l'enregistrement d'une image en PNG ?}
\end{itemize}
% -------------------------------------------------------------------

35
chap/ioctl.tex Normal file
View File

@@ -0,0 +1,35 @@
\chapter{I/O control}
\label{chap:ioctl} \index{ioctl}
Un des paradigmes les plus connus à propos des systèmes de la
famille Unix est : \textsf{Tout est vu comme un fichier}.
C'est souvent vrai, mais parfois ce n'est pas suffisant.
Prenons rapidement un exemple, le baton de joie\index{joystick}
dans Linux.
\begin{verbatim}
int joy_fd;
char joy_name[128];
joy_fd = open(joy_device , O_RDONLY);
if (ioctl(joy_fd, JSIOCGNAME(sizeof(joy_name)), joy_name) < 0)
strncpy(joy_name, "Unknown", sizeof(joy_name));
fprintf(stderr, "Name: \"%s\"\n", joy_name);
\end{verbatim}
La macro \texttt{JSIOCGNAME} étant définie dans le fichier
\texttt{/usr/include/linux/joystick.h} comme
\texttt{\_IOC(\_IOC\_READ, 'j', 0x13, len)}.
Bon, d'accord, j'aurais pu choisir un exemple plus simple,
mais vous avez capté le principe\dots
% =========================================================
\vspace{5em}
Ailleurs dans ce document :
la gestion des ports série (p. \pageref{rs232}) utilise beaucoup les ioctl,
tout comme les webcams (p. \pageref{chap:webcam})
% =========================================================

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}.
% ===============================================================
% ===============================================================

22
chap/manpages.tex Normal file
View File

@@ -0,0 +1,22 @@
\chapter{manpages}
\index{man}
\label{chap:manpages}
Guidelines for writing man pages can be found in \texttt{mdoc(7)}.
\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
the manual. The default action is to search in all of the available
sections following a pre-defined order ("1 n l 8 3 2 3posix 3pm 3perl
3am 5 4 9 6 7" by default, unless overridden by the SECTION directive
in /etc/manpath.config), and to show only the first page found, even if
page exists in several sections.
\section{Un exemple ?}
XXX\index{XXX}
Voir \texttt{roff}\index{roff} en page \pageref{roff}.

202
chap/modular.tex Normal file
View File

@@ -0,0 +1,202 @@
\chapter{Modulaires}
\label{chap:modular}
Comment définir un synthétiseur modulaire en quelques mots ?
Disons que c'est un synthé dont chaque composant élémntaire
est indépendant, et interconnectable aux autres par un gros
plat de cables sans parmesan.
Un univers intrigant et infini.
% ======================================================
\section{Chuck} \index{Chuck}
Chuck peut être vu comme un équivalent logiciel à ce système
de cablage. Nous avons sour la main des modules, que nous allons
raccorder et paramétrer grace à l'opérateur \texttt{=>}.
Le module \texttt{dac} correspond à la sortie audio de votre
machine.
Voici donc un premier exemple, sans la moindre prétention
musicale~:
\lstinputlisting{code/beep.ck}
Félicitation, vous venez de coder un diapason rudimentaire.
La première ligne connecte un oscillateur sinusoïdal
directement sur la sortie audio, les deux suivantes
règlent le volume et la hauteur du signal généré, et la
dernière demande d'attendre deux secondes avant d'arreter.
Mais je suis bien d'accord avec vous, ce son est un peu
agressif, surtout dans l'attaque. Hop, nous allons brancher
un nouveau module entre le générateur et la sortie~:
un contrôleur d'enveloppe qui atténuera la brutalité de
l'attaque et la violence de la fin du son.
\lstinputlisting{code/bipenv.ck}
C'est déja mieux \textit{:)} Détaillons les quatre dernières
ligne de ce script~: deux nous sont déja connues, celles où
l'on met une \textsl{duration} dans le \texttt{now} afin
d'attendre un certain temps. quand aux deux autres
(qui sont des appels de méthode, reconnaissables à la
paire de parenthèses qui les terminent)
elles déclenchent le debut et la fin du contrôleur
d'enveloppe.
Quand on actionne le \texttt{keyOn}, le processeur d'enveloppe
commence avc un gain à 0 et monte progressivement au gain
maximal dans le temps réglé au préalable dans
\texttt{e.duration}. De la même façon, \texttt{keyOff}
fait redescendre le volume à 0 à la fin du beep sur
la même durée, et pour entendre cette partie finale , il nous
faut attendre un peu, d'où la dernière ligne.
Et avant de passer à la suite, voyons un peu le coté plus
« informatique » de Chuck. La séquence d'instruction finale
de l'exemple précédent peut être vu comme un bloc unique,
puisque il n'a qu'une seule finalité~:
générer le beep\index{beep}.
Et pour ça, nous allons les regrouper dans une \textbf{fonction}
que voici que voilà :
\begin{verbatim}
fun void beep() {
e.keyOn(); 2::second => now;
e.keyOff(); 1::second => now;
}
\end{verbatim}
Pour l'utilisation de cette fonction, c'est dans la partie suivante.
Bienvenue dans le monde merveilleux des lignes de code.
% ------------------------------------------------------
\subsection{Les filtres}
Le son que nous avons utilisé dans les précédents exemples
est une sinusoïde, un son « pur » que l'on peut qualifier
sans crainte de légèrement pauvre. Nous allons régler ça.
Vous pouvez déja essayer de remplacer le sinus par une onde
carrée, un \texttt{SqrOsc}, bien remplie d'harmoniques.
C'est ce que nous allons faire, mais nous allons aussi rajouter
un filtre passe-bande pour moduler la couleur du son.
\lstinputlisting{code/bipfilter.ck}
Puisque la fréquence de notre \textit{beep} est calée à
440 Hz, nous allonc chercher les harmoniques supérieures
vers 1337 Hz, avec une largeur de bande assez grande.
Et nous obtenons un son bien plus brillant, mais encore
un peu inerte.
Prochaine étape, brancher un LFO sur
ce filtre\dots
% ------------------------------------------------------
\subsection{Beep à vibrato}
Les choses vont un peu se corser, avec la notion de
\textsl{multi thread}. Un grand mot pour une chose
(relativement) simple. En fait, une partie du script
va s'exécuter indépendament du reste, un peu comme
l'autonomie de votre LFO matériel.
\lstinputlisting{code/bipvibrato.ck}
Et nous retrouvons la notion de fonction.
% ------------------------------------------------------
\subsection{Attack Decay Sustain Release} \index{ADSR}
Un module d'enveloppe bien plus élaboré, fidèle aux canons
de l'époque. Son utilisation est semblable à \texttt{Envelope} que nous
avons vu plus haut, ce qui nous donne ce patch~:
\begin{verbatim}
SqrOsc s => BPF f => ADSR adsr => dac;
\end{verbatim}
Point suivant : configurer notre ADSR. Il y a bien plus de potards
que dans l'exemple précédent :
attack time et rate, decay time et rate, release time et rate et
sustain level pour finir.
% ------------------------------------------------------
\subsection{Jouer des samples}
Oui, on peut. On peut même faire des choses assez fun.
Juste un example un peu brouillon et qui manque de rigueur,
essentiellement sur le calcul de la durée d'écoute de
l'échantillon en fonction du \textsl{pitch}.
Mais, en attendant mieux :
\lstinputlisting{code/playsample.ck}
Bien entendu, il vous faudra créer le fichier avec
l'échantillon sonore. J'ai utilisé un fichier de quatre
secondes échantilloné à 22050 Hz.
Et j'entend un esprit chagrin râler au fond de la salle :
« oué, nous on veut du gros son ». Patience, nous allons
d'abord voir les briques avant de construire le mur.
% ------------------------------------------------------
\subsection{Dialoguer en MIDI} \index{MIDI} \label{chuck-midi}
Oui, on peut. Et nous allons faire des \textsf{beep} à
partir d'un clavier ou du séquenceur d'une electribe.
Attention, une petite connaissance du protocole MIDI
est nécessaire. Vous trouverez quelques explications
page \pageref{chap:MIDI}.
Le petit bout de code qui suit vous affiche les triplets
reçus en charabia numérique. Leur décriptage est laissé
en exercice à nos lecteurs.
\lstinputlisting{code/midibeep.ck}
Cet exemple est volontairement simple, voire même minimaliste,
afin de ne pas surcharger cet ouvrage. Mais je vous rappelle
que les exemples sur le site sont très instructifs.
% ------------------------------------------------------
\subsection{Communication OSC} \index{OSC} \label{chuck-osc}
OSC, Open Sound Control, a son chapitre dédié en page \pageref{chap:OSC}.
Nous allons nous concentrer sur les aspects Chuck.
J'ai bien une idée d'exemple, mais ce soir, c'est soirée "flemme".
% ------------------------------------------------------
\subsection{Enregistrer}
Il est aussi possible de générer des fichiers .WAV à partir
d'un script Chuck.
\subsection{Aller plus loin}
Et pour la suite, allez onsulter
http://chuck.cs.princeton.edu/ et http://chuck.stanford.edu/
pour tout savoir. La rubrique des exemples est très
instructive.
% ======================================================
\section{Super Collider}
Là, nous rentrons dans le domaine de la jeune Nina, je vais
donc lui,laisser la plume (ou le clavier).
% ======================================================
\section{CSound} \index{Csound}
% ======================================================

View File

@@ -1,7 +1,7 @@
\chapter{Joueurs de musique}
\label{chap:musique}
Vous pouvez aussi aller voir la page \pageref{Son},
Vous pouvez aussi aller voir la page \pageref{chap:son},
qui traite d'autres
problématiques liées au son.
@@ -14,6 +14,25 @@ Personnellement, j'aime beaucoup son look, et son ergonomie parfois
déroutante.
% expliquer comment creer son theme personnel
Les fichiers de configuration sont stockés dans le répertoire
\texttt{\$HOME/.moc/} et on y trouve la config en elle-même, et
les thêmes\footnote{Très importants, les thêmes de mocp :)}.
Un exemple très complet (.../doc/moc/examples/config.example)
est fourni. Les commentaires vous expliquerons bien tout.
Voici un petit extrait de la configuration que j'utilise~:
\begin{verbatim}
# enchainement des morceaux.
Repeat = yes
Shuffle = yes
AutoNext = yes
Theme = moca_theme
\end{verbatim}
Pout un usage de base, c'est bien suffisant, mais il y a des
options avancées qui permettent de faire bien d'autres choses.
%------------------------------------------------------------------
\section{mpd}

13
chap/openwrt.tex Normal file
View File

@@ -0,0 +1,13 @@
\chapter{OpenWrt}
\label{chap:openwrt}
\index{OpenWrt}
Sur quoi tenter de le faire tourner ?
\begin{verbatim}
TP Link
AC 1750
Archer C7
\end{verbatim}
http://sven.stormbind.net/blog/posts/deb\_qemu\_local\_openwrt/

View File

@@ -1,47 +1,73 @@
\chapter{Photographie}
\label{chap:photos}
\index{Photo}
Voir aussi ImageMagick dans le chapitre \ref{chap:image},
Le domaine de la photographie numérique est vaste.
Nous allons essayer d'en entrevoir certains aspects et de
découvrir quelques recettes bien pratiques.
Dans le (dés)ordre, nous verrons comment récupérer les
image d'un appareil qui n'est pas compatible avec le
bien pratique protocole \textsl{mass storage}, puis nous
passerons au traitement des fichiers crus, les fameux
\textsc{raw} qui font le bonheur de monsieur Reep.
Voir aussi ImageMagick dans le chapitre \ref{chap:image},
page \pageref{chap:image}, un bon outil pour brotcher vos images.
%----------------------------------------------------------------
\section{gphoto2}
\index{gphoto2}
Notes écrites en se basant sur la version 2.4.5 (Ubuntu 10.04),
Notes écrites en se basant sur la version 2.5.20 (Debian 10.23),
les choses peuvent être (rarement) différentes chez vous.
L'appareil photo que j'utilise actuellement est un
Canon \textit{PowerShot A520}.
Canon \textit{EOS 600D}\footnote{Hélas, j'ai perdu mon bien-aimé
PowerShot A520\dots}, dont, il faut bien l'avouer, la complexité
m'effraye un peu.
\begin{verbatim}
gphoto2 --list-ports
gphoto2 --list-cameras
gphoto2 --auto-detect
\end{verbatim}
Deux commandes pour obtenir la description des modes de connexion
possibles, et la liste des appareils gérés.
Ces trois commandes servent à obtenir la description des modes de
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$ gphoto2 --auto-detect
Model Port
----------------------------------------------------------
Canon EOS 600D usb:002,005
\end{verbatim}
%----------------------------------------------------------------
Ok, nous savons maintenant par quel petit nom notre Canon est connu
par le système sous-jacent.
\begin{verbatim}
gphoto2 --auto-detect
gphoto2 --port usb:002,002 -P
\end{verbatim}
Détection d'un éventuel appareil connecté, puis récupération
Cette commande fait une récupération
bestiale de toutes les photos (l'option \texttt{-P} peut
être remplacée par \texttt{--get-all-files}).
L'option \texttt{--new} permet de se limiter au
téléchargement des nouvelles photos.
Pour les drogués de la ligne de commande, l'option \texttt{--shell}
démarre un environnement interactif, qui permet d'explorer le
contenu de votre appareil, et d'interagir avec lui.
contenu de votre appareil, et d'interagir avec lui. Ce qu'on peut faire
semble assez dépendant du modèle d'apn utilisé.
Il doit exister plein d'autres tricks'n'tips, il faut juste prendre
le temps de les découvrir.
%----------------------------------------------------------------
%================================================================
\section{ufraw}
\index{ufraw}
@@ -50,7 +76,39 @@ Ufraw (Unidentified Flying Raw) est un convertisseur de fichier images
\textit{RAW}, c'est à dire en général les données brutes en sortie
du capteur de l'appareil photo.
%----------------------------------------------------------------
%================================================================
\section {EXIF} \index{EXIF} \label{whatisExdif}
\texttt{exiftool - Read and write meta information in files}
\begin{quote}
\textbf{from wikipedia:}
Exchangeable image file format (officially Exif, according to JEIDA/JEITA/CIPA
specifications) is a standard that specifies formats for images, sound,
and ancillary tags used by digital cameras (including smartphones), scanners and
other systems handling image and sound files recorded by digital cameras.
\end{quote}
% ----
\subsection{Lire}
Peut-être est-il temps de passer (comme d'habitude) à un exemple pratique.
J'ai un appareil numérique\footnote{un Canon EOS 600D, mais ça n'est pas important}
et quatre objectifs. Je souhaite écrire le nom de l'objectif sur l'image,
et de préférence dans une teinte assez kitch\index{kitch}. Comment faire ?
% ----
\subsection{Écrire}
Un autre exemple me vient à l'esprit : Je souhaite rajouter un petit texte dans
les \textit{tags} d'un fichier JPEG. Comment procéder ?
Et surtout sans perdre les \textit{tags} déja présents.
%================================================================

110
chap/plugins.tex Normal file
View File

@@ -0,0 +1,110 @@
\chapter{Plugins}
\index{plugin}
% ------------------------------------
Le concept de bibliothèque partagée
(\textsl{shared library} en anglais est apparu, du moins
dans le monde Unix, avec \textsl{SunOS 4}, en 1989.
Mais il est probable que ce concept existait déja dans
d'autres mondes, peut-être avec \textsl{AmigaOS} ou
\textsl{VAX/VMS}\index{VMS}\dots
Une bibliothèque partagé (aka \texttt{.so}) est une collection
de fonctions, chargée une seule fois en mémoire centrale,
mais qui peut être utilisée par plusieurs programmes en
même temps.\index{.so}
Et c'est en partie sur ce concept qu'est basé le premier
mécanisme que nous allons découvrir~:
\texttt{dlopen} et sa petite famille.
% ------------------------------------
\section{Mécanisme}
\index{dlopen} \index{dlclose}
\texttt{dlclose, dlopen, dlmopen - open and close a shared object}
\begin{quote}
The function dlopen() loads the dynamic shared object (shared library)
file named by the null-terminated string filename and returns an opaque
"handle" for the loaded object. This handle is employed with other
functions in the dlopen API, such as dlsym(3), dladdr(3), dlinfo(3),
and dlclose().
\end{quote}
Traduit en clair, la fonction \texttt{dlopen} permet de charger
manuellement une bibliothèque partagée (un \texttt{.so})
en mémoire centrale, au lieu de
laisser faire le loader (ld.so) automatiquement au lancement
d'un binaire. la fonction \texttt{dlclose} va, elle, vidanger
la zone mémoire dans laquelle est le plugin.
% ------------------------------------
\section{Un exemple ?}
\label{ex_dlopen}
Comme d'habitude, je vais proposer un exemple un peu artificiel,
mais qui, de part sa simplicité, illustrera clairement
les concepts de base. Partons du principe que nous avons
un tableau de quatre nombres flottants, et que nous souhaitons
proposer un affichage de ce tableau modifiable à volonté.
Nous allons donc écrire notre fonction personnelle d'affichage
dans un fichier \textsc{.c} indépendant
(ci-après dénommé «le plugiciel») et qui
sera chargé dynamiquement au \textsl{run-time} par le logiciel
principal (l'appelant).
\subsection{Le plugiciel}
C'est ici que nous trouverons le code actif de l'exemple,
l'utilité de notre \textsl{usecase} reste à déterminer par nos
lecteurs, mais seulement à titre d'exercice.
\lstinputlisting[language=c]{code/plugiciel.c}
On peut difficilement faire plus simple pour une première
approche, mais attendez la suite des opérations,
la cinquième va vous étonner.
\subsection{L'appelant}
Voyons maintenant comment mettre ça en œuvre depuis le programme
principal.
Nous supposerons que le binaire du plugin est dans le répertoire
courant. Pour les autres cas, il faut jouer avec la variable
d'environnement \texttt{LD\_LIBRARY\_PATH} (cf man dlopen(3)) ou
le fichier \texttt{/etc/ld.so.cache} (cf man ldconfig(8)).
\lstinputlisting[language=c]{code/appelant.c}
Ah, les choses se corsent un peu, il y a un pointeur bien
tortueux à déchiffrer. Il était temps.
\texttt{void (*funcname)(const char*, const float *);}
\subsection{Le run}
\begin{verbatim}
tth@fubar:~/Documents/TetaTricks/code$ make plugin
gcc -Wall -shared -fPIC plugiciel.c -o plugiciel.so
gcc -Wall appelant.c -ldl -o appelant
tth@fubar:~/Documents/TetaTricks/code$ ./appelant
rgb * a = : 6.685000 8.320000 1.570795
tth@fubar:~/Documents/TetaTricks/code$
\end{verbatim}
% ------------------------------------
\section{Autres langages}
En Perl\index{Perl} ?
En Fortran\index{Fortran} ?
% -------------- to be continued

98
chap/print.tex Normal file
View File

@@ -0,0 +1,98 @@
\chapter{\textbf{\textsl{lp0 on fire!}}}
\label{chap:imprimer}
%-----------------------------------------------------------------
L'impression sour Linux semble avoir plusieurs personnalités.
La chaine logicielle mise en œuvre est parfois étonnament
complexe (il en existe même plusieurs) et ls système par défaut,
\texttt{CUPS} (page \pageref{CUPS}), se contrôle
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.
%-----------------------------------------------------------------
\section{Historique}
Line Printer Daemon Protocol
LPR Ng
Cf le bouquin de Bellanger.
%-----------------------------------------------------------------
% https://fr.wikipedia.org/wiki/Internet_Printing_Protocol
\section{IPP : Internet Printing Protocole} \index{IPP} \label{IPP}
\begin{quote}
\textbf{wikipedia:}
« 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
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}
\begin{quote}
\textbf{wikipedia:}
Common Unix Printing System (CUPS) est un système modulaire d'impression
numérique pour les systèmes d'exploitation Unix et assimilés.
Tout ordinateur qui utilise CUPS peut se comporter comme un serveur d'impression ;
il peut accepter des documents envoyés par d'autres machines (ordinateurs clients),
les traiter, et les envoyer à l'imprimante qui convient.
\end{quote}
%-----------------------------------------------------------------
\section{Pretty printers}.
\subsection{enscript} \index{enscript}
\begin{verbatim}
DESCRIPTION
Enscript converts text files to PostScript or to other output
languages. Enscript can spool the generated output directly
to a specified printer or leave it to a file. If no input
files are given, enscript processes the standard input stdin.
Enscript can be extended to handle different output media and
it has many options which can be used to customize the print
outs.
\end{verbatim}
\subsection{GNU a2ps} \index{a2ps}
\begin{verbatim}
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'.
\end{verbatim}
\subsection{Les autres\dots}
\begin{itemize}
\item fmt\index{fmt} / pr\index{pr}
\item lgrind
\item src2tex
\item trueprint
\end{itemize}
%-----------------------------------------------------------------

View File

@@ -7,18 +7,79 @@ et graphique interactive et au graphisme de données, mais sa simplicité
d'utilisation en fait aussi un bon support pour l'apprentissage de la
logique de la programmation pour les non-programmeurs.
Processing est écrit en Java\index{Java}, et est, en fait, une sorte
de surcouche dont le principal intérêt est de masque la complexité
de ce langage. Une opinion toute personnelle. Mais un outil digne
d'intérêt.
% -------------------------------------------------------------------
\section{Installation}
Pour commencer, allez donc chercher le logiciel
dans \texttt{http://processing.org/download}.
Ensuire regardez ce qu'il y a dedans~:
\begin{verbatim}
tth@fubar:~/$ tar ztf ~/Downloads/processing-3.5.4-linux64.tgz | head
processing-3.5.4/
processing-3.5.4/processing
processing-3.5.4/tools/
processing-3.5.4/tools/MovieMaker/
\end{verbatim}
La documentation officielle nous explique comment installer le
tarball dans votre \$HOME. Personnellement, je n'aime pas cette
solution, et je préfère nettement une installation
\textsl{systemwide}, afin que tout les yusers y aient accès.
Nous allons donc installer l'archive dans un répertoire
adapté pour les logiciels externes~:
\texttt{/usr/local/}\footnote{Certains peuvent préferer
\texttt{/opt/}, mais c'est vous qui voyez\dots},
puis utiliser un lien symbolique pour lancer Processing.
%
% question à trancher : lien 'dur' ou symbolique ?
%
\begin{verbatim}
tth@fubar:~$ su -
Password:
root@fubar:~\# cd /usr/local/
root@fubar:/usr/local \# tar zxf /home/tth/Downloads/processing-3.5.4-linux64.tgz
root@fubar:/usr/local \# ln -s /usr/local/processing-3.5.4/processing bin/processing
root@fubar:/usr/local \# logout
tth@fubar:~$
\end{verbatim}
Voilà, processing est maintenant prêt à être utilisé, modulo quelques soucis
avec les items du menu "Help", que j'espère bien comprendre en plongeant
dans une \textsl{stacktrace} de l'enfer.
% -------------------------------------------------------------------
\section{Premiers pas}
Nous allons créer une fenêtre et dessiner quelque chose dedans,
ce qui semble raisonnable pour débuter\dots
% -------------------------------------------------------------------
\section{Vers l'extérieur}
Open Sound Control\index{OSC}, aka OSC (voir page \pageref{chap:OSC})
pour causer sur le réseau,
rs232\index{rs232} pour causer avec un Arduino\index{Arduino},
% -------------------------------------------------------------------
\section{Extensions}
Comment peut-on écrire une extension ? Et envisageons le pire,
utiliser une bibliothèque écrite en C ?
% -------------------------------------------------------------------

View File

@@ -1,14 +1,15 @@
\chapter{Les intertubes}
\chapter{Les Intertubes}
\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},
\textsc{ssh} page \pageref{chap:ssh},
streaming page \pageref{streaming},
streaming page \pageref{chap:streaming},
et probablement bien d'autres à venir.
% http://dougvitale.wordpress.com/2011/12/21/deprecated-linux-networking-commands-and-their-replacements/
@@ -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
@@ -51,96 +54,58 @@ est peut-être un debianisme, ymmv.} un fichier nommé
\begin{verbatim}
service qotd
{
disable = yes
type = UNLISTED
socket_type = stream
protocol = tcp
user = nobody
server = /usr/local/bin/qotd.sh
}
{
disable = no
type = UNLISTED
socket_type = stream
protocol = tcp
user = nobody
server = /usr/local/bin/qotd.sh
}
\end{verbatim}
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
% ==============================================================
\section{Translation d'adresse}
\index{NAT}
% XXX expliquer un peu le NAT !
Voir en page \pageref{NAT} pour découvrir comment utiliser une
machine connectée en WiFi pour donner accès à Internet à votre
réseau local Ethernet\dots
Mais cette translation d'adresse peut avoir aussi d'autres
défits à relever pour en faire une solution complexe et
défis à relever pour en faire une solution complexe et
amusante à des problèmes inexistants et datant du siècle
dernier.
Par exemple la comparaison de la mise en œuvre du NAT
avec \texttt{iptable} et \texttt{pfctl} est une source de trolls
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}
@@ -148,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}
@@ -163,7 +130,7 @@ Le port par défaut utilisé est le 5001.
% -------------------------------------------------------------
\subsection{tcpdump}
\index{tcpdump}
\index{tcpdump} \label{tcpdump}
C'est clairement un outil dédié au voyeurisme, mais qui permet de
décrypter les ésotérismes de MiniMad\index{minimad}. C'est donc
@@ -174,6 +141,10 @@ Ces gadgets dialoguent entre eux par le protocole
\footnote{C'est en page \pageref{chap:Bonjour} qu'on
en parle vaguement}.
Mais en fait, non. Je n'ai plus les Minimad sous la main.
Il va falloir trouver un autre exemple, ou l'imaginer
nous-même.
% -------------------------------------------------------------
\subsection{nmap}
@@ -183,11 +154,21 @@ C'est clairement aussi un outil dédié au voyeurisme à distance,
puisque il permet de découvrir, avec plus ou moins de détails,
les services exposés à l'extérieur par une machine distante.
Comment scanner un /24 pour y découvrir les machines ?
\begin{verbatim}
# nmap -sS 192.168.42.0/24
\end{verbatim}
\texttt{-sS} = TCP SYN scan.
% ==============================================================
\section{netcat}
\index{netcat}
\textbf{Attention :} Il existe au moins $N$ variantes de netcat
en circulation, bien entendu avec des options et des
comportements différents.
\begin{quote}
The nc (or netcat) utility is used for just about anything under the sun
involving TCP or UDP. It can open TCP connections, send UDP packets,
@@ -199,6 +180,7 @@ error messages onto standard error instead of sending them to standard
output, as telnet(1) does with some.
\end{quote}
Netcat was written by a guy we know as the Hobbit <hobbit@avian.org>.
% ==============================================================

203
chap/scripting.tex Normal file
View File

@@ -0,0 +1,203 @@
\chapter{scripting}
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
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 des possibilités du langage\dots
\begin{verbatim}
cat { print $0 } or just 1
grep pattern /pattern/
head -n 5 NR <= 5
cut -f1 { print $1 }
tr a-z A-Z { print toupper($0) }
sed 's/hi/ho/g' gsub(/hi/,"ho")
wc -l END { print NR }
\end{verbatim}
Vous pouvez déja constater une certaine élégance portée par une
grande simplicité logique, une sorte d'axiome de base, de
méthologie très \textsc{kiss} :
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 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 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.
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
avec la structure de déroulement d'un script Awk, comme nous allons
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 ».
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.
% ===============================================================

37
chap/sdr.tex Normal file
View File

@@ -0,0 +1,37 @@
\chapter{Sofware Defined Radio}
\label{chap:sdr} \index{sdr}
Beaucoup d'empirisme danc ce chapitre.
Tout d'abord, le matériel à ma disposition~:
\begin{verbatim}
Bus 004 Device 010: ID 0bda:2838 Realtek Semiconductor Corp. RTL2838 DVB-T
\end{verbatim}
Ensuite, le premier hack, dont je n'ai pas encore bien capté
la raison~:
\begin{verbatim}
$ cat /etc/modprobe.d/blacklist-dvb_usb_rtl28xxu.conf
# added by tth
blacklist dvb_usb_rtl28xxu
\end{verbatim}
% ===================================================
\section{CubicSDR}
\begin{quote}
CubicSDR is a cross-platform Software Defined Radio application which
allows you to navigate the radio spectrum and demodulate any signals
you might discover. It currently includes several common analog
demodulation schemes such as AM and FM and will support digital modes
in the future.
SDR hardware is accessed through SoapySDR and therefore any
hardware for which a SoapySDR module exists can be used as a receiver
with CubicSDR.
\end{quote}
% ===================================================

View File

@@ -1,30 +1,306 @@
\chapter{Le Shell}\index{shell}
\label{chap:shell}
Le \texttt{shell} est le coquillage qui isole le MC/P des yusers.
Le \texttt{shell} est le coquillage qui isole le
MC/P\footnote{Master Control Program} des yusers.
En gros, hein, je vais simplifier, et me limiter aux
bricolages constructifs et/ou amusant. Il y aura du gore\index{gore}
aussi.
aussi, parce que le shell est à la fois un interpréteur de commande
et un langage de programmation.
Ces deux notions ont beaucoup de choses en commun, comme nous
allons essayer de le voir. Certains qualifient le shell de
« langage de glue », et c'est une image assez pertinente.
Le shell est à la fois un interpréteur de commande et un
langage de programmation. Ces deux notions ont beaucoup de
choses en commun.
Nous allons nous concentrer sur le \textsl{Bourne again shell}
(aka \texttt{bash}\footnote{aka GNU/shell ?}) qui est un des plus
répandus, du moins dans le monde Linux\index{Linux}.
Mais il en existe d'autres : sh, ksh, ash, zsh, tthsh\dots
Ce qui, bien entendu, pose quelques problèmes de compatibilité.
Nous allons nous concentrer sur le \textsl{Bourne again shell}.
aka \texttt{bash} qui est peut-être le plus répandu. Mais il
en exuste d'autres : sh, ksh, ash, zsh\dots
Ou alors, il faut reste \textsc{posix}, mais c'est pour le moment
une autre histoire. Parce que là, on est plutôt dans une optique
« morefun » sur l'utilisation de nos machines.
% ==============================================================
\section{Interpréteur}\index{cli}
Ceci est un prompt. Son petit nom est \texttt{PS1}.
Ceci est un prompt : \texttt{tth@redlady:\textasciitilde\$}.
Son petit nom est \texttt{PS1}. On peut y
mettre plein d'informations utiles et de \textsl{mises en forme} assez
funky\footnote{Un peu de calme, fatalerrors !} permettant
d'enhancer la reliability de votre UI/UX. Mais surtout il est
là pour indiquer qu'il attend vos ordres, qu'il est prèt à
interpréter vos lignes de commandes.
\begin{verbatim}
tth@redlady:~$ date --utc
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}
Parlons un peu du \textsc{shebang}\index{shebang}\dots
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 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', 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.
Quand on demande au noyau\index{kernel} d'exécuter un fichier
\texttt{(man 3 exec}), il va en lire d'abord les premiers
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}
Une invention géniale, dont vous pouvez voir un exemple d'utilisation
par un gadget sonore en page \pageref{say-uptime} et
un bout de code C en page \pageref{filtre-unix}.
Exemple rapide, où la commande \texttt{uptime} envoie sa sortie dans
le tuyau, et la commande \texttt{tr} va lire le tuyau pour
son entrée~:
\begin{verbatim}
$ uptime | tr ' ' 'X'
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}.
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 ? 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 un fichier contenant quelques fonctions~:
\lstinputlisting{code/shell/fonctions.sh}
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/
\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
Here Doc (9946)
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.
Pour un exemple plus complet, toujours avec gnuplot, c'est vers la
page \pageref{chap:gnuplot}.
% ==============================================================
\section{Les \textsl{locales}}
\index{locales}
% new: Mon Apr 17 10:54:45 UTC 2023
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}
% ==============================================================
@@ -32,6 +308,7 @@ Parlons un peu du \textsc{shebang}\index{shebang}\dots
\begin{itemize}
\item le traitement des chaines de caractères\dots
\item la gestion des co-routines\dots
\end{itemize}

View File

@@ -2,6 +2,8 @@
\label{S-lang}
\index{S-lang}
% ----------------------------------------------------------
\section{C'est quoi ?}
S-lang est une bibliothèque de fonctions multi-plateforme
@@ -13,6 +15,8 @@ L'exemple le plus éblouissant étant le célèbre
longuement dans les pages consacrées à Usenet\index{Usenet}
(page \pageref{slrn}).
% ----------------------------------------------------------
\section{slsh}
\index{slsh}
@@ -40,3 +44,4 @@ tth@plop:~/Essais/Slang$
Cool...
% ----------------------------------------------------------

View File

@@ -1,6 +1,19 @@
\chapter{Son}
\label{chap:son}
Abordons maintenant un sujet complexe :
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.
%------------------------------------------------------------------
@@ -10,7 +23,7 @@
ALSA, \textit{Advanced Linux Sound Architecture}, gère
à peu près correctement les entrées/sorties sonores
d'une machine Linux, aussi bien en audio qu'en
\textsc{midi}\footnote{Voir page \pageref{chap:midi}
\textsc{midi}\footnote{Voir page \pageref{chap:MIDI}
pour en savoir plus.}.
Nous allons faire le tour de quelques outils associés.
@@ -27,7 +40,9 @@ en Curses\index{curses} est époustouflante :
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 noise !}.
James Lewis\footnote{Que ça, c'est de la super noise !}.
Ils partagent beaucoup d'options communes.
\subsection{arecord}
@@ -36,19 +51,66 @@ Si vous avez plusieurs cartes son, la sélection du
l'option \texttt{-l} qui vous donnera la bonne piste,
mais l'option \texttt{-L} qu'il faut utiliser.
\begin{verbatim}
arecord -D plughw:CARD=Snowball,DEV=0 -v -r 22050 foo.wav
\end{verbatim}
\begin{verbatim}
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}
int
main()
{float f
;char c;int
d,o;while(scanf(
"%d%c%d ",&d,&c,&o)
>0){c&=31;for(f=!(c>>4)*55,c=(c*8/5+8)%12+o*
12-24;c--;f*=1.0595);
for(d=16e3/d;d--;
putchar(d*f
*.032))
;}}
\end{verbatim}
https://zserge.com/posts/etude-in-c/
https://www.alsa-project.org/alsa-doc/alsa-lib/pcm.html
\subsection{Le reste}
Et quand on regarde par la lorgnette du programmeur, on découvre
rapidement que l'utilisation d'ALSA n'est pas si simple que
ça, essentiellement à cause d'une documentation spartiate.
Heurensement, pour certains domaines, il existe des
surcouches plus simple d'emploi : \texttt{libao}\index{libao}
pour les sorties
surcouches plus simple d'emploi :
\texttt{libao}\index{libao} pour les sorties
sonores, XXX\index{XXX} pour le reste.
ALSA apporte aussi les primitives et des utilitaires
de gestion des interfaces MIDI\index{MIDI}. Là aussi,
la doc est sommaire. Quelques explications
sur la page \pageref{chap:MIDI}.
%------------------------------------------------------------------
\section{Configurer Alsa}
TODO\index{XXX}
%------------------------------------------------------------------
%
% bienvenu dans le monde de LP
\section{pulseaudio}
\index{pulseaudio}
\label{pulseaudio}
@@ -57,7 +119,8 @@ On avait pourtant dit « \textbf{pas de trolls} », mais il va quand
même falloir y passer : ce machin prétenduement
\textsl{michu compliant}\index{Michu}
a parfois, voire même souvent, tendance à se mettre en travers
du chemin des honnètes gens.
du chemin des honnètes gens%
\footnote{Du moins vers les années 2014/2019}.
%------------------------------------------------------------------
\section{Jack}
@@ -71,7 +134,8 @@ lui laisser le soin d'en parler.
Jack peut aussi servir de source sonore pour
darkice\index{darkice}, lequel pourra feeder un
Icecast\index{icecast}
serveur de stream comme Icecast\index{icecast}
(cf page \pageref{chap:streaming}).
%------------------------------------------------------------------
@@ -81,17 +145,16 @@ Icecast\index{icecast}
\index{libsndfile}
Libsndfile est essentiellement une très complète bibliothèque
de lecture/écriture de fichiers sons.
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.
Par contre, elle arrive avec une floppée d'outils en ligne de
Elle arrive avec une floppée d'outils en ligne de
commande, dont certains sont assez performants.
Citons, entre autres, \texttt{sndfile-resample} qui est un
convertisseur de
fréquence d'échantillonage très performant.
convertisseur de fréquence d'échantillonage très
performant\footnote{Et probablement basé sur \textsl{Secret Rabbit Code}}.
%------------------------------------------------------------------
@@ -105,9 +168,29 @@ d'une application
to output audio using a simple API on a wide variety of platforms.}).
Elle supporte une grande variété de formats.
\lstinputlisting[language=C]{ao_example.c}
\lstinputlisting[language=C]{code/ao_example.c}
La configuration se fait par deux fichiers :
\texttt{/etc/libao.conf} surchargeable par
\texttt{\$HOME/.libao.conf}, et schématiquement, nous pouvons
voir qu'elle est à deux niveaux.
https://www.xiph.org/ao/doc/drivers.html
\subsection{Choisir la sortie}
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 3.5 standard, casque audio USB\dots).
%------------------------------------------------------------------
\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}
\textsl{custom-made} à mon idée\dots
%------------------------------------------------------------------
@@ -131,7 +214,6 @@ Sox est le « couteau suisse » des manipulateurs de données
sonores. Sa documentation étant assez ésotérique, je vais
faire comme d'hab' : présenter des exemples approximatifs.
\subsection{Conversions}
Nous avons un process quelconque qui nous délivre des données
@@ -158,18 +240,32 @@ random.wav: random.dat Makefile
\begin{verbatim}
play -n synth sine 480 sine 620 remix 1-2 fade 0 0.5 delay 0.5 repeat 5
play -r $[28*1024] -b 16 -c 2 -e signed-integer -t raw /dev/sda -S
play -r $[8*1024] -b 8 -c 1 -e unsigned-integer -t raw /dev/sda -S
\end{verbatim}
\subsection{Traitements}
\texttt{sox --norm source.wav normal.wav} pour normaliser un son.
\texttt{sox --norm[=dB-level] source.wav normal.wav} pour
normaliser un son.
\textsl{Automatically invoke the gain effect to guard against
clipping and to normalise the audio}.
\texttt{sox left.wav right.wav -M stereo.wav} pour combiner deux
voies mono en un fichier stéréo. \texttt{-M} est l'abréviation
de \texttt{--combine merge}.
Question en attente : comment combiner huit pistes monophoniques
en un seul fichier ?
Dupliquer
la piste d'un fichier mono pour obtenir un fichier stéréo :
"\texttt{sox - -t wav -b 16 - remix 1 1}" avec le premier tiret
qui dit de prendre l'entrée standard
Questions en attente :
comment combiner huit pistes monophoniques
en un seul fichier contenant ces 8 pistes ?
Quelles métriques Sox peut-il extraire ? Eg: \textsl{spectrogram}.
%------------------------------------------------------------------
@@ -177,7 +273,8 @@ en un seul fichier ?
\section{espeak}
\index{espeak}
Logiciel de synthèse vocale.
Logiciel de synthèse vocale. Mais c'est pas comme un
spo256al2, hélas.
\begin{verbatim}
tth@plop:~/RADIO$ espeak --voices=fr
@@ -186,12 +283,25 @@ Pty Language Age/Gender VoiceName File Other Langs
7 fr M french-mbrola-1 mb/mb-fr1
7 fr F french-mbrola-4 mb/mb-fr4
5 fr-be M french (Belgium) fr-be
tth@plop:~/RADIO$ cat hello.txt | espeak
\end{verbatim}
Comme à l'accoutumée, nous allons chercher un contexte d'utilisation
futile et réjouissant. Le texte qui sera « parlé » sera la sortie
de la commande \texttt{ddate}\index{ddate}%
\footnote{outil indispensable de la vie numérique
\texttt{http://www.subgenius.com/}}, avec une voix
d'outre-monde, sur un seul canal, ce que nous pouvons entendre avec
"\texttt{echo \$(ddate) | espeak-ng}".
%------------------------------------------------------------------
\section{ecasound} \index{ecasound}
%------------------------------------------------------------------
\section{Pour finir...}
En conclusion, le son avec Linux, c'est un peu la grande foire.

View File

@@ -14,9 +14,11 @@ other attacks. Additionally, OpenSSH provides secure tunneling
capabilities and several authentication methods, and supports
all SSH protocol versions.}
% --------------------------------------------
\section{X11 forwarding}\index{X11}
Option \texttt{-X} et ses implications sur la sécurité.
\section{sshfs}
\index{sshfs}
@@ -30,7 +32,7 @@ the implementation makes use of the FUSE (Filesystem in Userspace)
kernel module. The practical effect of this is that the end user can
seamlessly interact with remote files being securely served over SSH
just as if they were local files on his/her computer. On the remote
computer the SFTP subsystem of SSH is used.}
computer the SFTP\index{sftp} subsystem of SSH is used.}
Hélas, ça ne marche pas trop bien depuis un
OpenBSD\index{OpenBSD}\footnote{OpenBSD 5.5 sur sparc64} :
@@ -51,5 +53,8 @@ les bons droits sur \texttt{/dev/fuse*} et un
La semaine prochaine, nous verrons le \textit{mapping} entre les
UID\index{UID} locaux et distants.
% --------------------------------------------
\section{Port forwarding}
% https://tookmund.com/2021/10/ssh-port-forwarding

View File

@@ -8,54 +8,62 @@
Avertissement : pour le moment\footnote{En juillet 2014}, nous
n'allons nous pencher que sur la diffusion de flux audios, avec
des encodages libres comme \textsl{ogg} ou \textsl{speex}.
Tout simplement parce que le monde de la vidéo est un gigantesque
foutoir de codecs, de containers, de brevets logiciels et
d'incompatiblités diverses et variées.
Une notion importante à bien comprendre, c'est l'organisation
du flux des sons immatériels au travers des intertubes.
\textbf{insert picture here !}\index{XXX}
%-------------------------------------------------------------
\section{icecast2}
\index{icecast2}
\label{icecast2}
Icecast est, semble-t-il, \textbf{le} serveur de streaming de référence.
Il se configure facilement avec des fichiers en XML\index{XML}.
Première approche d'une ergonomie différente, vous êtes avertis.
\begin{quote}
Icecast, the project, is a collection of programs and libraries for
streaming audio over the Internet. This includes:
Icecast, the program that streams audio data to listeners,
libshout, a library for communicating with Icecast servers and
IceS\index{ices}, a program that sends audio data to Icecast servers
Ices2\index{ices}, a program that sends audio data to Icecast servers
\end{quote}
Icecast est, semble-t-il, \textbf{le} serveur de stream de référence.
Il se configure facilement avec des fichiers en XML\index{XML}.
Première approche d'une ergonomie différente, vous êtes avertis.
Pour alimenter Icecast en son, il faut utiliser un
\textsl{source-client} approprié. Le modèle recommandé
est \textbf{ices2} qui est détaillé un peu plus loin,
à la page \pageref{ices2}.
Il peut envoyer depuis une entrée audio (alsa, jack, pulseaudio...)
ou une playlistde fichiers \texttt{.ogg}\index{ogg}.
\textsl{more to come...}
%-------------------------------------------------------------
\section{idjc}
\index{idjc}
\begin{quote}
Internet DJ Console is an Internet radio application for making a
live radio show or podcast. Features include two main media players
with a crossfader, a jingle player, microphone signal processing
(compressor and noise gate)
\end{quote}
% https://github.com/radiofrance/rf-liquidsoap
%-------------------------------------------------------------
\section{liquidsoap}
\index{liquidsoap}
Mais nous allonc commencer par un outil puissant, bien que
délicat à comprendre au premier abord~:
\texttt{https://www.liquidsoap.info/}
\begin{quote}
Liquidsoap is an extensible and flexible audio stream generator, mainly
used for streaming to a shoutcast/icecast server.
It is also possible
to output in a file, to speakers or as raw PCM stream.
Liquidsoap is an extensible and flexible audio stream generator,
mainly used for streaming to a shoutcast/icecast server.
It is also possible to output in a file, to speakers or as
raw PCM stream.
liquidsoap can
perform any audio processing, mixing streams together,
applying filters, generating sound procedurally,
@@ -93,19 +101,39 @@ Et la grosse instruction \texttt{output.icecast}
envoie la musique dans votre serveur
Icecast2 en passant les paramètres nécessaires.
\subsection{10.20.0.23}
\subsection{Logfile}
\begin{verbatim}
set("log.file.path", "/home/tth/Radio/log/takeover.log")
set("log.stdout", false)
set("log.level",3)
\end{verbatim}
Alors, la grande question est : « quelle valeur pour le loglevel ? », et
la réponse n'est pas évidente à trouver dans la documentation, il y
a même un ticker ouvert\dots
\begin{itemize}
\item{1 = critical}
\item{2 = important}
\item{3 = normal}
\item{4 = information}
\item{5 = debug}
\end{itemize}
\subsection{10.20.0.23}
Maintenant, voyons un exemple plus complet et plus réaliste,
largement inspiré d'un tutoriel de la documentation officielle,
et qui deviendra un de ces jours la base de Radio-Myrys :
et qui deviendra un de ces jours la base de la nouvelle%
\footnote{L'ancienne ayant été fermée pour des raisons
incompréhensibles.} radio de Myrys~:
\begin{verbatim}
set("log.file.path", "/tmp/savon.log")
set("log.stdout", false)
default = single("loveme.ogg")
openbsd = playlist(mode="random", "files/openbsd.pls")
others = playlist(mode="random", "files/others.pls")
jingles = playlist( "files/jingles.pls")
@@ -113,7 +141,6 @@ jingles = playlist( "files/jingles.pls")
radio = fallback([ switch([({ 5h-11h }, openbsd),
({ 11h-5h }, others)]),
default])
radio = random(weights=[1,12],[ jingles, radio ])
output.icecast( %vorbis,
@@ -125,11 +152,9 @@ output.icecast( %vorbis,
\end{verbatim}
Ah bah oui, ça commence à être robuste, mais en fait c'est
assez simple à comprendre, et un peu plus compliqué à mettre
presque simple à comprendre, et un peu plus compliqué à mettre
en œuvre.
On se retrouve vite face à un problème classique :
les différences de niveau sonore entre les divers morceaux.
Et comme on veut avancer sur d'autres choses, on rache un
@@ -153,6 +178,15 @@ s = rotate([pl2014, pl2013, ..., jingles])
output.icecast(..., s)
\end{verbatim}
\subsection{Take over the playlist}
XXX\index{XXX}
Il est également possible, avec liquidsoap, d'interrompre la
diffusion d'une playlist à partir d'une autre source
(fichier ou entrée audio), eventuellement externe.
\lstinputlisting{code/takeover.liq}
\subsection{trucs divers}
@@ -170,6 +204,33 @@ la suite les uns des autres ;)
\section{Source clients}
\label{sourceclients}
Il existe une foultitude de clients source pour abreuver icecast2.
%-------------------------------------------------------------
\subsection{ices2} \index{ices2} \label{ices2}
Premier mystère : comment faire le rapprochement entre
la déclaration du périphérique d'entrée
(\texttt{<param name="device">hw:1,0</param>}) et
l'équivalent dans le monde Alsa ?
La commande \texttt{arecord -L} va nous donner quelques
informations sur les « points d'entrée » utilisables.
Liste dont nous extrayons (par la pure pensée logique)
ce fameux nom de device~: \texttt{ plughw:CARD=Snowball,DEV=0}
XXX\index{XXX} que nous pouvons mettre dans le XML.
\textbf{Attention} si votre source est monophonique, comme
le microphone USB \textsc{Snowball} utilisé dans cet exemple,
il NE faut PAS mettre \textsl{downmix} à 1\dots
Et si vous souhaitez dupliquer une entrée à un seul canal
(genre un micro usb) por obtenir une sortie stéréo, ça ne
semble pas possible fin 2020\index{2020}. Il serait temps
de songer à écrire un patch\index{patch}.
%-------------------------------------------------------------
\subsection{Ezstream}
@@ -193,14 +254,139 @@ interface (e.g. sound card), encodes it and sends it to a streaming server.
\end{quote}
%-------------------------------------------------------------
\subsection{VLC}
\index{vlc}
\index{vlc} \label{streamvlc}
VLC est le « cône de chantier » du multimédia.
%-------------------------------------------------------------
\subsection{butt}
\index{butt}
Du clickaconvi qui plante en X remote ;( mais sinon une
interface graphique simple et facile d'emploi. Un bon
choix pour qui aime les choses simples où juste
brancher un microphone et causer dans le Ternet.
%-------------------------------------------------------------
\subsection{idjc}
\index{idjc}
\begin{quote}
Internet DJ Console is an Internet radio application for making a
live radio show or podcast. Features include two main media players
with a crossfader, a jingle player, microphone signal processing
(compressor and noise gate)
\end{quote}
%-------------------------------------------------------------
\subsection{Android} \index{Android}
Cool Mic \texttt{https://coolmic.net/} ?
Mais il faut avoir quelques connaissances en \textsc{modernophone}
pour arriver à tenter de comprendre pouquoi ça ne fonctionne pas,
alors que tout semble correct.
%====================================================================
\section{Gadgets}
On peut aussi imaginer des \textsl{client sources} plus ésotériques.
L'exemple classique étant l'utilisation de la synthèse vocale pour
faire une horloge parlante. Mais comme tout vieux linuxien, j'attache
un intérêt tout particulier à une valeur symbolique~:
l'uptime de ma machine.
En ces temps troublés\footnote{Début janvier 2021, le collectif
d'artistes Mixart-Myrys, dont je fais partie depuis dix ans,
est en train de se faire salement éjecter de son hangartistique.
À cette occasion, j'ai remonté \textit{à la rache} un Icecast,
et je l'ai voulu un peu surprenant pour le béotien, d'où l'uptime parlé.},
l'uptime, c'est important.
\lstinputlisting{code/say-uptime.sh}
L'option \texttt{-p} de la commande \texttt{uptime} permet d'obtenir
une sortie de cette forme : \textsf{up 1 day, 1 hour, 37 minutes}
qu'une micromagie \texttt{sed} change en une forme plus correcte
syntaxiquement, bien qu'anglo-saxonne.
La ligne suivante sert uniquement d'affichage de contrôle, et peut
être supprimée sans vergogne.
\label{say-uptime}
Les trois lignes suivantes vont effectivement généré le son qui sera
envoyé vers la radio\index{radio} de l'Internet.
Premier élément du pipeline, \texttt{espeak-ng} reçoit le texte
par son \textsl{stdin} et génère le flux de
parole sur son \textsl{stdout}, à partir des options
\texttt{-g 9 -s 150 -a 133}, réglant la voix synthétique.
Ensuite, il faut que les échantillons sonores soient au format
physique attendu par le diffuseur,
d'où la conversion en 2$x$16 bits. Et pour finir, il est
encodé/encapsulé dans du OggVorbis\index{ogg} que le
\textsl{yuser} final ne pourra peut-être pas écouter sur
son \textsf{iPhone}.
Quand à la dernière ligne \texttt{~/bin/sender} c'est un programme,
basé sur \texttt{libshout}, qui va gérer l'authentification et
le transfert des données vers un point d'entrée du serveur icecast.
Voilà, c'est tout pour le moment.
%====================================================================
\section{Airtime} \index{Airtime}
Cette partie est écrite pendant l'installation de Airtime
dans \textsf{Radio-Parasite} en octobre 2021.
Hélas, ça ne va pas être si simple que ça.
Le logiciel original a été abandonné depuis plusieurs années
(fin 2015 à la louche)
par son éditeur \textsf{Sourcefabric}.
Un remplaçant potentiel (un fork ?) existe~:
\textsl{LibreTime} qui semble identique.
\begin{quote}
LibreTime est un système d'automatisation de station de radio qui
prend en charge la diffusion Web.
Il est construit à partir de la communauté du système
dautomatisation de la station de radio Airtime de SourceFabric.
\end{quote}
\texttt{https://libretime.org/install}
\texttt{https://libretime.org/docs/host-configuration}
\texttt{https://progsoft.net/fr/software/libretime}
%====================================================================
\section{libshout}\index{libshout}\label{libshout}
Mais c'est quoi ?\index{XXX}
Libshout c'est quoi ? Ah, chers amis de la radio en ligne,
c'est une porte
ouverte facilitant l'accès en direction du monde sonore extérieur,
comme le précise clairement sa documentation~:
\begin{quote}
Libshout is a library for communicating with and sending data to an
icecast server. It handles the socket connection, the timing of the
data, and prevents bad data from getting to the icecast server.
\end{quote}
\lstinputlisting[language=c]{code/microcast.c}
Mais il reste encore pas mal de chose importante à rajouter dans
ce logiciel : par exemple la partie encodage.
%====================================================================

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,14 +37,20 @@ condimentum ante in metus iaculis quis congue diam commodo.
%-------------------------------------------------------------
\section{roff}
\index{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
@@ -50,6 +60,78 @@ une redirection vers \texttt{stdin} comme ceci :
< $BASENAME.txt recode utf8..latin1 | groff -Tutf8
\end{verbatim}
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 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}
\begin{quote}
\texttt{eqn} compiles descriptions of equations embedded within troff
input files into commands that are understood by troff.
\end{quote}
\subsection{tbl}
\begin{quote}
\texttt{tbl} compiles descriptions of tables embedded within troff
input files into commands that are understood by troff.
\end{quote}
\subsection{pic}
\begin{quote}
\texttt{pic} compiles descriptions of pictures embedded within 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}
@@ -66,6 +148,8 @@ and texinfo, a poor-man's text converter and an experimental xml converter.
\section{zoem}
\index{zoem}
General-purpose macro/programming language for transforming text
\begin{quote}
Zoem is a language for transforming text. It supports the creation of
light-weight mark-up languages as macro packages built on top of zoem.

View File

@@ -3,7 +3,10 @@
% ----------------------------------------------------------------
Ahemmm, par quoi commencer\footnote{Par de l'aspirine ?} ? Par un
Ahemmm, par quoi commencer\footnote{Par de l'aspirine ?} ?
La programmation avec les fils d'exécution est un espace
rempli de chausse-trappes.
Par un
extrait de la page \texttt{pthreads(6)} ? Voilà, ça c'est bien :
\begin{quote}
@@ -17,8 +20,43 @@ memory (data and heap segments), but each thread has its own stack
Et c'est là que les ennuis potentiels débarquent :
\textit{share the same global memory}, ce qui veut dire en gros
«~se partagent la même mémoire globale~».
«~se partagent la même mémoire globale~». Et en français de tous
les jours, «~ils vont se marcher sur les pieds~».
D'un autre coté, ce paradigme permet de faire des choses assez
choupi, comme un « synthétiseur d'évènement», notion que noue allons
bientôt contempler.
% ----------------------------------------------------------------
\section{Un exemple}
Nous allons partir sur un exemple peu réaliste, mais simple
à comprendre. Nous aurons un seul fil d'exécution qui affichera
un compteur, puis l'incrémentera. Pendant ce temps, la branche
principale du programme mettra du random dans le compteur, en
espérant perturber l'autre branche.
\lstinputlisting[language=c]{code/thread-demo.c}
Voilà, nous avons là deux \textsl{race conditions} qui
peuvent avoir des effets pervers~: Ils vont
effectivement se marcher sur les pieds.
Dans le thread
(la fonction \texttt{fil}), le
compteur est incrémenté, \textbf{puis} il est affiché.
Si la branche principale poke du random dans le compteur
entre ces deux opérations, *paf* le chien.
Et réciproquement, si le \texttt{main} pose son aléa dans
le compteur, \textbf{puis} l'affiche, cet aléa peut avoir
été incrémenté par l'autre partie du processus.
Un esprit pervers vient quand même modérer ces affirmations
en prétendant que dans ces deux cas, les \textsl{race conditions}
pourraient dépendre des optimisations du compilateur,
et de l'utilisation du \texttt{volatil} pour notre compteur.
%
% ----------------------------------------------------------------
\section{ITC}
@@ -36,12 +74,9 @@ Comment allons-nous procéder\footnote{Et c'est une vraie question !} ?
Une première piste : http://tools.ietf.org/html/rfc3117
% ----------------------------------------------------------------
\section{Un exemple}
Une seconde : \ref{chap:IPC}, page \pageref{chap:IPC}.
XXX\index{XXX}
% ----------------------------------------------------------------
% ----------------------------------------------------------------

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

@@ -6,6 +6,8 @@ les multiples \textsl{codec} et les multiples \textsl{containers},
on est rapidement perdu. Voici donc quelques recettes de cuisine
à appliquer avec modération (et respect des gestes barrières).
% https://unixsheikh.com/tutorials/remuxing-iso-dvd-or-bluray-using-cat-and-ffmpeg-on-linux.html
% --------------------------------------------------------------------
\section{mplayer}
@@ -25,12 +27,16 @@ Pour faire une planche contact d'une vidéo :
jpeg:outdir=/tmp -sstep 60 monfichier.ts}
% --------------------------------------------------------------------
%
% <doug> https://img.ly/blog/ultimate-guide-to-ffmpeg/
%
\section{ffmpeg}
\index{ffmpeg}
D'après certaines rumeurs des intertubes, ce serait un peu le remplaçant
de mencoder pour pas mal de trucs...
de mencoder pour pas mal de trucs, et d'après d'autres rumeurs
(je confirme clairement) c'est vraiment tortueux à utiliser.
Pour convertir une sextape prise avec un \textit{iMachin} :
@@ -42,9 +48,20 @@ Extraire le son d'une vidéo Youtube :
\texttt{ffmpeg -i fichiervideo.flv -vn -ar 44100 -ac 2 -f wav fichierson.wav}
Extraire les images individuelles, dans le but avoué de les maltraiter
avec d'ignobles logiciels~:
\texttt{ffmpeg -i foo.avi -r 1 -s WxH -f image2 foo-\%03d.jpeg}
J'avoue ne pas avoir tout saisi : l'option\texttt{-r N} qui fixe le
\textsl{frame rate} sert à quoi ???
Il existe bien une alternative, mais je n'ai pas encore essayé~:
\texttt{mplayer -vo png -ss 3:46 -frames 20 stairs.mp4}
\# 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
@@ -95,11 +112,20 @@ préciser le coef de qualité ( qscale : 1 = le mieux / 3 = correcte )
ffmpeg -i fichier.dv -target pal-dvd -qscale 2 Fichier.mpeg
\end{verbatim}
https://engineering.giphy.com/how-to-make-gifs-with-ffmpeg/ \index{gif89a}
\begin{verbatim}
ffmpeg -ss 0:5:59.600 -to 0:6:11.150 -i Downloads/foo.mp4 /tmp/tragic.gif
\end{verbatim}
% -----------------------------------------------------------------
\subsection{Encoder un cloître}
Là, nous sommes dans du \textsl{serious bizness}, puisque cette vidéo
a été programmée par James Lewis pour la résidence « Sonoptic 2020 ».
C'est donc un exemple réel.
a été programmée par James Lewis pour la résidence « Sonoptic 2020 »,
vidéo dont il a composé la bande originale.
C'est donc un exemple réel, avec même des méta-données.
\begin{verbatim}
ffmpeg -nostdin \
@@ -112,17 +138,114 @@ ffmpeg -nostdin \
wip.mp4
\end{verbatim}
OMFG! Il manque le son.
% -----------------------------------------------------------------
\subsection{Capturer une vidéo}
%
% mais où ai-je bien pu trouver ça ?
%
\begin{verbatim}
read -p "*** Press Enter to start recording ***"
"$FFMPEGBIN" \
-thread_queue_size 512 \
-r "$RATE" \
-f v4l2 \
-video_size "$SIZE" \
-i "$VIDEODEVICE" \
-crf 0 \
-c:v libx264 \
-preset ultrafast \
-threads 4 \
"$FILENAME"
\end{verbatim}
C'est un peu rudimentaire, mais il doit être possible de
\textsl{tweaker} ça avec d'autres options, genre fixer
la durée de la capture.
% -----------------------------------------------------------------
\subsection{Questions}
Quand on encode images+son, comment arreter au plus court des deux ?
Comment convertir lors de l'encodage un fichier \texttt{.WAV}
en un format compressé afin de ne pas saturer la buvette ?
\textsf{il dit qu'il ne comprend pas la question.}
Quand on encode en // images et son, comment arreter quand on atteint
la fin du plus court des deux flux ?
\textit{look up the options -shortest and -apad}
Comment limiter le nombre de \textsl{cores} utilisés lors d'un encodage
violent sur une toute petite machine\footnote{Coucou le défunt Vaio :)} ?
ffmpeg -f x11grab -video\_size cif -framerate 25 -i :0.0 /tmp/out.mpg
% --------------------------------------------------------------------
\section{VLC} \index{vlc}
VLC est un peu le couteau suisse à 112 lames du multimédia.
Son emblème est un cône de chantier, je ne sais pas
si ça a un sens caché. Mais soyons sérieux deux minutes.
VLC propose une interface \textsl{clickconvi},
que nous allons
soigneusement éviter, pour nous concentrer sur la ligne
de commande.
Pour balancer toutes les vidéos en boucle random~:
\texttt{vlc -f -Z *.mp4}. Mais comment supprimer l'affichage
du nom de fichier au début de chaque séquence ?
VLC peut éventuellement aussi être utilisé comme un outil
de streaming, voyez ça page \pageref{streamvlc}, bon courage.
% --------------------------------------------------------------------
\section{Mediainfo}
\begin{quote}
MediaInfo\footnote{by the famous Zenitram of DaLFP.} is a utility
used for retrieving technical information and other
metadata about audio or video files.
\end{quote}
Et avec du \textbf{Zenitram} dedans \textit{:)}
% --------------------------------------------------------------------
\section{MPV} \index{MPV}
\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 variety
of sources other than disk files. Depending on platform, a variety
of different video and audio output methods are supported.
\end {quote}
Un avantage de Mpv sur ses camarades (Mplayer, Ffplay\dots) est évident
dès que l'on joue une vidéo en boucle~: la transition entre la fin
et le début est propre.
% --------------------------------------------------------------------
\section{Autres trucs}
\index{rtmp}
La video informatique, c'est d'une complexité effarante. La multitude
de codecs, la foultitude de containers, et les nombreuses variantes de
combinaisons codec/container rendent la compréhension de cet univers
assez perturbante.
\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}
% --------------------------------------------------------------------

7
chap/wayland.tex Normal file
View File

@@ -0,0 +1,7 @@
\chapter{Wayland}
\label{chap:wayland} \index{wayland}
L'avenir sans X11 ?\index{X11}

View File

@@ -21,8 +21,12 @@ image.
\textsl{Video For Linux, second edition.}
%
% PLEASE EXPLAIN !
%
\begin{verbatim}
tth@delirium:~/Essais/Fonderie$ v4l2-ctl --list-formats-ext
tth@delirium:~$ v4l2-ctl --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
Type: Video Capture
@@ -39,6 +43,80 @@ ioctl: VIDIOC_ENUM_FMT
Question : quelle méthode utiliser pour avoir la même chose avec
des lignes de code écrites en C ?
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}
%
% trouvé dans pleroma
%
Voilà (désolé dur de faire moins technique en 500 charactères):
\texttt{sudo modprobe v4l2loopback exclusive\_caps\=1 video\_nr\=7 %
card\_label="WebcamVirtuelle"}
On créé un périphérique de caméra virtuelle sur /dev/video7
\texttt{ffmpeg -video\_size 352x288 -i /dev/video0 -i ./palette.png
-lavfi fps=10,scale=w=128:h=112,paletteuse=dither=bayer,format=yuyv422
-f v4l2 /dev/video7}
On fait une chaîne ffmpeg de la webcam réelle vers la virtuelle,
en redimensionnant en 128x112 1/2
puis en appliquant un algorithme de dithering et une palette de
couleurs (juste un PNG carré avec les différentes couleurs à utiliser
pour le dithering, je peux le fournir si besoin).
Enfin on force un format pour la webcam de destination et on sort
sur son fichier (/dev/video7 comme défini tout à l'heure).
C'est pas propre (et il faudrait que je change d'algorithme pour le
scaling parce qu'il y a un effet de flou désagréable), MAIS ça
fonctionne et le rendu ressemble.
% --------------------------------------------------------------------
@@ -46,18 +124,21 @@ des lignes de code écrites en C ?
\index{vgrabbj}
D'après la manpage :
« \textit{
vgrabbj is a program that will grab images from any v4l-capable device
« \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}
@@ -75,3 +156,12 @@ of Code, the development continued and we are still looking for people with
% --------------------------------------------------------------------
\section{Kinect} \index{Kinect}
Bon, voilà un nouveau gadget ;)
À priori, la partie caméra RGB est gérée classiquement par v4l2,
mais le coté spécifique, je ne sais pas qu'en faire...
% --------------------------------------------------------------------

80
chap/webserver.tex Normal file
View File

@@ -0,0 +1,80 @@
%
% Chapitre un peu en vrac :)
%
\chapter{Web servers}
% ==============================================================
\section{Apache, Nginx} \index{Apache} \index{nginx}
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
sur un autre serveur : \texttt{lighthttp}, pour passer ensuite à quelque
chose d'encore plus bas-niveau qui demandera quelques connaissances en C.
% ==============================================================
\section{Lighttpd} \index{Lighttpd}
Un outsider ? Non, pas vraiment. Probablement plus léger que
les classiques, il a quelques fonctions assez interessantes.
Je vais faire un rapide survol des \textsl{tricks} à connaitre
pour une mise en œuvre de bon aloi. Et pour ça, je vais
d'abord me concentrer sur un cas précis~:
l'exécution de scripts CGI\index{CGI} écrits en Perl\index{Perl}
depuis le répertoire \texttt{\$HOME/public\_html/} des yusers.
\begin{verbatim}
root@ramen:~# lighty-enable-mod userdir
Enabling userdir: ok
Run "service lighttpd force-reload" to enable changes
root@ramen:~# service lighttpd force-reload
root@ramen:~#
\end{verbatim}
\textbf{Q:} Sur une installation fraiche, la racine du site est
en erreur 403\index{403} ?
\textbf{R:} Par défaut le listing des répertoires vides
(sans \texttt{index.html}) est interdit. Pour changer ça, il faut
\texttt{\# lighttpd-enable-mod dir-listing} et
\texttt{\# service lighttpd force-reload}, voilà.
Question : comment forcer le \texttt{Content-Type} pour un type particulier
de fichier ? Par exemple text/plain pour les fichiers \texttt{.POV} ?
% ------------------------------------------------
\subsection{Filtrages}
In case you need to do this with lighttpd (you can have multiple of
these for each useragent you want to match, or you can make one big regex
if you want):
\texttt{\$HTTP["useragent"] =~ "Amazonbot" \{ url.access-deny = ("") \}}
% ==============================================================
\section{Custom made}
\begin{verbatim}
tth@ramen:~/Houba/Fractales90$ apt show libmicrohttpd12
Package: libmicrohttpd12
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.
\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.
% ==============================================================

25
code/.gitignore vendored Normal file
View File

@@ -0,0 +1,25 @@
a.out
appelant
arguments
ex_curses
fifo-rx
fifo-tx
flydraw.gif
flydraw.png
foo
get-signal
hello
listen-osc
C/no-op
C/slowprint
*.o
plugiciel.so
send-osc
thread-demo
voirenv
xform/yesyno
debug/spy_getenv

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

9
code/ABC/paddy.abc Normal file
View File

@@ -0,0 +1,9 @@
X:42
T:Paddy O'Rafferty
C:Trad.
M:6/8
K:D
dff cee|def gfe|dff cee|dfe dBA|dff cee|def gfe|faf gfe|1 dfe dBA:|2 dfe dcB||
~A3 B3|gfe fdB|AFA B2c|dfe dcB|~A3 ~B3|efe efg|faf gfe|1 dfe dcB:|2 dfe dBA||
fAA eAA|def gfe|fAA eAA|dfe dBA|fAA eAA|def gfe|faf gfe|dfe dBA:|

12
code/Basic/README.md Normal file
View File

@@ -0,0 +1,12 @@
# Le BASIC
Un des premiers langages abordable par tout le monde,
crée il y a très longtemps à Dartmouth. Il a eu ensuite
une longue et fructueuse carrière, surtout à l'époque
des ordinateurs personnels de la regrettée famille des
8 bits : Apple ][, Amstrad CPC6128, la série des MSX,
l'Oric...

6
code/Basic/bywater-1.bas Normal file
View File

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

3
code/Basic/yabasic-1.bas Normal file
View File

@@ -0,0 +1,3 @@
for i=1 to 10
print i, i*i
next

5
code/Basic/yabasic-2.bas Normal file
View File

@@ -0,0 +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+1,y+1,x+4,y+4
next y:next x

4
code/C/.gitignore vendored Normal file
View File

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

35
code/C/Makefile Normal file
View File

@@ -0,0 +1,35 @@
# exemples pour le chapitre sur le C
# new Sat Feb 11 12:06:34 CET 2023
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 $@
slowprint: slowprint.c Makefile
gcc -Wall $< -o $@
fgets-simple: fgets-simple.c Makefile
gcc -Wall $< -o $@
demo-strtok: demo-strtok.c Makefile
gcc -Wall $< -o $@
# 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/arguments.c Normal file
View File

@@ -0,0 +1,16 @@
/*
* afficher les arguments.
*/
#include <stdio.h>
int main(int argc, char *argv[])
{
int foo;
for (foo=0; foo<argc; foo++) {
printf(" %3d %s\n", foo, argv[foo]);
}
return 0;
}

57
code/C/demo-strtok.c Normal file
View File

@@ -0,0 +1,57 @@
/*
* +-------------+
* | demo strtok |
* +-------------+
*/
#include <stdio.h>
#include <string.h>
#include <ctype.h>
/*-------------------------------------------------------*/
void dump_line(char *titre, char *ligne, int combien)
{
int foo;
unsigned char *ptr;
printf(" --- %s\n", titre);
ptr = (unsigned char *)ligne;
for (foo=0; foo<combien; foo++) {
if (ptr[foo]) printf("%02x ", ptr[foo]);
else printf("\\0 ");
}
puts("");
for (foo=0; foo<combien; foo++) {
printf(" %c ", isprint(ptr[foo]) ? ptr[foo] : ' ');
}
puts("");
}
/*-------------------------------------------------------*/
int main(int argc, char *argv[])
{
char input[] = "foo bar\tquux wiz";
char *cptr, *copie;
int foo;
dump_line("original", input, sizeof(input));
copie = strdup(input);
dump_line("copie", copie, sizeof(input));
puts("");
cptr = strtok(copie, " \t");
dump_line("1er strtok", copie, sizeof(input));
printf(" got [%s]\n", cptr);
puts("");
puts(" two more strtok...");
cptr = strtok(NULL, " \t");
printf(" got [%s]\n", cptr);
cptr = strtok(NULL, " \t");
printf(" got [%s]\n", cptr);
dump_line("2eme & 3me strtok", copie, sizeof(input));
foo = cptr - copie; /* this is the hack :) */
printf(" index = %d\n", foo);
printf(" and we have [%s] :)\n", input+foo);
return 0;
}

14
code/C/fgets-simple.c Normal file
View File

@@ -0,0 +1,14 @@
/*
* exemple d'utilisation de 'fgets'
*/
#include <stdio.h>
#include <string.h>
#define TL 12
int main(int argc, char *argv[])
{
char buffer[TL+1];
while( fgets(buffer, TL, stdin) ) {
printf(" %4ld %s\n", strlen(buffer), buffer);
}
return 0;
}

8
code/C/hacks.txt Normal file
View File

@@ -0,0 +1,8 @@
inline int
usleep(useconds_t microseconds)
{
struct timespec ts;
ts.tv_sec = microseconds / (useconds_t)1000000;
ts.tv_nsec = (long)(microseconds % (useconds_t)1000000) * 1000L;
return nanosleep(&ts, NULL);
}

View File

@@ -1,6 +1,7 @@
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("Hello world.\n");
puts("hello world.");
return 0;
}

18
code/C/no-op.c Normal file
View File

@@ -0,0 +1,18 @@
/*
* no-op.c is an useless shell filter
*/
#include <stdio.h>
#include <ctype.h>
int main(int argc, char *argv[])
{
int quux, baz;
while (EOF != (quux=getchar())) {
baz = toupper(quux);
if ('O'==baz || 'P'==baz) continue;
putchar(quux);
}
return 0;
}

116
code/C/packtest.c Executable file
View File

@@ -0,0 +1,116 @@
#include <stdio.h>
#include <stdbool.h>
/*
* found in the good old Usenet
*/
/* The expected sizes in these comments assime a 64-bit machine */
struct foo1 {
char *p;
char c;
long x;
};
struct foo2 {
char c; /* 1 byte */
char pad[7]; /* 7 bytes */
char *p; /* 8 bytes */
long x; /* 8 bytes */
};
struct foo3 {
char *p; /* 8 bytes */
char c; /* 1 byte */
};
struct foo4 {
short s; /* 2 bytes */
char c; /* 1 byte */
};
struct foo5 {
char c;
struct foo5_inner {
char *p;
short x;
} inner;
};
struct foo6 {
short s;
char c;
int flip:1;
int nybble:4;
int septet:7;
};
struct foo7 {
int bigfield:31;
int littlefield:1;
};
struct foo8 {
int bigfield1:31;
int littlefield1:1;
int bigfield2:31;
int littlefield2:1;
};
struct foo9 {
int bigfield1:31;
int bigfield2:31;
int littlefield1:1;
int littlefield2:1;
};
struct foo10 {
char c;
struct foo10 *p;
short x;
};
struct foo11 {
struct foo11 *p;
short x;
char c;
};
struct foo12 {
struct foo12_inner {
char *p;
short x;
} inner;
char c;
};
int main(int argc, char *argv[])
{
printf("sizeof(char *) = %zu\n", sizeof(char *));
printf("sizeof(long) = %zu\n", sizeof(long));
printf("sizeof(int) = %zu\n", sizeof(int));
printf("sizeof(short) = %zu\n", sizeof(short));
printf("sizeof(char) = %zu\n", sizeof(char));
printf("sizeof(float) = %zu\n", sizeof(float));
printf("sizeof(double) = %zu\n", sizeof(double));
printf("sizeof(struct foo1) = %zu\n", sizeof(struct foo1));
printf("sizeof(struct foo2) = %zu\n", sizeof(struct foo2));
printf("sizeof(struct foo3) = %zu\n", sizeof(struct foo3));
printf("sizeof(struct foo4) = %zu\n", sizeof(struct foo4));
printf("sizeof(struct foo5) = %zu\n", sizeof(struct foo5));
printf("sizeof(struct foo6) = %zu\n", sizeof(struct foo6));
printf("sizeof(struct foo7) = %zu\n", sizeof(struct foo7));
printf("sizeof(struct foo8) = %zu\n", sizeof(struct foo8));
printf("sizeof(struct foo9) = %zu\n", sizeof(struct foo9));
printf("sizeof(struct foo10) = %zu\n", sizeof(struct foo10));
printf("sizeof(struct foo11) = %zu\n", sizeof(struct foo11));
printf("sizeof(struct foo12) = %zu\n", sizeof(struct foo12));
if (sizeof(struct foo3) == 16) {
puts("This looks like a 64-bit machine.");
} else if (sizeof(struct foo3) == 6) {
puts("This looks like a 32-bit machine.");
}
}

42
code/C/slowprint.c Normal file
View File

@@ -0,0 +1,42 @@
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
int c, sec, nano;
struct timespec ts;
int slowdown = 300; /* set a default value */
float delay;
/*
* get the desired slowdown from command-line
*/
if (2 == argc) {
if (1 != sscanf(argv[1], "%d", &slowdown)) {
fprintf(stderr, "%s: bad arg, sorry\n",
argv[0]);
exit(1);
}
if (slowdown < 1) {
fprintf(stderr, "%d is invalid\n",
slowdown);
exit(1);
}
}
/* convert the slowdown value to delay */
delay = 1.0 / (float)slowdown;
sec = (int)delay;
nano = (int)(1000*1000*1000*(delay - (int)delay));
ts.tv_sec = sec;
ts.tv_nsec = nano;
while ( EOF != (c=getchar()) )
{
putchar(c), fflush(stdout);
nanosleep(&ts, NULL);
}
return 0;
}

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;
}

49
code/Makefile Normal file
View File

@@ -0,0 +1,49 @@
######################################################
# TetaTricks
#
# exemples du bouquin
ex_curses: ex_curses.c Makefile
gcc -Wall $< -o $@ -lncurses
thread-demo: thread-demo.c Makefile
gcc -Wall -pthread $< -o $@
voirenv: voirenv.c Makefile
gcc -Wall $< -o $@
#------------- IPC -----------------------
get-signal: get-signal.c Makefile
gcc -Wall $< -o $@
fifo: fifo-rx fifo-tx
dtime.o: dtime.c my-fifo.h Makefile
gcc -Wall -c $<
fifo-tx: fifo-tx.c my-fifo.h dtime.o Makefile
gcc -Wall $< dtime.o -o $@
fifo-rx: fifo-rx.c my-fifo.h dtime.o Makefile
gcc -Wall $< dtime.o -o $@
#------------- PLUGIN --------------------
plugin: plugiciel.so appelant
plugiciel.so: plugiciel.c plugiciel.h Makefile
gcc -Wall -shared -fPIC $< -o $@
appelant: appelant.c plugiciel.h Makefile
gcc -Wall $< -ldl -o $@
#------------- GRAPHISME --------------------
flydraw.png: dessiner.fly
flydraw < $<
convert flydraw.gif flydraw.png

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;
}

19
code/OSC/send-osc.c Normal file
View File

@@ -0,0 +1,19 @@
/* SEND OSC */
#include <stdio.h>
#include <lo/lo.h>
#define REMOTE_HOST "localhost"
#define REMOTE_PORT "9000"
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, "/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

Some files were not shown because too many files have changed in this diff Show More