Building a CHRONO SOCIOGRAM from real world data

My movies are but the capture of a fleeting moments of life that takes place in a 1:1 map of human relationships. The map is a useful simplification of the overwhelming complexity of a territory in which I strive to explore human emotions.

Ingmar Bergman
In previous episode (last 2 posts) I did explore HOW TO represent links between social animals to try to infer who knows who and how these animals organize themselves as a herd : it is a sociogram.

It's a map, and a bad one at this. You see as in H2G2 (hitchiker's guide to galaxy) it's not the map that make the story, but construction work that changes the map. To « prove » my point I will study real life data for which (ethical/legal disclaimer the victim of the data breach and THE CREAM OF ALL JOURNALISTS admitted there was nothing. The hacked team said it was an honeypot (which will prove to be quite true), and nothing of interest was there (which is quite false). Hence, if you want scandals or REVELATIONs, sorry to disappoint you, sociogram don't unfold secret conspiracies.

I must also say I am a sysadmin first. My soul burns when exposed to private email contents, so ... I love sociograms that are in the grey area : you look the enveloppe without reading the mail body.

In my database structure you saw I DO populate my database with the text_mail, and you guessed I did use real data since day 1. Coding out of abstraction is nice, but nothing beats real data to actually stress out your abstration and torture your tools, especially mails that are per RFC2822 the most annoying archive format ever to parse (that I love, I began as a sysadmin specialized in mail).

Without further ado I will show you the result and explain how it was built thanks to postgres FTS (word count does not count as reading email body, doesn't it ?).

Legal disclaimer

It is a sociogram of Person Of Interests from the macronleaks. I will define a POI as : either hacked or (my own definition) any public servant that by being a is submitted to article 14 of constitution Article 14
Tous les citoyens ont le droit de constater, par eux-mêmes (...) la nécessité de la contribution publique, (...), d'en suivre l'emploi.
The payroll of public servants being public contribution submitted to « devoir de réserve » (hence NOT INFLUENCING election), I am entitled to check if public money was indeed used with my constitutional rights at heart.

Aristotle said elective systems are the opposite of democracy : democracy is the ruling of the people by ANY people, the elections introduce a bias of selection of the candidate by chosing who has access to the tribune hence making vote a biased choice in a biased subset of the people. I will add Aristotle was an idiot.
Democracy is not a STATE function, it is a PATH function. Democracy is a path and a journey made of polemics of improvements. Elective systems represent a f**d up state of the situation but it doesn't prevent democracy to exists has long as «a good huguenot's belief » everyone can discuss as an equal. I BELIEVE IN REFORMS, but I don't go to the temple (protestants bore me to death) (cf Frankfurt school//Habermas).

So let's see if my constitutional rights to choose from the largest democratically large subset of population was respected or did public servants entitled to enforce the spirit of the Constitution meddled with my right to choose from a larger subset of candidate than during last elections. Is the delta « positive » in term of democracy ?

TL;DR : the reform I would want after this study would be for administration to make ALL enveloppe of public servants mail and private sector public. I would also like to have all public communication in a database I can query without rights of elected members/public servants to DELETE them.

Hence here is a real life sociogram of public servants//elected members during Macron's campaign.

Real life feedback

At the opposite of developpers I know when a tool sucks. This MAP SUX.

A good map is easily readable and does not clutter the screen with TOO MUCH INFORMATION. I find it nice and readable, because I have been trained to read the functions of a chip by looking at the silicon with a microscope, and compared to a SoC, this is peanuts. It's not even has complex has modulator/de-modulator (MODEM). However, I am also human. It's really a mess.

You may criticize people with nice words, I don't coat my words with sugar : it is plainly unusable because of H = k . ln(S). There is too much choices that are not relevant.


This is a sociogram from may collected on a 2 year span, hence it is making stuff that were fleeting moments persist over time. It has good sides : you can guess the galaxy of influences by looking at the constellations of contact near the person that were hacked : ministry of the finances, minister of public health, minister of royal importance (justice/interior), municipality of capital (a state in the state), and military industry.

It has the same value has a persistant vision : making a blurry map with a feeling of what is there, but no details.

Hence, we are gonna introduce another tool : that complements the sociogram with ... a CHRONO-SOCIOGRAM. MOVING PICTURES of SOCIOGRAM. V1 is ugly, but good enough to give an idea of what comes next: a freakinig chrono sociogram where nodes stand still and where I will only higlight temporarly the edges.

I will not sugar coat my words : it is still shitty as hell, BUT, at any given time a normal brain can often see what matters : who talked to whom when ? Which for shit diggers having access to the content of email would be the tool to ease the inquiry job of isolating the informational window in which to scrutinize contents. BUT I WILL NOT ! I am a PROUD SYSADMIN, muttafuckas !

But how did you found the POI in the first version btw ? Cheater ?

You can predict everything except the future, hence the reason in applied physics we make prediction on past data so we can foresee the results.

Niels Bohr
I don't cheat, I used science. I put in all members of government as POI and spoke person of it, knowing it was already public they worked in the campaign. But I discovered soon, knowing the future was not necessary.

Let me introduce : POSTGRESQL FULL TEXT SEARCH's FEATURES : not trying to add words in a corpus based on inference.

Once you google for regex postgres array you have a neat function ~#!@ that is very useful and you can fire the word count and select emails by frequency from a point.

Knowing that the president real email is ALWAYS in the form e2m@ it gives :
ml=# select * from ts_stat($$select to_tsvector('french', text_plain) from mail where  '^e2m.*' ~!@# any("from") order by date ASC$$) where word ~* '.*@.*' order by nentry desc;
                  word                   │ ndoc │ nentry 
─────────────────────────────────────────┼──────┼────────
 e2m@en-marche.fr                        │   18 │    115
 barbara.frugier@gmail.com               │   11 │    104
 clement.beaune@gmail.com                │   11 │    102
 ismael.emelien@en-marche.fr             │   19 │     36
 sylvain.fort@en-marche.fr               │    8 │     16
 benjamin.griveaux@en-marche.fr          │    6 │     12
 julien.denormandie@en-marche.fr         │    6 │     12
 brigitte.macron@en-marche.fr            │    6 │     12
 sibeth.ndiaye@en-marche.fr              │    6 │     12
...
So when president is in from these are the most likely emails to have been quoted.

Word count does not count has reading emails body content, for real especially with a filter on "@".

And, step by step, you build the sociogram by doing a top most quoted email using the first ring, the second ring and then you stop because it is already much...

Nothing magical, just stupid out of the box function from the database used in a perverted way.

Since these leaks are old news, you can then correlate with what you know.

  • barbara was indeed the PR
  • clement became a spokeperson of the President or a minister
  • ...
  • sylvain the ghost writer who wrote « revolution » for the president
Being as sleaky as google/Meta does not require brain. Just building tools.

At this point the code (embedded data not counted) for making « a movie » is still 100sloc and I code AT BEST 10 sloc a day. I'm a messy sloth.

Here is the code for build the movie
pushd out
for i in *dot; do dot -Tpng $i > $( basename $i .dot).png; done
for i in rec.????.png; do convert $i -resize 2000x1400! re.$i; done
rm output2.mp4
ffmpeg -framerate 1 -i re.rec.%04d.png -c:v libx264  -crf 30 -pix_fmt yuv420p output2.mp4 && firefox output2.mp4
popd 
And here is the code for building the sociograms :
#!/usr/bin/env python3

import os
import psycopg2
from datetime import date, datetime, timedelta
from archery import mdict

def int_env_default(var, default):
    return int(os.getenv(var) or default)

MIN_MAIL = int_env_default("MIN_MAIL",6, )
MAX_MAIL = int_env_default("MAX_MAIL",100)
WL_MIN = int_env_default("WL_MIN", 3)
CUT_SIZE = int_env_default("CUT_SIZE", 20)
DATE = os.getenv("DATE") or "2016-01-01"
END_DATE = "2017-05-01"
BY_DAYS = int_env_default("BY_DAYS",4) # 13x28 = 364 ~ 365.5
NB=1

end_date = date.fromisoformat(END_DATE)
date = date.fromisoformat(DATE)
td = timedelta(days=BY_DAYS/2)
td2 = timedelta(days=BY_DAYS/2)



                
def is_ilot(node:str, edge_dict:tuple) -> bool:
    """ilot == has only 1 link back and forth either in (from,) or (,to)"""
    count=0
    for edge in edge_dict.keys():
        if node == edge[1] or node == edge[0]:
            count+=1
        if count > 2:
            return False
    return True

patt_to_col =  dict({
    "e2m":"red",
    "emmanuel.macron":"red", 
    "emmanuelmacron":"red",
    "alexis.kohler" : "midnightBlue",
    "gabriel.attal" : "orange",
    "sejourne.stephane" : "grey15",
    "stephane.sejourne" : "grey15",
    "olivia.gregoire" : "darkOrange",
    "veranolivier":"green",
    "julien.denormandie" : "lightBlue",
    "sibeth.ndiaye" : "orange",
    "barbara.frugier" : "green",
    "cedric.o" : "purple",
    "gouv.fr" : "maroon",
    "snecma.fr" : "purple",
    "safran-group.fr" : "purple",
    "benjamin.griveaux":"blue",
    "laurent.bigorgne" : "darkBlue",
    "jean.pisani-ferry": "yellow",
    "luc.pisani-ferry": "yellow",
    "ismael.emelie" : "orange",
    #"jesusetgabriel.com" : "crimson",
    "gregoire.potton" : "lightGreen",
    "eric.dumas":"salmon",
    "alexandre.benalla" : "darkGreen",
    "pierre.person" : "darkBlue",
    "pierrperson" : "darkBlue",
    "quentin.lafay":"grey10",
    "fm.alaintourret" : "purple",
    "@paris.fr" : "orange",
    "langanne" :"pink",
 })
    

wl = lambda s : any(map(str.startswith, patt_to_col.keys() ,s))
def in_wl(mail : str):
    for l in patt_to_col:
        if mail.startswith(l) or mail.endswith(l):
            return l

def wl(pair: tuple):
    for l in patt_to_col:
        if in_wl(pair[0]) and in_wl(pair[1]):
            return patt_to_col[in_wl(pair[0])]
#assert wl(("jesusetgabriel.com", "jesusetgabriel.com")) == "crimson"

is_vip = lambda t:all(map(in_wl, t))
fn=0
while date < end_date:
    fn+=1
    direct=mdict()
    final = mdict()
    conn = psycopg2.connect("dbname=ml host=192.168.1.32 port=5432 user=jul  sslmode='require' ")
        
    with conn.cursor() as sql:
        sql.execute(f"""SELECT "to", "from" from mail where DATE BETWEEN '{date}' AND '{date+td}';""")
        while t := sql.fetchone():
            for fr in t[0]:
                fr=fr.strip()
                for to in t[1]:
                    to=to.strip()
                    if fr != to and fr and to:
                        direct += mdict({ (fr,to) : 1 })

    date += td2
    tk= list(direct.keys())
    def has_more_than_n_neighbour(email: str, n :int, final : dict):
        count = 0
        for k in final.keys():
            if len(set([email]) & set(k)):
                count+=1
                if count >n:
                    return True
        return False
            

    for k in tk:
    # dont modify a dict you iterate hence copy of keys
        if is_vip(k) and k not in final  and k[::-1] not in final: # or wl(k) and (k[1] != k[0] and k[1] and k[0] and k in direct and k not in final and k[::-1] not in final and k[::-1] in direct \
               
            final[k]=direct[k]
            final[k]+=direct.get(k[::-1],0)
        else:
            try:
                del(direct[k]) 
            except KeyError:
                pass
            try:
                del(direct[k[::-1]]) 
            except KeyError:
                pass


        
    tk= list(final.keys())

    for e in tk:
    # dont modify a dict you iterate hence copy of keys
        if not has_more_than_n_neighbour(e[0],NB,final) or not has_more_than_n_neighbour(e[1],NB,final):
            try:
                del(final[e]) 
            except KeyError:
                pass
            try:
                del(final[e[::-1]]) 
            except KeyError:
                pass



    color = "".join([  f"""{i[1]} pour {i[0]}{[", ",chr(0x0a),][(n%4)==3]}  """  for n,i in enumerate(patt_to_col.items()) ])
        

    conn.close()
    with open(f"out/rec.%04d.dot" % fn, "w") as f:
        title = f"""label="Sociogramme de {date} à {date + td} extrait des macron leaks orienté gouv.fr, personne d'intérêts (vert), victime du hacking (rouge), et président (bleu)\n
    entre [ {MIN_MAIL}, {MAX_MAIL} ] échangés \n
    plus gros liens au dessus de {CUT_SIZE} mails échangés entre interlocuteurs \n
    couleur par priorités selon les origines \n
    {color}
"""

        print("""
    graph Sociogramme { """ + f"""
    fontname="Comics sans MS"
    outputmode="nodesfirst"
    size=20
    label="Sociogramme de {date} à {date + td}"
    ratio=1.7
    labelloc="c"
    labelloc="t";
    """ + 
    "\n".join(['  "%s" -- "%s" [label=%d color=%s penwidth=%d ];' % (k[0],k[1],v, wl(k) or "black", 1 if v < CUT_SIZE and wl(k) != "red" else 4 ) for k,v in final.items()])
     + "}", file=f)


PS : I'm totally sure I saw during FSM 2005 or 2004 (20 years ago) exactly this about python commit during a conference. A lot of kudos to whoever can find the link and say : boooooh it's not new imposteur ! PPS : next blog post solving the graphviz variable problem that f*** ffmpeg with a fstring and being inventive in less than 20 sloc :D
I'm totally gonna dump the full stuff and use perl to make a template in f"" with perl :D trololololol

Building a sociogram from mail archives in python and postgres

TL;DR : « I know that as john snow, I know nothing, and it is not a problem »

Foreword : typing in CS is WRONG



People are different. I am, you are, he/she are, it are.

I don't talk about gender, I talk about mileage, life experiences and shit.

Me, I come from being a half thug, half educated (D&D bi-classed) including the local kingpin of forging fake documents for « école buissonière » (skipping school) with my early 90s computer, cheating with pctools, being the kingpin of a ring of cracked software from ranging from amiga to powerPC.

I learned coding not as an educated CS 101 but as a dyscalculic and dyslexic student in physics redeemed by his facility in foreign language especially if they have a germanic touch (french, english, german).

Foreign languages have taught me the power of composition of pre/post positions that are consistent like dé-ménager is opposite on en-ménager which is same as moving-out compared to moving-in.

Also, programming in physic is not the same as programming in CS. We don't have budget for programming hours, so our teacher don't care about elegance and high level programming or low memory consumption. They want easy to read and debug code that works fast. Also, physics has long resolved the typing debate : computer academics are just so high they don't get it.

See : if I have a unit in meter per seconds and I add kilograms, we want the code to crash.

Strongly typed language (including ADA or VHDL) don't have « symbolic consistency » but DATA TYPE consistency. And I will illustrate it in the code to come with the
is_ilot
function.

Mindset and tools : why I did not use overwhelmingly beautiful postgres features but wasted my CPU and memory doing the sociogram in python (and why not in Perl)

My problem is simple : imagine I have a sample database to have fun containing real life email and I want to make a graph out of it. Like an Xleaks from wikileaks, and I want like Meta, or google to infer who are the interesting persons interacting out of the thousands of interlocutors. So let's dump my SIMPLE sql schema :

DROP TABLE IF EXISTS public.mail;

CREATE TABLE IF NOT EXISTS public.mail
(
    filename text COLLATE pg_catalog."default" NOT NULL,
    "from" text[] COLLATE pg_catalog."default" NOT NULL,
    "to" text[] COLLATE pg_catalog."default" NOT NULL,
    subject text COLLATE pg_catalog."default",
    attachments json,
    text_plain text COLLATE pg_catalog."default",
    date date,
    message_id text COLLATE pg_catalog."default",
    thread_id text COLLATE pg_catalog."default",
    CONSTRAINT mail_pkey PRIMARY KEY (filename)
)

TABLESPACE pg_default;

ALTER TABLE IF EXISTS public.mail
    OWNER to jul;


A sociogram is a graph made of relationships (edges) between persons (nodes) with their strength expressed in number of occurences between persons.

I basically want
for each mail
   for the cartesion product of  to and from
       add an edge in graph
I use the language of building microchips I learned in applied physics of micro-electronic here. Not a computer stuff I cannot visualize in my f***d up brain.

The problem are « HUMANS ». They chat to a lot of persons but there are 2 kinds of persons : persons who linked other persons and persons who are just noises having a 1:1 relationship.

Analysing visually thousands of nodes in a graph is doable, but tiring. So we have to weed out nodes that are useless. People who are just leaves in the graph having only a bijective relationship.

Digression on the choice of tools


I love posgres, but I am dyslexic and don't use it often. I have as an only tool psql to build request and stack overflow to answer my questions involving recursive request on array to build a cross product.

Stack overflow is good at solving one problem. But composition of answers is tough, especially when I use reserved WORDS in postgres as column names. And you are gonna wonder why ?

MY OWN STRONG TYPING : name a thing by it's real name and PUT UNITS in their name if you can.

Also, physics taught me to avoid recursion at all costs because .... see point #1, stacked base thinking does the same for less bugs and head/p overflow (I come from an era where size of heap for call recursion where laughingly low on linux, C, Perl).

So I did my own code in python wasting memory and CPU for something I am well aware there was an elegant, faster solution in postgres, but early optimization or early result was a fast choice : I want for gruik coding without hesitation. Why did I used postgres ? Parsing email is a cost of HOURS. Getting the « to »s and « from »s time consuming. I totally amortized postgres for the use as a more efficient DATASTORE than the filesystem. No regrets here.

The code : KISS



Building a sociogram weeding out the « ilot » (edges connected to only one and only one other edge) is fairly easy once you coded the
is_ilot
function. It has been 2 full hours of work for a problem I never faced before applying academic knowledge of micro-electronic to a social graph.
import psycopg2
MIN_MAIL=20
MAX_MAIL=400
from archery import mdict

conn = psycopg2.connect("dbname=ml")

direct=mdict()
final = mdict()
    
with conn.cursor() as sql:
# cartestion product done the dumbest way possible
    sql.execute("""SELECT "to", "from" from mail""")
    while t := sql.fetchone():
        for fr in t[0]:
            for to in t[1]:
                direct += mdict({ (fr,to) : 1 })

                
def is_ilot(node:str, edge_dict:tuple) -> bool:
    """ilot == has only 1 link back and forth either in (from,) or (,to)"""
    count=0
    for edge in edge_dict.keys():
        if node == edge[1] or node == edge[0]:
            count+=1
        if count > 2:
            return False
    return True
    
tk= list(direct.keys())
for k in tk:
# weeding out pass 1
# dont modify a dict you iterate hence copy of keys
    if k in direct and k[::-1] in direct \
            and MAX_MAIL> direct[k]+direct[k[::-1]]>MIN_MAIL:
        final[k]=direct[k]
        final[k[::-1]]=direct[k[::-1]]
    else:
        try:
            del(direct[k]) 
        except KeyError:
            pass
        try:
            del(direct[k[::-1]]) 
        except KeyError:
            pass


    
tk= list(final.keys())
for e in tk:
# dont modify a dict you iterate hence copy of keys
# weeding out pass 2
    if is_ilot(e[0],final):
        try:
            del(final[e]) 
        except KeyError:
            pass
        try:
            del(final[e[::-1]]) 
        except KeyError:
            pass

    if is_ilot(e[1], final):
        try:
            del(final[e]) 
        except KeyError:
            pass
        try:
            del(final[e[::-1]]) 
        except KeyError:
            pass



conn.close()
# output for graphviz
print("digraph Sociogramme {")
print("\n".join(['"%s"->"%s" [label=%d];' % (k[0],k[1],v) for k,v in final.items()]))
print("}")


You will notice I « typed » the python function. It took me 20% of the time because I was still in postgres thinking of postfix typing (::array) and not in infix typing (list :) and it's because I had ... a bug to solve. At first I coded the function with one letter name as I usually do until I have a problem. I backtracked it, changed the name and put the typing annotations for fun but what really helped me was : the only strdoc in the code and naming. Remembering what was my purpose and what edges and nodes were. As soon as I named correctly the function, the inputs, and wrote the strdoc it was done magically and I laughed at how typing was missing the point.

a_dict could be a list of keys, a sparse matrix, a mutable mapping, a string. The type of data structure I use to represent a node or an edge is so varied typing does not help.

Here is a sample of the output before after the weeding out with
is_ilot

Before

After

Final word

I want this post to be an advisory to noobs like me to not care about academics but let the accident of programming not rebute them for going the way they see fit in a Keep It Simple Manner that « work for you »©®

Datastore and database : why it is a good idea to not confuse both.


I strongly advise to fast watch this video, since datastore and database, as well as hierarchical database are covered there.

Now let's come back in 2024 and wonder, well, is this still relevant.

I recently had fun taking a simple use case that made one postgresql contributor famous : Julian Assange Xleaks.

Should we put mails in database or keep the database as an index ?

As a foreward Python mail parsing is infamously not on par with Perl from which it has ported its libs. We will imagine we use a thin layer on top of it know as mail parser and that our mail comes from google, outlook, and thunderbird archives.

After all, mails are so important in our modern life that the use case of analysing mail with a database, or a nosql or .... is important.

My favourite « kind » of non database data-base are like LDAP hierarchical tree like datatype. They fit verey well with my aggregation lib for dict in python (archery a good way to shoot yourself an arrow in the knee). And of course, POSTGRES DOES IT, POSTGRES DOES EVERYTHING BETTER THAN ANYONE. (I intend it as a troll, but, in the bottom of my heart, postgresql and sqlite are my 2 favourite databases).

However mails ARE relationals thanks to from/to, and thread-id. If thread reconstruction may favour hirearchical databases, your unit of search will be mail and wanting to mail a many-to-many relationship like « find all mail where X and Y are linked.

One approach on parsing 1000th of email is relying on an SSD and brute forcing your way through mail every time. But, lol, I'm poor, I have an hard drive wich I fear for its life with all my precious photos of my family, so I prefer not too. Plus it's long. And that's when you remember surfing the paperspace and the liibrary analogy.

Database is supposed to be the cabinet in the entrance where you can find all the name of the books that are physically located in the library and where they are. Ex : an author may be a co-author (like Good omens from pratchett in Fantasy, in SF (yes Pratchett wrote SF), and in fantasy.

Fetching a book is long, the cabinet (database) helps you find the books fast in the datastore (the shelf of the library). A database is pretty much a tool for indexing slow retrieval data that you want to find fast.

In 2024, is it still relevant ?

I beg to argue yes in the famous realm of « it works for me this way »©® (famous saying of linus torvalds).

Hear me out : mail parsing is shit.

Imagine, you have an email : per RFC, you can have MORE THAN ONE BODY (a mail is an n-relationship between enveloppe and body) and BODIES can be either TXT OR HTML and more often than not (thks to the creativity of the artists) may bear different messages since SOMETIMES what you see matters, hence, the text body is litteral garbage if you want to make sense of the mail.

Mail per RFC 2822 can have attachments that can embedd attachments that refers to each others (often in an mixed peek and poke of both an arrayish and tree-ish data structure.

Ho ! Is it perfect for postgresql XML/JSON ? NO ! Recursive descending SQL request may exists, but joining on non deterministic disposition is begging for losing too much brain cell : it is not because you can do it that YOU SHOULD DO IT. Sometimes the most reliable to access attachments is not from
parser(mail).attachments.to_json
(that is half backed) but with
parser(mail).write_attachments
that renders embedded attachments inside the documents in a more reasonable readable way. And sometimes more often than a python guess, what you want is a heavy client for READING MAIL that embedds decade of wisdom on how to deal with broken norms.

Hence, practically, when you deal with mails what you want to store in the database what you want to store is :
  • path to the DATA-STORE (hence HARD DRIVE)
  • from
  • to (BCC, CC for me are tos too, since I want to draw sociograms)
  • message-id
  • subject
  • thread-id
  • DATE which is a nightmare since it's a clear hell to PARSE
  • and because experimenting with JSON is fun the attachments metadata object/dict (application type, content type, filename) as an JSON
  • and because FTS (full text search that can survive typo) is fun the FIRST text body (but you will miss when astute individuals will use more than one)
Legal archiver and geeks MIGHT want to add : the chain of mail servers, and all data concerning validation to try to detect signs of spoofing. Which gives us almost this :
CREATE TABLE IF NOT EXISTS public.mail
(
    filename text COLLATE pg_catalog."default" NOT NULL,
    "from" text[] COLLATE pg_catalog."default" NOT NULL,
    "to" text[] COLLATE pg_catalog."default" NOT NULL,
    subject text COLLATE pg_catalog."default",
    attachments json,
    text_plain text COLLATE pg_catalog."default",
    date date,
    message_id text COLLATE pg_catalog."default",
    thread_id text COLLATE pg_catalog."default",
    CONSTRAINT mail_pkey PRIMARY KEY (filename)
)

TABLESPACE pg_default;
This is ALREADY speeding up without hammering my hard drive all of the following funny use cases : This said, I have already fun using postgres and shell doing sociogram by first ranking people in to/from relationship above a threshold and then drawing the sociogram.

Here is a simple request to see who are the top senders

cat <<EOM  | psql ml jul | less
SELECT DISTINCT ON (times_seen, element) element
    ,COUNT(element) OVER (
        PARTITION BY element
        ) AS times_seen
FROM mail
    ,unnest("to") WITH ordinality AS a(element)
ORDER BY times_seen DESC, element DESC;
EOM
Making histograms about how much « to » you have per mail

psql ml -c ' 
WITH len as (SELECT cardinality("to") as cto from mail) 
SELECT 
	width_bucket(cto, 1, 43, 10) as bucket, 
    count(*) as freq 
FROM len 
GROUP BY bucket ORDER BY bucket;
'
# too lazy to put the min/max functions

 bucket | freq  
--------+-------
      0 | 41083
      1 |  9965
      2 |  1096
      3 |   227
      4 |   116
      5 |    88
      6 |    12
      7 |    14
      8 |     4
      9 |     2
     10 |     2
     11 |    26
(12 rows)


Making dot diagram of who speaks to whom in a one to one relationship (strong link) when it it more than 20 times :
( echo "digraph G {" ; 
	PSQL_PAGER="cat" psql ml jul -ta -c "SELECT \"from\"[1] || '->' ||  \"to\"[1]  FROM mail WHERE cardinality(\"to\") = 1 and cardinality(\"from\") = 1; " \
    | sort | uniq -c \
    | perl -ane 's/^\s+(\d+)  (.*)\-\>(.*)/"\2" -> "\3" [label="\1"];/g; print $_ if $1 > 20'  ; echo "}" ) \
    | dot -Txdot | xdot -
And that's already neat. By treating the envelope as an orthognal data space than datastore, you treat a new shit-ton of informations that are normally hidden in the mail that is already (too) full of information. I stop writing this post to come back having fun with my database while I leave the mail in the cold of the data-store :D

Addendum : And I was furious that the SQL was so complex for querying reciprocal relationships in arrays that I came (since my dataset is small and I have A LOT OF MEMORY (4Gb) with a neat more exact python/SQL/BASH/xdot solution that will cringe any SQL/bash/python purist (lol) but that is a pipe of simple operations anyone can understand.
#!/usr/bin/env bash
MIN_MAIL=40
TF=$( mktemp )
PSQL_PAGER="cat" psql ml jul -ta -c "
SELECT \"to\"[1] || '->' ||  \"from\"[1] 
FROM mail 
WHERE cardinality(\"to\") = 1 and cardinality(\"from\") = 1; " > $TF
python -c "from archery import mdict" || python -mpip install archery

python <<EOF | xdot -
import re
from archery import mdict
patter=re.compile(r"""^ (\S+)\->(\S+)$""")


direct=mdict()
final = mdict()
    
with open("$TF") as f:
    for l in f:
        try:
            (fr, to) = patter.search(l).group(1,2)
            direct += mdict({ (fr,to) : 1 })           
        except:
            pass

tk= list(direct.keys())

for k in tk:
# dont modify a dict you iterate hence copy of keys
    if k in direct and k[::-1] in direct and direct[k]+direct[k[::-1]]>$MIN_MAIL:
        final[k]=direct[k]
        final[k[::-1]]=direct[k[::-1]]
    else:
        try: del(direct[k]) 
        except KeyError: pass

        try: del(direct[k[::-1]]) 
        except KeyError: pass

print("digraph Sociogramme {")
print("\n".join(['"%s"->"%s" [label=%d];' % (k[0],k[1],v) for k,v in final.items()]))
print("}")


EOF



We need a more anti-clerical mindset in Information Technologies

I have recently made a rabbit hole in postscript, PDF, SVG, tk/Tcl (hence modern graphical UI), unicode and have worked intensively in web technologies. And I can tell you something : the modern clergy must die !

Talking like an ivy league student (https://mail.python.org/archives/list/python-ideas@python.org/thread/AE2M7KOIQR37K3XSQW7FSV5KO4LMYHWX/) is the freaking norm in open source software, and it ain't no secrets that expressing yourself like a « vulgar » street guy make any of your comment thrown to the thrash. I am « deftones » BORED of this, and I think this is becoming a major problem.

Clergymen are the knowledgable persons who from their ivory tower classify, gives names and structure the knowledges of the others. Charles Marche would say the « bourgeois » appropriate the « praxein » (how to) by transforming it into « doxein » (know how). But what else the bourgeois are famous for ?

Creating private property everywhere they can : on numbers (ISDN, IPv4, IPv6, DOI, OUI, PCI ids, BGP prefixes), on glyphemes (emojis, fonts), on sound (musics), fucking frequencies (5G, digital radio), time (RT GPS) ... Anything that physics can define as observable : even freaking colours can be patented !

Us from the « soute à charbon » (coal bunker) have in common with the boss of startup that we began coding with the raise of lowspec computers (C64, Z80, apple II (for the riches), CPC464, HP28/48 (kind of expensive at the time) ...). Why aren't we the boss ? Because someone need to do the job, and it won't be the bosses, the lawyers and their balls leakers (academic). Because, I vy League are the crucible of where these balls suckers are molded in this culture that sees THEIR views as universal.

Recently I have been raising to python and firefox my concern that I have NO LINE OF DEFENSE against something that seems irrationnal to me from the « coal bunker » : I cannot detect or correct when unicode bidir algorithm are presenting a < as a >
from unicodedata import normalize
from wsgiref.simple_server import make_server

def simple_app(environ, start_response):
    status = '200 OK'
    headers = [('Content-type', 'text/plain; charset=utf-8')]
    start_response(status, headers)
    ret = [("%s < =? %s" % (n, normalize(n,"\u202b>\u202b\n"))).encode("utf-8")
           for n in ("NFD", "NFC", "NFKD", "NFKC")]
    return ret

with make_server('', 8000, simple_app) as httpd:
    print("Serving on port 8000...")
    httpd.serve_forever()



Take a web browser and admire that < and > both appears and no stdlib/filters/normalizations exists for this.

What is a contract ? (Beware, I have huguenot origin the holy geist of capitalism runs through my blood)

If I show you a contract on screen, what should I consider the stuff on which agreement has been made ? What is shown or what is written ?

Since, we automatize contract processing it does not matter. What is written of course prevails on what is shown. And all of firefox/python coders said : « the holy unicode norm prevails ».

I don't want to pick a fight with unicode since only persons who actually have been experiencing first hand the madness of unicode editing bidir mixed strings will grock whatever I said.

Editing bidir string is like following the white rabbit under LSD of Alice in wonderland. The clergyman will tell you « YOU FAILED BY NOT FOLLOWING THE MYSTERIOUS ONE BEST WAY©® » (which basically boils down to use the latest iOS on the latest Mac Mx).

You see how my double punctuation marks have all a space in front ?

It is because my typography reflex are inherited from french language and I find it clearer. Typography is ONE of the many « ONE BEST WAY », and PEP8 enforces another one that contradicts mine. Making me consider « properly formatted » python code un-fucking-readable.

I have a master in physics and stumbled upon laplacians, differential and pretty complex equations, I have learned by strong burns that math are easier to read (FOR ME) when I deviate from the norm by adding MORE SPACES THAN REQUIRED.

You might rightly argue that what works for me IS NOT UNIVERSAL.

In greek there is a word for universal : catholic. It is a concept that has been heralded by chauvinistics genocidal embodiement of all what is wrong in our civilisation : « philosophs ».
Philosophs in Athens were richs sons of aristocrats and hiérarchs (holy persons) who thought that democracy was a threat to their unique Nature of « enlightened » piece of shit they were. They believed in absolute power of knowledge over everything and thought knowing maths was enough to have an opinion on every topic on earth : diet, pseudo-science, ruling a country, deciding who lives and who dies, what books to keep in libraries how to properly format writings and which one to throw away. They throw all books from the « sophists » who had the cardinal sin of opposing the « catholic » « one best way » in favor of the « πάντων χρημάτων ἄνθρωπον μέτρον εἶναι » (for all judgement man (he/she in its diversity) is the measure).

Hence, as a sophist I don't claim I am right, I claim I have the right to make a plea « as an equal human on the public place » for my case without being disregarded as « not following the « one best way ». Don't mistake me, I strictly don't want my views to be embraced by all as universal, nor disregard the others. I want to be talked as an equal on the agora.

All the answers I had were : we aren't gonna do anything because that's exactly WHAT THE NORM (unicode freaking hummongous mammothian riddled with more undefined behaviour than a C++ standard) SAID.

You know what, as a coder that HAVE to redact the web page that involves situation in which you click and it ties you to an immediate non reversible CONTRACT, I surely do advise you discuss with me.

This attitude towards discussion : always invoquing « the norm » first and refusing discussion with heterodox is undistinguishable from a clergy.
Fuck the norms, fuck the existing de-facto clergy of educated CS graduate, fuck the MPAA, the RIAA, unicode, and what the industry « wants » : let's talk about the freaking consequences for the « anthropos » (the animal called men and women) that must deal with the chaos of less than satisfyingly baked cathedral of norms.

And unicode is just the tip of the iceberg, PS, PDF, Tk and SVG deserves their OWN topic because, to me internet as a way to print knowledge and helps the « vulgus pecum » (the mass of persons not speaking ivy league english) share informations is being barred from exactly this by the norms themselves.

PDF and unicode are the opposite of Gutenberg press : neither a revolution of simplification of the essence of the written language (french happily lost a lot of letters and ligature in the process of Gutenberg Revolution), nor an ease of printing but they are WALLS of useless complexity that makes me regret the existence of daisy printers.
Modern web technologies is a dyschronia where the diffusion of information is being ruled by people with the Catholic church mindset opposing the ideals of Gutenberg. Modern web technology and computing is an effective dysfunction of what education should thrive for : emancipation of the mass by letting people exchange information the easiest they can and build their own tooling.

Mon premier language qui devrait être enseigné à tous : le Reverse Polish Lisp

Je m'aperçois que ce n'est pas le basic de mon commodore 64 quand j'avais 12 ans, où le pascal de mon PC quand j'en avais 14 qui m'a amené à coder, mais le langage de ma calculatrice HP48GX et ce pour des raisons d'avancées techniques que nul autre ordinateurs et langage de programmation n'ont atteinte aujourd'hui.

Déjà, j'ai toujours aimé allumer et éteindre des pixels sur les écrans, et aucun autre langage ne faisait ça aussi simplement de base.

Commençont par une revue de ce langage sans prétention : on a une pile d'appel visualisée en écran principale dans laquelle on peut visuellement introduire du code et des données.

C'est la seule UX où la pile d'appel est au centre de l'expérience du développeur.

LA PILE

Dans cette pile inversée par rapport à la convention des langages dits infixe on commence par empiler PUIS on appelle les fonctions. L'intérêt pour le concepteur du langage c'est que le parseur de commandes est dit de gauche à droite monotonique. En notation « naturelle » mathématique on met l'opérateur AVANT les opérandes, ce qui oblige pour des raisons de respect d'une typographie académique qui n'a pas lieu dans un ordinateur de rajouter moults circuits électronique et manipulation d'AST (arbre syntaxique).

Ce faisant en étant plus proche du métal, on se bâti une belle intuition de comment faire son langage et des piles d'appels.
Les piles étant elles même des objets (oui le RPL est objet) on peut les sauvegarder et les restaurer, permettant de créer des SCOPES, des contextes d'execution. Bref, de la programmation paramétrée.

Le « typage » sains

Je vais commencer par le plus merveilleux typage que je n'ai jamais revu en informatique : le typage unitaire.

Avant de faire de l'informatique pour compter les fois où un client se branlait devant une paire de chaussure croco j'étais étudiant en science APPLIQUÉE, où l'on confrontait des résultats d'équations maousse costaud à des résultats de mesures.
Une erreur est vite arrivée, heureusement la HP48 avait un as dans la mange : la validation des unités.

les tags

# 1:m/s + 2:kg
Syntax Error : vous pouvez pas additionner des choux et des carottes 
Les valeurs scalaires (à gauche) pouvait être associées à des chaînes libres qui permettaient de transformer la pile en dictionnaire (il y avait des opérations de FTS pour aller chercher les occurences de valeurs taguées, mais aussi ces étiquettes (tags) permettaient de donner des unités physiques aux OBJETS. Car je vais y revenir le typage étaient attachés aux objets et non basés sur les objets. Le typage était un traît de classe et non une classe.
Et cela permettait de aussi de gérer intelligemment le polymorphisme. Chose qui paraît incompréhensible par un dev moderne, mais un typage de type add(int: a, int: b) basé sur la valeur est CON. En math on sait faire matrice + entier et on a pas envie de surcharger les opérateur des classes, mais de leur faire hériter des traits des scalaires. traîts qui sont variables.
Les règles de l'algèbre hermitienne sont symmétrique à droite, anti-symmétrique à gauche et donc aB = B*a != Ba. Ce serait bien dans une époque où la quantique est importante que nos langages nous fassent pas chier à changer des contextes ou charger des librairies compliquées quand l'algèbre linéaire et hermitienne coexistent. Ce serait mieux que le langage gère le typage et les opérateurs en fonction de traits.

les unités

La HP48 possédait la validation native des unités physiques. C'est une chose que j'ai utilisé en mission de compta. J'ai permis à un client de détecter une sous facturation car des unités exprimées en feuilles étaient injectées pour calculer des coûts à la page. AUCUN PUTAIN de langage moderne n'a embrassé la possibilité de gérer des cohérences d'unités, voire des cohérences de domaines de valeurs (underflow/overflow), où encore de pertes de précisions dans les calculs de float.

Si la HP48 était un calculateur, nos langages modernes sont à peine du domaine de la calculatrice 4 opérations.

les structures de données

L'une des choses qui est dure à apprendre en informatique c'est d'étendre son vocabulaire informatique en structure de données.

Un langage comme basic possède 3 structures de données majeures : les nombres, les caractères et les tableaux.

La HP48 elle proposait : les matrices, les bitmaps, les tableaux, les listes à la lisp, le code (objet modifiable par du code), les fichiers, les fonctions programmées, les alarmes, et la pile qui pouvait servir de table associative grâce aux étiquettes.

La Pile et et les listes à la LISP sont vraiment des outils de bases à partir on peut construire une vision de l'informatique structurée. Surtout les listes à la LISP. D'ailleurs c'est pour ça que je dis RPL pour ce langage car cette structure de donnée est la mère de prototyper toutes les autres structure de données (arbres, Btree, tuple, set...) en plus l'éditeur permettait de structurer la représentation mentale.

Grâce à cette structure de base, il devenait trivial de créer ses PROPRES structures de données. Qui n'a pas implémenté sa propre DB de téléphones persos en mode SQL Less avant que les bases orientées document deviennent à la mode ?

Les shunts

Le langage avait un shunt (court circuit) pour aller chercher le RPL sans ceinture/sans passer par le microcode qui ouvrait la porte à son langage primaire. (syseval) Découvrir le syseval c'était comme avoir ses 18 ans et être enfin autorisé à se bourrer la gueule et se tuer en voiture. Tout langage devrait avoir un débrideur.

Papillon roi de l'évasion

Ce calculateur était ouvert, il avait même un protocole intégré utilisé par des instruments de mesure : kermit.

Kermit étant un protocole série à 8bits, c'est le genre de trucs faciles à bricoler pour mettre sur un RS232C et permettant ... de pouvoir étendre sa machine soit en téléchargeant des archives d'un ordi soit en utilisant sa calculatrice comme solveur d'équation symbolique pour son PC.



Pour toute ces raisons, j'ai aimé programmé en RPL, et j'ai appris à aimer à YODA COMME PARLER, toujours à la fin le verbe mettant.

J'ai aussi pu faire un protoype de MON langage plus facilement en voyant que le RPL était bon et ne me demandant comment faire un FORTH orienté objet extensible qui rendrait jaloux le programmateur que j'étais. Ah et j'ai oublié, je pouvais jouer à lemmings sur la calculatrice et la gestion de l'écran permettait de vraiment s'amuser à dessiner et faire des jeux.

Je pense contrairement à la masse qu'en étant exigeant sur la partie chiante (structure de données, objets...) de geeks scientifiques on fait plus facilement un environnement permettant de développer des jeux.

Bref, j'ai jamais retrouvé le kiff de coder en HP48 et je crois toujours qu'il y a une place pour un nouveau langage extensible qui s'en inspire car c'est facile à bâtir en silicium et microcode à même de transformer des CPUs lowspec en foudres de guerre.

Plaidoyer contre la priorisation en science des budgets hautes énergie, de l'infiniment grand et du petit.

On appellerait ça la méso-science celle qui définit la priorisation de ses budgets et ressource en y mettant l'Homme (et la fammme) au centre de son budget.
Comme le disait le sophiste Protagoras : ce ne sont pas les idéaux ou les esthétiques qui doivent gouverner les priorisation comptables mais l'Homme car l'Homme est la mesure de toute chose et doit être privilégié quand on dépense du pognon sur la vanité et les principes.
Tu m'étonnes que Protagoras n'était pas aimé quand en toute chose on demande à que l'on place l'Homme au centre de toute mesure. Et ça tombe bien car le coeur de métier de la science ce sont les erreurs de mesures.

Voyez vous, l'Homme est au centre de la science, notamment en tant que manipulateur de dispositifs expérimentaux de pointe, OR, toute la science le prouve, l'Humain fait des erreurs.

C'est pour ça qu'on a inventé ce qu'on appelle la « confiance ». C'est une gymnastique mentale où l'on prend toutes les valeurs donnés par des humains qui font des erreurs soit totales partielle 10% du temps sans volonté délibéré de nuire aléatoirement. Et on vire les 10% les plus hauts, les plus bas et on garde un domaine pour une valeur.

Et une loi physique connaît en fonction de son domaine d'application,
  1. ses budgets,
  2. les ordres de grandeur des mesures impliquées
Vous prenez l'astrophysique dans le domaine de vitesse laquelle les vitesses des objets étudiés de l'ordre de 300 000 km/s. Est-ce un domaine prioritaire au vu des budgets ?

Nan parce que prenons un budget pour un autre domaine d'énergie qui implique des corps en mouvement : l'élaboration de tenue de travail qui protège les ouvriers.

Y'a pas besoin de télescopes à des milliards de dollards pour commencer juste à observer un truc.

Pour faire des tests de résistances de tenues une bette presse hydroliques calibrées par l'APAVE, avec banc de certification ça permet de commencer à publier direct des résultats pour moins de 100 000 €.

Si l'homme est la mesure de toute chose, la priorisation de la science quand elle concerne des ordres de grandeur qu'aucun humain n'expérimentera de son vivant est questionnable.

Le citoyen, l'homme va-t'il donner le droit de construire sans contestation du citoyens des accélérateurs de particules impliquant des Téras électron-Volt, des environnements où l'espérance de vie d'un humain avant sa sublimation (passage littérallement de l'Humain de la phase solide à gaz de plasma) se MESURE en microsecondes ?

Si l'Homme est la mesure de l'utilité des budgets sur la survie de l'Homme, l'inconnu dans lequel qu'il pourrait être important d'investir maintenant j'ai d'autres sujets low-costs car faible domaine d'énergie.

Alors je sais c'est pas bandant, mais pipi, caca, popo.

Les bactéries dans l'eau et la nourriture prolifèrent d'autant plus que la terre se réchauffent.
Bactéries contre lesquelles les antibiotiques sont efficaces ... tant que tout le monde peut se les payer... et ils chient et ça va dans le tout à l'égout.

Ces bactéries -streptocoques- sont responsables de la crise des chiasses des mangeurs d'huîtres de cette année (dont j'ai fait parti).

J'ai acheté à ma fille un microscope à 30€ au supermarché du coin à Noël. Et je vois pas des bactéries, car je sais que dans notre domaine d'observation il y a que les énormes bactéries bien nourries du caca, elle peut en voir aucune. Et j'ai vraiment pas envie de toucher et sentir du caca pour faire le kéké avec un microscope. Par contre elle peut voir des amas cellulaires.


Plus le domaine de science est dans celui où l'homme est la mesure de toute chose, plus il est possible que des bons instruments de mesure soient accessibles dans sa cuisine ou son salon.

Autant je peux ranger un microscope résolution optique x 1200 de 20cm x 25 cm x 40 cm sur un meuble, autant un tokamak pour étudier la fusion nucléaire/physique des particules ou un réseau de de téléscopes spatiaux et terrestres multifréquence c'est pas trop facile à caser dans mon 50m², même en faisant appel à un architecte d'intérieur.

Alors, le paradoxe est certes que le GPS qui a permis à la physique du quotidien de gagner en terme de disponibilités et coût provient de la recherche spatiale.
Grace au GPS, vous avez dans vos téléphones portables la puissance de mesure inimaginable.

Voyez vous, ce qui fait l'erreur en mesure c'est aussi la limite de résolution physique des dispositifs de mesure.

Pour ça on a une mesure de ce que l'on ne sait pas mesurer. Et la mesure retourne de manière invariante une constante. La constante de Planck qui nous détermine le budget qu'il faut investir. Delta Énergie fois Delta temps inférieur à cette constante.

Vous avez vu c'est filou, c'est déterministiquement pas déterminé.

Pour une mesure ou je vais quasiment systématiquement terminé par une mesure de vitesse car les hommes sont plus obsédés par ce qui bouge que ce qui est statique je vais avoir deux budgets : celui d'être meilleur en mesure du temps OU de l'énergie.

Vous imaginez pas comme le GPS en jouant sur le budget synchronisation des horloges à la millisecondes a permis de faire de réseaux de vieux instruments dépassés des nouvelles merveilles.

Si l'Homme est la mesure de toute chose il doit intégrer qu'une priorité accordée à un domaine de la science ne doit pas être donné à l'infini, car une disruption issue du spatiale a condamné la compétitivité des gros phallus à décharge rapide de l'atomique bien coûteuse adoré de la physique spatiale. Maintenant qu'ils ont prouvé valoir quelque choses, ils ont en gagnant leur pari de l'utilité de leur science ont condamné leur science en la rendant peu rentable à la mesure.

Enfin, moi je dis ça, mais comme toute humain je me trompe peut-être dans mes ordres de grandeurs. C'est la base de la science, être bienveillant avec celui qui prend le risque de se tromper. Celui qui se trompe est corrigé ou appelé à s'expliquer, entre humains.

Il est évident que la science fana de regarder ce qui bouge et de mesurer à parier contre « la Nature » chaotique, a les instruments pour mettre l'homme au centre de toute chose. Même si on a pas d'outil de mesure très sensible à l'Humain (analogue de l'énergie) on est bon à mesurer vite des signaux de merde. On a des conceptions prouvées par la pratique de systèmes tolérants à l'erreur (où beaucoup d'instruments mentent) et où la quantité des systèmes qui s'exprime contribue plus substantiellement à l'augmentation de la précision de la mesure que la fiabilité/honnêteté absolue de chaques mesures.

Je pense qu'il y a encore sujet à explorer car je doute que si on pousse les échantillons réels à une certaine limite de bruits dans les tuyaux ça résiste.

Bref, on a intérêt à pouvoir impliquer en science, à la fois comme gens qui font la partie théorique barbante et font des confs d'égaux à égaux (mais c'est rasoir), mais aussi car avec des gens qui s'y connaissent un peu en radio fréquences, en antennes, en télescopes et tu as une choses qui n'a pas de valeurs pour une science, c'est un moyen peu coûteux de diminuer des couteûx budget de campagnes de mesures.

La science moderne à l'époque des réseaux sociaux plutôt que de chouiner sur le passé devrait remettre l'Homme, le quidam, le pékin le vulgaire au centre de la mesure de toutes choses.

La diversité sociale en science et son ouverture aux non diplômés n'est pas une menace, mais une opportunité d'étendre par la diminution de budgets de mesures et de leur vérifications.

Le scientifique dont la marotte est la mesure des évolutions bénéfiques à minima à sa pomme, est peu crédible quand il ignore quelque chose qui au contraire de rabaisser sa place dans la société verrait augmenter sa valeur en pouvant poutrer des gros équipement en faisant du crowd-science : en distribuant des protocoles expérimentaux simple à répéter pour augmenter les résolutions de campagnes coûteuses. En se plaçant en intermédiaire inévitable dans la mesure distribuée entre les théoriciens, et les opérateurs, on crée un nouveau métier de crowd scientist. quelqu'un qui fait l'interface avec des férus d'un domaine pour permettre à chaque fans de participer à élaborer et opérer les dispositifs expérimentaux accessibles à leurs budget.

Comme un community manager, non pas en mode pète moi le clash entre 2 inconnus dont tu te tamponnes, mais plus l'ado avec son bafa qui encadre les enfants pour leur faire faire des trucs rigolos ensemble.
Un peu un scoutisme scientifiques, des colonies de vacances méso-virtuelles à qui confier son geek, nerd, passionné, fana (et n'oubliez pas les versions féminines tout aussi casse couille qui au danger mortel des explosions que les males préfèrent (haute énergie+grande vitesse) qui elles sont attirés par toutes ce que la biochimie et la chimie orga ont pu générer de molécules qui peuvent tuer : les parfums, la biologie, les fleurs (c'est souvent des poisons les fleurs, hein?)) ... qui apaiserait les foyers.

Une science qui veut dominer son époque doit embrasser les effets de réseaux qui apportent en eux l'intégration et la valorisation de l'Humain comme fondement d'une science bien gérée accessible à tous et qui priorise son budget à ce qui lui est accessible. Une science où la participation se voit dans les marges d'incertitudes qui baissent dans les mesures. Une science qui devient de plus en plus crédible dans sa parole que ses résultats s'améliore et que les gens la mette à l'épreuve dans leur quotidien.

Vu la floppée d'instruments de mesures de haute précision qu'un téléphone portable renferme qui auraient coûtés des millions il y a encore 30 ans, j'aimerais comprendre comment la science justifie de renfermer encore plus le cercle de ceux qui peuvent y contribuer par la répétition de mesures ?

En plus on est peut être pas diplômés en science du BON diplôme pour chercher, mais, on a fait entre 50 et 90% du cursus avec vous. On sait lire, écrire et faire 90% du boulot duquel vous prétendez déternir un savoir et une autorité exclusive...

Vous savez, genre, y'a pas besoin d'avoir fait polytechnique pour mettre un échantillon dans une boître de Petri, maniper en environnement stérile et mettre la boîte dans le frigo 12h et compter les colonies bactériennes sélectionnées.

Pour faire une campagne de résistance aux anti-biotiques ça pourrait rendre 20% de la population à même d'acheter leur propre matos (un microscope à 30€, des boîtes de Petri, de l'agaragar, solution antibiotiques/glucose dosée) et faire les mesures..

Pour remettre l'Humain au cœur de la science, il faudrait peut être qu'à l'image de la sécurité civile, et de ses pompiers respectés de tous, ils intégrent plus de citoyens volontaires à même de contribuer à la science dans sa pratique. Que le citoyen indépendant des titres scientifiques soit à la fois le garant de l'honnêteté de la mesure scientifique, et l'acteur qui l'élabore et la développe en gardant l'intégral droit à disposer de ses créations.

La chafouin y voit de la corruption d'une partie de la population, moi j'y vois la juste rétribution à la vulgate des fruits de son labeurs. Si je conçois un outil pour mesurer un sujet de pointe, j'ai aussi un outil de pointe pour manufacturer les futurs hits que le progrès prépare.

Je ne réclame pas les droits exclusifs, mais le partage des droits car c'est la manière la plus simple d'obtenir ce qui m'est cher, non pas être le propriétaire de l'invention, mais qu'aucun proprio que la justice a tendance à favoriser ne viennent clamer et prétendre à l'exclusivité pour lui le plus fort de ce que j'ai sué à élaborer.

Il me semblerait sain, de réenraciner la science qui est dans sa tour d'ivoire toute pourrie dans le monde du vivant. L'ivoire c'est une dent de cadavre qui n'a plus de racines. Ce qu'il faut à la science, c'est d'être plus organique, biologique, élaborée par une base sociale plus inclusive. Plus la science se referme dans ses universités et meurt de sa mort par milles citations académiques ... plus elle donne l'impression d'être pareille à la rose qui se fâne. Qui se décâtit qui n'est pas un domaine attirant. Et c'est dommage, car la science, c'est plus fun quand on le fait ensemble.

L'état est par construction anti-démocratique.

L'État c'est la certitude, la démocratie un doute permanent.

L'état dans son nom et sa mission d'assurer une stabilité sociale en organisant la continuité non violente des communautés. Elle s'oppose (et j'y ahdère) à éviter le conflit, et la disruption violente. Le problème c'est que son opposition extrême au conflit peut justement amener à l'anti-démocratisme. L'état a non le monopole de la violence, il a surtout la violence de pouvoir normer ce que l'on appelle violence ou pas.

Depuis Athènes, l'Homme politique n'a pas beaucoup évolué. L'état luttait contre toute réforme visant à la démocratie. Les arguments des sophistes (pro-démocratie) contre les pro-états (philosophes) tenaient dans l'arbitrage de décision. La mesure de toute chose doit-t'elle être l'Homme faillible qu'est le citoyen réel (protagoras), ou l'idéal (Platon) ?

La question décide de savoir si quand la chose publique (qu'on appelle état, ville, république démocratie) ARBITRE en faveur de 2 parties elle est biaisée ou pas ?

La démocratie dans l'esprit Athénien n'est pas celle de l'immobile, mais bien de pouvoir à chaque ARBITRAGE polémiquer (dans le sens de pouvoir défendre sa cause) sur le caractère démocratique.

Le sophisme haï des philosophes revendique le droit pour tous de venir contester auprès des agoras (on dirait agent publique/administration/juge/parlement) sans distinction de naissance (esclaves, méthèques citoyen), sans distinction dans la prise de parole entre les bègues et ceux qui ont eu « une éducation », sans dictinction de classes sociales (entre aristocrates, philosophes, riches ou pauvre.

Genre le sophiste, le démocrate, c'est la définition même du métier d'avocat.

D'ailleurs c'est ce que reproche Platon aux sophistes : d'être des traîtres de classes éduqués, des mercenaires.

Les sophistes et démocrates étaient suspects -à raison- de plaider pour plus de démocratie afin de vendre l'idée de payer des gens éduqués proche des responsables des discriminations pour porter ta cause en place publique.

Genre, un démocrate/sophiste athénien, c'est un pur produit de l'aristocratie athénienne éduquée qui s'enrichit du système de discrimination par la pratique de défendre devant la justice de l'époque les discriminés. Et que vu qu'ils s'enrichissaient, a priori, au fur et à mesure de l'appauvrissement des riches qu'ils critiquent, des pauvres qu'ils défendent, il y a vait des sérieuses questions à se poser sur les démocrates.

Et Platon de retourner le poison démocrate (leur pamphlet marketing pour extirper de la prestation de représentation du discriminer à l'agora pour plaider la discrimination) dans le cœur des sophistes.

Hey, vous les sophistes et démocrates qui vous enrichissez en prétendant vous battre pour la démocratie, il n'y aurait pas une contradiction entre vos actes et vos paroles ?

Et là, moi je dis masterclass headshot de Platon/Socrates sur les social justice warrior (ou parti de gauches dans les années 90, et pourtant je reste démocrate avec le même sens que les sophistes, et j'insiste sur l'ironie de Socrates plaidant la cohérence et la logique alors qu'il est lui même une Gatling à arguments fallacieux. La Socrates non plus est pas très cohérent entre ses mots (il faut être logique et s'appuyer sur le réel) et son comportement habituel en tribune (désinformer au nom de ses idéaux pétés du cul (incluant la misoginye) en niant volontairement la pertinence du factuel).

Les philosophes et sophistes sont un peu le point noir au milieu du blanc (Ying) et blanc au milieu du Yang (c'est de la récursion). Les philosophes (*réels* de l'époque) et les démocrates rééls qui se bastonnait DANS les camps qu'ils prétendaient être la petite touche de l'autre. Un peu la constance de la corruptions des défenseurs d'une cause.

Le philosophe profite de la contestation démocratique pour pervertir un bon système à son avantage, de même que le sophiste. Et c'est peut être parce que le débat sophiste/philosophe a pris toute la scène que la démocratie athénienne est devenu un état impérialiste violent qui faisait passer Spartes pour des défenseurs de la paix dans le monde et des bisous entre voisins.

Si Spartes avait été un gars de banlieue, son casier judiciaire pour violence extrême, prostitution, esclavagisme, extorsion, viol, vol en bande organisé serait établi, et aucun daron ne le laisserait dormir dans le lit de sa fille sans surveillance sans une bonne raison. Les démocraties réelles de l'époque ont du s'allier à Spartes pour se défendre la cité auto-proclamée la plus démocratique de grèce mettant en avant la qualité de débat philosphes sophistes en haut de leur catalogue produit : « démocratie/République Ayez un état au poil plus brillant en employant les goods cops/bad cops du débat bi-partisan démocratie/république, mais aussi droite/gauche. Notre cabinet de Conseil Socrates et Protagoras vous mettent à disposition les meilleurs tribuns athéniens qui moyennant un peu de richesse pour former vos experts défendrons l'amélioration du système.

L'idiot prend parti soit pour la République ou la démocratie, le démocrate prend part à reconnaître dans le débat démocratie/République un bon débat mais dont les bases DOIVENT être questionnées en permanence.

L'erreur n'est ni la démocratie, ni la République, ni le changement, ni l'immobilisme, ni bien ni mal. Mais si quelque chose ne marche pas il faut admettre que ça marche pas. Laisser les gens éduqués décider de l'amélioration de la chose Publique pour un mieux être (soit républicain de prospérité conservatrice, soit démocrate de réforme égalitaires) n'a jamais marché.

Les gens éduqués sont les Hooligans de l'arbitrage des opinions. Les seuls admis à critiquer les opinions, les choses, avoir un avis, proposer des solutions c'est eux. Et pas de bienveillance envers celui qui pense différemment. Ce sont des experts des idéaux seuls « légitimes » à discuter des idéaux qui nécessitent de l'éducation subventionnée qu'ils ont eu, et dont ils élabore les subventions (Platon avait une académie à former des gens à sa pensée pour organiser les cités, il avait inventé l'ENA/scPo privée).

Comme on dit en France d'aujourd'hui, droite ou gauche peu importe, que l'un ou l'autre dirige ça devient de pire en pire sans changement, c'est toujours les mêmes qui dirigent et débattent.

Et pour se foutre la gueule des démocrates de Pacotilles (dont la gauche) qui parlent d'égalité d'accès aux tribunes aux Républicains de pacotille qui clame qu'il faut trier et priviligié celui qui est BIEN éduqué pour avoir un système vertueux qui s'améliore, ils ont TOUS tiré avantage des défauts évidents de leurs litotes manichéennes.

L'idiot peut définir la démocratie et n'a aucun doute, le démocrate refuse d'accepter une quelconque sélection basée sur l'expertise dans un débat par des gens qui s'enrichissent de la discrimination CROISSANTE de l'accès à l'expertise. Je suis certain de ne pas vivre en démocratie, parce que même si j'ignore la définition exacte de démocratie, je suis CERTAIN que ce n'est pas démocratique d'exclure par une sélection sur l'éducation, une distinction de classe sociale.... une majorité CROISSANTE de gens qui s'appauvrissent. Je ne sais pas ou est ce qui est immobile (l'état par essence), par contre je vois clairement que les calculs sont pas bons et qu'on se dirige dans la mauvaise direction.

Je ne vais pas rentrer dans le débat philosophe/sophiste, République démocrate tel qu'il est posé actuellement, car ce débat figé, non de par son sujet, mais par tout les marchands du temple de la gloire publique (sport, TV, politique) qui prône leur lubie comme « amélioration exclusive de la société » et qui alterne exclusivement à la direction du changement nous emmènent quelque soit leurs oppositions bien argumentées de façade droit vers le mur pendant que leurs fouilles se remplissent.

C'est un biais systémique qui empêche quoi que ce soit de changer en bien. Nous devons douter de tout les experts, et les experts feraient moins peur si on les entendait douter publiquement de leur expertise et exposer qu'ils profitent de l'empiration de la situation.

Un débat d'expert/opinion dans un contexte qui empire est rationnellement systématiquement un débat entres pourris dont il faut logiquement ignorer les polémiques. Si le monde s'améliorait, je changerais d'opinion sur la nécessité d'arrêter de trier la distinction de classe sociale pour l'accès au débat/pouvoir, je ne sais pas si la distinction sociale est une mauvaise idée dans l'absolu idéal, je constate dans la pratique notre sélection sociale est cassée.

Quand on sélectionne de plus en plus sur l'éducation intélectuelle et que la situation empire, c'est un peu le signe que quelque soit le critère de sélection, il faut cracher sur les gens éduqués non sur les pompes pour les cirer, mais bien directement dans la face.

L'état quand il désigne une chose qui empire son convertisme alors que la situation empire est anti démocratique. Si il réformait alors que la situation est tout à fait acceptable, il serait aussi anti-démocratique. Quand l'état qu'il se réforme ou qu'il conserve garde constant l'aggravation de la situation, ce n'est pas un état, c'est du crime organisé.