This commit is contained in:
Philippe Pittoli 2025-12-15 23:22:10 +01:00
commit 5d7ebb4a3e
21 changed files with 4973 additions and 0 deletions

View file

@ -0,0 +1,71 @@
extension "groff"
doctemplate
"
.MT 0
$header
.TL
$title
.AU \"\"
.ND
.SA 0
.DS I
"
".DE
$footer
"
end
nodoctemplate
"
"
"
"
end
bold "\f[CB]$text\fP"
italics "\f[CI]$text\fP"
underline "\f[CI]$text\fP"
fixed "\fC$text\fP"
color "\m[$style]$text\m[]"
anchor "$infilename : $linenum - $text"
reference "$text \(-> $infile:$linenum, page : $infilename:$linenum"
#lineprefix "\fC\(em\fP "
#lineprefix "\fC\n(ln\fP "
lineprefix ""
colormap
"green" "green"
"red" "red"
"darkred" "darkred"
"blue" "blue"
"brown" "brown"
"pink" "pink"
"yellow" "yellow"
"cyan" "cyan"
"purple" "purple"
"orange" "orange"
"brightorange" "brightorange"
"brightgreen" "brightgreen"
"darkgreen" "darkgreen"
"black" "black"
"teal" "teal"
"gray" "gray"
"darkblue" "darkblue"
default "black"
end
translations
"\\" "\\\\"
##"\n" " \\\\\n"
##" " "\\ "
##"\t" "\\ \\ \\ \\ \\ \\ \\ \\ "
"\t" " "
"|" "|"
"---" "\(em"
"--" "\(mi"
end

5
Makefile Normal file
View file

@ -0,0 +1,5 @@
SRC ?= paper
ODIR ?= ~/tmp/
export ODIR SRC
include Makefile.in

80
Makefile.in Normal file
View file

@ -0,0 +1,80 @@
SRC ?= graphs
ODIR ?= .
BIBLIOGRAPHY ?= bibliography
ALLSRC = $(shell find .)
SOELIM_OPTS ?=
SOELIM = soelim $(SOELIM_OPTS)
PRECONV_OPTS ?= -e utf-8
PRECONV = preconv $(PRECONV_OPTS)
EQN_OPTS ?= -Tpdf
EQN = eqn $(EQN_OPTS)
# source-highlight stuff
# GH_INTRO: instructions before each source code provided by source-highlight
# GH_OUTRO: ------------ after ---- ------ ---- -------- -- ----------------
# GH_INTRO/GH_OUTRO: values are separated by ';'
#
GH_INTRO := .nr DI 0;.DS I;.fam C;.b1;.sp -0.1i
GH_OUTRO := .sp -0.2i;.b2;.fam;.DE
#
export GH_INTRO
export GH_OUTRO
#
# SHOPTS: cmd line parameter given to source-highlight
SHOPTS = --outlang-def=.source-highlight_groff-output-definition
export SHOPTS
# ghighlight brings `source-highlight` to troff
GHIGHLIGHT_OPTS ?=
GHIGHLIGHT = ./bin/ghighlight $(GHIGHLIGHT_OPTS)
GRAP_OPTS ?=
GRAP = grap $(GRAP_OPTS)
PIC_OPTS ?= -Tpdf
PIC = pic $(PIC_OPTS)
# -P => move ponctuation after reference
# -S => label and bracket-label options
# -e => accumulate (use a reference section)
# -p bib => bibliography file
REFER_OPTS ?= -PS -e -p $(BIBLIOGRAPHY)
REFER = refer $(REFER_OPTS)
# -k => iconv conversion (did it ever worked?)
# -t => tbl preprocessor
# -ms => ms macro
# -U => unsafe (because of PDF inclusion)
# -Tpdf => output device is PDF
# -mspdf => include PDF (so, images converted in PDF) in the document
# NOTE: a custom troffrc (configuration file) is necessary on OpenBSD
# to have correctly justified paragraphs. Otherwise, the default
# configuration removes this possibility, for bullshit reasons. Sad.
# -M dir => path to custom troffrc
# TODO: no change with or without the following options -P -e
# This has to be inverstigated: how to make PDFs look nice in browsers?
# -P -e => provide "-e" to gropdf to embed fonts
GROFF_OPTS ?= -ms -t -Tpdf -U -mspdf -mpdfmark -M ./bin -P -e
GROFF = groff $(GROFF_OPTS)
$(SRC).pdf:
$(SOELIM) < $(SRC).ms |\
./bin/utf8-to-ms.sh |\
$(PRECONV) |\
$(EQN) |\
$(GHIGHLIGHT) |\
$(GRAP) |\
$(PIC) |\
$(REFER) |\
$(GROFF) > $(ODIR)/$@
# Keep options in memory for the recursive 'make' call
export SOELIM_OPTS PRECONV_OPTS EQN_OPTS GHIGHLIGHT_OPTS GRAP_OPTS PIC_OPTS REFER_OPTS
serve:
@#find . -name "*.ms" -or -name "*.d" | entr gmake -B $(SRC).pdf
find . | entr gmake -B $(SRC).pdf

24
bibliography Normal file
View file

@ -0,0 +1,24 @@
%K CBOR
%A C. Bormann
%A P. Hoffman
%T RFC 8949, Concise Binary Object Representation (CBOR)
%D 2020
%I Internet Engineering Task Force (IETF)
%K JSON
%A Tim Bray
%T RFC 8259, The JavaScript Object Notation (JSON) Data Interchange Format
%D 2017
%I Internet Engineering Task Force (IETF)
%K darkhttpd
%A Emil Mikulic
%T DarkHTTPd, when you need a webserver in a hurry.
%D 2017
%I https://unix4lyfe.org/darkhttpd/
%K netlibre
%A Philippe PITTOLI
%T netlib.re, a free DNS registrar
%D 2013
%I https://www.netlib.re

2684
bin/busgrap.pl Executable file

File diff suppressed because it is too large Load diff

57
bin/custom Executable file
View file

@ -0,0 +1,57 @@
#!/bin/sh
# From a single byte in hexadecimal per line to lines ending with 0a
# (hex for '\n'). Ex: 61 62 63 0a
# Required to easily match (and remove) multi-byte characters.
regroup_lines() awk '
BEGIN {
line_start=1
}
{
if (line_start == 1)
line = $1;
else
line = line " " $1;
line_start = 0;
if ($1 == "0a") {
print line;
line_start = 1
}
}
END {
if (line_start == 0)
print line
}
'
uppercase() tr "[a-z]" "[A-Z]"
# One column decimal to plain text.
from_dec() awk '{ printf ("%c", $1 + 0) }'
# Replace spaces by line returns, outputs a single column.
spaces_to_line_returns() tr " " "\n"
# Convert input into hexadecimal and a single byte per line.
to_hex_one_column() { od -An -tx1 | awk '{for(i=1;i<=NF;i++){ print $i }}'; }
# One column hexa to one column decimal.
hex_to_dec() { { echo "obase=10;ibase=16;" ; cat ; } | bc ; }
# Reverse hexadecimal (with space separators) to original value.
from_hex() { spaces_to_line_returns | uppercase | hex_to_dec | from_dec; }
# Replace unbreakable spaces by '\ '.
replace_unbreakable_spaces() sed "s/c2 a0/5c 20/g"
custom_mods(){
to_hex_one_column | # Input to hexadecimal, 1-byte representation per line.
regroup_lines | # From 1-byte to x-byte lines with space separators.
replace_unbreakable_spaces | # Replace unbreakable spaces by '\ '.
from_hex # Convert back from hex (x-byte per line, space separator).
}
custom_mods

286
bin/ghighlight Executable file
View file

@ -0,0 +1,286 @@
#! /usr/bin/env perl
# ghighlight - A simple preprocessor for adding code highlighting in a groff file
# Copyright (C) 2014-2018 Free Software Foundation, Inc.
# Written by Bernd Warken <groff-bernd.warken-72@web.de>.
my $version = '0.9.0';
# This file is part of 'ghighlight', which is part of 'groff'.
# 'groff' is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
# 'groff' is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
# You can find a copy of the GNU General Public License in the internet
# at <http://www.gnu.org/licenses/gpl-2.0.html>.
########################################################################
use strict;
use warnings;
#use diagnostics;
# current working directory
use Cwd;
# $Bin is the directory where this script is located
use FindBin;
# open3 for a bidirectional communication with a child process
use IPC::Open3;
########################################################################
# system variables and exported variables
########################################################################
$\ = "\n"; # final part for print command
########################################################################
# read-only variables with double-@ construct
########################################################################
our $File_split_env_sh;
our $File_version_sh;
our $Groff_Version;
my $before_make; # script before run of 'make'
{
my $at = '@';
$before_make = 1 if '@VERSION@' eq "${at}VERSION${at}";
}
my %at_at;
my $file_perl_test_pl;
my $groffer_libdir;
if ($before_make) {
my $highlight_source_dir = $FindBin::Bin;
$at_at{'BINDIR'} = $highlight_source_dir;
$at_at{'G'} = '';
} else {
$at_at{'BINDIR'} = '@BINDIR@';
$at_at{'G'} = '@g@';
}
########################################################################
# options
########################################################################
foreach (@ARGV) {
if ( /^(-h|--h|--he|--hel|--help)$/ ) {
print q(Usage for the 'ghighlight' program:);
print 'ghighlight [-] [--] [filespec...] normal file name arguments';
print 'ghighlight [-h|--help] gives usage information';
print 'ghighlight [-v|--version] displays the version number';
print q(This program is a 'groff' preprocessor that handles highlighting source code ) .
q(parts in 'roff' files.);
exit;
} elsif ( /^(-v|--v|--ve|--ver|--vers|--versi|--versio|--version)$/ ) {
print q('ghighlight' version ) . $version;
exit;
}
}
my $macros = "groff_mm";
if ( $ENV{'GHLENABLECOLOR'} ) {
$macros = "groff_mm_color";
}
########################################################################
# input
########################################################################
my $source_mode = 0;
my @lines = ();
sub getTroffLine {
my ($opt) = @_;
if ($opt =~ /^ps=([0-9]+)/) {".ps $1"}
elsif ($opt =~ /^vs=(\S+)/) {".vs $1"}
else { print STDERR "didn't recognised '$opt'"; ""}
}
sub getTroffLineOpposite {
my ($opt) = @_;
if ($opt =~ /^ps=/) {".ps"}
elsif ($opt =~ /^vs=/) {".vs"}
else { print STDERR "didn't recognised '$opt'"; ""}
}
# language for codeblocks
my $lang = '';
my @options = ();
foreach (<>) {
chomp;
s/\s+$//;
my $line = $_;
my $is_dot_Source = $line =~ /^[.']\s*(``|SOURCE)(|\s+.*)$/;
unless ( $is_dot_Source ) { # not a '.SOURCE' line
if ( $source_mode ) { # is running in SOURCE mode
push @lines, $line;
} else { # normal line, not SOURCE-related
print $line;
}
next;
}
##########
# now the line is a '.SOURCE' line
my $args = $line;
$args =~ s/\s+$//; # remove final spaces
$args =~ s/^[.']\s*(``|SOURCE)\s*//; # omit .source part, leave the arguments
my @args = split /\s+/, $args;
##########
# start SOURCE mode
$lang = $args[0] if ( @args > 0 && $args[0] ne 'stop' );
if ( @args > 0 && $args[0] ne 'stop' ) {
# For '.``' no args or first arg 'start' means opening 'SOURCE' mode.
# Everything else means an ending command.
shift @args;
@options = @args;
if ( $source_mode ) {
# '.SOURCE' was started twice, ignore
print STDERR q('.``' starter was run several times);
next;
} else { # new SOURCE start
$source_mode = 1;
@lines = ();
next;
}
}
##########
# now the line must be a SOURCE ending line (stop)
unless ( $source_mode ) {
print STDERR 'ghighlight.pl: there was a SOURCE ending without being in ' .
'SOURCE mode:';
print STDERR ' ' . $line;
next;
}
$source_mode = 0; # 'SOURCE' stop calling is correct
my $shopts = $ENV{"SHOPTS"} || "";
##########
# Run source-highlight on lines
# Check if language was specified
my $cmdline = "source-highlight -f $macros $shopts --output STDOUT";
if ($lang ne '') {
$cmdline .= " -s $lang";
}
# Start `source-highlight`
my $pid = open3(my $child_in, my $child_out, my $child_err, $cmdline)
or die "open3() failed $!";
# Provide source code to `source-highlight` in its standard input
print $child_in $_ for @lines;
close $child_in;
if (my $v = $ENV{"GH_INTRO"}) {
print for split /;/, $v;
}
for (@options) {
my $l = getTroffLine $_;
print $l if ($l ne "");
}
# Print `source-highlight` output
while (<$child_out>) {
chomp;
print;
}
close $child_out;
for (reverse @options) {
my $l = getTroffLineOpposite $_;
print $l if ($l ne "");
}
if (my $v = $ENV{"GH_OUTRO"}) {
print for split /;/, $v;
}
my @print_res = (1);
# Start argument processing
# remove 'stop' arg if exists
# shift @args if ( $args[0] eq 'stop' );
# if ( @args == 0 ) {
# # no args for saving, so @print_res doesn't matter
# next;
# }
# my @var_names = ();
# my @mode_names = ();
# my $mode = '.ds';
# for ( @args ) {
# if ( /^\.?ds$/ ) {
# $mode = '.ds';
# next;
# }
# if ( /^\.?nr$/ ) {
# $mode = '.nr';
# next;
# }
# push @mode_names, $mode;
# push @var_names, $_;
# }
# my $n_vars = @var_names;
# if ( $n_vars < $n_res ) {
# print STDERR 'ghighlight: not enough variables for Python part: ' .
# $n_vars . ' variables for ' . $n_res . ' output lines.';
# } elsif ( $n_vars > $n_res ) {
# print STDERR 'ghighlight: too many variablenames for Python part: ' .
# $n_vars . ' variables for ' . $n_res . ' output lines.';
# }
# if ( $n_vars < $n_res ) {
# print STDERR 'ghighlight: not enough variables for Python part: ' .
# $n_vars . ' variables for ' . $n_res . ' output lines.';
# }
# my $n_min = $n_res;
# $n_min = $n_vars if ( $n_vars < $n_res );
# exit unless ( $n_min );
# $n_min -= 1; # for starting with 0
# for my $i ( 0..$n_min ) {
# my $value = $print_res[$i];
# chomp $value;
# print $mode_names[$i] . ' ' . $var_names[$i] . ' ' . $value;
# }
}
1;
# Local Variables:
# mode: CPerl
# End:

5
bin/pdf.awk Normal file
View file

@ -0,0 +1,5 @@
# usage: cat data | awk -f pdf.awk
{
V = V + $1
print V, $2
}

38
bin/remove-eol.pl Executable file
View file

@ -0,0 +1,38 @@
#!/usr/bin/perl
use v5.10;
my @list_multiline_cmd = (
qr/^\.SUBSECTION$/
, qr/^\.SECTION_NO_NUMBER$/
, qr/^\.SUBSUBSECTION$/
, qr/^\.SUBSUBSUBSECTION$/
, qr/^\.SECTION$/
, qr/^\.BULLET$/
, qr/^\.ENUM$/
);
my $STACK = "";
my $found_pattern = 0;
while (<>) {
chomp;
my $line = $_;
$found_pattern = 0;
for (@list_multiline_cmd) {
if ($line =~ $_) {
#say "line '$line' matched " . $_;
$found_pattern = 1;
$STACK = $line . ' ';
}
}
if ($found_pattern == 1) {
next;
}
say $STACK . $line;
$STACK = "";
}

18
bin/roff2custom.sh Executable file
View file

@ -0,0 +1,18 @@
#!/bin/sh
# HOW TO USE
# . ./$0
# cat file | modernize_roff | remove-eol.pl > file.new
modernize_roff() {
sed \
-e "s/^\.PP/.PARAGRAPH_INDENTED/" \
-e "s/^\.NH 1/.SECTION/" \
-e "s/^\.NH 2/.SUBSECTION/" \
-e "s/^\.NH 3/.SUBSUBSECTION/" \
-e "s/^\.NH 4/.SUBSUBSUBSECTION/" \
-e "s/^\.SH [1-4]/.SECTION_NO_NUMBER/" \
-e "s/^\.SH$/.SECTION_NO_NUMBER/" \
-e "s/^\.LP/.PARAGRAPH_UNINDENTED/"
}

69
bin/troffrc Normal file
View file

@ -0,0 +1,69 @@
.\" Startup file for troff.
.
.\" This is tested by pic.
.nr 0p 0
.
.\" Load composite mappings.
.do mso composite.tmac
.
.\" Load generic fallback mappings.
.do mso fallbacks.tmac
.
.\" Use .do here, so that it works with -C.
.\" The groff command defines the .X string if the -X option was given.
.ie r.X .do ds troffrc!ps Xps.tmac
.el .do ds troffrc!ps ps.tmac
.do ds troffrc!pdf pdf.tmac
.do ds troffrc!dvi dvi.tmac
.do ds troffrc!X75 X.tmac
.do ds troffrc!X75-12 X.tmac
.do ds troffrc!X100 X.tmac
.do ds troffrc!X100-12 X.tmac
.do ds troffrc!ascii tty.tmac
.do ds troffrc!latin1 tty.tmac
.do ds troffrc!utf8 tty.tmac
.do ds troffrc!cp1047 tty.tmac
.do ds troffrc!lj4 lj4.tmac
.do ds troffrc!lbp lbp.tmac
.do ds troffrc!html html.tmac
.do if d troffrc!\*[.T] \
. do mso \*[troffrc!\*[.T]]
.do rm troffrc!ps troffrc!Xps troffrc!dvi troffrc!X75 troffrc!X75-12 \
troffrc!X100 troffrc!X100-12 troffrc!lj4 troff!lbp troffrc!html troffrc!pdf
.
.\" Test whether we work under EBCDIC and map the no-breakable space
.\" character accordingly.
.do ie '\[char97]'a' \
. do tr \[char160]\~
.el \
. do tr \[char65]\~
.
.\" Set the hyphenation language to 'fr'.
.do hla fr
.
.\" Disable hyphenation:
.\" Do not load hyphenation patterns and exceptions.
.\"do hpf hyphen.us
.\"do hpfa hyphenex.us
.
.\" Disable adjustment by default,
.\" such that manuals look similar with groff and mandoc(1).
.\".ad l
.\".de ad
.\"..
.\" Handle paper formats.
.do mso papersize.tmac
.
.\" Handle PS images.
.do mso pspic.tmac
.do mso pdfpic.tmac
.
.\" ====================================================================
.\" Editor settings
.\" ====================================================================
.
.\" Local Variables:
.\" mode: nroff
.\" fill-column: 72
.\" End:
.\" vim: set filetype=groff textwidth=72:

147
bin/utf8-to-ms.sh Executable file
View file

@ -0,0 +1,147 @@
#!/bin/sh
# This program isn't by any mean complete.
# Most of text markers, accents and ligatures are handled.
# However, nothing else currently is.
# Please, do provide more translations.
# Convert input into hexadecimal and a single byte per line.
to_hex_one_column() xxd -p -c 1
# Reverse hexadecimal to original value.
from_hex() xxd -p -r
regroup_lines() awk '
BEGIN {
line_start=1
}
{
if (line_start == 1)
line = $1;
else
line = line " " $1;
line_start = 0;
if ($1 == "0a") {
print line;
line_start = 1
}
}
END {
if (line_start == 0)
print line
}
'
accents() sed \
-e "s/c3 81/5c 5b 27 41 5d/g"\
-e "s/c3 89/5c 5b 27 45 5d/g"\
-e "s/c3 8d/5c 5b 27 49 5d/g"\
-e "s/c3 93/5c 5b 27 4f 5d/g"\
-e "s/c3 9a/5c 5b 27 55 5d/g"\
-e "s/c3 9d/5c 5b 27 59 5d/g"\
-e "s/c3 a1/5c 5b 27 61 5d/g"\
-e "s/c3 a9/5c 5b 27 65 5d/g"\
-e "s/c3 ad/5c 5b 27 69 5d/g"\
-e "s/c3 b3/5c 5b 27 6f 5d/g"\
-e "s/c3 ba/5c 5b 27 75 5d/g"\
-e "s/c3 bd/5c 5b 27 79 5d/g"\
-e "s/c3 84/5c 5b 3a 41 5d/g"\
-e "s/c3 8b/5c 5b 3a 45 5d/g"\
-e "s/c3 8f/5c 5b 3a 49 5d/g"\
-e "s/c3 96/5c 5b 3a 4f 5d/g"\
-e "s/c3 9c/5c 5b 3a 55 5d/g"\
-e "s/c3 a4/5c 5b 3a 61 5d/g"\
-e "s/c3 ab/5c 5b 3a 65 5d/g"\
-e "s/c3 af/5c 5b 3a 69 5d/g"\
-e "s/c3 b6/5c 5b 3a 6f 5d/g"\
-e "s/c3 bc/5c 5b 3a 75 5d/g"\
-e "s/c3 bf/5c 5b 3a 79 5d/g"\
-e "s/c3 82/5c 5b 5e 41 5d/g"\
-e "s/c3 8a/5c 5b 5e 45 5d/g"\
-e "s/c3 8e/5c 5b 5e 49 5d/g"\
-e "s/c3 94/5c 5b 5e 4f 5d/g"\
-e "s/c3 9b/5c 5b 5e 55 5d/g"\
-e "s/c3 a2/5c 5b 5e 61 5d/g"\
-e "s/c3 aa/5c 5b 5e 65 5d/g"\
-e "s/c3 ae/5c 5b 5e 69 5d/g"\
-e "s/c3 b4/5c 5b 5e 6f 5d/g"\
-e "s/c3 bb/5c 5b 5e 75 5d/g"\
-e "s/c3 80/5c 5b 60 41 5d/g"\
-e "s/c3 88/5c 5b 60 45 5d/g"\
-e "s/c3 8c/5c 5b 60 49 5d/g"\
-e "s/c3 92/5c 5b 60 4f 5d/g"\
-e "s/c3 99/5c 5b 60 55 5d/g"\
-e "s/c3 a0/5c 5b 60 61 5d/g"\
-e "s/c3 a8/5c 5b 60 65 5d/g"\
-e "s/c3 ac/5c 5b 60 69 5d/g"\
-e "s/c3 b2/5c 5b 60 6f 5d/g"\
-e "s/c3 b9/5c 5b 60 75 5d/g"\
-e "s/c3 83/5c 5b 7e 41 5d/g"\
-e "s/c3 91/5c 5b 7e 4e 5d/g"\
-e "s/c3 95/5c 5b 7e 4f 5d/g"\
-e "s/c3 a3/5c 5b 7e 61 5d/g"\
-e "s/c3 b1/5c 5b 7e 6e 5d/g"\
-e "s/c3 b5/5c 5b 7e 6f 5d/g"\
-e "s/c3 87/5c 5b 2c 43 5d/g"\
-e "s/c3 a7/5c 5b 2c 63 5d/g"\
-e "s/c3 85/5c 5b 6f 41 5d/g"\
-e "s/c3 a5/5c 5b 6f 61 5d/g"\
-e "s/c5 b8/5c 5b 3a 59 5d/g"\
-e "s/c5 a0/5c 5b 76 53 5d/g"\
-e "s/c5 a1/5c 5b 76 73 5d/g"\
-e "s/c5 bd/5c 5b 76 5a 5d/g"\
-e "s/c5 be/5c 5b 76 7a 5d/g"
# Ligatures.
ligatures() sed \
-e "s/ef ac 80/5c 5b 66 66 5d/g"\
-e "s/ef ac 81/5c 5b 66 69 5d/g"\
-e "s/ef ac 82/5c 5b 66 6c 5d/g"\
-e "s/ef ac 83/5c 5b 46 69 5d/g"\
-e "s/ef ac 84/5c 5b 46 6c 5d/g"\
-e "s/c5 81/5c 5b 2f 4c 5d/g"\
-e "s/c5 82/5c 5b 2f 6c 5d/g"\
-e "s/c3 98/5c 5b 2f 4f 5d/g"\
-e "s/c3 b8/5c 5b 2f 6f 5d/g"\
-e "s/c3 86/5c 5b 41 45 5d/g"\
-e "s/c3 a6/5c 5b 61 65 5d/g"\
-e "s/c5 92/5c 5b 4f 45 5d/g"\
-e "s/c5 93/5c 5b 6f 65 5d/g"\
-e "s/c4 b2/5c 5b 49 4a 5d/g"\
-e "s/c4 b3/5c 5b 69 6a 5d/g"\
-e "s/c4 b1/5c 5b 2e 69 5d/g"\
-e "s/c8 b7/5c 5b 2e 6a 5d/g"
# Text markers.
text_markers() sed \
-e "s/e2 97 8b/5c 5b 63 69 5d/g"\
-e "s/e2 80 a2/5c 5b 62 75 5d/g"\
-e "s/e2 80 a1/5c 5b 64 64 5d/g"\
-e "s/e2 80 a0/5c 5b 64 67 5d/g"\
-e "s/e2 97 8a/5c 5b 6c 7a 5d/g"\
-e "s/e2 96 a1/5c 5b 73 71 5d/g"\
-e "s/c2 b6/5c 5b 70 73 5d/g"\
-e "s/c2 a7/5c 5b 73 63 5d/g"\
-e "s/e2 98 9c/5c 5b 6c 68 5d/g"\
-e "s/e2 98 9e/5c 5b 72 68 5d/g"\
-e "s/e2 86 b5/5c 5b 43 52 5d/g"\
-e "s/e2 9c 93/5c 5b 4f 4b 5d/g"
# These markers shouldn't be automatically translated in ms macros.
# @ "s/40/5c 5b 61 74 5d/g"
# # "s/23/5c 5b 73 68 5d/g"
# Legal symbols.
legal_symbols() sed \
-e "s/c2 a9/5c 5b 63 6f 5d/g"\
-e "s/c2 ae/5c 5b 72 67 5d/g"\
-e "s/e2 84 a2/5c 5b 74 6d 5d/g"
hexutf8_to_hexms() {
text_markers | accents | ligatures | legal_symbols
}
to_hex_one_column | regroup_lines | hexutf8_to_hexms | from_hex

View file

@ -0,0 +1,179 @@
242 0
6226 1
10498 2
12977 3
15009 4
19452 5
20169 6
20611 7
20981 8
21261 9
21872 10
22077 11
22236 12
22346 13
22442 14
22518 15
22583 16
22634 17
22687 18
22736 19
22815 20
22860 21
22901 22
22923 23
22943 24
22963 25
22993 26
23014 27
23031 28
23046 29
23124 30
23147 31
23161 32
23174 33
23186 34
23208 35
23218 36
23232 37
23239 38
23251 39
23261 40
23271 41
23278 42
23289 43
23298 44
23307 45
23311 46
23319 47
23324 48
23332 49
23343 50
23349 51
23365 52
23370 53
23373 54
23377 55
23382 56
23384 57
23388 58
23393 59
23397 60
23401 61
23403 62
23407 63
23409 64
23415 65
23416 66
23419 67
23420 68
23422 69
23426 70
23428 71
23430 72
23432 73
23435 74
23436 75
23437 77
23441 78
23447 80
23451 81
23455 82
23463 83
23467 85
23470 86
23478 87
23484 88
23491 89
23495 90
23498 91
23501 92
23506 93
23514 94
23517 95
23528 96
23536 97
23546 98
23574 99
23611 100
23618 101
23622 102
23623 104
23624 108
23625 110
23627 111
23628 112
23629 113
23630 114
23635 115
23636 117
23638 118
23639 120
23640 122
23641 123
23643 127
23644 129
23645 130
23646 131
23647 133
23649 134
23650 135
23652 138
23653 141
23654 142
23655 143
23656 145
23658 147
23659 150
23660 152
23661 154
23662 156
23663 158
23664 159
23665 165
23666 166
23667 168
23668 175
23669 177
23670 180
23671 185
23672 186
23673 187
23674 194
23675 197
23676 202
23677 203
23678 205
23679 209
23680 224
23681 227
23682 231
23683 233
23684 242
23685 248
23686 253
23687 254
23688 258
23689 274
23690 281
23691 309
23692 313
23693 334
23694 362
23695 363
23696 373
23697 416
23698 473
23699 479
23700 538
23701 546
23702 554
23703 573
23704 583
23705 860
23706 973
23707 1954
23708 2589
23709 2911
23710 3400
23711 3714

179
data/domains-per-user.d Normal file
View file

@ -0,0 +1,179 @@
242 0
5984 1
4272 2
2479 3
2032 4
4443 5
717 6
442 7
370 8
280 9
611 10
205 11
159 12
110 13
96 14
76 15
65 16
51 17
53 18
49 19
79 20
45 21
41 22
22 23
20 24
20 25
30 26
21 27
17 28
15 29
78 30
23 31
14 32
13 33
12 34
22 35
10 36
14 37
7 38
12 39
10 40
10 41
7 42
11 43
9 44
9 45
4 46
8 47
5 48
8 49
11 50
6 51
16 52
5 53
3 54
4 55
5 56
2 57
4 58
5 59
4 60
4 61
2 62
4 63
2 64
6 65
1 66
3 67
1 68
2 69
4 70
2 71
2 72
2 73
3 74
1 75
1 77
4 78
6 80
4 81
4 82
8 83
4 85
3 86
8 87
6 88
7 89
4 90
3 91
3 92
5 93
8 94
3 95
11 96
8 97
10 98
28 99
37 100
7 101
4 102
1 104
1 108
1 110
2 111
1 112
1 113
1 114
5 115
1 117
2 118
1 120
1 122
1 123
2 127
1 129
1 130
1 131
1 133
2 134
1 135
2 138
1 141
1 142
1 143
1 145
2 147
1 150
1 152
1 154
1 156
1 158
1 159
1 165
1 166
1 168
1 175
1 177
1 180
1 185
1 186
1 187
1 194
1 197
1 202
1 203
1 205
1 209
1 224
1 227
1 231
1 233
1 242
1 248
1 253
1 254
1 258
1 274
1 281
1 309
1 313
1 334
1 362
1 363
1 373
1 416
1 473
1 479
1 538
1 546
1 554
1 573
1 583
1 860
1 973
1 1954
1 2589
1 2911
1 3400
1 3714

View file

@ -0,0 +1,179 @@
1 3714
2 3400
3 2911
4 2589
5 1954
6 973
7 860
8 583
9 573
10 554
11 546
12 538
13 479
14 473
15 416
16 373
17 363
18 362
19 334
20 313
21 309
22 281
23 274
24 258
25 254
26 253
27 248
28 242
29 233
30 231
31 227
32 224
33 209
34 205
35 203
36 202
37 197
38 194
39 187
40 186
41 185
42 180
43 177
44 175
45 168
46 166
47 165
48 159
49 158
50 156
51 154
52 152
53 150
55 147
56 145
57 143
58 142
59 141
61 138
62 135
64 134
65 133
66 131
67 130
68 129
70 127
71 123
72 122
73 120
75 118
76 117
81 115
82 114
83 113
84 112
86 111
87 110
88 108
89 104
93 102
100 101
137 100
165 99
175 98
183 97
194 96
197 95
205 94
210 93
213 92
216 91
220 90
227 89
233 88
241 87
244 86
248 85
256 83
260 82
264 81
270 80
274 78
275 77
276 75
279 74
281 73
283 72
285 71
289 70
291 69
292 68
295 67
296 66
302 65
304 64
308 63
310 62
314 61
318 60
323 59
327 58
329 57
334 56
338 55
341 54
346 53
362 52
368 51
379 50
387 49
392 48
400 47
404 46
413 45
422 44
433 43
440 42
450 41
460 40
472 39
479 38
493 37
503 36
525 35
537 34
550 33
564 32
587 31
665 30
680 29
697 28
718 27
748 26
768 25
788 24
810 23
851 22
896 21
975 20
1024 19
1077 18
1128 17
1193 16
1269 15
1365 14
1475 13
1634 12
1839 11
2450 10
2730 9
3100 8
3542 7
4259 6
8702 5
10734 4
13213 3
17485 2
23469 1
23711 0

View file

@ -0,0 +1,33 @@
.G1
copy "legend.grap"
graph Linear
frame invis ht 3 wid 2 left solid bot solid
#coord x 0,4000 y 0,100
#ticks left out from 0 to 40000 by 10000
#ticks bot off
#ticks bot out at 0, 10, 100,1000,2000,3000
label left "% users having" unaligned "up to this" "much domains" left 0.5
label bottom "Nb domains" unaligned
copy "./data/cumulative-domains-per-user.d" thru X
v = ($1/23711)*100
bullet at $2,v
X
graph Zoom
frame invis ht 3 wid 2 left solid bot solid
coord x 10,100 y 96,100
#ticks left out from 0 to 40000 by 10000
#ticks bot off
ticks bot out from 0 to 1000 by 10
label left "% users having" unaligned "up to this" "much domains" left 0.5
label bottom "Nb domains" unaligned
copy "./data/cumulative-domains-per-user.d" thru X
v = ($1/23711)*100
bullet at $2,v
X
.G2

View file

@ -0,0 +1,31 @@
.G1
copy "legend.grap"
graph Linear
frame invis ht 3 wid 2 left solid bot solid
coord x 0,4000 y 1,6000
#ticks left out from 0 to 40000 by 10000
#ticks bot off
#ticks bot out at 0, 10, 100,1000,2000,3000
label left "Nb users" unaligned left 0.5
label bottom "Nb domains" unaligned
copy "./data/domains-per-user.d" thru X
bullet at $2,$1
X
graph Zoom
frame invis ht 3 wid 2 left solid bot solid
coord x 0,50 y 1,6000
#ticks left out from 0 to 40000 by 10000
#ticks bot off
ticks bot out from 0 to 50 by 10
label left "Nb users" unaligned left 0.5
label bottom "Nb domains" unaligned
copy "./data/domains-per-user.d" thru X
bullet at $2,$1
X
.G2

145
legend.grap Normal file
View file

@ -0,0 +1,145 @@
define boite {
xleft = $1
xright = $2
yup = $3
ydown = $4
line from xleft,ydown to xright,ydown
line from xleft,yup to xright,yup
line from xleft,yup to xleft,ydown
line from xright,yup to xright,ydown
}
define legend_line {
cy = $1
lstartx = $2
lendx = $3
tstartx = $4
.gcolor $5
line from lstartx,cy to lendx,cy
.gcolor
$6 ljust at tstartx,cy
}
define legend {
xleft = $1
xright = $2
yup = $3
ydown = $4
diffx = xright - xleft
diffy = yup - ydown
hdiff = diffy/5.7
cy = yup - (diffy/6)
cx = (diffx/20) + xleft
lstartx = cx
lendx = cx + diffx/8
tstartx = lendx + diffx/20
.ps -2
legend_line(cy,lstartx,lendx,tstartx,red,"RAM only")
cy = cy - hdiff
legend_line(cy,lstartx,lendx,tstartx,black,"Cached db and index")
cy = cy - hdiff
legend_line(cy,lstartx,lendx,tstartx,pink,"Common db, cached index")
cy = cy - hdiff
legend_line(cy,lstartx,lendx,tstartx,blue,"Uncached db, cached index")
cy = cy - hdiff
legend_line(cy,lstartx,lendx,tstartx,green,"Uncached db and index")
.ps +2
}
define legend_common {
xleft = $1
xright = $2
yup = $3
ydown = $4
diffx = xright - xleft
diffy = yup - ydown
hdiff = diffy/4.5
cy = yup - (diffy/6)
cx = (diffx/20) + xleft
lstartx = cx
lendx = cx + diffx/8
tstartx = lendx + diffx/20
.ps -2
legend_line(cy,lstartx,lendx,tstartx,red,"1k")
cy = cy - hdiff
legend_line(cy,lstartx,lendx,tstartx,green,"5k")
cy = cy - hdiff
legend_line(cy,lstartx,lendx,tstartx,black,"10k")
cy = cy - hdiff
legend_line(cy,lstartx,lendx,tstartx,pink,"20k")
.ps +2
}
define legend_lru_addition {
xleft = $1
xright = $2
yup = $3
ydown = $4
diffx = xright - xleft
diffy = yup - ydown
hdiff = diffy/3.5
cy = yup - (diffy/10)
cx = (diffx/20) + xleft
lstartx = cx
lendx = cx + diffx/8
tstartx = lendx + diffx/20
.ps -2
cy = cy - hdiff
legend_line(cy,lstartx,lendx,tstartx,orange,"Basic LRU")
cy = cy - hdiff
legend_line(cy,lstartx,lendx,tstartx,green,"Efficient LRU")
.ps +2
}
# WARNING: this macro uses "cx" (current x), y_scale and "ox" (old x).
define line_no_mustache {
# $1 = cbram
# $2 = obram
# $3 = column
# $4 = color
$1 = $3/y_scale
.gcolor $4
if ($2 > 0) then {line from cx,$1 to ox,$2}
bullet at cx,$1
.gcolor
$2 = $1
}
# WARNING: this macro uses "cx" (current x), y_scale and "ox" (old x).
define line_with_mustache {
# $1 = cbram
# $2 = obram
# $3 = column
# $4 = color
# $5 = column mustache 1
# $6 = column mustache 2
line_no_mustache($1,$2,$3,$4)
line from cx,$5/y_scale to cx,$6/y_scale
}
# WARNING: this macro y_scale.
define linear_growth {
# $1 = color
# $2 = duration of the retrieval for a single value
# $3 = min number of retrievals
# $4 = max number of retrievals
.gcolor $1
line dashed from $3,($2*$3)/y_scale to $4,($2*$4)/y_scale
.gcolor
}

632
macros.roff Normal file
View file

@ -0,0 +1,632 @@
.\" .RP = report document
.nr PO 0.5i \" page offset default 1i
.nr LL 7.0i \" line length default 6i
.nr FM 0.3i \" page foot margin default 1i
.nr DI 0
.nr FF 3 \" footnotes' type: numbered, with point, indented
.nr PS 12
.
.nr LIST_NUMBER 0 +1
.
.R1
no-label-in-reference
accumulate
.R2
.
. \" COLORS
.defcolor darkgreen rgb 0.1 0.5 0.2
.defcolor darkblue rgb 0.3 0.3 0.7
.defcolor darkred rgb 0.7 0.3 0.3
.defcolor black rgb 0 0 0
.defcolor color_box rgb 1 1 .6
.
. \" with semantic
.defcolor citation rgb 0.4 0.4 0.4
.defcolor citationbar rgb 0.3 0.3 0.7
.defcolor explanation rgb 0.7 0.4 0.4
.defcolor explanationbar rgb 0.8 0.3 0.3
.
.defcolor specialcolor_command rgb 0.7 0.3 0.3
.defcolor specialcolor_type rgb 0.6 0.3 0.5
.defcolor specialcolor_constructor rgb 0.1 0.5 0.2
.defcolor specialcolor_module rgb 0.1 0.5 0.2
.defcolor specialcolor_function rgb 0.4 0.4 0.7
.defcolor specialcolor_question rgb 0.0 0.0 0.7
.defcolor specialcolor_operator rgb 0.3 0.8 0.3
.defcolor specialcolor_shine rgb 0.3 0.3 0.7
.
. \" SIZES
.nr specialsize_command 10
.nr specialsize_type 8
.nr specialsize_constructor 8
.nr specialsize_module 8
.nr specialsize_function 8
.nr specialsize_operator 9
.nr specialsize_question 10 \" Current point size, no change.
.nr specialsize_shine 11
.
. \" FONTS
.ds specialfont_command CW
.ds specialfont_type CW
.ds specialfont_constructor CW
.ds specialfont_module CW
.ds specialfont_function CW
.ds specialfont_operator CW
.ds specialfont_question I
.ds specialfont_shine B
.
.
.de BELLOWEXPLANATION1
.sp 0.5
.ps 7 \" point size (~= font size)
.vs 8p \" vertical spacing between lines
..
.de BELLOWEXPLANATION2
.br
.ps 9
.vs 11p
..
.
.\" BULLET and ENUM => do not add space when no parameter are provided
.de STARTBULLET \" Bullet points
.in +1
..
.de BULLET \" Bullet points
.in -1
\(bu
.in +1
.sp -1
.ie '\\$1'' \
.
.el \\$*
..
.de ENDBULLET
.in -1 \" indent
..
.
.de ENUM \" Numbered list
.nr LIST_NUMBER +1
.IP \\n[LIST_NUMBER]. 3
.sp -1
.ie '\\$1'' \
.
.el \\$*
..
.de ENDENUM
.nr LIST_NUMBER 0
.in -2 \" indent
..
.
.de b1 \" Begin code box
.B1
.sp 0.2
.ft CW
..
.de b2 \" End code box
.sp 0.5
.B2
.ft
..
.
.de CITATION1
.KS \" start a keep
.ft I \" citation in italics
.mk C \" set a marker for line drawing
.in +1 \" indent a bit
.gcolor citation
..
.ig
The CITATION2 macro closes the quote then draws a line
from current line to the start of the quote.
..
.de CITATION2
.mk D \" set second marker to come back here
.ft \" back to previous font
.in -1 \" remove indent
.gcolor \" remove previous color
.gcolor citationbar
.\" r = move upward
.\" Z D t = drawing thickness
.\" L = draw the line
\r\
\Z'\D't 1p''\
\L'|\\nCu' \" draw line
.gcolor black \" remove previous color
.sp -2 \" get two lines back
\Z'\D't 1'' \" get the previous drawing thickness back
.KE \" end of the keep
..
.
.de NAMECITATION
.QP
.vs -\\n[legendps]p
.ps -\\n[legendps]
.in -1.2
.ll +1.2
\h'|-2'\(em\h'|-0.4'
\\$*
.br
.LP
..
.
.de EXPLANATION1
.KS \" start a keep
.ft B \" citation in italics
.mk C \" set a marker for line drawing
.in +1 \" indent a bit
.gcolor explanation
..
.de EXPLANATION2
.ft \" back to previous font
.in -1 \" remove indent
.gcolor \" remove previous color
.gcolor explanationbar
\r\L'|\\nCu' \" draw line (\r moves upward, \L draw the line, ...)
.gcolor \" remove previous color
.sp -1 \" get two lines back
.KE \" end of the keep
..
.
.de METAINFO1
.ft CW \" constant width font
.ps 8 \" small font
.vs 9p \" smaller vertical spacing between lines
..
.de METAINFO2
.sp 1
.vs \" come back to the previous vertical spacing
.ps \" come back to the previous point size
.ft \" come back to the previous font
.sp -1 \" return one line above
..
.
.
.de FRAC
.ie '\\$3'' \{\
\v'-.7m\s[\\n(.s*6u/10u]+.7m'\\$1\v'-.7m\s0+.7m'\
\(f/\s[\\n(.s*6u/10u]\\$2\s0
\}
.el \{\
\v'-.7m\s[\\n(.s*6u/10u]+.7m'\\$1\v'-.7m\s0+.7m'\
\(f/\s[\\n(.s*6u/10u]\\$2\s0\\$3
\}
..
.de FOOTNOTE_TO_COLUMN_WIDTH
.nr pg@fn-colw \\n[pg@colw] \" footnotes' column width
..
.de SINGLE_COLUMN
.1C
.\" .FOOTNOTE_TO_COLUMN_WIDTH
.nr FL (\n[LL]*97/100)
..
.de TWO_COLUMNS
.2C
.FOOTNOTE_TO_COLUMN_WIDTH
..
.de HORIZONTALLINE
\l'15'
.FOOTNOTE_TO_COLUMN_WIDTH
..
.
. \" Fonts and colors.
.
.de SPECIAL_WORDS
.ie !'\\$3'' \\$3\c
.nr current_size \\n[.s] \" Current point size.
.gcolor specialcolor_\\*[semantictoken]
.
.if !((\\n[current_size] == \\n[specialsize_\\*[semantictoken]]) \
.ps \\n[specialsize_\\*[semantictoken]]
.
.ie '\\$2'' \{\
\f[\\*[specialfont_\\*[semantictoken]]]\\$1\f[]
. ps \\n[current_size]
. gcolor black \" FIXME: should be the previous color
\}
.el \{\
\f[\\*[specialfont_\\*[semantictoken]]]\\$1\f[]\c
. ps \\n[current_size]
. gcolor black \" FIXME: should be the previous color
\\$2
\}
..
.de SMALLFONT
.ps 8
.vs 9p
..
.de NORMALFONT
.vs
.ps
..
.de COMMAND1
.b1
..
.de COMMAND2
.b2
..
.de COMMANDNAME
.ds semantictoken command
.SPECIAL_WORDS \\$@
..
.de FUNCTION
.ds semantictoken function
.SPECIAL_WORDS \\$@
..
.de TYPE
.ds semantictoken type
.SPECIAL_WORDS \\$@
..
.de TYPECLASS
.I "\\$1" "\\$2"
..
.de OPERATOR
.ds semantictoken operator
.SPECIAL_WORDS \\$@
..
.de QUESTION
.ds semantictoken question
.SPECIAL_WORDS \\$@
\h'5p'
..
.de CONSTRUCTOR
.ds semantictoken constructor
.SPECIAL_WORDS \\$@
..
.de MODULE
.ds semantictoken module
.SPECIAL_WORDS \\$@
..
.de SHINE
.ds semantictoken shine
.SPECIAL_WORDS \\$@
..
.de MODULEX
.MODULE \\$1 ,
..
.de TBD
.ft B
To be defined or to finish.
.ft R
..
.de ARROW
.br
\(->\h'5p' \\$*
..
.af dy 00
.af mo 00
.ds CURRENT_DATE \\n(dy/\\n(mo/\\n[year]
.ds WEBSITE https://t.karchnu.fr/doc
.ds EMAIL karchnu@karchnu.fr
.de INFORMATIONS
Check out for newer versions:
.ft CW
.ps 8
\h'2p' \\$1
.ps
.ft
.br
And if you have questions:
.ft CW
\h'13p' \\$2
.ft
.\" .DE
.LP
Lastly compiled the
.SHINE \*[CURRENT_DATE]
(day/month/year, you know, like in any sane civilization).
..
.de INFORMATIONS_FR
.LP
Nouvelles versions :
.ft CW
.ps 8
\h'2p' \\$1
.ps
.ft
.br
Questions :
.ft CW
\h'36p' \\$2
.ft
.\" .DE
.LP
Compilé pour la dernière fois le
.SHINE \*[CURRENT_DATE]
..
.
.\" RENAMING REQUESTS
.
.de SECTION
.NH
.ps +3
.fam H \" helvetica family
\\$*
.fam \" back to previous font family
.ps
.PARAGRAPH_INDENTED
..
.de SUBSECTION
.NH 2
.ps +1
.fam H \" helvetica family
\\$*
.fam \" back to previous font family
.ps
.PARAGRAPH_INDENTED
..
.de SUBSUBSECTION
.NH 3
.fam H \" helvetica family
\\$*
.fam \" back to previous font family
.ps
.PARAGRAPH_INDENTED
..
.de SUBSUBSUBSECTION
.NH 4
.fam H \" helvetica family
\\$*
.fam \" back to previous font family
.PARAGRAPH_INDENTED
..
.de SECTION_NO_NUMBER
.SH
.fam H \" helvetica family
\\$*
.fam \" back to previous font family
.PARAGRAPH_INDENTED
..
.de SUBSECTION_NO_NUMBER
.SH 2
.fam H \" helvetica family
\\$*
.fam \" back to previous font family
.PARAGRAPH_INDENTED
..
.de PARAGRAPH_INDENTED
.PP
..
.de PARAGRAPH_UNINDENTED
.LP
..
.de NO_ABSTRACT
.AB no
..
.de ABSTRACT1
.AB
..
.de ABSTRACT2
.AE
..
.ds LH Page %
.ds CH
.de TITLE
.TL
\\$*
.\".ds LH \\$*
.de HD .XX
.sp -2.3
.nr LINEWIDTH (\n[LL]/1.0i)
\l'\\\\n[LINEWIDTH]i'
.sp +1.5
.br
..XX
..
.de AUTHOR
. AU
. ie !'\\$1'' \\$*
..
.de FOOTNOTE1
. FS
..
.de FOOTNOTE2
. FE
..
.de VOCABULARY1
. KS
. BULLET
. UL "\\$*" :
..
.de VOCABULARY2
. KE
..
.
.
.de HIGHLIGHT
.
. nr @wd \w'\\$1'
. nr x1 0
. nr y1 (\\n[rst]u - \\n[rsb]u + .4m)
. nr x2 (\\n[@wd]u + .4m)
. nr y2 0
. nr x3 0
. nr y3 (\\n[rst]u - \\n[rsb]u + .4m)
. nr x4 (\\n[@wd]u + .4m)
. nr y4 0
.
\h'.2m'\
\h'-.2m'\v'(.2m - \\n[rsb]u)'\
\M[color_box]\
\D'P \\n[x1] -\\n[y1]u \\n[x2]u \\n[y2]u \\n[x3]u \\n[y3]u -\\n[x4]u \\n[y4]u '\
\h'.2m'\v'-(.2m - \\n[rsb]u)'\
\M[]\
\\$1\
\h'.2m'
..
.
.
.
.ds SPACE_SS_NUMBER_TITLE 0.5\" not a number register because of leading 0
.nr CURRENT_SECTION 0 +1
.nr CURRENT_APPENDIX 0
.af CURRENT_APPENDIX I
.nr CURRENT_SUBSECTION 0 +1
.nr CURRENT_SSSECTION 0 +1
.rm SECTION
.de SECTION
. nr CURRENT_SUBSECTION 0 \" reset current subsection numbering
. nr CURRENT_SSSECTION 0 \" reset current subsubsection numbering
. ie !(\\n[CURRENT_SECTION]=0) .sp +1
. br
. ie (\\n[APPENDIX_TIME]=0) \
. ds RH \\n+[CURRENT_SECTION].\h'\\*[SPACE_SS_NUMBER_TITLE]' \\$*
. el \{
. ds RH \\n[CURRENT_APPENDIX].\h'\\*[SPACE_SS_NUMBER_TITLE]' \\$*
. bp \}
. ps +2
. fam H \" helvetica family
. ft B
. ne 4 \" should be at least a few lines left at the bottom of the page
\\*[RH]
. ft
. fam \" back to previous font family
. ps -2
. PARAGRAPH_INDENTED
..
.nr APPENDIX_TIME 0
.de APPENDIX
. nr CURRENT_APPENDIX +1
. nr APPENDIX_TIME 1
. SECTION \\$*
..
.de SS
. nr CURRENT_SSSECTION 0
. ie (\\n[APPENDIX_TIME]=0) \
. SUBSECTION_NO_NUMBER \\n[CURRENT_SECTION].\
\\n+[CURRENT_SUBSECTION]\h'\\*[SPACE_SS_NUMBER_TITLE]' \\$*
.el \
. SUBSECTION_NO_NUMBER \\n[CURRENT_APPENDIX].\
\\n+[CURRENT_SUBSECTION]\h'\\*[SPACE_SS_NUMBER_TITLE]' \\$*
..
.de SSS
. br
. ps -2
. fam H \" helvetica family
. ft B
. ie (\\n[APPENDIX_TIME]=0) \
. SUBSECTION_NO_NUMBER \\n[CURRENT_SECTION].\
\\n[CURRENT_SUBSECTION].\\n+[CURRENT_SSSECTION]\h'\
\\*[SPACE_SS_NUMBER_TITLE]' \\$*
. el \
\\n[CURRENT_APPENDIX].\
\\n[CURRENT_SUBSECTION].\\n+[CURRENT_SSSECTION]\h'\
\\*[SPACE_SS_NUMBER_TITLE]' \\$*
. ft
. fam \" back to previous font family
. ps +2
. PARAGRAPH_INDENTED
..
.de INNERBULLET
. in +1
. br
\(bu
. in +1
. sp -1
\\$*
. in -2
..
.de EENUM \" Numbered list
. nr ENUM_INDENTATION 2
. ie !(\\n[LIST_NUMBER]=0) .in -\\n[ENUM_INDENTATION]
. br
\\n+[LIST_NUMBER].
. in +\\n[ENUM_INDENTATION]
. sp -1
\\$*
..
.de EENDENUM
. nr LIST_NUMBER 0
. in -\\n[ENUM_INDENTATION]
..
.nr legendps 2
.de LEGEND1
. QP
. vs -\\n[legendps]p
. ps -\\n[legendps]
. in -1.2
. ll +1.2
. br
..
.de LEGEND2
. br
. vs +\\n[legendps]p
. ps +\\n[legendps]
. br
. LP
..
.de IEME
\\$1\u\s-4\\$2\s+4\d
..
.de CENTERED
. ce
\\$*
. br
..
.de GIVEEXAMPLE1
. in +1
. ll -1
. KS \" start a keep
. \" .ft I \" citation in italics
. mk C \" set a marker for line drawing
. in +1 \" indent a bit
. gcolor citation
..
.de GIVEEXAMPLE2
. mk D \" set second marker to come back here
. \" .ft \" back to previous font
. in -1 \" remove indent
. gcolor black\" remove previous color
. gcolor citationbar
. \" r = move upward
. \" Z D t = drawing thickness
. \" L = draw the line
\r\
\Z'\D't 1p''\
\L'|\\nCu' \" draw line
. gcolor black \" remove previous color
. sp -2 \" get two lines back
\Z'\D't 0.5p'' \" get the previous drawing thickness back
. KE \" end of the keep
. ll +1
. in -1
..
.de ST
.nr ww \w'\\$1'
\Z@\v'-.25m'\l'\\n[ww]u'@\\$1
..
.de INCREMENT
.br
.in \\*[PINCREMENT]
.br
\h'-\\*[DECALAGE]'\\*[CHARACTER]\h'|0'\\$*
..
.de D
.ds DECALAGE 1.0
.ds PINCREMENT 2
.ds CHARACTER \(bu
.INCREMENT \\$*
..
.de DD
.ds DECALAGE 1.0
.ds PINCREMENT 3
.ds CHARACTER \(bu
.INCREMENT \\$*
..
.de AA
.ds DECALAGE 1.5
.ds PINCREMENT 3
.ds CHARACTER \(->
.INCREMENT \\$*
..
.de AAA
.ds DECALAGE 1.5
.ds PINCREMENT 4
.ds CHARACTER \(->
.INCREMENT \\$*
..
.de ED
.br
.in 0
..

42
paper.ms Normal file
View file

@ -0,0 +1,42 @@
.ds VERSION 0.5.1
.ds NB_USERS_NETLIBRE 10700
.so macros.roff
.de dq
\[lq]\\$1\[rq]\c
.shift
\&\\$1
..
.
.de COMMAND
.I "\\$*"
..
.de DIRECTORY
.ps -3
\f[CW]\\$*\f[]
.ps +3
..
.
.
. \" The document starts here.
.
.TITLE Netlibre in Graphs
.AUTHOR Philippe PITTOLI
.ABSTRACT1
Just some graphs about netlibre.
.ABSTRACT2
.SINGLE_COLUMN
.br
.po +11.5c
.br
.po
.SECTION Before the Great Purge, how many domains per user?
.ps -2
.so graphs/nb-domains-per-user.grap
.ps \n[PS]
.QP
These graphs show that the vast majority of users have between a single domain (almost 6000 users) and about 10 domains.
There is a total of 23,711 users on netlibre, 21,872 of them have between 0 to 10 domains, which represents 92 % of the users.
The distribution after that is mostly flat.
.so graphs/cumulative-domains-per-user.grap
The graphs showing the cumulative number of users is very explicit on the fact that almost everyone has a very low number of domains (less than 10) and only 1,5 % of users have 50 or more domains.
.QE

69
troffrc Normal file
View file

@ -0,0 +1,69 @@
.\" Startup file for troff.
.
.\" This is tested by pic.
.nr 0p 0
.
.\" Load composite mappings.
.do mso composite.tmac
.
.\" Load generic fallback mappings.
.do mso fallbacks.tmac
.
.\" Use .do here, so that it works with -C.
.\" The groff command defines the .X string if the -X option was given.
.ie r.X .do ds troffrc!ps Xps.tmac
.el .do ds troffrc!ps ps.tmac
.do ds troffrc!pdf pdf.tmac
.do ds troffrc!dvi dvi.tmac
.do ds troffrc!X75 X.tmac
.do ds troffrc!X75-12 X.tmac
.do ds troffrc!X100 X.tmac
.do ds troffrc!X100-12 X.tmac
.do ds troffrc!ascii tty.tmac
.do ds troffrc!latin1 tty.tmac
.do ds troffrc!utf8 tty.tmac
.do ds troffrc!cp1047 tty.tmac
.do ds troffrc!lj4 lj4.tmac
.do ds troffrc!lbp lbp.tmac
.do ds troffrc!html html.tmac
.do if d troffrc!\*[.T] \
. do mso \*[troffrc!\*[.T]]
.do rm troffrc!ps troffrc!Xps troffrc!dvi troffrc!X75 troffrc!X75-12 \
troffrc!X100 troffrc!X100-12 troffrc!lj4 troff!lbp troffrc!html troffrc!pdf
.
.\" Test whether we work under EBCDIC and map the no-breakable space
.\" character accordingly.
.do ie '\[char97]'a' \
. do tr \[char160]\~
.el \
. do tr \[char65]\~
.
.\" Set the hyphenation language to 'us'.
.do hla us
.
.\" Disable hyphenation:
.\" Do not load hyphenation patterns and exceptions.
.\"do hpf hyphen.us
.\"do hpfa hyphenex.us
.
.\" Disable adjustment by default,
.\" such that manuals look similar with groff and mandoc(1).
.\".ad l
.\".de ad
.\"..
.\" Handle paper formats.
.do mso papersize.tmac
.
.\" Handle PS images.
.do mso pspic.tmac
.do mso pdfpic.tmac
.
.\" ====================================================================
.\" Editor settings
.\" ====================================================================
.
.\" Local Variables:
.\" mode: nroff
.\" fill-column: 72
.\" End:
.\" vim: set filetype=groff textwidth=72: