moved files

This commit is contained in:
Yann Esposito (Yogsototh) 2021-09-15 09:12:29 +02:00
parent cf5dd888c8
commit d641cd04d9
Signed by untrusted user who does not match committer: yogsototh
GPG key ID: 7B19A4C650D59646
633 changed files with 14435 additions and 3 deletions

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,14 @@
:PROPERTIES:
:ID: 4527ef88-68b4-4aef-882f-498ffc42e221
:END:
#+TITLE: Starting with org roam
#+AUTHOR: Yann Esposito
- tags :: [[id:a2225047-7563-4e4e-a031-7f69e060de6b][learning]] [[id:5579f7b0-3b00-4751-9211-9b9381481954][org-mode]] [[id:1a12a62f-f96f-48de-b634-bd548654c238][roam]]
- source :: [[https://blog.jethro.dev/posts/how_to_take_smart_notes_org/][How To Take Smart Notes With Org-mode (14 Feb 2020)]]
The workflow looks like.
1. Toggle show org-roam backlinks (SPC orr)
2. org-roam-find-file (SPC orf)
3. org-roam-insert (SPC ori)

View file

@ -0,0 +1,22 @@
:PROPERTIES:
:ID: 4d57b529-9ca8-4c6e-82e0-9f9c987ce2e8
:END:
#+TITLE: Test org-roam-templates
#+Author: Yann Esposito
tags :: [[id:1a12a62f-f96f-48de-b634-bd548654c238][roam]] [[id:5579f7b0-3b00-4751-9211-9b9381481954][org-mode]] [[id:e0d4b962-b16e-499e-9c69-bdb196793e68][org-roam]] [[id:5e257538-beca-40de-8b8f-0733d241c96a][zettelkasten]]
https://github.com/org-roam/org-roam/blob/master/org-roam-capture.el#L82
I've been wondering how to make =org-roam= use the templates.
Just needed to do that.
#+begin_src elisp
(setq org-roam-capture-templates
'(("d" "default" plain (function org-roam--capture-get-point)
"%?"
:file-name "%(format-time-string \"%Y-%m-%d--%H-%M-%SZ--${slug}\" (current-time) t)"
:head "#+TITLE: ${title}\n#+Author: Yann Esposito\n\ntags ::\nsource ::\n"
:unnarrowed t)))
#+end_src

View file

@ -0,0 +1,9 @@
:PROPERTIES:
:ID: c861572c-ae30-427c-b366-5ecd0a1e3b6c
:END:
#+TITLE: sens-de-vie
#+Author: Yann Esposito
tags ::
source ::

View file

@ -0,0 +1,9 @@
:PROPERTIES:
:ID: 94844c4b-c906-47e6-abaf-91f6685ef4f6
:END:
#+TITLE: AI
#+Author: Yann Esposito
tags ::
source ::

View file

@ -0,0 +1,9 @@
:PROPERTIES:
:ID: 98c5f781-ba88-4eb6-a9d3-332abceca325
:END:
#+TITLE: AGI
#+Author: Yann Esposito
tags :: [[id:94844c4b-c906-47e6-abaf-91f6685ef4f6][AI]]
source ::

View file

@ -0,0 +1,9 @@
:PROPERTIES:
:ID: e459f88b-5f6d-4547-b6b2-08d4815c1ede
:END:
#+TITLE: emacs
#+Author: Yann Esposito
tags ::
source ::

View file

@ -0,0 +1,9 @@
:PROPERTIES:
:ID: d248036c-4117-4406-a230-030b4d2b0085
:END:
#+TITLE: tidal
#+Author: Yann Esposito
tags ::
source :: https://tidalcycles.org/index.php/Tutorial

View file

@ -0,0 +1,9 @@
:PROPERTIES:
:ID: e4875af3-946f-4d3e-a263-3cda0851ba1b
:END:
#+TITLE: discoverability
#+Author: Yann Esposito
tags ::
source ::

View file

@ -0,0 +1,70 @@
:PROPERTIES:
:ID: cde86e16-0c19-4537-b430-829d5eff9dcf
:END:
#+TITLE: Impots 2019
#+Author: Yann Esposito
tags :: [[id:7051b4a2-b42b-4d6f-abf6-2396b68dc5ed][impots]] [[id:36b59945-0f45-40fe-8ade-56d2f1a287db][2019]] [[id:cae62687-f643-4ca5-9ea0-a0fc7560ee6d][appartements]] [[id:075fb95e-8fe7-41a4-85d6-c63d432f6afc][actions]]
source :: https://www.impots.gouv.fr/portail/
* Déclaration
- numero fiscal: 1208764994115
** Revenus
- Y: 94853 (retenu 14673€)
- K: 15677 (retenu 68€)
** Foncier 2044
Etape 3; Selectionner:
- Revenus: Micro foncier
- Charges: Investissement locatif (...,Duflot,...)
C.f.:
[[./assets/declaration-2019-helper.png]]
- [[file:assets/esposito.pdf][Revenus Fonciers 2019]]
- [227]: Taxe Foncière (612) - Taxe ordure ménagères (122) = 490
*** DUFLOT (7FK)
- 3060€ dans la case 7FK (investissement Duflot 2014)
** DONE Dons [7UD] - 260
CLOSED: [2020-06-01 Mon 15:58]
| assoc | don |
|-------------------------------+-----|
| [[file:assets/Unicef_2019.HEIC][Unicef 2019]] | 140 |
| [[file:assets/Medecins_sans_frontieres_2019.pdf][Medecins Sans Frontieres 2019]] | 120 |
|-------------------------------+-----|
*** DONE [6RS] AXA Declaration Epargne Retraite: 0970808057
CLOSED: [2020-06-01 Mon 15:58] SCHEDULED: <2020-05-18 Mon>
- Case 6RS
- Via l'outil ESS Access *EN FRANCAIS*
#+DOWNLOADED: file:///Users/yaesposi/Library/Mobile%20Documents/iCloud~com~appsonthemove~beorg/Documents/org/journal/assets/impots2019/article-83-PreRetraite.pdf @ 2020-06-01 15:57:56
[[file:assets/Déclaration/2020-06-01_15-57-56_article-83-PreRetraite.pdf][article-83-pre-retraite]]
- AXA reinit mot de passe 0970808057
- https://ere.axa.fr
- Identifiant Internet: 70475738
- Votre entreprise : CISCO SYSTEMS France
- Votre numéro d'adhésion : 2722501130200/00888
- email: yann.esposito@gmail.com
*** DONE Actions ESPP/RSU
CLOSED: [2020-06-01 Mon 15:58] SCHEDULED: <2020-05-18 Mon>
#+DOWNLOADED: file:///Users/yaesposi/Library/Mobile%20Documents/iCloud~com~appsonthemove~beorg/Documents/org/journal/assets/2020-05-19_13-37-48_cisco_systems_france__-_pre__sentation_rsu-so_-_v.13.05.19.pdf @ 2020-05-30 10:32:44
[[file:assets/Déclaration/2020-05-30_10-32-44_2020-05-19_13-37-48_cisco_systems_france__-_pre__sentation_rsu-so_-_v.13.05.19.pdf][Presentation Actions Cisco]]

View file

@ -0,0 +1,9 @@
:PROPERTIES:
:ID: 7051b4a2-b42b-4d6f-abf6-2396b68dc5ed
:END:
#+TITLE: impots
#+Author: Yann Esposito
tags ::
source ::

View file

@ -0,0 +1,41 @@
:PROPERTIES:
:ID: 088d51ce-bf1e-4717-b3a6-f2dd6d445836
:END:
#+TITLE: Tidalcycles Resources
#+Author: Yann Esposito
tags :: [[id:d248036c-4117-4406-a230-030b4d2b0085][tidal]]
source ::
* MIDI
Video: [[file:assets/Tidal Acid Jam (MIDI test)--fpSKvxOA0k.mkv][Tidal Acid Jam (MIDI test)]] ; https://www.youtube.com/watch?v=-fpSKvxOA0k
Init MIDI
- https://www.youtube.com/watch?v=cdB0dBGiar4
- https://tidalcycles.org/index.php/SuperDirt_MIDI_Tutorial
* Chiptune like
https://www.youtube.com/watch?v=MbCNdB3hfpc&feature=youtu.be
#+begin_src tidal
import qualified Sound.Tidal.Chords as Chords
let mute = const silence
do
let arp = "[0 0 2 4]*2"
pat = "<0 2 5 4>"
oct = -2
d1 $ fast 2 $ stack [
n (toScale Chords.major (arp + pat) + 2*oct) # s "superchip" # release 0.075,
n ("0*8" + (slow 4 pat) - 14) # s "superchip" # release 0.3 # cut 2
] # orbit 1 # room 0.15 # size 0.93 # gain 0.9
d2 $ fast 2 $ stack [
"bd:10(3,8)",
s "~ sn" # n 3,
s "[~ cp:1]*2"
] # orbit 2 # room 0.05 # size 0.2
#+end_src

View file

@ -0,0 +1,9 @@
:PROPERTIES:
:ID: 36b59945-0f45-40fe-8ade-56d2f1a287db
:END:
#+TITLE: 2019
#+Author: Yann Esposito
tags ::
source ::

View file

@ -0,0 +1,9 @@
:PROPERTIES:
:ID: cae62687-f643-4ca5-9ea0-a0fc7560ee6d
:END:
#+TITLE: appartements
#+Author: Yann Esposito
tags ::
source ::

View file

@ -0,0 +1,9 @@
:PROPERTIES:
:ID: 075fb95e-8fe7-41a4-85d6-c63d432f6afc
:END:
#+TITLE: actions
#+Author: Yann Esposito
tags ::
source ::

View file

@ -0,0 +1,9 @@
:PROPERTIES:
:ID: 6889af65-5d2e-4ad7-9008-50e067580f68
:END:
#+TITLE: fp
#+Author: Yann Esposito
tags ::
source ::

View file

@ -0,0 +1,38 @@
:PROPERTIES:
:ID: fb82e84c-955c-4602-86f9-cbd40f5953db
:END:
#+TITLE: Marketin For Engineers
#+Author: Yann Esposito
tags :: [[id:47fcfc15-ce20-423d-ae07-1d5f89ae4fdc][startup]] [[id:6ed543d2-59f4-4f06-8728-a5763af5843d][marketing]]
source :: https://github.com/LisaDziuba/Marketing-for-Engineers
* Plan
- [[https://github.com/LisaDziuba/Marketing-for-Engineers/blob/master/README.md#-user-research][User Research]]
- [[https://github.com/LisaDziuba/Marketing-for-Engineers/blob/master/README.md#mag_right-market-research][Market Research]]
- [[https://github.com/LisaDziuba/Marketing-for-Engineers#triumph-marketing-without-budget][Marketing without Budget]]
- [[https://github.com/LisaDziuba/Marketing-for-Engineers#-content-marketing][Content Marketing]]
- [[https://github.com/LisaDziuba/Marketing-for-Engineers#sunglasses-personal-blog][Personal blog]]
- [[https://github.com/LisaDziuba/Marketing-for-Engineers#green_book-medium-marketing][Medium Marketing]]
- [[https://github.com/LisaDziuba/Marketing-for-Engineers#mega-promotion-of-your-content][Promotion of your content]]
- [[https://github.com/LisaDziuba/Marketing-for-Engineers#influencer-marketing][Influencer Marketing]]
- [[https://github.com/LisaDziuba/Marketing-for-Engineers#cat-marketing-for-product-hunt-launch][Marketing for Product Hunt Launch]]
- [[https://github.com/LisaDziuba/Marketing-for-Engineers#-social-media-marketing][Social Media Marketing]]
- [[https://github.com/LisaDziuba/Marketing-for-Engineers#-twitter][Twitter]]
- [[https://github.com/LisaDziuba/Marketing-for-Engineers#facebook][Facebook]]
- [[https://github.com/LisaDziuba/Marketing-for-Engineers#reddit][Reddit]]
- [[https://github.com/LisaDziuba/Marketing-for-Engineers#-linkedin][LinkedIn]]
- [[https://github.com/LisaDziuba/Marketing-for-Engineers#quora][Quora]]
- Instagram (coming soon)
- [[https://github.com/LisaDziuba/Marketing-for-Engineers#love_letter-lifecycle-email-marketing][Lifecycle Email Marketing]]
- [[https://github.com/LisaDziuba/Marketing-for-Engineers#fearful-cold-email-marketing][Cold Emails Marketing]]
- [[https://github.com/LisaDziuba/Marketing-for-Engineers#bowtie-building-partnerships][Building Partnerships]]
- [[https://github.com/LisaDziuba/Marketing-for-Engineers#%EF%B8%8F-psychology-in-marketing][Psychology in Marketing]]
- [[https://github.com/LisaDziuba/Marketing-for-Engineers/blob/master/README.md#moneybag-business-model-and-pricing][Business Model and Pricing]]
- [[https://github.com/LisaDziuba/Marketing-for-Engineers/blob/master/README.md#-marketing-automation][Marketing Automation]]
- [[https://github.com/LisaDziuba/Marketing-for-Engineers/blob/master/README.md#moving-to-saas-model][Moving to SaaS model]]
- [[https://github.com/LisaDziuba/Marketing-for-Engineers#other-useful-materials][Other Useful Materials]]
- [[https://github.com/LisaDziuba/Marketing-for-Engineers#-authors][Authors]]
- [[https://github.com/LisaDziuba/Marketing-for-Engineers#future-plans][Future Plans]]

View file

@ -0,0 +1,9 @@
:PROPERTIES:
:ID: 47fcfc15-ce20-423d-ae07-1d5f89ae4fdc
:END:
#+TITLE: startup
#+Author: Yann Esposito
tags ::
source ::

View file

@ -0,0 +1,9 @@
:PROPERTIES:
:ID: 6ed543d2-59f4-4f06-8728-a5763af5843d
:END:
#+TITLE: marketing
#+Author: Yann Esposito
tags :: [[id:47fcfc15-ce20-423d-ae07-1d5f89ae4fdc][startup]]
source ::

View file

@ -0,0 +1,9 @@
:PROPERTIES:
:ID: 6bcf15bd-0c37-4394-a0c0-3ba601332d22
:END:
#+TITLE: politic
#+Author: Yann Esposito
tags ::
source ::

View file

@ -0,0 +1,9 @@
:PROPERTIES:
:ID: e5676f7e-eb22-4ec5-ac6d-b73eee7a4996
:END:
#+TITLE: shake
#+Author: Yann Esposito
tags :: [[id:1243ac34-78e3-421a-968d-af8a0bbc01d3][build-system]]
source ::

View file

@ -0,0 +1,9 @@
:PROPERTIES:
:ID: 1243ac34-78e3-421a-968d-af8a0bbc01d3
:END:
#+TITLE: build-system
#+Author: Yann Esposito
tags :: [[id:e5676f7e-eb22-4ec5-ac6d-b73eee7a4996][shake]]
source ::

View file

@ -0,0 +1,9 @@
:PROPERTIES:
:ID: a6f5e6db-b44d-4715-afc2-58599a070b81
:END:
#+TITLE: idris
#+Author: Yann Esposito
tags :: [[id:155859f9-3f3c-4cea-bce4-70f24fca05fa][functional programming]]
source ::

View file

@ -0,0 +1,9 @@
:PROPERTIES:
:ID: 155859f9-3f3c-4cea-bce4-70f24fca05fa
:END:
#+TITLE: functional programming
#+Author: Yann Esposito
tags :: [[id:a6f5e6db-b44d-4715-afc2-58599a070b81][idris]] [[id:debfbdb6-03a6-478e-8316-bce0119c0dd7][clojure]] [[id:28b1b988-b2de-46aa-9a47-78a94aa5e2ce][haskell]]
source ::

View file

@ -0,0 +1,9 @@
:PROPERTIES:
:ID: debfbdb6-03a6-478e-8316-bce0119c0dd7
:END:
#+TITLE: clojure
#+Author: Yann Esposito
tags :: [[id:155859f9-3f3c-4cea-bce4-70f24fca05fa][functional programming]]
source ::

View file

@ -0,0 +1,9 @@
:PROPERTIES:
:ID: 28b1b988-b2de-46aa-9a47-78a94aa5e2ce
:END:
#+TITLE: haskell
#+Author: Yann Esposito
tags :: [[id:155859f9-3f3c-4cea-bce4-70f24fca05fa][functional programming]]
source ::

View file

@ -0,0 +1,15 @@
:PROPERTIES:
:ID: 0ffa6c7e-87c3-4cbc-8896-7208462f9268
:END:
#+TITLE: Idiomatic Clojure: Mixing Side Effects and Iteration
#+Author: Yann Esposito
tags :: [[id:debfbdb6-03a6-478e-8316-bce0119c0dd7][clojure]]
source :: [[https://bsless.github.io/side-effects/][Idiomatic Clojure: Mixing Side Effects and Iteration]]
Main lessons:
- Never use ~doall~
- use ~mapv~ or ~(into [] (map f) coll)~ if you want to retrieve the elements
- use ~(run! f coll)~ or ~doseq~

View file

@ -0,0 +1,10 @@
:PROPERTIES:
:ID: 986259da-53b4-4d02-a5fd-c19428bda5c2
:END:
#+TITLE: Evolving non-determinism
#+Author: Yann Esposito
tags :: [[id:28b1b988-b2de-46aa-9a47-78a94aa5e2ce][haskell]] [[id:155859f9-3f3c-4cea-bce4-70f24fca05fa][functional programming]]
source :: https://oleg.fi/gists/posts/2020-05-26-evolving-non-determinism.html
A nice article about evolving algorithms.

View file

@ -0,0 +1,13 @@
:PROPERTIES:
:ID: f78519b0-3e95-448e-821c-06ab969b5e26
:END:
#+TITLE: org-clone-subtree-with-time-shift
#+Author: Yann Esposito
tags :: [[id:5579f7b0-3b00-4751-9211-9b9381481954][org-mode]]
source :: https://karl-voit.at/2017/01/15/org-clone-subtree-with-time-shift/
Main lesson, use ~org-clone-subtree-with-time-shift~.
This will ask number of copies and the recurring date.
Just did that for drugs I need to take for only 6 days.

View file

@ -0,0 +1,17 @@
:PROPERTIES:
:ID: eece595d-9089-47bd-9393-08cd843826c4
:END:
#+TITLE: mail
#+Author: Yann Esposito
tags ::
source ::
Use gmi (gmailieer).
#+begin_src
cd ~/mail
mkdir yann.esposito.gmail
gmi pull
gmi sync
#+end_src

View file

@ -0,0 +1,33 @@
:PROPERTIES:
:ID: 87b3b7b5-abd0-4efc-9a70-6420a88c3cd5
:END:
#+TITLE: Haskell criticisms
#+Author: Yann Esposito
tags :: [[id:28b1b988-b2de-46aa-9a47-78a94aa5e2ce][haskell]]
source :: https://news.ycombinator.com/item?id=23364485
We dance around this issue in the comments to every Haskell story, but the
reason Haskell is hard to market is that it's bad.
It's a research language being shoehorned into production by a few people
who really love it.
Some details of this have been given in this thread; let me suggest the
following threads for more:
1) https://www.reddit.com/r/ocaml/comments/3ifwe9/what_are_ocamlers_critiques_of_haskell/cugohyn/
2) https://www.reddit.com/r/ocaml/comments/e7g4nb/haskell_vs_ocaml/fa4bnsw/
Yes, the Haskell community hates that guy and considers him a troll.
But he does functional programming professionally as part of a private
consultancy and wrote a book on OCaml.
If anyone's equipped to understand what's wrong with Haskell, it's him.
Haskell has had 30 years to get its act together.
Any benefits it has are drowned out by a sea of buggy tooling and
accidental complexity (monads, etc.).
Ask yourself this: if there are literally billions of dollars in industry
riding on writing efficient and correct software, and Haskell is such an
obvious productivity win, why does it have a market share that rounds to
zero?
Time to move on.

View file

@ -0,0 +1,17 @@
:PROPERTIES:
:ID: 02fadd2f-42db-41a5-b3c9-b60eb1c5928c
:END:
#+TITLE: Krystelle idées cadeaux
#+Author: Yann Esposito
#+Date: [2020-05-31 Sun]
tags :: [[id:c194cbc4-d92e-4b68-a371-1cb91803ab8f][family]]
source ::
Juste un endroit pour centraliser les idées potentielles.
Les thèmes:
- produits naturel
- zen
- jardinage, plantes
- thé

View file

@ -0,0 +1,9 @@
:PROPERTIES:
:ID: c194cbc4-d92e-4b68-a371-1cb91803ab8f
:END:
#+TITLE: family
#+Author: Yann Esposito
tags ::
source ::

View file

@ -0,0 +1,9 @@
:PROPERTIES:
:ID: 6e4c4d62-215d-4e0d-9361-0ff64af6f4a9
:END:
#+TITLE: nix
#+Author: Yann Esposito
#+Date: [2020-06-02]
tags ::
source ::

View file

@ -0,0 +1,9 @@
:PROPERTIES:
:ID: b052c72a-806f-44a6-ac5f-0b47eb216640
:END:
#+TITLE: geek
#+Author: Yann Esposito
#+Date: [2020-06-02]
tags ::
source ::

View file

@ -0,0 +1,9 @@
:PROPERTIES:
:ID: c7184c4b-9573-497b-a215-ba7e75a6326e
:END:
#+TITLE: testing
#+Author: Yann Esposito
#+Date: [2020-06-03]
tags :: [[id:bec11f07-ffed-487b-9059-bdf6696548ab][programming]]
source ::

View file

@ -0,0 +1,9 @@
:PROPERTIES:
:ID: bec11f07-ffed-487b-9059-bdf6696548ab
:END:
#+TITLE: programming
#+Author: Yann Esposito
#+Date: [2020-06-03]
tags ::
source ::

View file

@ -0,0 +1,70 @@
:PROPERTIES:
:ID: 6b88927e-90ab-44c3-ae86-169e7704c480
:END:
#+TITLE: Zettelkasten -- How One German Scholar Was So Freakishly Productive
#+Author: Yann Esposito
#+Date: [2020-06-05]
tags :: [[id:5579f7b0-3b00-4751-9211-9b9381481954][org-mode]] [[id:af26ee30-6392-40e3-bc26-a7e887947293][note taking]] [[id:e0d4b962-b16e-499e-9c69-bdb196793e68][org-roam]] [[id:5e257538-beca-40de-8b8f-0733d241c96a][zettelkasten]]
source :: https://writingcooperative.com/zettelkasten-how-one-german-scholar-was-so-freakishly-productive-997e4e0ca125
* The Zettelkasten principles
1. *The principle of atomicity*: The term was coined by Christian Tietze.
It means that each note should contain one idea and one idea only.
This makes it possible to link ideas with a laser focus.
2. *The principle of autonomy*: Each note should be autonomous, meaning it
should be self-contained and comprehensible on its own.
This allows notes to be moved, processed, separated, and concatenated
independently of its neighbors.
It also ensures that notes remain useful even if the original source of
information disappears.
3. *Always link your notes*: Whenever you add a note, make sure to link it to
already existing notes.
Avoid notes that are disconnected from other notes.
As Luhmann himself put it, “each note is just an element that derives its
quality from the network of links in the system.
A note that is not connected to the network will be lost, will be forgotten
by the Zettelkasten” (original in German).
4. *Explain why youre linking notes*: Whenever you are connecting two notes by
a link, make sure to briefly explain why you are linking them.
Otherwise, years down the road when you revisit your notes, you may have no
idea why you connected them.
5. *Use your own words*: Dont copy and paste.
If you come across an interesting idea and want to add it to your
Zettelkasten, you must express that idea with your own words, in a way that
youll be sure to understand years later.
Dont turn your Zettelkasten into a dump of copy-and-pasted information.
6. *Keep references*: Always add references to your notes so that you know where
you got an idea from.
This prevents plagiarism and makes it easy for you to revisit the original
source later on.
7. *Add your own thoughts to the Zettelkasten*: If you have thoughts of your
own, add them to the Zettelkasten as notes while keeping in mind the
principle of atomicity, autonomy, and the need for linking.
8. *Dont worry about structure*: Dont worry about putting notes in neat
folders or into unique preconceived categories.
As Schmidt put it, in a Zettelkasten “there are no privileged positions”
and “there is no top and no bottom.”
The organization develops organically.
9. *Add connection notes*: As you begin to see connections among seemingly
random notes, create connection notes, that is, specific notes whose
purpose is to link together other notes and explain their relationship.
10. *Add outline notes*: As ideas begin to coalesce into themes, create outline
notes.
An outline note is a note that simply contains a sequence of links to other
notes, putting those other notes into a particular order to create a story,
narrative, or argument.
11. *Never delete*: Dont delete old notes.
Instead, link to new notes that explain whats wrong with the old ones.
In that way, your Zettelkasten will reflect how your thinking has evolved
over time, which will prevent hindsight bias.
Moreover, if you dont delete, you might revisit old ideas that may turn
out to be correct after all.
12. *Add notes without fear*: You can never have too much information in your
Zettelkasten.
At worst, youll add notes that wont be of immediate use.
But adding more notes will never break your Zettelkasten or interfere with
its proper operation.
Remember, Luhmann had 90,000 notes in his Zettelkasten!

View file

@ -0,0 +1,9 @@
:PROPERTIES:
:ID: af26ee30-6392-40e3-bc26-a7e887947293
:END:
#+TITLE: note taking
#+Author: Yann Esposito
#+Date: [2020-06-05]
tags :: [[id:5579f7b0-3b00-4751-9211-9b9381481954][org-mode]]
source ::

View file

@ -0,0 +1,9 @@
:PROPERTIES:
:ID: e0d4b962-b16e-499e-9c69-bdb196793e68
:END:
#+TITLE: org-roam
#+Author: Yann Esposito
#+Date: [2020-06-05]
tags :: [[id:5579f7b0-3b00-4751-9211-9b9381481954][org-mode]] [[id:af26ee30-6392-40e3-bc26-a7e887947293][note taking]] [[id:5e257538-beca-40de-8b8f-0733d241c96a][zettelkasten]] [[id:1a12a62f-f96f-48de-b634-bd548654c238][roam]]
source :: https://github.com/org-roam/org-roam

View file

@ -0,0 +1,9 @@
:PROPERTIES:
:ID: 5e257538-beca-40de-8b8f-0733d241c96a
:END:
#+TITLE: zettelkasten
#+Author: Yann Esposito
#+Date: [2020-06-05]
tags :: [[id:af26ee30-6392-40e3-bc26-a7e887947293][note taking]]
source :: https://writingcooperative.com/zettelkasten-how-one-german-scholar-was-so-freakishly-productive-997e4e0ca125

View file

@ -0,0 +1,9 @@
:PROPERTIES:
:ID: 474d7fcb-1ed6-4e89-91cc-bf9273b7f1bd
:END:
#+TITLE: opinion
#+Author: Yann Esposito
#+Date: [2020-06-11]
tags ::
source ::

View file

@ -0,0 +1,9 @@
:PROPERTIES:
:ID: 92d5ea2a-7604-4fe0-81b5-ac019a0b350e
:END:
#+TITLE: social-media
#+Author: Yann Esposito
#+Date: [2020-06-11]
tags :: [[id:fee88808-d9a1-4a80-abfc-3222bf0d3bd8][internet]]
source ::

View file

@ -0,0 +1,9 @@
:PROPERTIES:
:ID: fee88808-d9a1-4a80-abfc-3222bf0d3bd8
:END:
#+TITLE: internet
#+Author: Yann Esposito
#+Date: [2020-06-11]
tags ::
source ::

View file

@ -0,0 +1,46 @@
:PROPERTIES:
:ID: 4a838201-9b9c-44e6-aec8-017663363627
:END:
#+TITLE: Why no defmethod?
#+Author: Yann Esposito
#+Date: [2020-06-12]
tags :: [[id:debfbdb6-03a6-478e-8316-bce0119c0dd7][clojure]] [[id:155859f9-3f3c-4cea-bce4-70f24fca05fa][functional programming]]
source ::
The main reason is that it is harder to reason about in our environment.
~defmethod~ is exactly like a ~cond~ or ~case~ but potentially distributed
between multiple files.
So:
#+begin_src clojure
(ns foo.bar
(:require [baz]))
...300 lines of code...
(foo :x) => "NICE X"
#+end_src
And after a few weeks someone add a require:
#+begin_src clojure
(ns foo.bar
(:require [[baz]
[pownd.core]]))
...300 lines of code...
(foo :x) => "PWND!!!!"
#+end_src
So ~defmethod~ is harder to reason about because the logic is distributed.
And as a developer it is harder to reason statically about the code.
Still, this could totally be fine for clojure libraries doing "magic" stuff.
There is a big difference between the code aimed for a production
environment /application/ written by a team and a codebase for a /library/.
So "never use defmethod" is a way of saying that it is only allowed if you
really tried your best not to use it but this does not make sense, and you
can show why to the rest of the team.

View file

@ -0,0 +1,18 @@
:PROPERTIES:
:ID: 450946b7-8a6b-43d1-b330-95f3a6735bba
:END:
#+TITLE: The performance of ghcied 0.2.0
#+Author: Yann Esposito
#+Date: [2020-06-13]
tags :: [[id:28b1b988-b2de-46aa-9a47-78a94aa5e2ce][haskell]] [[id:03a8f444-b907-447c-9554-fc97d49336df][benchmarks]]
source :: https://mpickering.github.io/ide/posts/2020-06-12-performance-of-ghcide-020.html
* Benchmarks
Benchmarks should focus on both performance and space usage to prevent
introducing space leaks.
Benchmarks made using a shake script: https://github.com/digital-asset/ghcide/pull/629
Before the benchmarks some improvement weren't obvious.

View file

@ -0,0 +1,9 @@
:PROPERTIES:
:ID: 03a8f444-b907-447c-9554-fc97d49336df
:END:
#+TITLE: benchmarks
#+Author: Yann Esposito
#+Date: [2020-06-13]
tags :: [[id:bec11f07-ffed-487b-9059-bdf6696548ab][programming]]
source ::

View file

@ -0,0 +1,13 @@
:PROPERTIES:
:ID: 8d0da915-6bf2-45e7-9c44-a3f9e6ad9288
:END:
#+TITLE: Gabriel Gonzalez - A bare-bones Twitter clone implemented with Haskell + Nix @ ZuriHac 2020
#+Author: Yann Esposito
#+Date: [2020-06-13]
tags :: [[id:28b1b988-b2de-46aa-9a47-78a94aa5e2ce][haskell]] [[id:da7e2db9-fa16-436b-a99a-c5b020acfc85][zurihac]]
source :: https://www.youtube.com/watch?v=Q3qjTVcU9cg&list=PLiU7KJ5_df6aZbNfh_TUJt-6w9N3rYkTX&index=2&t=0s
Introduction by Jasper to Gabriel (dhall, etc...)
The implementaiton is here: https://github.com/Gabriel439/simple-twitter

View file

@ -0,0 +1,11 @@
:PROPERTIES:
:ID: da7e2db9-fa16-436b-a99a-c5b020acfc85
:END:
#+TITLE: zurihac
#+Author: Yann Esposito
#+Date: [2020-06-13]
tags :: [[id:28b1b988-b2de-46aa-9a47-78a94aa5e2ce][haskell]] [[id:155859f9-3f3c-4cea-bce4-70f24fca05fa][functional programming]]
source :: https://zfoh.ch/zurihac2020/
- https://www.youtube.com/playlist?list=PLiU7KJ5_df6aZbNfh_TUJt-6w9N3rYkTX

View file

@ -0,0 +1,13 @@
:PROPERTIES:
:ID: 38d2b532-6453-49b6-b668-36ca38a376b0
:END:
#+TITLE: Datatype-Generic Programming - Andre Loh @Zurihac 2020
#+Author: Yann Esposito
#+Date: [2020-06-13]
tags :: [[id:28b1b988-b2de-46aa-9a47-78a94aa5e2ce][haskell]] [[id:da7e2db9-fa16-436b-a99a-c5b020acfc85][zurihac]]
source :: https://www.youtube.com/watch?v=pwnrfREbhWY
Inlining Trees via subset of template haskell.
https://github.com/well-typed/gp-zurihac-2020

View file

@ -0,0 +1,9 @@
:PROPERTIES:
:ID: 1b212806-1cc4-4881-ab7c-688568474e20
:END:
#+TITLE: philo
#+Author: Yann Esposito
#+Date: [2020-06-18]
tags ::
source ::

View file

@ -0,0 +1,9 @@
:PROPERTIES:
:ID: 42ebaac6-b37b-4680-a06b-dc7e0b7ad066
:END:
#+TITLE: philo
#+Author: Yann Esposito
#+Date: [2020-06-18]
tags ::
source ::

View file

@ -0,0 +1,9 @@
:PROPERTIES:
:ID: 6abfc7b7-2bef-45bc-a35e-b0b43e45492d
:END:
#+TITLE: stress
#+Author: Yann Esposito
#+Date: [2020-07-01]
tags :: [[id:ddb5dbe8-64cb-44d6-9149-6740d30635a3][psychology]]
source ::

View file

@ -0,0 +1,9 @@
:PROPERTIES:
:ID: ddb5dbe8-64cb-44d6-9149-6740d30635a3
:END:
#+TITLE: psychology
#+Author: Yann Esposito
#+Date: [2020-07-01]
tags ::
source ::

View file

@ -0,0 +1,9 @@
:PROPERTIES:
:ID: 1ea3c870-142b-4289-bb56-5c7f5b14ea75
:END:
#+TITLE: macos
#+Author: Yann Esposito
#+Date: [2020-07-02]
tags ::
source ::

View file

@ -0,0 +1,11 @@
:PROPERTIES:
:ID: 7a8d9311-592d-4c20-a841-82fc72a032c6
:END:
#+TITLE: David Lynch explains Transcendantal Meditation
#+Author: Yann Esposito
#+Date: [2020-08-16]
tags :: [[id:083bf71c-44d0-465a-b74d-6bb3691f9c81][meditation]]
source :: https://youtu.be/Em3XplqnoF4

View file

@ -0,0 +1,9 @@
:PROPERTIES:
:ID: 083bf71c-44d0-465a-b74d-6bb3691f9c81
:END:
#+TITLE: meditation
#+Author: Yann Esposito
#+Date: [2020-08-16]
tags ::
source ::

View file

@ -0,0 +1,144 @@
:PROPERTIES:
:ID: ba399c55-5ea5-4b58-a605-574fd2f2f18d
:END:
#+TITLE: cistercien
#+Author: Yann Esposito
#+Date: [2020-08-24]
tags :: [[id:c245de18-fbc3-40c8-88c7-21e7636768fc][histoire]]
source :: https://fr.wikipedia.org/wiki/Ordre_cistercien
en latin: Ordo cisterciensis
Restauration de la règle bénédictine.
- ascétisme
- rigueur liturgique
- travail comme valeur cardinale
* Naissance et expansion de l'ordre
Poussé par Bernard de Clairvaux (1090-1153).
Il est le maître spirituel des cisterciens.
Inclination pour la solitude et la méditation.
Formé au combat, il préfère devenir moine.
Persuasif et charismatique.
Il accable les autres ordres et les clercs et prélats qui succombent aux
richesses.
Il n'hésite pas de ruse, mauvaise foi ou injure pour abatre son adversaire.
Cependant il ne s'est jamais mis Rome à dos.
Il accélère les fondations de nouvelles abbayes durant sa vie.
- 762 monastères.
- 341 maisons dont 80 "filles" directes.
* Règle bénédictine
Syntèse entre exigences contraires:
- indépendance économique
- activité liturgique
- activité apostolique
- refus du monde
La règle:
- stricte observance de la règle bénédictine
- recherche de l'isolement
- pauvreté intégrale
- refus des bénéfices ecclésiastiques
- travail manuel
- autarcie
Équilibre: ascèse et goût de la culture.
Exemption de juridiction épiscopale permet de mettre deux institutions:
- visites des abbés-pères
- chapitre général annuel
Le père de l'abbaye mère descend et controle ce que fait l'abbaye fille.
Pouvoir de révoquer le responsable et de le remplacer.
Une fois par an.
* Les Abbayes
Une abbaye mère qui fait des filles.
L'abbaye envoie des moines qui vont faire une autre abbaye.
Chaque abbaye est autonome, cachée, et concentrée sur leur mission.
Les abbayes sont cachées et pas faites pour être des lieux d'accueil ou des
lieux de cultes publics.
Ce sont des lieux reclus, isolés, pour laisser les moines se concentrer sur
leur mission.
Charte de charité postérieure (leur constitution)
Cîteau reste l'autorité spirituelle gardienne de l'observance de la sainte règle.
Chaque monastère doit secours aux fondations les plus démunies.
Les abbayes mères assurant le contrôle et l'élection des abbés au sein des
abbayes filles.
Chaque abbé doit se rendre à Citeau opur le Chapitre général.
* Difficultés de l'ordre
L'ordre devient populaire et reçoit des dons.
Le dévelopement économmique est peu compatible avec la vocation initialie
de pauvreté qui a fait le succès de l'ordre.
Guerres, changements des temps, immision de la papauté.
En 1422, reforme de l'ordre pour retrouver les principes fondamentaux.
Réafirmation des exigences et de la discipline.
* Vie dans le monastère
- Silence, obéissance, frugalité
- communication non verbales, un langage par signes.
Règle du silence pour ne pas être détourné de Dieu, mais les travaux
quotidiens exigent qu'ils puissent communiquer.
** Groupes
- les moines (frères clercs) qui savent lire le latin.
- les moins "laïcs", qui ne savent pas lire
- les convers, ne font pas vœux religieux, portent la barbe (travailleurs)
- les novices
- les infirmes (un des 4 groupes, mais ne participent pas à tout)
- familiers attachés au monastère
1 an de noviciat, les novices sont initiés.
S'ils le demandent et que la commmunauté accepte, ils sont admis à la "profession".
Certains frères avec des responsabilités particulières:
- tenue du chapitre, administration
** Prières
durées en fonction de l'heure du lever du soleil et du coucher du soleil
(pas d'horloge classique).
- 2h du matin (1h le dimanche)
- 5h30
- 7h00
- dimanche 9h30
- 13h30
- 15h00
- 19h00
** Repas
- 2 repas de pâques au 13 septembre (11h30, 19h)
- 1 repas sinon (15h, ou 17/18h carême)
** Travail
- travail dans les champs dans la mesure ou celà n'entrave pas les prières.
7h de travail par jour.
* Ordre moteur des évolutions techniques
- techniques de culture
- techniques de constructions
- génie hydraulique, eau courante, moulin hydrolique

View file

@ -0,0 +1,9 @@
:PROPERTIES:
:ID: c245de18-fbc3-40c8-88c7-21e7636768fc
:END:
#+TITLE: histoire
#+Author: Yann Esposito
#+Date: [2020-08-24]
tags ::
source ::

View file

@ -0,0 +1,815 @@
:PROPERTIES:
:ID: 19f81781-c1e1-47bc-9d07-62f84e0b0b6a
:END:
#+TITLE: Ordre des Informaticiens
#+Author: Yann Esposito
#+Date: [2020-08-29]
- tags :: [[id:ba399c55-5ea5-4b58-a605-574fd2f2f18d][cistercien]] [[id:62c57354-72ed-4465-91b4-67c53defbd10][ordre]] [[id:1b212806-1cc4-4881-ab7c-688568474e20][philo]] [[id:eb806d6a-57ca-4aab-8987-820b139b2be6][society]]
- source ::
Bonjour,
Avant de commencer à entrer sur le vif du sujet.
Quelques précisions sur cet email.
J'ai envoyé ce mail à quelques destinataires choisi.
Seulement des personnes que j'apprécie et qui j'estime pourront en retour
apprécier cet email.
Il s'agit d'une longue lettre.
C'est un format inhabituel qui s'est perdu avec nos nouvelles habitudes de
consommations immédiates et courtes.
Je pense qu'il est grand temps de faire renaître ce type de communication
de fond.
Cette forme permet d'aborder des sujets de fond.
* Introduction
Bonjour à tous.
Cette année fût forte en rebondissements et nouvelles de toutes sortes.
Ce sont certainement les signes d'un changement profond de notre façon de
vivre qui se dessinent.
Personnellement, cette année m'a demandé un engagement dans mon travail
inhabituel.
Et donc pour la plupart d'entre vous je n'ai pas pu discuter autant que je
l'aurais aimé.
J'ai eu la chance de pouvoir prendre quatres semaines entières de congés.
Malgré ces vacances, je n'ai pas totalement pu récupérer de l'effet de ce
surplus de pression et de travail intense.
Par contre les vacances et le repos sont propices à la réflexion et c'est
pourquoi j'aimerai partager avec vous le fruit de mes quelques réflexions
d'été.
Comme je l'ai dis, j'étais assez épuisé nerveusement.
Je n'ai donc pas pu lire de livre de fond, ou « geeker » en explorant de
nouveaux outils, languages informatiques, etc...
Mais, je pense avoir une idée qui pourrait s'avérer intéressante.
Si on reste dans le milieu des « geeks », on voit toujours les mêmes
questions revenir.
Souvent un individu ou un groupe d'individus essaye de résoudre ces
problèmes d'une manière ou d'une autre.
Généralement avec une réponse technique.
Dans notre milieux c'est une erreur classique de répondre à un problème
humain par une solution technique.
Jusqu'ici, j'ai l'impression que les arguments tournent en rond.
Et que les solutions aussi reprennent de veilles idées qui ont échouées.
Alors quels sont ces problèmes:
** Reconnaissance de l'Informatique
Notre métier n'est pas reconnu à sa juste valeur.
Du moins en Europe.
Pour moi, l'informatique devrait être une /profession/ au sens
sociologique.
Aujourd'hui nous sommes de vulgaires ouvriers spécialisés.
La raison principale je pense c'est qu'on laisse l'informatique se réduire
à la programmation.
Hors l'informatique va beaucoup plus loin.
Elle s'immmisce dans énormément d'activités modernes.
Et cet état de fait n'est pas reconnu, ni visible par la culture Française
et par la classe politique.
Je dis Française, mais je pense c'est le cas dans le monde entier à
l'exception des USA où Barak Obama lors de son discours d'inoguration avait
un mot relatif à l'informatique et nouvelles techno pour tous les domaines
de l'État.
L'armée, la finance, la santé, l'éducation, etc...
De mon point de vue l'Informatique mérite une meilleure place dans nos
sociétés.
Un nouveau domaine de spécialité Humaine qui devient de plus en plus
indispensable à tous comme l'accès à l'eau potable ou à l'éducation.
** Mise à mal du progrès
C'est une réflexion que je partage souvent.
La différence fondamentale entre progrès et innovation.
Le progrès profite à toute l'humanité.
Comme la découvert d'un vaccin, d'un nouveau soin.
L'innovation se restreint à avoir de la plus value financière.
Et récemment il y a beaucoup d'innovations qui se soldent par une
régression au lieu d'un progrès pour le reste de l'Humanité.
J'espère encore que l'équilibre global reste positif.
Mais il est difficile d'en juger à cours terme.
Le fond de ce problème c'est qu'une très grande partie des cerveaux passe
sont temps sur du travail régressif.
Je pense à Google, FB, mais aussi une majorité des applis web, etc...
Il existe aussi un philosophe qui a évalué à plus de 80% la part des
informaticiens qui travaillent sur des "bullshit jobs".
Donc des domaine avec progrès nul ou négatif.
** Brigading
Par brigading j'entends les nouveaux mouvements de foules sur les réseaux
sociaux.
Parfois ses effets sont positifs, parfois négatifs mais assez souvent assez
hératiques avec un peu des deux cotés.
Précédemment il me semblait qu'il s'agissait d'un problème mineur.
Un problème aussi plutôt restreint au web.
Aujourd'hui le problème se répand tel un cancer social dans la vie réelle.
Il est presque impossible de parler de certains sujet sans voir apparaître
des intervenants contres productif à toute discussion appaisée sur le web.
Mais de plus en plus d'idées saugrenues font leur apparition lors des
diners de famille.
De plus il semble de plus en plus évident que l'influence sur les réseaux
sociaux est devenu plus qu'un business mais une arme internationale.
Même les petites communautés spécialisées comme Hacker News, Lobsters, ont
des agents qui perturbent les discussions.
Ces attaques d'argumentation ont un effet mécanique et efficace.
Le niveau d'intelligence semble diminuer avec chaque nouvelle réponse dans
un fil de discussion.
Ces problèmes ont toujours existé auparavant.
Mais je trouve que l'ampleur récente est nouvelle et inquiétante.
Il est aussi très important de remarquer que l'intelligence n'est en rien
un bouclier aussi efficace que l'on pourrait l'imaginer contre cest attaques.
Il faut faire preuve d'un apprentissage constant pour faire face aux
nouvelles techniques d'influences.
Beaucoup de nos proches et une grande partie de la population n'est
simplement pas armée pour faire face à ces attaques.
Le "brigading" renforce l'effet de stagnation en empêchant les idées de
s'élever.
** L'open source n'est pas rétribué à sa juste valeur
Les fondations de tous les systèmes informatiques mondiaux ne progressent
presque plus.
Les créateurs de logiciels libres ne sont pas rétribués pour le bien qu'il
produise.
C'est un problème qui me semble classique.
Le salaire ne correspond pas à l'utilité sociale des individus.
Je pense même que dans beaucoup de cas, et pour les informaticiens c'est
presque l'inverse.
* Ma petite expérience lors de mes vacances; les Cisterciens
Nous sommes allé avec Krystelle visiter l'Abbaye cistercienne du Thoronet.
La visite fut vraiment très agréable mais aussi inspirante.
Je vous la conseille.
Ce n'est pas relié avec le reste de ce mail mais le son de la chapelle est
unique.
Le seul autre batiment mondial qui le dépasse en terme de durée de
raisonnance est le Taj Mahal.
Tout d'abord, je n'étais pas familier des Cisterciens.
En quelques mots il s'agit d'un ordre catholique créé au début du XIIe
siècle qui voulait revenir à l'essentiel de la chrétienté.
L'ordre estime que les chrétiens se sont perdus avec l'accumulation de
richesses.
Très vite à l'aide de la force d'influence d'un seul moine de nombreuses
abbaye Cisctersciennes sont créées.
Attention, très vite ne signifie pas la même chose que pour nous.
Il faut aussi imaginer les différences de la relation au temps de l'époque.
Trois moines sont envoyés d'une autre abbaye « mère » dans la région du
Thoronet pour demander des terres au seigneur local.
Ces moines étaient des nobles avec de l'argent.
Le temps d'obtenir les terres, de trouver le meilleur lieu de construction
il faudra 20 ans avant de poser la première pierre de l'Abbaye.
Il faudra encore 20 ans pour finir la chappelle et encore 60 ans pour finir
l'Abbaye dans son entier.
Environ un siècle.
Pour son époque l'Abbaye est très en avance technologique.
Il y avait une fontaine avec l'eau courante au XIIe siècle.
Tout au long de son existence l'ordre à toujours été à la pointe de la
technologie.
Les moines étaient très instruits et ouverts d'esprit contrairemment à ce
que pourrait laissé penser leur mode de vie.
Les règles bénédictines sont très strictes.
Recherche de l'isolement, pauvreté intégrale, refus des bénéfices
ecclésiastiques, travail manuel, autarcie.
Ça ne rigolait pas.
Les cisterciens se méfient de la parole.
Tous les jours, ils se réunissent pour lire les règles bénédictines.
C'est le seul moment où la parole peut-être émise.
Avant de rentrer dans la sale, il y a des symboles qui rapellent que la
parole peut à la fois être utilisée pour le bien ou pour le mal.
Il convient donc de ne pas parler sans y avoir préalablement bien réfléchi.
Autre détail intéressant sur l'organisation sociale.
Tout devait être fait pour la méditation et le recueillement tout en ne
négligeant pas le travail manuel.
Mais certains métier étaient nécessaires.
Il y avait donc d'autres groupes d'individus qui sans être moines devaient
aussi respecter des règles de vie très strictes.
Il fallait un an de mise à l'épreuve avant d'être admis.
L'organisation de l'ordre est interressante aussi.
Pour éviter des prises de pouvoir qui iraient contre la vision de l'ordre.
Chaque année le moine principal d'une abbaye mère descend pour vérifier les
comptes, ainsi que l'état et l'organisation de l'abbaye.
Et pour la 1ere maison mère ce sont les filles qui faisaient aussi son
inspection.
Pas de culte de la personalité chez les Cisterciens.
Même les moines avec des responsabilités n'était pas au dessus des autres.
Il s'agit des charactéristiques principales que j'ai retenu.
Évidemment on a envie de faire le lien avec l'informatique.
Nombre d'informaticien ont perdu leur voie pour gagner leur vie.
Il est aujourd'hui très difficile de gagner un salaire honnête en faisant
de l'open source/free software.
Nous ne sommes plus à une époque où nous voudrions sacrifier nos vies pour
nous consacrer à un but transcendental comme un super projet open source.
Cependant il y a je pense dans cette histoire cistercienne de quoi nous
inspirer pour la création d'un ordre des informaticiens.
Mais à condition de le penser sur le long terme et de bien préparer sa
place.
Même si la création d'une telle communauté échoue à devenir influente elle
pourra participer à un effort dans la bonne direction dont en étant une
expérience agréable et enrichissante pour ses participants.
* La solution que je propose de faire ensemble
Il est temps d'esquisser une première proposition sur ce que nous pourrions
faire pour être moteur de progrès.
Et si nous le sommes déjà comme certains d'entre vous, comment peut-être
faire encore mieux.
Tout d'abord, je pense que le premier point important à garder à l'esprit
c'est que je propose de faire quelque chose sur du temps long.
Pas de précipitation, même si rien n'empêche, bien au contraire de
commencer à faire des choses.
** l'Ordre
Mon idée serait de former un « ordre des informaticiens ».
Je n'aime pas trop ce nom, mais c'est tout ce que j'ai trouvé pour l'instant.
Même si on le traduit, je pense que j'utiliserait quand même
"Informatician" qui reprensent plus ce que nous sommes.
On est pas des "Computer Scientist".
L'ordinateur pourrait disparaitre, notre métier serait toujours utile.
Je pense qu'on peut se donner quelques années avant de vraiment sortir et
s'appeler « ordre des informaticiens ».
De plus je pense que tous les informaticiens de métier ne pourraient pas
faire parti de cet ordre.
Il devrait y avoir des critères plus restrictif que juste savoir utiliser
quelques outils et savoir programmer.
Le but premier de cet « Ordre » serait donc promouvoir le progrès.
Comme le but de l'ordre des médecins et de promouvoir la bonne santé.
Mais un « ordre » pourrait aussi avoir des avantages évidents avec l'extérieur.
Gagner une autonomie et sa place au sein de la société.
Autonomie de la formation.
L'« ordre » décide de comment former ses membre et des règles internes.
Promouvoir ses intérêt et celui de ses membres.
Entre-aide.
Etre une voix pour promouvoir les différences fondamentales entre les
informaticiens et d'autres groupes d'ingénieurs ou scientifiques qui
justifient que les informaticiens deviennent une profession (toujours au
sens sociologique).
À l'intérieur de l'ordre par contre les sujets abordés seraient très différents.
Forum de question sur comment se rendre utile et moteur de progrès ?
Quelle serait la méthode la plus efficace ?
Et évidemment dans une environnement adapté à nos vie modernes.
Je n'imagine pas nous retrouver dans une Abbaye cachée pour coder du matin
au soir.
Même si ça fait un peu sectaire, je parlerai de l'Ordre sans les guillemets
pour la suite.
** Pour vivre heureux vivont cachés
Comme les moines cisterciens il me semble important d'avoir un lieu protégé
de l'extérieur.
Lors de mon arrivée sur le parking de la visite de l'Abbaye du Thoronet, on
ne voyait rien.
Pas de bâtiment visible.
L'abbaye était cachés.
Il me semble que c'est une bonne solution pour éviter d'être vu et ensuite
attaqué par des systèmes d'influences court-termistes.
Pas de forum ouvert.
Je pense même qu'on peut aller plus loin.
J'ai vu des communauté comme le tildeverse.
Il s'agit d'ouvrir un compte ssh sur une machine à des individus.
Et celà devient une sorte de réseau social clos.
Réservé aux personnes qui savent utiliser ~ssh~ et qui ont donc une
connaissance technique non nulle.
Je pense aussi que même si on est entre nous.
Nous baignons dans une environnement très bruyants.
Nous ne pouvons pas toujours nous faire confiance pour être dans un état
d'esprit calme et raisonnable nécessaire à ce type de lieu de rencontre.
C'est pourquoi je pense que l'entrée devrait imposer une sorte de temps de
pause à chacun.
Le temps de reprendre ses esprits loin de toute notification ou imperatif
extérieur.
Il faudrait arriver à communiquer lorsque l'on sait que l'on va avoir un
temps isolé et calme prompt à la réflexion.
S'imposer de couper toutes les sources potentielles de notification.
Retrouver en quelque sorte un lieu où on se sente bien entre individus de
confiances.
Dans un premier temps communiquer par mail encrypté avec GPG est déjà un
moyen de restreindre le groupe.
Mais je pense qu'il faudrait conserver des archives visible par tous ceux
qui pourraient le rejoindre à l'avenir.
** Constitution
Concernant les règles des groupes.
Il est clair si l'on regarde tous les forums et réseaux sociaux, il existe
une taille critique qui fait que l'on passe d'une expérience agréable à un
système qui va privilégier la réaction plutot que la réflexion.
Voici donc une proposition pour gérer la scalabilité de l'Ordre.
Bien entendu inspirée par des propositions connues d'organisations
décentralisées.
Pour éviter l'effet "Eternal September" je pense qu'il faudrait une
constellation de réseaux sociaux mais très limités en nombre de
participants.
De plus imposer une stabilité des participants; on reste dans le même
groupe et on ne participe pas à plusieurs groupes sauf exception.
Et ce pour rendre quasi totalement impossible l'effet "buzz".
Il me semble avoir lu qu'un individu ne peut pas vraiment connaitre plus de
120 personnes.
Donc si nous limitons la taille du groupe à 120 (peut-être même juste 60)
on peut faire un groupe où chacun de nous pourra en quelque sorte connaître
assez bien tous les autres individus.
Evidemment un tel système devrait être sur invitation seulement.
J'irai même plus loin.
Il faudrait dans une première phase n'inviter que des gens assez proches.
Lorsque le groupe atteint un seuil, il est alors nécessaire d'établir un
autre groupe séparé du premier.
Je pense qu'il faudrait des volontaires du groupe pour monter le suivant.
Ces volontaires seraient ensuite garrant de conserver le même esprit
progressiste et amical dans le groupe « fille ».
Et comme les Abbayes qui se surveillaient les unes les autres.
Il serait très intéressant d'entretenir une relation similaire.
Comparer les réflexions des groupes.
Vérifier si un groupe se spécialise.
Si differents groupes convergent ou divergent.
Avoir de façon régulières mais peu fréquentes des "synchronisations".
Prendre les meilleures idées, discussions, productions de chaque groupes et
le promouvoir aux autres groupes.
Pour éviter un effet "overflow" et "buzz" la synchronisation sera limité
aur relation directe mère fille (dans les deux sens je pense) et aussi
prendre gare à désynchroniser les dates de ces synchronisations.
Et bien entendu imposer un nombre maximal de « filles » d'un groupe.
** Détail des Principes
Je pense qu'il faut lier un ordre à un ensemble de grands principes.
De plus il faut non seulement énoncer les principes mais leur hiérarchies.
Car si toutes les sociétés prônent les même principes c'est leur hiérarchie
qui diffère.
Pour moi le principe fondateur c'est la promotion du progrès.
Et le plus difficile se mettre d'accord sur une définition suffisamment
précise du progrès pour pouvoir le distinguer.
Progrès individuel, social, technique, etc...
Souvent différents points de vus s'opposent.
Comme la parole était suspicieuse pour les cistercien certains détail de
nos communication devraient aussi être regardé d'un œil suspicieux et si
possible être évité.
*** Le contenu
**** Pas de news
Si on voit quelque chose sur Hacker News, reddit, etc...
Une mise à jour, une dernière nouveauté, un nouveau service en ligne, un
nouveau PC, téléphone, gadget.
De la politique.
À 99% ce ne devrait pas avoir sa place dans les discussions sur ce groupe.
La plupart des discussions politiques devraient être exclues.
La plupart des informations qui datent de moins de 6 mois.
Je pense qu'il pourrait y avoir certaines exceptions; les décès de
personnes proches de la communauté.
Les news touchant directement un des membres du groupe ou de l'Ordre,
etc...
Peut-être des discussions de fond sur des mouvements politiques mais rien
de récent.
Il faut à tout prix éviter de s'embourber dans les discussions
emotionnelles.
Typiquement, pendant le COVID, il faudrait éviter d'en parler complètement
à l'exception des détails techniques.
Le but de ces groupes de discussions sont la recherche du progrès à long
terme.
Le temps passé à discuter de ses peurs, émotions, dernières nouvelles
reviennent à regarder sidéré BFM TV pendant des attentats ou n'importe quel
autre évênement stupéfiant.
Au contraire, cet espace devrait être préservé du quotidiens et de
l'évênementiel pour se tourner vers du méditatif à très long terme.
**** Presque pas d'humour
Sans vouloir l'interdire totalement certaines des formes de l'humour devraient être
prohibés dans les communications.
C'est la malheureuse conclusion à laquelle je suis arrivé.
Pour plusieurs raisons mais qui se rejoignent par le fait que l'humour se
partage mal hors d'un groupe d'amis.
Les sensibilités de chacun sont différentes.
Une remarque humoristique qui nous semble innocente sera perçue comme
offensante par une personne ayant une histoire et une sensibilité
différente.
Si les communications du groupe sont publiés il ne faudrait pas qu'elles
soient mal interprétés ou puissent être utilisé pour attaquer le groupe via
des canaux extérieurs.
J'ai bien peur que pour le bien du groupe il faille refuser un humour de
détente pour se contenter d'un humour politiquement correct ou d'un humour
subtil plus difficile d'accès.
Par humour subtil j'entend un humour qui passerait par des critiques de
raisonnements un peu avancé.
***** Pas d'humour de détente
Je pense toutes les formes d'humour relatives à la distraction; les mèmes
Internet, les petits chatons, les blagues.
***** Pas de sarcasme
Je suis le premier à utiliser le sarcasme sur le chat, les forums dans la
vie courante.
Cependant, dans un système avec archive impossible à supprimer une phrase
peut simplement être utilisée hors de son contexte.
Plus que ça, il n'est pas toujours compris et c'est ce qui fait le drôle de
la situation.
Le petit moment de flottement où les individues ne savent pas si l'on est
sérieux ou pas.
Je pense que dans les communications sur les groupes, ce ne peut être acceptable.
***** Pas d'exagérations
Pas d'exagération non plus, de tournure déplaisante, etc...
Si on dit "c'est carrément fasciste" il faut que vous pensier vraiment que
l'acte décrit soit au niveau historique du fascisme.
Evidemment il faudrait absolument éviter le point Godwin.
De cette manière les règles seront aussi très strictes.
**** Pas d'anecdotes
Encore une remarque pour garder son sérieux et éviter des débats inutiles.
En gros il s'agit d'éviter les "Logical falacies" et autres erreurs de
raisonnements.
La plupart du temps, les anecdotes font partie de ces informations qui
n'ont que très peu de valeur de fond.
Elles peuvent par contre être utilisées en contre argument d'une fausse
généralité.
*** Asynchronicité
À peut-être quelques exceptions près.
Les communications au sein du groupe devraient être asynchrones.
Chaque individu devrait avoir le temps de penser la réponse à un texte, un commentaire.
Les communications mêmes anciennes ne devraient pas disparaître comme on le
voit sur les sites comme HN, reddit.
Au contraire, on peut prolonger une discussion sans fin ou très longtemps.
Et la discussion, l'activité doit encore être visible.
De même les discussions les plus importantes relatives à la prise de
certaines décisions de groupes devraient faire parti des productions
publiques du groupe.
*** Privé vs Read-only
Je pense qu'il serait bénéfique que les productions du groupe soient
publiques.
Mais je pense que les discussions internes ne devraient pas nécessairement
l'être.
Celà permettrait d'avoir des discussions dans une bulle où nous pourrions
avoir confiance en la bonne foi de chacun des participants.
Tout en sachant que les détails de la discussion ne fuiteront pas vers le
domaine public pour éviter un brigading possible.
En ce qui concerne les productions, je pense aussi que dans la plupart des
cas il faudrait qu'elles soient read-only pour l'extérieur du groupe.
Si c'est du code, le repository reste read-only.
On autorise les forks, mais on autorise pas les non-membres à participer.
C'est un peu dur, mais sinon, celà ouvrirait une brêche où pourrait
s'engouffrer les trolls, le brigading...
J'imagine qu'on pourrait trouver un système intermédiaire mais, je ne vois
pas quelque chose qui me parraisse correct pour l'instant.
*** Pseudonyme pour l'extérieur pas d'anonymat pour l'intérieur
Il me semble difficile d'intégrer de l'anonymat au sein du système.
Il faudrait éviter à tout prix qu'un individu triche en se faisant inscrire
dans plusieurs groupes en même temps.
J'imagine que l'on pourrait trouver un moyen technique qui obligerait tous
les membres de tous les groupes à se connecter en même temps dans certaines
conditions pour éviter les duplicata de compte.
Mais il faut connaître le vrai nom des gens au moins entre membres du
groupe.
Pour les archives publiques, il me semble au contraire préférable d'avoir
le maximum d'anonymat pour éviter toute possibilité de pression extérieure.
Il me semble donc cohérent d'avoir un nickname différent de celui que l'on
utilise ailleurs.
** Règles
Les cisterciens ont des règles très strictes d'hygiène de vie à respecter
tous les jours.
Je pense que c'est totalement hors de propos pour le type de communauté à
laquelle je pense.
Au contraire, je pense qu'au delà des principes et d'une forme de recueil
technique pour éviter les prises de pouvoir.
Il ne faut pas de loi, pas de règle, pas de process qui ne soit modifiable
par le jugement de bonne foi.
Si on part sur du progrès et que la communauté se constitue de personnes
de confiance.
La communauté doit avoir le droit de changer radicalement toutes les règles.
nb: c'est l'exact inverse de ce que propose les cryptos avec des
constitutions dans le marbre.
Donc il y a une tension ici.
D'une part j'ai énoncé des règles constitutionnelles pour éviter des prises
de pouvoir.
De l'autre je considère qu'il faut un moyen de réforme absolue basé sur la
bonne foi des participants.
La fondation immuable devrait être cette idée de progrès qui ne doit jamais
être confondu avec une idée d'innovation ou autres stratagèmes.
** Banissement
Si une personne emet un avis totalement en désaccord avec l'esprit
progressiste du groupe il devrait être banni.
Il pourra utiliser twitter pour faire valoir son opinion.
Dans ce cas, je propose que le bannissement demande au moins l'accord de 3
membres du groupe.
Dont probablement un membre considéré comme modérateur.
Je pense qu'il faut quelques membres qui soient considérés modérateurs,
opérateurs.
Celà ne devrait pas particulièrement leur conféré des privilèges mais
plutôt des devoirs de maintenance.
** Arrivée dans le groupe
Il fallait un an pour passer de novice à moine.
Il me semble que c'est une bonne façon de faire.
Avoir une période d'essai qui ne serait pas nécessairement un an.
Après un vote si possible secret à l'hunanimité un membre pourra soit
devenir membre définitif, soit reconduire sa période d'essai, soit être
rejeté par la communauté.
** Financement
De même que les cisterciens commencèrent à accumuler de l'argent avec
beaucoup de dons mais aussi beaucoup d'innovations et découvertes
techniques.
Il me semble que l'idéal serait que la compétence de chacun des membre
puisse favoriser le progrès mais aussi les innovations qui en
découleraient.
Et pouvoir utiliser celà pour financer le mouvement.
Pour moi il faut un plan à la SpaceX mais pour l'open source.
Avoir un objectif lointain de fonder un Ordre comme les Bene Geserit de
Dune et jalonner des étapes qui pourrait à chaque étape devenir rentable et
renforcer le mouvement.
Evidemment, il est hors de question que cet argent soit jeté par les
fenêtre ou utilisé pour s'acheter des yatchs.
Sans parler de pauvreté, il me semble qu'une certaine décence des dépenses
est nécessaire pour un mouvement humaniste et progressiste.
Mais si un groupe pouvait obtenir une indépendance financière pour payer à
temps plein des codeurs sur de l'open source je pense que celà constituerai
un immense pas en avant.
* Digression
Attention cette idée est peut-être saugrenue.
Mais elle raisonne depuis un moment il doit donc y avoir quelque chose a en
tirer.
Une autre idée relative à cet « Ordre » serait de produire un « super
software ».
C'est un nom que j'ai inventé, je ne sais pas trop coment appeler ça.
L'idée serait de produire un ressource gigantesque et publique de code
source.
Une sorte de super repository potentiellement décentralisé mais 100%
autonome et cohérent.
Un peu comme tous les paquets Linux/BSD.
En fait j'aimerai aller encore plus loin.
Dans l'idéal nous trouverions en tant que groupe un consensus sur un seul
language de programmation qui possèderait toutes les propriété que nous
pourrions vouloir.
Ou au moins réduire les langages de programmation d'intérêt.
Tout en prenant en compte l'évolution scientifique des languages de
programmation.
Il faudrait que ce « super software » contienne des libs pour tout, mais
tout en conservant les autres version (potentiellement fausses) des
anciennes implémentation de fonction pour avoir une retro-compatibilité
parfaite.
Ajouter du nouveau code ne pourrait ainsi jamais casser du vieux code.
La modification de code serait interdite ainsi que la suppression de code
(sauf peut-être exception de Garbage collect).
Ainsi si il y a un bug dans une fonction, plutot que la modifier.
Il faut réécrire une autre fonction, avec un autre nom (qui contiendrait
probablement un numero de version).
Celà fabriquerait petit à petit une sorte de gigantesque « boule
d'accretion code » (un peu comme le soleil).
De plus, d'expérience une petite équipe code mieux sur du code qu'une
grande équipe.
Ce qui rejoins l'idée de conserver un nombre de membre du groupe faible.
Merger serait trivial avec une simple convention de nommage.
Le premier groupe s'appelerait ~0x~.
Ses filles ~0x0~, ~0x1~, ~0x2~, ...
~0xf~ (on pourrait limiter le nombre de filles à 16).
Les filles de ~0x3~ seraient alors (~0x30~ ... ~0x3f~).
Ainsi si la convention de nomage des fonctions serait:
~[function-name]-[groupe]-version~.
Et il n'y aurait jamais de conflit possible entre groupe puis que chaque
commit serait uniquement additif avec des noms différents.
Rien ne serait modifié ni supprimé.
Evidemment j'imagine qu'une telle convention sera proposé nativement via
des IDE, ou un système qui automatise le nommage.
Ansi tous les merges seraient triviaux.
Après de longues années il n'est pas impossible que nous puissions avoir un
code qui s'oriente uniquement vers des résolutions de problèmes utiles.
Vers du progrès.
Et pourquoi pas, même imaginer la fabrication de hardware dédié compatible
avec ce système.
Avec un tel système de convention de nommage on pourrait même totalement
décentraliser les codes sources et chaque « objet » connecté pourrait ne
réclamer que les codes qu'ils souhaite de façon transitive.
Les mises à jours seraient aussi simplifiées et triviales.
* Comment Techniquement?
Je n'ai pas parlé de l'implémentation techniques.
L'hébergement ? Web, ssh, gpg, mails ?
Pour l'instant c'est secondaire.
Cependant j'ai quelques petites idées:
J'imagine une interface qui ressemblerait à un forum de discussion un peu
comme Reddit ou les newsgroups.
Peut-être pas sur le web mais directement dans un terminal via ssh.
Ce serait une première pour moi.
Certains choix de l'interface de l'IETF sont intéressants aussi.
Quoi qu'il en soit, il faudrait que l'on « entre » dans la communauté.
Avoir un petit temps d'attente qui permette de respirer avant d'entrer pour
retrouver ses esprits et se mettre en condition.
Avoir des messages de rappel des règles pour éviter les débordements, les erreurs.
Checker le contenu des commentaires pour potentiellement ajouter un rappel
des règles.
Typiquement si le message contient certains mots clés.
Que le message est trop court, etc...
Uploader les clés GPG publiques de tous les membres pour discuter en privé
via mail (ou autre).
Si c'est le cas, il faudra que ce trousseau soit encrypté pour éviter les
fuites publiques des emails des membres.
Ou simplement demander à tout le monde d'envoyer les clés.
L'idéal serait d'avoir de l'e2e et plus généralement de chiffrer toutes les
communications internes.
Le volume des converstations devrait rester assez faible pour que l'on
puisse tout lire à chaque fois.
Et donc pas besoin d'un algorithme intelligent qui positionnerait des
priorités de certaines discussions.
Peut-être avoir une notion de discussion amenée à son terme.
On pourrait donc par consensus fermer une discussion lorsque l'on arrive à
une conclusion.
Et si c'est le cas pouvoir potentiellement publier une « production » qui
retrace la conclusion de la discussion avec une explication des différents arguments.
La discussion en elle même pouvant ou non rester cachée et archivée.
Peut-être décider d'un nombre maximal de sujet à traiter jusqu'à obtention
de consensus.
Si le consensus ne peut pas être atteint et que plus personne ne peut
ajouter de commentaire sur la discussion.
On pourrait mettre une discussion en « couveuse » pour un certain temps.
Elle serait alors dépriorisée et réapparaitrait de nouveau au premier plan
après le temps d'attente.
L'objectif final étant de produire des conclusions consensuelles et
d'essayer d'avancer.
De même il me semble qu'il faudra un ou plusieurs repository git.
Pour aider à la production de code.
* Qui ?
Jusqu'ici je n'ai pas dit qui inclure et comment.
Mais je considère qu'il doit y avoir un certain nombre de qualités que nous
devons rechercher chez les membres.
1. *Compétent techniquement*; pas de nul.
2. *Éthiquement compatible*; qui partage les valeurs du groupe.
3. *Socialement compatible*; une personne ouverte d'esprit qui sera
bienveillante envers les autres membres.
4. *Techniquement compatible*; qui partage les opinions fortes du groupe sur
le plan technique.
5. *Productif*; il serait triste d'avoir des membres brillants incapables
d'accepter des solutions temporaires imperfectes mais utiles.
Il faut une personne qui aide à la production et qui ne s'arrête pas à la
discussion théorique.
Même si l'objectif est sur du temps long et qu'il n'y a pas de
précipitation.
6. *Impliqués*; nos vies modernes sont remplies et nous laissent peu de temps.
Mais il faudrait que les membres puissent s'engager à participer pendant
un temps régulier suffisant.
J'imagine pour que les choses se fasse bien il faudrait procéder un peu
comme un recrutement.
Pour aussi montrer que joindre ce groupe c'est différent de juste d'abonner
à reddit ou HN.
* Conclusion
Merci d'avoir lu jusqu'ici.
Si ce n'est pas clair je voudrais simplement lancer une discussion sur le
sujet.
Et je tiens à ajouter que je n'ai aucune compétence ni en science sociale,
ni en science politique.
J'ai très probablement émis une énorme quantité d'erreurs et d'idées naives
sur ces sujets.
Cependant j'espère que cette idée pourrait contribuer à créer une bulle
protectrice pour un environnement positif.
Positif pour nous mais aussi pour les autres.
Avec un petit espoir qu'une telle communauté puisse naître et avoir une
influence positive.
À bien y regarder, il s'agit simplement de faire des communautés comme ce
qui existe déjà pour la plupart des projets open sources.
Mais au lieu de se focaliser sur un outil technique ici il s'agit d'aller
plus sur le terrain de la politique et de la philosophie tout en ne
négligeant pas le coté « travail productif » pour qu'il en découle du
concret.
J'attends vos commentaires avec impatience.
Bien entendu, si vous pensez que je me trompe complètement, je préfère une
honnêté brutale à un compatissement bienveillant.
N'hésitez pas à émettres vos critiques et vos idées.
Si suffisamment d'entre vous me répondent et que vous acceptez de partager
ces discussions entre vous.
Je trouverai un moyen de tous nous mettre en relation.
Bien que je pense cet aspect de communication direct est aussi intéressant.
Et si vous êtes même partiellement convaincu.
Dans ce cas, nous pourrons commencer à discuter des détails d'organisation
et des détails techniques.
Et probablement ainsi construire ensemble une communauté de confiance qui
nous convient.
Y.

View file

@ -0,0 +1,10 @@
:PROPERTIES:
:ID: 62c57354-72ed-4465-91b4-67c53defbd10
:END:
#+TITLE: ordre
#+Author: Yann Esposito
#+Date: [2020-08-29]
tags ::
source ::

View file

@ -0,0 +1,9 @@
:PROPERTIES:
:ID: eb806d6a-57ca-4aab-8987-820b139b2be6
:END:
#+TITLE: society
#+Author: Yann Esposito
#+Date: [2020-09-01]
tags ::
source ::

View file

@ -0,0 +1,12 @@
:PROPERTIES:
:ID: 749c6c1d-781d-4362-a04a-2d8da46dfc1a
:END:
#+TITLE: cours universite en ligne
#+Author: Yann Esposito
#+Date: [2020-09-06]
tags ::
source ::
http://r.news1.fun-mooc.fr/mk/mr/TtObuvCBFz4rW3fNKQrCSjJ4Qk4neqQyOG0VFDm5Zr1vtg-Ei1uDV-Co1B506BJliEhSUhbD95V9NaiHA_YBawdrpwiFmpMKd7VxexWR_Yts9Q

View file

@ -0,0 +1,13 @@
:PROPERTIES:
:ID: 0a9e476b-3119-4f1a-9b52-39ca5cde4d45
:END:
#+TITLE: Cours université en ligne
#+Author: Yann Esposito
#+Date: [2020-09-06]
tags :: [[id:a2225047-7563-4e4e-a031-7f69e060de6b][learning]]
source :: [[notmuch:id:202028082220.nrnx041tgg9qvbj@news1.fun-mooc.fr][Email from France Université Numérique: Vos prochains MOOC sur FUN pour la première quinzaine de septembre]]
Exemple
http://r.news1.fun-mooc.fr/mk/mr/TtObuvCBFz4rW3fNKQrCSjJ4Qk4neqQyOG0VFDm5Zr1vtg-Ei1uDV-Co1B506BJliEhSUhbD95V9NaiHA_YBawdrpwiFmpMKd7VxexWR_Yts9Q

View file

@ -0,0 +1,9 @@
:PROPERTIES:
:ID: 504a4da0-9a11-4b7d-8055-92546880b7d0
:END:
#+TITLE: vie
#+Author: Yann Esposito
#+Date: [2020-09-20]
tags ::
source ::

View file

@ -0,0 +1,218 @@
:PROPERTIES:
:ID: c5641d26-40dc-4473-afc9-4c6d70918f14
:END:
#+TITLE: Luc follow.sh review
#+Author: Yann Esposito
#+Date: [2020-10-04]
tags :: [[id:bec11f07-ffed-487b-9059-bdf6696548ab][programming]] [[id:a2f79c86-51a4-4313-a1af-b9e27a36712e][product]] [[id:89f9402f-0d70-4477-a4ae-34ad4da22868][app]] [[id:9b0a1aa0-5374-41e3-bf65-2ae9e0d03eeb][review]]
source :: https://www.follow.sh/en/
* Review
J'ai testé pas mal de choses.
C'est cool, ça marche j'ai fait pas mal de remarque.
Good luck! :)
** Site web
Très bonne première impression très propre.
Bemol, les couleurs ne sont pas alignées entre le logo et le thème du site.
C'est un détail mais c'est important puis que ça montre quasi immédiatement
que le branding n'est pas parfaitement aligné.
Le violet est assez sympa, donc je pense ça serait pas d'utiliser le violet
plutot que le bleu du logo partout.
Ça me semble plus facile dans ce sens.
*** Conseils
Sur la page d'accueil FR: je pense j'ajouterai "local" quelque part dans la
phrase d'accroche.
Peut-être même que j'utiliserai une formulation pour rassurrer
psychologiquement.
Du genre « Restez en contact avec vos commerçants de proximité », à
améliorer, mais tu vois.
Aussi, contrairement à ce que j'ai dit juste avant, s'il faut appuyer sur
le coté rassurant, local, etc...
Malheureusement le thème du site n'est pas super adapté.
Il faudrait un truc qui fasse plus chaud les couleurs choisies ici sont
froides et technologiques.
Typiquement y aller à fond genre un theme comme =gruvbox= par exemple.
Un truc qui rapelle les affiches genre biscuit lu des années 20.
Donc plutôt du jaune, du marron, du bleu doux, etc...
En gros, j'irai vair des couleurs vintage plutôt chaudes
Ma préfée serait: https://www.schemecolor.com/yellow-vintage-color-palette.php
Mais qui irait aussi:
- https://www.schemecolor.com/vintage-by-choice.php
- https://www.schemecolor.com/vintage-brown-look.php
- https://www.schemecolor.com/vintage-tirp.php le plus doux, rassurant mais féminin
Et assez important pour donner cette impression de chaleur, ne pas utiliser
de background blanc. Probablement utiliser une fonte qui fasse un peu vintage.
Exemples:
- https://ourstoriesin.com
- https://themeforest.net/item/retro-portfolio-one-page-vintage-wordpress-theme/1708109?s_rank=8&_ga=2.52183969.96619734.1601802127-201122956.1575809459
*** Problèmes
1. En allant sur =follow.sh= je suis tombé sur le site anglais, pas moyen de
trouver comment aller sur le site en FR.
C'est en allant sur =confidentialité= et en cliquant sur la petite maison
que je suis arrivé sur le site en FR (mon env est en Anglais).
2. [EN] Typo: Feature au lieu de Features dans le titre.
3. Le texte anglais ne semble pas adapté à ce que fait l'app. Cette partie
est assez difficile, il faudrait d'abord savoir qui arrive sur ce site
et adapter le discours et le vocabulaire pour le public visé.
4. En allant sur https://www.follow.sh/confidentialite j'ai cru qu'il n'y
avait pas de bouton retour. En fait j'ai pris le triangle en background
pour un bouton retour et je n'ai pas vue la petite maison.
Je pense qu'il faudrait mettre un top menu ou avoir la maison dans un
cercle coloré ou noir pour que l'icône se voit.
5. Le mail dans Contactez nous n'est pas cliquable. Vous pouvez à minima
obfusquer le `mailto:contact@follow.sh` en utilisant un mix de `&#xxx;`
genre http://www.wbwip.com/wbw/emailencoder.html.
** App
J'ai désinstallé et réinstallé l'app pour reproduire les conditions d'un
nouvel utilisateur.
*** Première expérience utilisateur non commerçant
1. permiere expérience, l'app lance une page de load avec le logo au
centre.
Directement après on se prend une notification, "follow would like to
send you notifications".
En général c'est plus simpa d'arriver directement dans un "wizard" qui
fait le tour du propriétaire avec un petit message explicatif.
« Pour ne rien râter des news locales merci d'autoriser follow à vous
envoyer des notifications; le niveau des notifications est configurable
dans l'applications ». Par exemple, on appuis sur "suivant" et hop on se
prend la demande. Sans ce premier message la plupart des gens refusent
systématiquement.
Avec le message je pense ça augmente sensiblement l'engagement.
2. Après avoir accepté, on arrive sur "Actualités et bon plans"
avec un bouton "Mes abonnements".
On clique dessus on arrive sur l'onglet "Abonnements", c'est sympa, je
pense qu'en premier usage il serait plus cool d'arriver sur une plage
explicative (toujours type wizard) et quand on fait "suivant" hop on
arrive sur l'onglet "Abonnements".
3. Je clique sur scanner QR code, la page affiche une page avec le top bleu
"Scan" et el contenu est du texte non designé (top left petit)
"Requesting for camera permission".
Là encore pour premier usage, je pense ça serait bien un texte
explicatif avant de demander la permission d'accès à la caméra.
Plein de gens ne savent pas scanner un QR code.
Juste une page du genre « Les QR codes sont ces images que l'on voit un
peu partout "exemple de QR code" il suffit de les filmer avec la caméra
de votre iPhone pour les scanner, c'est pour celà que nous vous
demandons l'accès à votre caméra. ». Et hop suivant, demande d'accès.
4. Si on choisit "Rechercher" l'interface est naturelle, par contre les
commerces ne semblent pas ordonnés. J'imagine qu'ils sont ordonnés par
date d'ajout. Si une personne veut chercher en scrollant (parce que des
gens peuvent être masochistes) il devient très difficile de trouver son commerce.
Je pense qu'il serait plus naturel de les ordonner par ordre
alphabetique et si possible d'avoir comme dans "Contact" la liste des
premières lettres sur la droite et d'ailleurs pour les tests, il serait
pas mal d'engendrer quelques dizaines de faux commerces. Et pourquoi pas
plusieurs milliers pour voir comment cela se comporterait.
A mon avis si l'app commence à être utilisé beaucoup cette interface
avec liste n'est absolument pas gérable, il faudra un prefiltre par
geoloc pour minimiser la liste à moins de 50 ou moins de 100 commerces.
5. Dans la liste "Rechercher" il y a un commerce avec un tick bleu.
Aucune idée de quelle est la signification.
6. Lorsqu'on clique pour s'abonner on revient sur l'onglet "Mes abonnements".
Mais du coups il ne reste que le bouton + et QR-code en haut.
Et il n'est pas tout de suite évident qu'il faudra cliquer là pour
ajouter un nouvel abonnement.
Souvent on s'attend à avoir un bouton + en bas de la liste en plus.
Sans ajouter le bouton, je pense il serait pas mal pour le tout premier
retour après le premier abonnement d'avoir un wizard qui fasse le focus
sur les deux boutons pour expliquer comment ajouter de nouveaux abonnements.
À la limite je laisserais deux gros bouton en haut plutôt que ces deux
petits icônes qui font plus jolis mais sont plus difficile à détecter.
Et de même j'agrandirais ces boutons pour rendre plus évident leur présence.
7. En retournant sur l'onglet "Actu" il y a un bug (iPhone 11), le bas de
la page est grisé, la taille de la liste n'est pas égale à la taille de
l'espace disponible.
8. L'onglet "A propos" le texte manque de contraste et est trop petit. La
moitié de la page est vide. Autant en profiter.
Le "Contactez-nous à info@follow.sh" n'est pas actionnable (cliquable).
*** Onglet commerçant
Je clique sur le bouton "Connexion".
Je vois le nombre de followers et le nombre de publications restantes.
C'est très bien.
Si je clique sur "nouvelle publication" immédiatement demande d'accès à mes
photos.
Je refuse de donner l'accès message [missing
"fr.send_notification.image.permissions_required" translation] Je pense
qu'il vaut mieux se passer de cette erreur visible par l'utilisateur final.
J'essaye d'écrire malgré tout, à chaque nouvelle lettre, je me prend le
meme message d'erreur.
Donc oui, il faut vraiment supprimer cette notificaiton d'erreur.
Surtout que même en image, ça marche.
**** Onglet packs de publications
Connaissant les commerçants, ils en ont marre de payer pour tout et rien.
Je pense qu'il ne serait pas trop mal plutôt que limiter leurs
"publication".
De faire une distinction entre "publication donnant lieu à des
notifications" et "publication silencieuses" qui seraient donc moins chère
ou avec des packs du genre 1 ou 2 pub silencieuses par semaine offerte
etc...
Mais ça risque de changer un peu le backend, mais d'un point de vue
marketing je pense que l'idée sera mieux reçue des commerçants.
Un autre aspect à considérer et peut-être de ne pas montrer directement le
nombre d'abonnés surtout pendant la période de lancement.
Histoire de laisser une sorte de croyance se mettre en place.
Avec certain qui feront des erreurs de corrélations entre l'utilisation de
l'app et une meilleure affluence.
Et aussi en terme de vente, peut-être plutot que compter le "nombre de notification"
considerer de limiter la fréquence des publications.
Du genre, pas plus que 1/semaine, 1/jour, 3/jour, etc...
Sinon vous risquez de vous retrouver avec des anti-joueurs assez vite
surtout que ce n'est pas très cher de faire l'anti-joueur.
De la même manière, je pense que coté utilisateur il faut un option qui
permette de limiter le nombre de notifications par jour et peut-être meme
aider les utilisateurs à configurer les notifications via l'app pour éviter
que les gens la désinstalle parce qu'au lieu d'être utile l'app devienne
une source de nuisance.
Après tout c'est une demande de recevoir de la pub.
Dans notre monde moderne, les gens essayent plutôt de limiter leur
exposition aux pubs.
Une autre piste potentielle serait d'augmenter une forme d'engagement des
utilisateurs en les rémunérant avec quelque chose, pas juste en recevant la
promo. Typiquement des promos exclusives via l'app, etc...
Détail technique, il y a une poubelle en haut à droite de "Nouvelle
publication" Aucune idée de comment utiliser ça.
De même un problème bien plus grave, je ne vois pas comment
supprimer/editer une publication.
Je pense ça risque d'amener des pb du genre, typo dans la promo, genre,
mauvais prix, à cause d'une typo pouvant causer des pertes financières à un
commerçant avec potentiellement des conséquences juridiques.
Si j'essaye d'éditer mon compte, je reprend le message d'erreur à cause de
mon refus de donner l'accès à mes photos.
La même erreur trigger à chaque fois que j'appuis sur une lettre pour
éditer. Il me semble que c'est aussi un pb de code, la demande d'accès ne
devrait se faire que lorsqu'on change une image pas à chaque fois que l'on
edite du texte.
*** Problèmes/bug/remarques
1. Comportement inattendu, si on fait scanner QR code et qu'on ne scanne rien, qu'on
change d'onglet et qu'on revient sur l'onglet "Abonnement" l'appli reste
toujours en mode scan de QR code et on voit toujours la vue caméra.
Je pense que lorsqu'on change d'onglet, il faudrait revenir à la page
d'acceuil de l'onglet "Abonnements".

View file

@ -0,0 +1,9 @@
:PROPERTIES:
:ID: a2f79c86-51a4-4313-a1af-b9e27a36712e
:END:
#+TITLE: product
#+Author: Yann Esposito
#+Date: [2020-10-04]
tags ::
source ::

View file

@ -0,0 +1,9 @@
:PROPERTIES:
:ID: 89f9402f-0d70-4477-a4ae-34ad4da22868
:END:
#+TITLE: app
#+Author: Yann Esposito
#+Date: [2020-10-04]
tags ::
source ::

View file

@ -0,0 +1,9 @@
:PROPERTIES:
:ID: 9b0a1aa0-5374-41e3-bf65-2ae9e0d03eeb
:END:
#+TITLE: review
#+Author: Yann Esposito
#+Date: [2020-10-04]
tags ::
source ::

View file

@ -0,0 +1,76 @@
:PROPERTIES:
:ID: fe7731fd-315e-4560-ace2-2deb397ffa00
:END:
#+TITLE: clojure job discussion
#+Author: Yann Esposito
#+Date: [2020-10-09]
tags ::
source :: [[notmuch:id:1053023735.5165546.1602236330261.JavaMail.app@lor1-app45372.prod.linkedin.com][Email from Remi Thandi: Clojure Development - Europe]]
#+BEGIN_QUOTE
Clojure Development - Europe
Hi yann,
Hope you're well,
I came across your profile as I see that you've got some great skills in
Clojure!
As a specialist software development recruiter I'm building a desk around
Clojure specifically.
I'm working with a few organisations around Europe (now branching out to
the rest of the world) with some very strong conversations happening with
more vacancies soon to be on my desk!
Right now I'm looking for skilled Engineers who are looking for new roles.
Please let me know your situation and what you're looking for.
Role type
Role location (Please confirm remote if this is what you are looking for)
Salary/Pay - (Per day/Month/Year)
Kind Regards,
Remi Singh | Delivery Manager - Europe
Web, Mobile &amp; Desktop (WMD)
UK: 0044 (0)208 0047784
#+END_QUOTE
Hi Remi,
Thanks a lot for your interest.
While I love my current position I've been there for quite a time now.
So I'm glad that you could give me the occasion to take a look elsewhere.
While I am not actively looking for a new role, that could change soon.
I have mostly worked on web applications.
Even though I have a full stack experience I am a lot more often focused on
the backend.
Recently I specialized around the Authentication and User identities
technologies and protocols.
I was the main developer to write a full OAuth2 Service Provider that also
support OpenID Connect.
Knowing that, I think my profile fit with backend engineer positions.
Regarding the location, I would prefer to remain in the South of France and
continue to work as a full remote employee.
Regarding the Salary, this is a bit tricky, currently my salary is about
90k€/month before advantages.
I often performed very well so I've got a lot of bonuses typically 80k of
RSU (on a 4 year period) and every year a ~20k bonus to add on top that.
So everything combined I am close to a 120k€/year salary.
So, to resume:
Role type: Senior Software Engineer
Role location: full remote
Salary: 120k€
Thanks,
Yann.

View file

@ -0,0 +1,46 @@
:PROPERTIES:
:ID: 358588f2-436a-4ff8-a8a2-02e6d29647c1
:END:
#+TITLE: I'm Thinking of Ending Things (2020)
#+Author: Yann Esposito
#+Date: [2020-10-25]
tags :: [[id:fb7eff33-f47e-49af-b087-24fcc47dc62b][film]]
source :: https://www.imdb.com/title/tt7939766/
Un film qui m'a fait beaucoup pensé aux films de David Lynch.
Les personnages parraissent vivant mais des choses « impossible » leur arrive.
Des pertes de mémoire, des inconsistences dans leur mémoire, leur vie, etc...
Parfois un personne se retourne au milieu d'une discussion pour se
retrouver au milieu d'un pièce vide.
Et c'est ce dont il s'agit dans "I'm Thinking of Ending Things".
Mais comme je suis un fan de David Lynch et que j'analyse ce genre de
chose.
Et bien, j'étais un peu « à la maison » en regardant ce film.
Les personnages sont tous des personnages inventés dans l'esprit du
personnage principal qui fantasme d'un scénario.
Le personnage principal est un "janitor" de lycée.
Il est la cible des ricanneries des jeunes filles qui lui trouve un air
bizarre.
Il aurait aimé être un scientifique, un poète, ou tout un tas d'autres
choses.
Mais il n'a toujours été bon qu'à s'occuper de nettoyer le lycée le soir.
Dans le scénario qu'il imagine, il s'imagine de nouveau jeune.
Avec une jeune fille qui lui ressemble et qui le trouve super.
Il s'imagine lui faire découvrir sa vie.
Sa famille, là où il a vécu.
Ses moments difficiles, lorsque ses parents tombent malades et meurent.
Et finalement il l'amène au lieu qui a fini sa vie.
Le lycée qu'il n'a jamais quitté et qu'il soccupe de nettoyer.
Dans ce film il y avait beaucoup de choses bien faites.
Mais aussi certains ratés.
Les acteurs sont vraiment très bon à mon goût.
Je trouve la fin un peu ratée.
Et il est trop long, certaines scènes sont ennuyeuses.
Pourtant j'aime bien les films avec des longeurs en général, mais là les
longeurs manquaient de profondeur.

View file

@ -0,0 +1,9 @@
:PROPERTIES:
:ID: fb7eff33-f47e-49af-b087-24fcc47dc62b
:END:
#+TITLE: film
#+Author: Yann Esposito
#+Date: [2020-10-25]
tags ::
source ::

View file

@ -0,0 +1,87 @@
:PROPERTIES:
:ID: cbe19b95-6274-4565-8d25-4ad35e41feb9
:END:
#+TITLE: Personal Plan
#+Author: Yann Esposito
#+Date: [2020-11-19]
- tags :: [[file:../../../../../../.org/journal/2020-12-01--10-41-19Z--plan.org][plan]] [[file:../../../../../../.org/journal/2020-12-01--10-39-44Z--y_project.org][y-project]]
- source ::
Bon je vais écrire en Français puisque c'est pour moi et que je suis bien
entendu bien plus à l'aise en français.
OK, holà, on est le 1er décembre.
* Plans
Les plans possibles sont:
1. Progresser chez Cisco
2. Aller dans une autre boite
3. Faire du freelance
4. Créer sa propre boite
** Plan 1: Cisco
Tout étant possible de faire plusieurs choses à la fois.
Donc il ne faut pas négliger l'option 1.
Il suffit de continuer.
La difficulté est de dégager du temps et de l'énergie pour le reste.
Important, améliorer son Anglais.
J'ai vu à quel point ça donne une mauvaise impression un accent fort.
Même sur moi qui suis Français.
*** TODO Améliorer son Anglais
** Plan 2: Employé autre boite
Il convient de mettre à jour son CV.
Savoir ce qu'on veut, savoir se vendre.
Donc la solution 2, revient à trouver une boite comme Cisco.
Mais maintenant que j'ai fait mon trou, j'espère pouvoir avoir plus de
temps libre et monter avec beaucoup moins d'efforts.
Cependant il faut répondre et postuler de temps en temps.
*** TODO Améliorer son Anglais (bis)
*** TODO Garder son CV à jour
*** TODO Postuler fréquemment
** Plan 3: Freelance
Via le Plan 2, je pense que celà pourra créer des relations.
Certaines ne pourront, voudront pas m'embaucher.
Ou moi aussi je ne voudrais pas.
Mais il pourrait être suffisant de convenir de travail à temps partiel de
consulting.
Ce n'est pas nécessairement le plus intéressant.
Cependant, on peut créer une entreprise de consulting.
Typiquement pour toute la gestion de l'Auth.
Je suis un expert après tout.
*** TODO Creation site freelance anonyme
** Plan 4: Création de Produit
Pour créer un produit il faut des idées.
Il y a plusieurs stratégies ici.
Il faut le bon équilibre entre production et approfondissement.
L'idée pour que ça fonctionne est d'avoir une système où rien ne se perd.
Donc si le but est de faire un gros produit, il faut découper en beaucoup
de micro-produit, chacun pouvant être utilise et pouvant se vendre.
C'est la partie la plus intéressante.
Mais il faut trouver de l'énergie pour le temps libre.
Des idées, un stack, etc...
Une idée de fond, serait de créer quelque chose qui me dépasse.
Avoir un plan, visible, établi, et avoir un groupe de personne, pas
seulement moi travailler pour arriver à un but ultime.
Peut-être sur des dizaines, centaines d'années.
Peut importe.
Il faut voir grand.
*** TODO Etablir un plan, produit final, chemin, création.

View file

@ -0,0 +1,58 @@
:PROPERTIES:
:ID: c7091bd9-68d7-494b-9538-b09e54cc1d2d
:END:
#+TITLE: Org present test
#+Author: Yann Esposito
#+Date: [2020-11-21]
tags :: [[id:5579f7b0-3b00-4751-9211-9b9381481954][org-mode]]
source :: https://github.com/rlister/org-present
* Presentation 1
** Title
Yann Esposito
** First slide
yolo
** Second slide
#+BEGIN_SRC clojure
(defn foo [x] (:something x))
#+END_SRC
** Conclusion
the end.
* Presentations 2
** First slide
- This is the first slide.
- With an item list.
*** Sub 1.1
Hello
*** Sub 1.2
Sub
**** Sub 1.2.1
My
**** Sub 1.2.2
Old
*** Sub 1.3
Friend
** Slide 2
This is slide 1.2
#+BEGIN_SRC elisp
(defun foo () "foo")
#+END_SRC
** Slide 3
Slide
** Slide 4
With some text.
** The End

View file

@ -0,0 +1,122 @@
:PROPERTIES:
:ID: a7c653a8-0b90-43bc-85ea-71bbb28cf1dd
:END:
#+TITLE: [Meta RFC] RFC template
#+Author: Yann Esposito
#+Date: [2020-11-26]
tags :: [[file:../../../../../../.org/journal/2020-11-26--10-12-21Z--work.org][work]] [[file:../../../../../../.org/journal/2020-11-26--10-12-42Z--organisation.org][organisation]]
source ::
/Abstract/: Yesterday in our weekly meeting I discussed about how I would
like us to work with RFCs.
I would like to add this document to talk about RFCs.
So this is a meta document.
I hope not to trigger the need for a meta-meta-document ;).
I will try to keep it self-referencing by using its own description.
Closer to the quine :).
*Audience*: (Who's impacted?)
+ iroh team
+ managers
*RFC kind*:
+ team organisation
** Objective
*Improvement*: Write a proper RFC template.
* Proposed Solutions
** Template
This is the template I would like us to provide.
We should probably add that as a github template for issue.
So if you declare you want to create a new RFC issue you will be presented
this template.
The author will only need to fill the blanks and remove parts that are not
relevant.
*** [Title] <- name of the issue in github
/Abstract/: A little bit more than in the title
*Audience*: (Who's impacted?)
+ iroh team
+ ops
+ ui team
+ managers
+ customers
*RFC kind*: (remove non relevant part)
+ code convention (=> Audience; iroh-team only)
- ns naming convention
- position of args
- naming of args
- etc..
+ dev tooling (=> Audience; iroh-team, maybe ops)
- emacs mode
- cider
- clj-refactor
- CI
- scripts
- git commit message
- docker
- etc...
+ team organisation (=> Audience; iroh-team, managers)
- github dashboard, issue templates, github labels, etc...
+ technical specification (Audience not constrained);
The goal of a technical specification RFC is is to produce a
document containing:
- a functional specification
- a technical specification for our team
- technical specification(s) for other team if necessary (ops, UI, etc...)
- an execution plan
**** Objectives
- *Problems*:
- *New Features*:
- *Improve the current situation*:
**** Proposed Solutions
***** [Solution 1]
Describe one possible solution
+ pros
+ cons
***** [Solution 2]
Describe another possible solution
+ pros
+ cons
**** Furter Considerations and Remarks
Generic place to put comment not suitable in any other subsection.
Typically, we could add
+ Security
+ Communication
**** Plan
Optional, complete once a consensus has been reached.
Should contain a plan to achieve the solution.
** Further Considerations and Remarks
*** =dev= label
We already have a =dev= label we should probably use for RFC whose audience
is just the iroh team.
*** =Epic= label
We should continu to use the =Epic= label for issues whose goal is to
produce a specification document along with an execution plan.

View file

@ -0,0 +1,9 @@
:PROPERTIES:
:ID: 1be19813-6fb0-453a-8e4f-24fc47e10b3b
:END:
#+TITLE: work
#+Author: Yann Esposito
#+Date: [2020-11-26]
tags ::
source ::

View file

@ -0,0 +1,9 @@
:PROPERTIES:
:ID: 01c1b082-4795-4c75-aa32-10795ab3b4e9
:END:
#+TITLE: organisation
#+Author: Yann Esposito
#+Date: [2020-11-26]
tags ::
source ::

View file

@ -0,0 +1,9 @@
:PROPERTIES:
:ID: d009643c-24d9-445a-886b-21c2bb7f5bf4
:END:
#+TITLE: y-project
#+Author: Yann Esposito
#+Date: [2020-12-01]
tags ::
source ::

View file

@ -0,0 +1,34 @@
:PROPERTIES:
:ID: 9c39a4bf-34fd-4788-92be-fab18a109410
:END:
#+TITLE: The Huge Y Project
#+Author: Yann Esposito
#+Date: [2020-12-01]
- tags :: [[id:d009643c-24d9-445a-886b-21c2bb7f5bf4][y-project]] [[id:e63bb3e0-4598-42e5-ae29-a4e2466383c1][plan]]
- source :: [[file:../../../../../../.org/journal/2020-11-19--10-36-42Z--personal_plan.org][Personal Plan]]
* Quel projet?
- General AI?
- Space exploration?
- Infinite Energy?
- Huge code network?
- Eternal Life?
- Super Education and Learning? Make human smarts.
- Toward Utopia?
De tout ceci on peut déduire un projet qui dépasse de loin une vie humaine.
Et elles sont toutes reliées.
Tous ces objectifs ont le point commun d'être des idées classiques de SF.
La seule un peu originale et la plus risquée est celle de la gestion de
l'Humain via un environnement social positif.
Mais celà pose un problème éthique de décider à priori ce que serait de bon
ou de mauvais comportements humains.
Si nous devions faire un plan pour arriver au plus vite à une utopie.
Il y a plusieurs chemins possible.
L'un d'entre eux est de de se fabriquer notre propre Dieu.
Une être à la fois supérieur aux Hommes en tout point et bienveillant.
Et il semblerait donc naturel de se tourner vers la résolution de General
IA en premier.

View file

@ -0,0 +1,9 @@
:PROPERTIES:
:ID: e63bb3e0-4598-42e5-ae29-a4e2466383c1
:END:
#+TITLE: plan
#+Author: Yann Esposito
#+Date: [2020-12-01]
tags ::
source ::

View file

@ -0,0 +1,24 @@
:PROPERTIES:
:ID: 39c34896-dfcb-4cb7-89c3-4d25a3509b5d
:END:
#+TITLE: English Lesson
#+Author: Yann Esposito
#+Date: [2020-12-04]
tags :: [[id:9c215186-e64a-400d-a507-b888e4c9ada1][english]]
source ::
* Ted
https://www.italki.com/teacher/4869805
** Lesson 1 (30 min)
:PROPERTIES:
:ID: 1a758996-2bb0-4753-8365-34ca3ef0f940
:END:
Pronounciation,
French accent,
Grammatical errors,
Maybe a bit of vocabulary, but more about local expressions.
Tyipcally, Austin, Texas.

View file

@ -0,0 +1,9 @@
:PROPERTIES:
:ID: 9c215186-e64a-400d-a507-b888e4c9ada1
:END:
#+TITLE: english
#+Author: Yann Esposito
#+Date: [2020-12-04]
tags ::
source ::

View file

@ -0,0 +1,16 @@
:PROPERTIES:
:ID: 9146a858-cf08-4d5c-aff1-6c9a8a3db8ed
:END:
#+TITLE: CRUX Past Present and Future!
#+Author: Yann Esposito
#+Date: [2020-12-04]
tags :: [[file:../../../../../../.org/journal/2020-05-26--06-16-14Z--clojure.org][clojure]] [[file:../../../../../../.org/journal/2020-12-04--15-33-28Z--re_clojure_2020.org][re:clojure 2020]]
source ::
CRUX DB, with SQL-like querying with time index.
- =seek= find the first event after a date. Index by date.
- trick to reverse the timeline to lookup in reverse.
Query Indices

View file

@ -0,0 +1,9 @@
:PROPERTIES:
:ID: 1f9f0299-3d45-4724-83b5-6cb6df8e92f7
:END:
#+TITLE: re:clojure 2020
#+Author: Yann Esposito
#+Date: [2020-12-04]
tags :: [[file:../../../../../../.org/journal/2020-05-26--06-16-14Z--clojure.org][clojure]]
source :: https://reclojure.org

View file

@ -0,0 +1,11 @@
:PROPERTIES:
:ID: ce2ba4c0-6d58-4445-9c90-ed4a5f7a4125
:END:
#+TITLE: Ketu the Kafka Client we deserve
#+Author: Yann Esposito
#+Date: [2020-12-04]
tags :: [[file:../../../../../../.org/journal/2020-05-26--06-16-14Z--clojure.org][clojure]] [[file:../../../../../../.org/journal/2020-12-04--15-33-28Z--re_clojure_2020.org][re:clojure 2020]]
source ::
Presentation by Yonatan Elhanan

View file

@ -0,0 +1,115 @@
:PROPERTIES:
:ID: 9df0dad0-11e9-4c1a-ab27-ff2af21a8f78
:END:
#+TITLE: Effects system in Clojure
#+Author: Yann Esposito
#+Date: [2020-12-23]
tags :: [[id:debfbdb6-03a6-478e-8316-bce0119c0dd7][clojure]]
source ::
Warning foreword. The Effect system (see type à la carte) from the Freer
Monad article takes in root in a precise definition.
Here the notion of Effect system will probably feel totally skewed from the
perspective of this article.
But I will talk about how to use the same ideas in a dynamicly typed
programming language. And in particular Clojure.
On a high level perspective the end goal of an Effect system is to be able
to write program such that the semantic of the program will depend on the
context the program is executed in.
So for example, let's say you write a program like this:
#+begin_src clojure
(defn user-logged-in [user-id]
(if-let [user (get-user user-id)]
(do
(log "user found!")
(update-last-time-logged user))
(throw {:error :user-not-found
:user-id user-id})))
#+end_src
Generally you expect every =*-action= to be a well defined function.
You can take a look at that function and see what code will be execute.
Within an effect system, you would be able to write something like this:
#+begin_src clojure
(with-effects
[logs-eff
db-eff]
(my-action))
(with-effects
[test-logs-eff
test-db-eff]
(my-action))
#+end_src
You can imagine that =logs-eff= and =db-eff= to be /Effects/ the first
could be used to write logs and the second one will be able to access a DB.
And in the second bloc =test-logs-eff= would be a completely pure
implementation of the =logs= and a fake =db= implementation.
So that way of writting your code is extremely appealing because it will
help a lot to test it.
Mainly you only need to change the list of effects used in your main
function and you will have the same code you will use in production to only
use pure effect. And thus will be completely reproductible and easy to test.
Effects systems while used in some languages (like Purescript, and some
libs exists in Haskell) does not really appear to be a very hot subject in
the Clojure community.
One of the reason might be because in Clojure the concepts and design space
is occupied with different existing solutions to a similar solution.
Mainly, compononent and trapperkeeper libraries for example.
Unlike effects, component and trapperkeeper have a few advantages.
I will not talk too much about component as I never used it.
So I will use trapperkeeper to explain myself.
One major advantage is the ability to describe dependecies between
different Effects in trapperkeeper.
Typically, one can simply imagine you would like to create an Effect to
handle the persistence of your Users.
It would seems natural that to provide an API to manipulate Users it will
need a DB related effect.
And thus you will also probably need to describe the fact that you need the
DB effect to be "ready" before being able to provide the User Effect.
So instead of talking about "Effects" we are talking about "Services".
They start, they stop and you can use functions they provide and the
services will take care about their internal state.
This has similarities with object oriented programming, but it sounds a lot
better to use this system in a functional programming context.
The generic pattern will be something like:
#+begin_src clojure
(defprotocol Protocol
(fn-of-protocol [this params]))
(defservice ServiceName
Protocol
[OtherService1
OtherService2]
(init [this context])
(start [this context])
(stop [this context])
(fn-of-protocol [this params]))
#+end_src
To start an application you just need to provide a list of instances of
services to start.
So in order to test with subbed services you can write the code of pure
fake services that expose an identical Protocol than the service you wish
to stub.
That's nice. But this is not 100% a positive outcome.
One issue is that as this is a completely dynamic language you will lose
all the static analysis tools you are used to.
Typically you pass the method of the services to your methods.
And thus you end up only using higher level functions in your code.
You are no more able to discover which function will be really used.
This is a feature of that effect system.

View file

@ -0,0 +1,227 @@
:PROPERTIES:
:ID: 2f14e39a-3a0c-4ced-a04b-bacfec159b7e
:END:
#+TITLE: We've got depression all wrong. It's trying to save us.
#+Author: Dr Escalante
#+Date: [2020-12-27]
- tags :: [[id:ddb5dbe8-64cb-44d6-9149-6740d30635a3][psychology]]
- source :: https://www.psychologytoday.com/us/blog/shouldstorm/202012/we-ve-got-depression-all-wrong-it-s-trying-save-us
- ref :: https://news.ycombinator.com/item?id=25546043
* Weve Got Depression All Wrong. Its Trying to Save Us.
New theories recognize depression as part of a biological survival
strategy.
Posted Dec 22, 2020
For generations, we have seen depression as an illness, an unnecessary
deviation from normal functioning.
Its an idea that makes sense because depression causes suffering and even
death.
But what if weve got it all wrong?
What if depression is not an aberration at all, but an important part of
our biological defense system?
Depression is a courageous biological strategy to help us survive.
Source: ActionVance/Unsplash More and more researchers across specialties
are questioning our current definitions of depression.
Biological anthropologists have argued that depression is an adaptive
response to adversity and not a mental disorder.
In October, the British Psychological Society published a new report on
depression, stating that “depression is best thought of as an experience,
or set of experiences, rather than as a disease.”
And neuroscientists are focusing on the role of the autonomic nervous
system (ANS) in depression.
According to the Polyvagal Theory of the ANS, depression is part of a
biological defense strategy meant to help us survive.
The common wisdom is that depression starts in the mind with distorted
thinking.
That leads to "psychosomatic" symptoms like headaches, stomachaches, or
fatigue.
Now, models like the Polyvagal Theory suggest that weve got it backward.
Its the body that detects danger and initiates a defense strategy meant to
help us survive.
That biological strategy is called immobilization, and it manifests in the
mind and the body with a set of symptoms we call depression.
When we think of depression as irrational and unnecessary suffering, we
stigmatize people and rob them of hope.
But when we begin to understand that depression, at least initially,
happens for a good reason we lift the shame.
People with depression are courageous survivors, not damaged invalids.
Laura believes that depression saved her life.
Most of the time her father only hurt her with words, but it was when she
stood up to him that Lauras dad got dangerous.
Thats when hed get that vicious look in his eyes.
More than once his violence had put Lauras life at risk.
Lauras father was so perceptive, that he could tell when she felt
rebellious on the inside even when she was hiding it.
And he punished her for those feelings.
It was the depression that helped Laura survive.
Depression kept her head down, kept her from resisting, helped her accept
the unacceptable.
Depression numbed her rebellious feelings.
Laura grew up at a time where there was no one to tell, nowhere for her to
get help outside her home.
Her only strategy was to survive in place.
And she did.
article continues after advertisement Looking back, Laura does not regret
her childhood depression.
She values it.
Going through her own healing process and working with her therapist helped
her see how depression served her.
Lauras story is stark.
Its ugly.
And it helps us understand that even though depression may happen for a
good reason, that does not make it a good thing.
Laura suffered deeply and describes the pain of her hopelessness vividly.
Her depression was a bad experience that started as the last resort of a
good biological system.
* Depression starts with immobilization
According to the Polyvagal Theory, discovered and articulated by
neuroscientist Stephen Porges, our daily experience is based on a hierarchy
of states in the autonomic nervous system.
When the ANS feels safe, we experience a sense of well-being and social
connection.
Thats when we feel like ourselves.
But the autonomic nervous system is also constantly scanning our internal
and external environment for signs of danger.
If our ANS detects a threat or even a simple lack of safety, its next
strategy is the fight or flight response which we often feel as anxiety.
Sometimes the threat is so bad or goes on for so long, that the nervous
system decides there is no way to fight or to flee.
At that point, there is only one option left: immobilization.
The immobilization response is the original biological defense in higher
animals.
This is the shutdown response we see in reptiles.
Also known as the freeze or faint response, immobilization is mediated by
the dorsal vagus nerve.
It turns down the metabolism to a resting state, which often makes people
feel faint or sluggish.
Owlie Harring/Unsplash
The immobilization response dulls pain.
Source: Owlie Harring/Unsplash Immobilization has an important role.
It dulls pain and makes us feel disconnected.
Think of a rabbit hanging limply in the foxs mouth: that rabbit is
shutting down so it wont suffer too badly when the fox eats it.
And the immobilization response also has a metabolic effect, slowing the
metabolism and switching the body to ketosis.
Some doctors speculate that this metabolic state could help healing in
severe illness.
In humans, people often describe feeling "out of their bodies" during
traumatic events, which has a defensive effect of cushioning the emotional
shock.
This is important because some things are so terrible, we dont want people
to be fully present when they happen.
So the immobilization response is a key part of the biological defense, but
it is ideally designed to be short term.
Either the metabolic shut down preserves the organism, i.e.
the rabbit gets away, or the organism dies and the fox eats the rabbit.
But if the threat continues indefinitely and there is no way to fight or
flee, the immobilization response continues.
And since the response also changes brain activity, it impacts how peoples
emotions and their ability to solve problems.
People feel like they cant get moving physically or mentally, they feel
hopeless and helpless.
Thats depression.
* Does depression have value?
Its easy to see why Laura's childhood circumstances would set off the
immobilization response, and even how it might have helped her survive.
But why does it happen in people with less obvious adversity?
Our culture tends to think of depression in the person who finds work too
stressful as a sign of weakness.
Self-help articles imply that they just need more mental toughness and they
could lean in and solve it.
Even some therapists tell them that their depression is a distorted
perception of circumstances that arent so bad.
But that is not how the body sees it.
The defense responses in the autonomic nervous system, whether fight/flight
or immobilization are not about the actual nature of the trigger.
They are about whether this body decides there is a threat.
And that happens at a pre-conscious point.
The biological threat response starts before we think about it, and then
our higher-level brain makes up a story to explain it.
We dont get to choose this response; it happens before we even know it.
Studying anxiety has revealed that many modern circumstances can set off
the fight or flight response.
For instance, low rumbling noises from construction equipment sound to the
nervous system like the growl of a large predator.
Better run.
Or feeling like they are being evaluated at school removes kids' sense of
safety and triggers fight or flight.
Better give the teacher attitude or avoid homework.
And to most of us, fight or flight feels like anxiety.
Eventually, if these modern triggers last long enough, the body decides it
cant get away.
Next comes immobilization which the body triggers to defend us.
According to Porges, what we call depression is the cluster of emotional
and cognitive symptoms that sits on top of a physiological platform in the
immobilization response.
Its a strategy meant to help us survive; the body is trying to save us.
Depression happens for a fundamentally good reason.
And that changes everything.
When people who are depressed learn that they are not damaged, but have a
good biological system that is trying to help them survive, they begin to
see themselves differently.
After all, depression is notorious for the feelings of hopelessness and
helplessness.
But if depression is an active defense strategy, people may recognize they
are not quite so helpless as they thought.
* Shifting out of immobilization
If depression is the emotional expression of the immobilization response,
then the solution is to move out of that state of defense.
Porges believes it is not enough to simply remove the threat.
Rather, the nervous system has to detect robust signals of safety to bring
the social state back online.
The best way to do that?
Social connection.
One of the symptoms of depression is shame, a sense of having let other
people down or being unworthy to be with them.
When people are told that depression is an aberration, we are telling them
that they are not part of the tribe.
They are not right, they dont belong.
Thats when their shame deepens and they avoid social connection.
We have cut them off from the path that leads them out of depression.
It is time that we start honoring the courage and strength of depressed
people.
It is time we start valuing the incredible capacity of our biology to find
a way in hard times.
And it is time that we stop pretending depressed people are any different
than anyone else.
* References
- Porges, Stephen. (Apr 2009) The polyvagal theory:
New insights into adaptive reactions of the autonomic nervous system.
Cleve Clin J Med.
- Porges, Stephen. (Feb 2007) The polyvagal perspective
Biol Psychology.

View file

@ -0,0 +1,4 @@
:PROPERTIES:
:ID: ad2aac23-4550-4f9a-acf3-3bd2c5d0cb5e
:END:
#+TITLE: journal

View file

@ -0,0 +1,5 @@
:PROPERTIES:
:ID: a2225047-7563-4e4e-a031-7f69e060de6b
:END:
#+TITLE: learning

View file

@ -0,0 +1,388 @@
:PROPERTIES:
:ID: 5579f7b0-3b00-4751-9211-9b9381481954
:END:
#+TITLE: org-mode
#+Author: Yann Esposito
tags :: [[id:e459f88b-5f6d-4547-b6b2-08d4815c1ede][emacs]]
* tips
- ~(org-num-mode)~ to show numbers
* org-agenda
To display the list of clocked tasks in agenda, type =L= to pass in =org-agenda-log-mode=.
* configuration
#+begin_src elisp
;; function needed to have nice name displayed by helm
(defun org-capture-todo ()
"Capture a todo."
(interactive)
(org-capture nil "t"))
(defun org-capture-pause ()
"Capture a pause."
(interactive)
(org-capture nil "p"))
(defun org-capture-review ()
"Capture a review."
(interactive)
(org-capture nil "r"))
(defun org-capture-work ()
"Capture a work."
(interactive)
(org-capture nil "w"))
(defun org-capture-meeting ()
"Capture time spend during meeting."
(interactive)
(org-capture nil "m"))
(defun org-capture-email ()
"Capture time spend in email."
(interactive)
(org-capture nil "e"))
(defun org-capture-chat ()
"Capture time spend in chat."
(interactive)
(org-capture nil "c"))
(defun fci-mode-override-advice (&rest args)
"https://github.com/alpaker/fill-column-indicator/issues/45.")
(defun org-publish-force ()
"Force publish blog by deleting the cache."
(interactive)
(save-excursion
(delete-directory org-publish-timestamp-directory t)
(org-publish "blog" t)))
(defun org-publish-current-file-keep-position ()
"Force publish blog by deleting the cache."
(interactive)
(save-excursion
(org-publish-current-file)))
(defun org-publish-current-project-keep-position ()
"Force publish blog by deleting the cache."
(interactive)
(save-excursion
(org-publish-current-project)))
(defun org-publish-assets ()
"Force publish assets."
(interactive)
(save-excursion
(org-publish "assets" t)))
(defun org-publish-draft ()
"Force publish assets."
(interactive)
(save-excursion
(org-publish "draft" t)))
(defun org-mode-config ()
"Org-mode."
;; EXPERIMENTAL
(setq helm-org-rifle-org-directories "~/.org/")
(setq helm-org-rifle-org-directories-filename-regex "\.org(\.gpg)?$")
(setq helm-org-rifle-directories-recursive t)
;; EXPERIMENTAL
(setq org-todo-keywords
'((sequence "TODO(t)"
"IN-PROGRESS(p)"
"|"
"DONE(d)"
"HOLD(h@/!)"
"CANCELED(c@/!)")
(sequence "|" "PAUSE(p)" "CHAT(c)" "EMAIL(e)" "MEETING(m)" "REVIEW(r)")))
(require 'org-download)
(setq-default org-download-image-dir "~/.org/img")
;; generate stable ids for headers, human readable, github-like
(require 'org-auto-id)
;; Align tags
(add-hook 'focus-in-hook
(lambda () (progn
(setq org-tags-column 60))
(org-align-all-tags)))
(add-hook 'focus-out-hook
(lambda () (progn
(setq org-tags-column 60))
(org-align-all-tags)))
;; org-sticky-full-path
(setq org-sticky-header-full-path 'full)
(setq org-sticky-header-heading-star ">")
(setq org-sticky-header-outline-path-separator "/")
;; src block indentation / editing / syntax highlighting
(setq org-src-fontify-natively t
org-src-window-setup 'current-window ;; edit in current window
org-src-strip-leading-and-trailing-blank-lines t
org-src-preserve-indentation t ;; do not put two spaces on the left
org-src-tab-acts-natively t)
;; Org Journal
(setq org-journal-dir "~/.org/journal/")
(setq org-journal-file-type "daily")
(setq org-journal-file-format "%Y-%m-%d.org")
(evil-leader/set-key "ooj" 'org-journal-new-entry)
(defvar birth-date "1977-03-05")
(defun str-time-to-year-float (date-str)
(/ (float-time
(apply 'encode-time
(mapcar (lambda (x) (if (null x) 0 x))
(parse-time-string date-str))))
(* 365.25 24 60 60)))
(defun y-date ()
"Number of year since my birth"
(let ((y (- (str-time-to-year-float (format-time-string "%Y-%m-%d" (current-time)))
(str-time-to-year-float birth-date))))
(format "∆y=%.2f (%d)" y (floor (* 365.25 y)))))
(defun my/journal-template ()
(mapconcat 'identity
`(,(format "#+Title: Journal (%s - %s)"
(format-time-string "%Y-%m-%d" (current-time))
(y-date))
"#+Author: Yann Esposito"
,(format "#+Date: [%s]" (format-time-string "%Y-%m-%d" (current-time)))
"#+STARTUP: showeverything"
""
"- tags :: [[id:ad2aac23-4550-4f9a-acf3-3bd2c5d0cb5e][journal]] "
""
"* Resumé Journée"
""
" | sommeil | ?/5 | horrible -> comme un bébé |"
" | activité φ | ?/5 | au lit -> activité sportive |"
" | nourriture | ?/5 | malbouffe -> saine |"
" | humeur | ?/5 | exécrable -> excellente |"
" | interêt | ?/5 | habituel -> exceptionel |"
""
"- Faits positifs"
"- Faits marquants"
"- Résumé des discussions intéressantes"
"- Réflexions/Éssais")
"\n"))
(setq org-journal-date-format "%Y-%m-%d %A")
(setq org-journal-file-header 'my/journal-template)
;; Org Roam
(setq org-roam-directory "~/.org/journal")
(setq org-roam-graph-viewer "/System/Applications/Preview.app/Contents/MacOS/Preview")
(setq org-roam-buffer-position 'left)
;; (setq org-roam-buffer "*my-buffer-name*")
(setq org-roam-buffer-width 0.4)
;; (setq org-roam-link-title-format "R:%s")
(setq org-roam-capture-templates
'(("d" "default" plain (function org-roam--capture-get-point)
"%?"
:file-name "%(format-time-string \"%Y-%m-%d--%H-%M-%SZ--${slug}\" (current-time) t)"
:head "#+TITLE: ${title}\n#+Author: Yann Esposito\n\ntags ::\nsource ::\n"
:unnarrowed t)))
(evil-leader/set-key "orr" 'org-roam)
(evil-leader/set-key "orf" 'org-roam-find-file)
(evil-leader/set-key "ori" 'org-roam-insert)
(evil-leader/set-key "orb" 'org-roam-switch-to-buffer)
(evil-leader/set-key "org" 'org-roam-graph)
(org-roam-mode +1)
;; Org Capture
;; Org capture is really neat. So for now I use these infos.
;; *** Templates
;; You can specify your own properties in the property list for the template, and then you can access those properties with plist-get and org-capture-plist. Here's a brief example:
;;
;; (defun my/expense-template ()
;; (format "Hello world %s" (plist-get org-capture-plist :account)))
;; (setq org-capture-templates '(("x" "Test entry 1" plain
;; (file "~/tmp/test.txt")
;; (function my/expense-template)
;; :account "Account:Bank")
;; ("y" "Test entry 2" plain
;; (file "~/tmp/test.txt")
;; (function my/expense-template)
;; :account "Account:AnotherBank")))
(setq org-capture-templates
'(("t" "todo" entry (file "~/.org/TODO.org")
"** TODO %?\n %U\n %a\n")
;; time tracker
("c" "chat" entry (file "~/.org/tracker.org")
"** CHAT %?\n %U\n %a\n" :clock-in t :clock-resume t)
("e" "email" entry (file "~/.org/tracker.org")
"** EMAIL %?\n %U\n %a\n" :clock-in t :clock-resume t)
("m" "meeting" entry (file "~/.org/tracker.org")
"** MEETING %? :meeting:\n %U\n %a\n" :clock-in t :clock-resume t)
("p" "pause" entry (file "~/.org/tracker.org")
"* PAUSE pause %?\n %U\n" :clock-in t :clock-resume t)
("r" "review" entry (file "~/.org/tracker.org")
"* REVIEW %?\n %U\n %a\n" :clock-in t :clock-resume t)
("w" "work" entry (file "~/.org/tracker.org")
"** IN-PROGRESS %?\n %U\n %a\n" :clock-in t :clock-resume t)))
(evil-leader/set-key "oc." 'org-capture)
(evil-leader/set-key "oct" 'org-capture-todo)
(evil-leader/set-key "occ" 'org-capture-chat)
(evil-leader/set-key "oce" 'org-capture-email)
(evil-leader/set-key "ocm" 'org-capture-meeting)
(evil-leader/set-key "ocp" 'org-capture-pause)
(evil-leader/set-key "ocr" 'org-capture-review)
(evil-leader/set-key "ocw" 'org-capture-work)
(evil-leader/set-key "ocof" 'org-capture-refile)
(evil-leader/set-key "ocol" 'org-capture-goto-last-stored)
(evil-leader/set-key "oxF" 'org-publish-force)
(evil-leader/set-key "oxf" 'org-publish-current-file-keep-position)
(evil-leader/set-key "oxp" 'org-publish-current-project-keep-position)
(evil-leader/set-key "oxa" 'org-publish-assets)
(evil-leader/set-key "oxd" 'org-publish-draft)
;; *** Projectile
(setq org-projectile-file "TODO.org")
;; *** Refile
;; to sync with beorg on iCloud
;; create a symlink named "~/.org" to iCloud dir for beorg
(when (not (file-symlink-p "~/.org"))
(if (not (file-exists-p "~/.org"))
(let ((icloudpath
(concat (getenv "HOME")
"/Library/Mobile Documents/iCloud~com~appsonthemove~beorg/Documents/org")))
(f-symlink icloudpath "~/.org"))
(message "%" "~/.org exists and is not a symlink to iCloud for beorg")))
;; Refile to either the =refile.org= file or to =agenda.org= org =standup.org=
(setq org-refile-target-files '("~/.org/tracker.org"))
(setq org-refile-targets
'((nil :maxlevel . 5)
(org-refile-target-files :maxlevel . 5)))
;; *** Agenda
(setq org-agenda-files '("~/.org/TODO.org" "~/.org/tracker.org"))
;; ** Org Annotate
;; Ability to take annotate some files, can of double usage with org-capture.
;; Still, I keep that keyboard shortcut here.
(defun my-org-settings ()
(org-display-inline-images)
(spacemacs/toggle-auto-fill-mode-on)
(setq fill-column 75)
(abbrev-mode)
(org-indent-mode))
(add-hook 'org-mode-hook #'my-org-settings)
(evil-leader/set-key "oa" 'org-annotate-file)
(setq org-annotate-file-storage-file "~/.org/annotations.org")
;; ** Org colums
;; I can pass in org-column view mode with SPC-o-v-c
(evil-leader/set-key "ovc" 'org-columns)
(setq org-columns-default-format
"%TODO %3PRIORITY %40ITEM(Task) %17Effort(Estimated Effort){:} %CLOCKSUM %8TAGS(TAG)")
;; ** Deft
(setq deft-extensions '("org" "gpg" "md" "txt"))
(setq deft-recursive t)
(setq deft-use-filter-string-for-filename t)
(setq deft-default-extension "org")
(setq deft-directory "~/.org")
;; ** Look and Feel
;; I like to have something different than ellipsis because I often use them
;; myself.
(setq org-ellipsis "⤵")
;; *** Colors
(setq solaryzed-yellow "#b58900")
(setq solaryzed-orange "#cb4b16")
(setq solaryzed-red "#d30102")
(setq solaryzed-magenta "#d33682")
(setq solaryzed-violet "#6c71c4")
(setq solaryzed-blue "#268bd2")
(setq solaryzed-cyan "#2aa198")
(setq solaryzed-green "#859900")
;; **** Spacemacs bug workaround
;; To handle a colorization bug; see https://github.com/syl20bnr/spacemacs/issues/9950
(add-hook 'org-mode-hook (lambda () (hl-todo-mode -1) nil))
;; **** Rainbow colors
(custom-theme-set-faces 'user `(org-level-1 ((t (:foreground ,solaryzed-green)))))
(custom-theme-set-faces 'user `(org-level-2 ((t (:foreground ,solaryzed-cyan)))))
(custom-theme-set-faces 'user `(org-level-3 ((t (:foreground ,solaryzed-blue)))))
(custom-theme-set-faces 'user `(org-level-4 ((t (:foreground ,solaryzed-violet)))))
(custom-theme-set-faces 'user `(org-level-5 ((t (:foreground ,solaryzed-magenta)))))
(custom-theme-set-faces 'user `(org-level-6 ((t (:foreground ,solaryzed-red)))))
(custom-theme-set-faces 'user `(org-level-7 ((t (:foreground ,solaryzed-orange)))))
(custom-theme-set-faces 'user `(org-level-8 ((t (:foreground ,solaryzed-yellow)))))
(setq org-priority-faces `((?A . (:background ,solaryzed-red :foreground "white" :weight bold))
(?B . (:foreground ,solaryzed-yellow))
(?C . (:foreground ,solaryzed-cyan))))
;; **** Keywords colors
(setq org-todo-keyword-faces
`(("TODO" . (:foreground ,solaryzed-orange :weight bold))
("IN-PROGRESS" . (:foreground ,solaryzed-yellow :weight bold))
("HOLD" . (:foreground ,solaryzed-violet :weight bold))
("DONE" . (:foreground ,solaryzed-green :weight bold))
("CANCELED" . (:foreground ,solaryzed-green :weight bold))
("CHAT" . (:foreground ,solaryzed-blue :weight bold))
("EMAIL" . (:foreground ,solaryzed-blue :weight bold))
("MEETING" . (:foreground ,solaryzed-blue :weight bold))
("PAUSE" . (:foreground ,solaryzed-cyan :weight bold))
("REVIEW" . (:foreground ,solaryzed-blue :weight bold))))
;; Org Babel
(org-babel-do-load-languages
'org-babel-load-languages
'(;; other Babel languages
(shell . t)
(haskell . t)
(plantuml . t)))
(setq org-plantuml-jar-path "~/bin/plantuml.jar")
;; https://github.com/alpaker/fill-column-indicator/issues/45
(advice-add 'org-html-fontify-code :around
(lambda (fun &rest args)
(advice-add 'fci-mode :override #'fci-mode-override-advice)
(let ((result (apply fun args)))
(advice-remove 'fci-mode #'fci-mode-override-advice)
result)))
;; FIX easytemplates issue
;; https://github.com/syl20bnr/spacemacs/issues/11798
(when (version<= "9.2" (org-version))
(require 'org-tempo)))
#+end_src

View file

@ -0,0 +1,5 @@
:PROPERTIES:
:ID: 1a12a62f-f96f-48de-b634-bd548654c238
:END:
#+TITLE: roam

View file

@ -0,0 +1,181 @@
:PROPERTIES:
:ID: 0a550da5-55e8-4cf4-ae29-1aa0240ed27d
:END:
#+TITLE: voeux 2021 alexandre
#+Author: Yann Esposito
#+Date: [2021-01-03]
- tags ::
- source ::
Bonjour Alexandre, je te souhaite à toi et toute ta famille une très bonne
année 2021 !
Je vous souhaite à tous et à votre famille une très bonne santé surtout
dans le climat actuel.
De trouver un bon équilibre entre la vie familiale, les passions et le
travail.
Et je me permet d'ajouter à ce mail une réflexion technique entre Haskell
et Clojure qui je l'espère t'inspirera.
Bien que je n'écrive plus vraiment de nouvel article sur
Haskell/Purescript, j'ai passé pas mal de temps à réfléchir à comment
architecturer du code dans ces langages et Clojure.
J'ai l'impression qu'une solution qu'on utilise actuellement en Clojure
bien qu'à première vue très inférieure aux solutions proposées par
Haskell/Purescript sont en fait supérieure lorsqu'on les regardes selon le
bon angle.
L'idée de fond c'est que les systèmes d'effets/Free Monad (et les
sous-systèmes, style MTL, handler pattern) sont des cas particuliers
restreints de ce que l'on peut obtenir avec un système de "Services".
Si on regarde l'intérêt de ces systèmes d'organisation de code --
le plus évolué étant les Free Monads et les systèmes d'effets --
leur objectif est toujours plus ou moins le même.
Changer le comportement du même bloc de code en fonction du contexte
d'exécution.
En gros si on prend une function qui ressemble à:
#+begin_src haskell
my_function arg1 ... argn = do
x1 <- action1 arg1 .. argn
x2 <- action2 arg1 .. argn x1
...
z <- actionK arg1 .. argn x1 .. x<K-1>
return z
#+end_src
les =action1= à =actionK= auront des comportement différents en fonction du
contexte dans lequel il va être initialisé.
Dans le cas de Haskell, on fait au mieux pour déterminer le contexte à
compile time en utilisant les types.
Du genre:
#+begin_src haskell
main = do
effect1 <- initEffect1
effect2 <- initEffect2 effect1
...
effectM <- initEffectM effect1 ... effect<M-1>
runWithEffects [effect1,effect2,...,effectM] my_function
#+end_src
Ce système présente ainsi beaucoup d'avantanges:
1. mettre toute la "business logic" dans la fonction =my_function= en se
débarrassant des détails techniques au mieu en les envoyant dans les
"Effets".
2. Pouvoir facilement changer les Effects par des Effects purs et pouvoir
ainsi écrire des tests déterministes et reproductibles aisément.
3. Controller "par le haut" les sous-effets disponibles dans certaines
branches du code. On peut du coups facilement contraindre et voir que
certaines fonction ne pourront jamais accéder à la DB par exemple.
Par contre ce système à un coût sur les performances.
Je pense que le coût est négligeable dans la majorité des cas et qu'il
s'agit d'"Haskell circle jerking" lorsque les gens refusent d'utiliser
des systèmes d'effects pour cette raison.
Si on va au bout de l'utilisation de tel système en réalité on voit qu'il
faut, plutôt qu'utiliser des systèmes tout prêt à l'emploi, se créer
beaucoup d'effects maison pour en tirer le meilleur parti.
Typiquement on va avoir des effects avec leur pendant pur qui devraient
probablement être standards comme un effect de Log, d'accès complet à une
DB peut-être ?
Mais assez vite, on a envie de se fabriquer des Effets spécialisé au
domaine de son application.
Typiquement, si on fait de la gestion d'utilisateur on va créer un effet
pour la gestion d'utilisateurs plutôt que filer un Effet complet d'accès à
la DB.
Ce qui permet de s'assurer que des fonctions n'auront accès qu'aux tables
de la DB utilisées pour les utilisateurs et pas pour les tables destinées à
d'autres buts etc...
Et c'est là qu'apparaît la première limitation des systèmes d'Effets.
Les effets ont des dépendances entre eux.
L'effet =UserEffect= doit dépendre de l'effect =DBEffect=.
Mais probablement aussi de l'effet qui permet d'écrire des logs, et de pas
mal d'autres.
Et c'est à la lumière de voir ces effects comme des outils d'applications
pragmatiques et pas juste des "Effect algébriques" que l'on voit apparaître
un besoin de gestion de ces dépendances.
Un aspect important devient donc la gestion de l'ordre d'init et de stop de
tous ces effets.
En effet, pour faire =initUserEffect= il faudra lui passer en paramètre des
effets dejè instanciés (et donc initialisés) pour les logs et la DB.
Un premier problème est donc que changer/modifier des dépendances entre
effet dans un point du système revient à imposer une modification manuelle
du code dans tous les effets dépendants.
Mais aussi en particulier le code de l'init du système devient lourd à
gerrer alors qu'il existe une solution simple.
Je pense que Tardis pourrait être utile dans ce cas, mais, ça ne me semble
pas encore assez facile.
Même avec tardis, il me semble qu'il faut savoir si un effet doit arriver
avant ou après.
Là on souhaiterai pouvoir utiliser la lazyness pour une gestion
automatique des dépendances.
En réalité l'API la plus souhaitable serait de laisser la gestion de
l'ordre des dépendance et leur appel laissé à un système automatique.
Ainsi au lieu d'avoir
#+begin_src haskell
main = do
confEffect <- initConfEffect "config.dhall"
dbEffect <- initDBEffect confEffect
userEffect <- initUserEffect dbEffect confEffect
runWithEffects [confEffect,dbEffect,userEffect] myFunction
#+end_src
Il semble préférable d'écrire:
#+begin_src haskell
main = do
let effects = [ ConfEff, DBEff, UserEff ]
runWithEffects effects myFunction
#+end_src
Sans avoir à se poser la question de quel effet doit utiliser quel autre.
Ce sont des détails qui doivent être dans les Effets eux-même et pas donné
à une gestion manuelle par l'utilisateur.
Et c'est exactement ce que les systèmes de services font en clojure.
Il en existe plusieurs.
Component [fn:1] et Trapperkeeper [fn:2].
Je travaille avec le second.
Evidement en Clojure tout se gère en runtime.
Mais si j'ai bien lu et compris la présentation sur les différents systèmes
d'Effets il semble difficile de faire beaucoup mieux en Haskell.
Il est en effet très difficile de faire descendre dans le code le détail
qui permet de savoir dans quel contexte il sera exécuté et changer le code
pour utiliser seulement le bon contexte et l'optimiser en conséquence.
Finalement, j'ai vu des essais pour exploiter ces idées en Haskell.
Mais elles sont toutes faiblardes et échouent.
J'ai moi-même essayé.
Le probléme de fond vient du fait qu'il est quasi impossible de trouver un
type qui soit à la fois assez generique pour matcher ce que doit faire un
Service et assez précis pour être utile lors du typage du code.
Voici donc un point qui m'agace au plus haut point.
D'habitude je préfère défendre les approches à la Haskell.
Mais pour le coups, impossible de faire aussi bien que Clojure et de plus
sur un des sujets les plus chauds actuellement dans la communauté.
Peut-être que l'écriture de cet email me donnera l'élan nécessaire pour
communiquer cette constation et le publier sur r/haskell :).
Quoi qu'il en soit.
Je te souhaite encore une très bonne année 2021 !
Yann.
[fn:1] https://github.com/stuartsierra/component
[fn:2] https://github.com/puppetlabs/trapperkeeper

View file

@ -0,0 +1,196 @@
:PROPERTIES:
:ID: 9af1dcc8-08d5-4f30-a7cb-6395302771dc
:END:
#+TITLE: The Service Pattern
#+Author: Yann Esposito
#+Date: [2021-03-14]
- tags :: [[id:bec11f07-ffed-487b-9059-bdf6696548ab][programming]] [[id:155859f9-3f3c-4cea-bce4-70f24fca05fa][functional programming]] [[id:debfbdb6-03a6-478e-8316-bce0119c0dd7][clojure]] [[id:28b1b988-b2de-46aa-9a47-78a94aa5e2ce][haskell]] [[id:d2a59fd6-947a-4ce5-9673-1494268678c0][architecture]]
- source ::
- related :: [[id:9df0dad0-11e9-4c1a-ab27-ff2af21a8f78][Effects system in Clojure]]
* Introduction
The question about code structure and organization is one of the most
prolific one.
In this article I describe one possible solution in this huge design space.
First of all, I will focus on a functional programming pattern.
But I think the lessons could be extended to any generic programming
language.
** Design Patterns
Before explaining the pattern I would like to take the time to provide a
few distinctions between different programming language patterns.
Quite often, one fundamental question very important when choosing a
pattern for your code is about find the correct level of the pattern.
There are a tower of patterns and meta-patterns.
For example in imperative programming not using =goto= statement was
considered as a programming pattern.
Once that idea was accepted there were work done on /Object Oriented
Programming/.
And OOP was considered as a programming language pattern.
But OOP while already providing quite a constraint on your code
architecture was enough not sufficient.
OOP alone leave a lot of room in the design space.
Thus we've seen numerous "OOP Design Pattern".
That used the underlying OOP paradigm as a base and constructed
abstractions over it.
Even with all those Design Pattern it was up to the programmer to decide
which one applies or not.
Quite often there is not a single path easy to detect correct design
pattern.
Mainly the very hard part in programming is choosing the right abstraction.
There are other code structures to choose from.
In functional programming there are FRP.
Here also there are stories about how design pattern once chosen make a
natural evolution toward meta-design-patterns.
Mainly design pattern that rely on a lower level design pattern.
If you take the story behind Elm Architecture you can see it.
At first there were FRP.
Elm removed the behavior from FRP to only deal with events to simplify the
model.
But with FRP the author clearly though it was a good-enough design pattern.
But the design space was a bit too big.
So it was difficult to take the right decision.
So a natural meta-pattern appeared.
It is [[https://guide.elm-lang.org/architecture/][/Elm Architecture/]].
So while Elm imposed so structure of your program using static types to
prevent common coding mistakes and enforce a specific code structure.
Elm did not constrain the file organization, the number of buffers to
send/receive events, the way they should talk/listen between each other.
So Elm Architecture is a non enforced meta structure for your code
application.
Unlike the underlying layer of architecture.
But what Elm Architecture provide is a higher level architecture that will
help your program to "scale" and whose natural organization is easy to
understand.
So Elm Architecture is more of a proposal that will potentially have
drawback.
Typically, if you change the organization of your views, it could cost a
lot of change in your code.
But most of the time this is acceptable and preferable.
Because, the Elm Architecture is simple to understand and quite often this
is not such a big deal.
Not using the Elm Architecture paradigm put you at risk to end up in a
spaghetti code hell.
But of course there is a tension between code size/DRYness and easy to
understand code organization/architecture.
If you have a short code base, DRYness could probably be preferable.
Because a bit of disorganization and shortcuts will not be unbearable.
But as the size of your code grow, it will become more and more prevalent
that a strict code organization with perhaps more repetitions and a bit
more conventions implying more lines of code become preferable because it
minimize the risk of surprise between different part of the code.
Clearly, Elm Architecture is selling compactness of your code for an easier to
read, discover and understand overall code architecture.
So we could probably say the same for multiple proposed code architecture
mechanism in the Haskell world.
Typically we had:
- no org => spaghetti code
- big Monad => lack of composability, leak of abstraction everywhere
- Handler Pattern
- MTL
- RIO
- Free Monads (Effects)
After this first short introduction I hope it is clear that, it will be
quite impossible to discover a "best code architecture".
There are multiple code architecture and the bigger your code the more
constraint you must probably put in your code which will make a lot of code
look cumbersome from people used to smaller code size.
That being said, there are code architecture that could be probably be
considered fully superior to other ones.
Imagine a code architecture with the same properties but better in some
dimensions without worse evaluation in some dimension.
Typically, a code architecture is preferable to no code architecture as
soon as your code become big enough and you need to not work alone.
For example I would argue that the Purescript Halogen architecture is
probably strictly superior to the Elm Architecture.
Because it contains Elm Architecture but also contains a shortcut mechanism
which is entirely enforced via static types..
The "cost" of these shortcuts are quite limited because you are helped with
the types provided by the Halogen framework.
One big advantage is the ability to not pay the full price of the Elm
Architecture while moving a component.
* The Service Pattern-level 1
The service pattern should be easy to grasp with a few concrete examples.
So the Service Pattern you split your application in components with
internal state and a clear interface.
It looks a lot like OOP but it isn't.
The inner state is global unlike in OOP where every object has an internal
state.
So the number of isolated state should not grow dynamically but should be
mostly static after the runtime init.
*Important* Every component has a set of direct sub-service dependencies.
Every component have an inner state.
So you write components like this:
1. declare a component interface that could access the internal state
2. declare a set of sub-component your component need
3. declare an init function that could consider every sub-component has
already been initialized
4. declare a stop function that will be called in case your component is no
more needed to cleanup the state.
Generally a service should be a long-running system like a server.
Using this design you could declare an unordered list of components that
your application need to launch and you could potentially only enable part
of them you just need to take care that every enabled component also have
every of its sub-component enabled.
This look easy, but I dare you to achive this in Haskell.
Because it relies a lot on runtime properties.
This is frustrating as we feel we could put a lot of static informations.
What does this buy us?
This description might not provide the full view about the feature we could
get from this design.
1. easy testing. Exactly like an effect system you could switch the
implementation of sub-modules to use pure (and thus reproducible)
functions during your tests.
#+begin_src clojure
(defprotocol UserService
(get-user [user-id] "returns a user entity from its id"))
(defservice user-service
[[:ConfigService get-in-config]
[:StoreService read-entity]]
(init [this context]
(into context
{:raw-db-get-user
(fn [user-id]
(read-entity db-conf user-id))}))
(get-user [this user-id]
((:raw-db-get-user (get-context this)) user-id)))
(defservice stub-user-service
(init [_ context] context)
(get-user [user-id] {:id "fake-user-id" ,,,}))
(def test
(start-app [config-service store-service stub-user-service
my-service]
(test-my-service)))
#+end_src

View file

@ -0,0 +1,9 @@
:PROPERTIES:
:ID: d2a59fd6-947a-4ce5-9673-1494268678c0
:END:
#+TITLE: architecture
#+Author: Yann Esposito
#+Date: [2021-03-20]
- tags :: [[id:bec11f07-ffed-487b-9059-bdf6696548ab][programming]]
- source ::

View file

@ -0,0 +1,70 @@
:PROPERTIES:
:ID: f220f537-574c-4545-8727-6a18efcac8a0
:END:
#+TITLE: Cross Domain Sessions
#+Author: Yann Esposito
#+Date: [2021-03-30]
- tags :: [[id:299643a7-00e5-47fb-a987-3b9278e89da3][Auth]]
- source :: https://www.quora.com/How-does-Google-achieve-single-sign-on-between-different-domains-such-as-YouTube-and-Gmail
Q: How does Google achieve single sign-on between different domains such as
YouTube and Gmail?
I assume your question refers to SSO on browser
Short Version:
Single Sign On between various google apps is achieved via cookies.
If you check the cookies that are transmitted/received when you visit one
of the google domains, you will see that it adds cookies for multiple
domains like accounts.google.com, accounts.youtube.com/accounts/, etc.
These cookies contain your current login session information and hence you
get SSO
If you try to login to any app with cookies blocked, you wont be able to
login even when your username and password are correct.
Google usually shows a help page about troubleshooting login issues.
Specifically, it will open up the page about enabling cookies in your
browser
Detailed Version:
- open https://mail.google.com/mail/ in a browser tab
- since you are not logged on (no session cookies sent during request) you are redirected to https://accounts.google.com
- you provide username and password and click on login
- posts a request to accounts.google.com/password
- the response contains cookies for the domain “.google.com” which contain
the session information
- it also contains identifier which is sent to accounts.youtube.com.
request is sent to accounts.youtube.com/SetSID URL
- there can be more requests similar to this for domains which are owned by
google but do not end with “.google.com”
- e.g. accounts.google.com.au , accounts.google.co.in
- for all such other domain requests, the current session identifier is sent
- this session identifier is different from the cookie value that is sent
- the required URLs are generated on the server and the browser simply
makes requests to these URLs
- the above activities happen in background when you are looking at “Please
Wait…” screen. When you sent your credentials at password URL, you are
redirected to the please wait screen which sets required cookies for
other domains
- once cookies are set, you are redirected to your gmail inbox
- since a request to accounts.youtube.com was already sent with current
session identifier, the server at accounts.youtube.com generates cookies
for “.youtube.com” which are present in the browser
- Google would maintain a central database of login sessions which can be
queried with the session identifier by all the other domain servers. That
is how they can generate cookies for the same user. I dont know the
exact implementation but this is the general idea of maintaining cross
domain SSO
- now when you try to open www.youtube.com in another tab, those cookies
are sent along with the requests which auto logs you into youtube
- Similar set of events happen when you click logout on gmail tab
you see a please wait screen that sends requests to accounts.google.com,
account.youtube.com and any other domain that doesnt end with
“.google.com” but is owned by google the response would clear the session
cookies now navigating to any link on youtube tab would suddenly show you
logged out

View file

@ -0,0 +1,9 @@
:PROPERTIES:
:ID: 299643a7-00e5-47fb-a987-3b9278e89da3
:END:
#+TITLE: Auth
#+Author: Yann Esposito
#+Date: [2021-03-30]
- tags ::
- source ::

View file

@ -0,0 +1,90 @@
:PROPERTIES:
:ID: e61b485f-6cfb-49c4-8bb6-f724f1b73495
:END:
#+TITLE: Software Design for Flexibility
#+Author: Yann Esposito
#+Date: [2021-04-03]
- tags :: [[id:bec11f07-ffed-487b-9059-bdf6696548ab][programming]]
- source ::
My notes on the book.
Title: Software Design for Flexibility
Subtitle: How to Avoid Programming Yourself into a Corner
Authors: Chris Hanson & Gerald Jay Sussman
* Chapter 1
Page 19
In computer science we are taught that the "correctness" of software is
paramount, and that correctness is to be achieved by establishing formal
specification of components and systems of componenents and by providing
proofs that the specifications of a combination of components are met by
the specification of the components and the pattern by which they are
combined[^19].
We assert that this discipline makes systems more brittle.
In fact to make truly robust systems we must discard such a tight
discipline.
[^19]: It is hard, and perhaps impossible, to specify a commplex system. As
noted on page 7, it is easy to specify that a chess player must play legal
chess, but how would we specify that it plays well? And unlike chess, whose
rules do not change, the specifications of mmost system are dynamically
changing as the conditions of their usage change. How do we specify an
accounting system in the light of rapidly changing tax codes?
* Chapter 2
This chapter introduce a notion of code organisation it is name DSL.
Domain Specific Language.
The first part was quite difficult to dig into.
It uses someting that looks like lost discussion on function arity.
While the subjet is quite important to me "combinators" them made it
shallow and not that interesting.
I was not happy.
They lost a lot of energy tacklink the tedious problem of function arities.
Coming from Haskell every function only has a single argument and thus
makes this issue trivially fixed.
Here they used a quite terrible approach to anotate the arities on a global
set hash-map.
They also use advanced Scheme functions that can provide the min and max
nunber of argument of a function.
Let just say, i wasn't really impressed.
They just declared =comp= and some parallel combinators.
I think they should have probably left the arities details in the appendice.
The second part of this chapter is about generating a composable language
to generate clean regular expressions.
This one was a lot better.
They show how the current implementation of regular expression was
generally terrible and provide a nice composable DSL for it.
Not something totally new, but it was better than a SQL DSL while similar
in spirit.
The third part of this chapter discuss about writing a system for a board
game rules.
As a non-native English speaker I haven't understood that /referee/ is the
English name of the game "les dames".
So as they also mention a "generic board game" and mention chess, I was
quite confused by the code and choices I saw.
So once I understood it.
It was a nice example about what not to do while designing a system.
They give two pass of the same code.
In the first pass, the rules and the executions are mixed together.
They explain how to fix this shortcoming and made another pass where they
split the system in three parts.
A generic "board-game" system, that could be used by most board games.
An execution system that would take care of applying rules using the board
game system API.
And lastly a system to only expres rules that could be used by the previous
system.
The interesting part being that you can adapt the rules from referee to
chess by only changing the rules and not the rest of the code.
There are still visible problem with this architecture.
But it was a pretty nice introduction to show how composability is kind of
preferable than a specialized system.

View file

@ -0,0 +1,441 @@
:PROPERTIES:
:ID: a92ff371-3ece-489c-a6cc-34810458f660
:END:
#+TITLE: IROH Auth Presentation
#+Author: Yann Esposito
#+Date: [2021-04-16]
- tags :: [[id:91f33b35-6e4e-4213-b214-972ee20722df][Cisco]]
* IROH Auth :ATTACH:
:PROPERTIES:
:ID: dc5070c0-9040-4175-9a67-c85a21f65f35
:END:
[[attachment:_20210416_150439Screenshot%202021-04-16%20at%2015.04.30.png]]
Yann Esposito <yaesposi@cisco.com>
* Plan
1. Introduction, History
2. Login
3. OAuth2/OIDC Provider
4. Specific Usages Cisco
* 1 - Introduction
* When did you interacted with IROH-Auth?
- *Login* in SecureX
- *Login* in CTR
- *Login* in Orbital
- *Authorized* the Ribbon
- *Invited* someone to your Org
- *Cross Launch* with SSE
- Dealing with JWT
- Changed the role of some user
- When you investigate in CTR (via CTIA's module)
- Created an OAuth2 client
* What is IROH-Auth? (overview)
This is a software subcomponent of /IROH/[fn:iroh] taking care of:
+ *Authentication*
- provide a user unique identifier
+ *Authorization*
- decide what user can or cannot do
+ *User Data Model*
+ *Tenancy (Org) Management*
+ *API Clients Management*
+ *OAuth2*, *OpenID Connect* provider (half of IROH-Auth dedicated to this)
[fn:iroh]: *IROH* The software serving the API behind SecureX, CTR, Ribbons, integrations...
* What is IROH-Auth? (technical)
/IROH-Auth/ is a set of /Services/ within /IROH/ some of them exposing
HTTP APIs.
- Login
+ Login (core service + web API)
+ Org (service)
+ User (service + web API)
+ Scopes (service)
+ Auth Management (core service)
+ Invite (core service + web API)
+ Session (web API)
+ Profile (web API, =/whoami=)
+ SCIM Client (service)
+ IdP Migrate (core service + web API) /deprecated a few months ago/
+ Provision (service + web API) /used instead of IdP Migrate/
- OAuth2
+ OAuth2 (core service + web API)
+ OAuth2 Clients (core service + web API)
+ OAuth2 Clients Presets (service)
+ Grant Service (User's client authorizations)
- Admin
+ Auth Management (web API)
+ OAuth2 Clients Management (web API)
* History: IROH/Visibility (1/?) :ATTACH:
:PROPERTIES:
:ID: dab23b61-a766-4eda-a1e9-1d39258ef5c0
:END:
Login using AMP SAML (generate JWT)
Worked with Guillaume.
Use AMP as an *IdP*[fn:idp]
After the dance of their people AMP provides:
- user-id
- org-id
- role (admin/user)
*No DB of users!*
[fn:idp] Idp: Identity Provider
* History: IROH/Visibility - SAML (2/?) :ATTACH:
:PROPERTIES:
:ID: 07dabe43-9563-430c-a729-87b5154d6d18
:END:
Doc & Libs
> It's bad.
> It's really bad.
> It's like eating a hot circle of garbage...
> Kevin
[[attachment:_20210416_152516.jpeg]]
* History: IROH/Visibility (3/?)
2nd goal: Support OAuth2 (become an OAuth2 provider)
3rd goal: Support AMP and Threatgrid login (OpenID Connect)
Become both an OAuth2 client and provider.
Need Clients/Users/Orgs in DB!!!
OAuth2 RFC => OAuth2 GRANTS
- Authorization Code Grant (the classic)
- Client Grant (for scripts)
- Implicit Grant (for Single Page Applications, now deprecated)
* History: IROH/Visibility (4/?)
4rd goal: Support Account Activation => SCIM[fn:scim] Client
Call a SCIM server.
Check if the account is part from an activated Org inside AMP.
- Become an OpenID Connect provider, made before the start of SecureX.
- OpenID Connect with SSE (we are the IdP now)
[fn:scim] *SCIM*: System for Cross-domain Identity Management
* History: CTR (IDB SSE) :ATTACH:
:PROPERTIES:
:ID: 83c6d508-003a-4c81-8385-b9fa13137b92
:END:
To integrate with SSE (devices) we have to use an SSE hosted IdP provider:
the *IDB*
The *IDB* stand for *Identity Broker*.
This is a *Ping Federate Identity Provider*.
*Ping Federate* is a server from PingIdentity a company specialized in
Identity Providers and Management.
Since then we only use OpenID Connect
=> IROH-Auth SAML support start to rot and is now probably completely deprecated
[[attachment:_20210416_155119Yesssss--meme-40935.jpg]]
* History: SecureX (5/?)
From =idp-mapping= to =idp-mappings=
From Idp managing Orgs to IdP providing only a User Identity Id.
=> generate random user-id/org-id and stop using the the one given by the IdP.
Lot of DB migrations ensues.
* 2 - Login
Lot of IROH-Auth services dedicated just for *Login*
* IROH-Auth Login
Generally: enter your username & password => set a cookie with an id of the
user of the user
Not in IROH-Auth.
The first goal was (and still is) not to take care of user's credentials.
*There are no user password in IROH Auth.*
The password security is handled by external *IdPs*.
Currently SXSO, CSA & TG.
* IROH-Auth Login Dance (1/?) :ATTACH:
:PROPERTIES:
:ID: e12ca021-c030-47f8-a9e5-4fb815a88735
:END:
So the dance of login via IROH-Auth
[[attachment:_20210416_154054Screenshot%202021-04-16%20at%2015.38.37.png]]
1. Login page => Select an IdP (all buttons are just links)
2. When a user click on the link:
- generate and save an unique Id
- redirect the user to the IdP with that unique Id as parameter
3. Wait for the user to come back to =/iroh/iroh-auth/:idp/answer= with
- =code= query parameter
- =state= query paramter that should be equal to the generate unique Id
4. We check our DB for that unique Id
then call the IdP with the =code= and a secret shared between IROH-Auth
and the IdP only.
5. The IdP returns an =id_token= with all user's information.
After this first dance, we have:
1. A Users's Identity Id (the id of the user in the IdP)
2. The user email
* IROH-Auth Login Dance (2/?)
After the "Login Workflow" we know:
- The user IdP
- /User Identity id/
- the user's email
Depending on the IdP we can also have an associated Org-id.
So login now? no.
* IROH-Auth Login Dance: Check the IdP configuration (3/?)
#+begin_example clojure
{:id "idb-amp" <- idp-id
:name "Cisco Security Account" <- to display on the login page
:msg "For existing Threat Response & AMP users." <- ???
:position 1 <- position on the login page
:legacy true <- old?
:auth-kind :oidc <- SAML or OpenId Connect?
:user-namespace "idb-amp" <- if legacy, user-id will be (str user-namespace "-" user-identity-id)
:authorize-uri "https://staging-sse.cisco.com/providers/sse/services/ident/as/authorization.oauth2"
:token-uri "https://staging-sse.cisco.com/providers/sse/services/ident/as/token.oauth2"
:idp-account-url "https://console.qa1.immunet.com/users/current"
:idp-logout-url "https://console.qa1.immunet.com/logout"
:grant-type :code <- OAuth2 detail
;; Correlation table how to transform the `id_token` claims
:correlation-table {:org-id [:companyId]
:org-name [:companyName]
:user-name [:user_name]
:user-email [:email]
:role [:role]}
:scopes ["profile" "email"] <- asked to the IdP OIDC provider
:client-id "mylocalamp" <- client-id on the IdP provider
:allow-all-role-to-login false <- default allow non-admin to login
:client-secret "******"
:additional-authorize-query-params {:selector "amp"} <- ping fed magic
:scim-id :qa1} <- SCIM server id (refer to another part in the conf)
#+end_example
* IROH-Auth Login Dance: For Legacy IdPs
We consider the IdP will manage the org (give an org-id, provide an user
role, etc...)
If that's the case we update our users inside IROH-Auth everytime the
user login.
There is no mechanism to push user's change from IdP directly in
IROH-Auth.
With CSA Migraiton should be deprecated.
* IROH-Auth Login Dance: For SXSO
:PROPERTIES:
:ID: dc5070c0-9040-4175-9a67-c85a21f65f36
:END:
We generate the =idp-mapping= out of the =id_token=.
The =idp-mapping= contain:
- The idp-id
- The /User Identity Id/ (the user id in the IdP not in IROH)
We search for the user's email.
If we find multiple users with the same email, we add (if not already exists)
the idp-mapping to all thoses users.
Then we search the DB for matches of the idp-mappings:
1. 0 occurence, this is a new unknown user => Present Org's creation page
=> create the org and the user.
2. 1 occurence, directly login the user to it's single known account
3. >1 occurence, display the account selection page
[[attachment:_20210416_150439Screenshot%202021-04-16%20at%2015.04.30.png]]
* 3 - OAuth2 / OpendID Connect Provider
* OAuth2 Provider
From the RFC:
> The OAuth 2.0 authorization framework enables a third-party
> application to obtain limited access to an HTTP service, either on
> behalf of a resource owner by orchestrating an approval interaction
> between the resource owner and the HTTP service, or by allowing the
> third-party application to obtain access on its own behalf.
3 involved entities:
- an API (Service Provider, IROH)
- an IROH-Auth user
- an Application that would like to access the API on behalf of the user (Ribbon)
* OAuth2 Provider: Supported Grants
RFC Grants
*Authorization Code Grant*
secrets:
- 1 secret between IROH-Auth/Application (client secret)
- 1 secret between Application/User and IROH-Auth/User (refresh token)
=> involve user-agent workflow
*Client Credential Grant*
- 1 shared secret between IROH-Auth/Application/User (client secret)
=> involve copy/paste
* Authorization Code Grant
#+begin_quote
4.1. Authorization Code Grant
The authorization code grant type is used to obtain both access
tokens and refresh tokens and is optimized for confidential clients.
Since this is a redirection-based flow, the client must be capable of
interacting with the resource owner's user-agent (typically a web
browser) and capable of receiving incoming requests (via redirection)
from the authorization server.
+----------+
| Resource |
| Owner |
| |
+----------+
^
|
(B)
+----|-----+ Client Identifier +---------------+
| -+----(A)-- & Redirection URI ---->| |
| User- | | Authorization |
| Agent -+----(B)-- User authenticates --->| Server |
| | | |
| -+----(C)-- Authorization Code ---<| |
+-|----|---+ +---------------+
| | ^ v
(A) (C) | |
| | | |
^ v | |
+---------+ | |
| |>---(D)-- Authorization Code ---------' |
| Client | & Redirection URI |
| | |
| |<---(E)----- Access Token -------------------'
+---------+ (w/ Optional Refresh Token)
Note: The lines illustrating steps (A), (B), and (C) are broken into
two parts as they pass through the user-agent.
Figure 3: Authorization Code Flow
#+end_quote
* Client Credential Grant
#+begin_quote
4.4. Client Credentials Grant
The client can request an access token using only its client
credentials (or other supported means of authentication) when the
client is requesting access to the protected resources under its
control, or those of another resource owner that have been previously
arranged with the authorization server (the method of which is beyond
the scope of this specification).
The client credentials grant type MUST only be used by confidential
clients.
+---------+ +---------------+
| | | |
| |>--(A)- Client Authentication --->| Authorization |
| Client | | Server |
| |<--(B)---- Access Token ---------<| |
| | | |
+---------+ +---------------+
Figure 6: Client Credentials Flow
The flow illustrated in Figure 6 includes the following steps:
(A) The client authenticates with the authorization server and
requests an access token from the token endpoint.
(B) The authorization server authenticates the client, and if valid,
issues an access token.
#+end_quote
* Clients
Client mandatory fields:
- =id= the unique id of the client accross all Threat Response,
- =name= a name for the client that will be user facing,
- =client-type= can be either =confidential= or =public=,
- =grants= a list that could contain =auth-code= or =client-creds=,
- =redirects= a set of URIs,
- =scopes= a set of scopes,
- =enabled?= a boolean, this field is editable by admin users,
- =approved?= a boolean, editable only by Threat Response admins.
Client optional fields:
- =description=, a long description of the client that could be presented to the
users during client authorization,
- =owner-id=, the user id of the client's owner,
- =org-id=, the org id of the client's owner,
- =enabled-by=, the user id of the admin that enabled the client,
- =disabled-by=, the user id of the admin that disabled the client,
- =password=, also known as the "client's secret", public clients don't
have a password,
- =access-token-lifetime-in-sec=, access token lifetime this client provides,
- =refresh-token-lifetime-in-sec=, refresh token lifetime this client provides,
- =availability=, can be =user=, =org= or =everyone=. This filters the user that
can grant access to this client:
+ =user= only the owner
+ =org= only org's members
+ =everyone= any Threat Response user
- =approval-status=, possible values are =waiting= =rejected= =approved=. During
client creation some criteria will need an Threat Response Admin's approval,
- =approver-id=, the user id of the user (a Threat Response admin) that approved the client
- =approval-message=, a message left for the user.
- =client-preset-id=, a Client Preset ID. Client Presets are explained in [[#client-presets]].
+ advanced fields
- =allow-partial-user-scopes?= If true, a user without all the requested
scopes from the Client can still authorize the client. The refresh and
access tokens will only have the intersection of both scopes.
- =audiences=
* 4 - Specifc Cisco Usage
- Orbital
- AMP
- SSE

View file

@ -0,0 +1,9 @@
:PROPERTIES:
:ID: 91f33b35-6e4e-4213-b214-972ee20722df
:END:
#+TITLE: Cisco
#+Author: Yann Esposito
#+Date: [2021-04-16]
- tags ::
- source ::

View file

@ -0,0 +1,140 @@
:PROPERTIES:
:ID: 9efea780-399a-45e8-9e20-a0974f6bccf6
:END:
#+TITLE: Impots 2020
#+Author: Yann Esposito
#+Date: [2021-05-01]
- tags ::
- source ::
* Declaration
** General
- numero fiscal: 1208764994115
Etape 3; Selectionner:
- Revenus: Micro foncier
- Charges: Investissement locatif (...,Duflot,...)
C.f.:
[[./assets/declaration-2019-helper.png]]
*** page 1
- Y: 102081 (retenue source 16282)
- K: 15203 (retenue source 89)
*** page 2
Détail des revenus connus de l'administration
Il vous appartient d'en vérifier l'exactitude :
Revenus ligne 2DC :
CASDEN BANQUE POPULAIRE
BANQUE POPULAIRE MEDITERRANEE
14 €
2 €
Total : 16 €
Revenus ligne 2CG :
CASDEN BANQUE POPULAIRE
14 €
Total : 14 €
Revenus ligne 2BH :
BANQUE POPULAIRE MEDITERRANEE
2 €
Total : 2 €
Revenus ligne 2CK :
CASDEN BANQUE POPULAIRE
2 €
Total : 2 €
*** Page 3
*** Foncier (page 4)
- Micro foncier: [4BE] 4656 + 2330 = 6986 (en utilisant [[file:assets/impots2020/revenus-fonciers-2020.pdf][Revenus Fonciers 2020]])
z
*** page 5
**** Pre retraite (6RS)
[6RS]: 5080
En utilisant [[file:assets/impots2020/fiche-fiscale-cisco.pdf][Fiche Fiscale Cisco]]
- https://ere.axa.fr
- Identifiant Internet: 70475738
- Votre entreprise : CISCO SYSTEMS France
- Votre numéro d'adhésion : 2722501130200/00888
- email: yann.esposito@gmail.com
*** page 6
**** Dons 7UD
| assoc | don |
|-------------------------------+-----|
| [[file:assets/Unicef_2019.HEIC][Unicef 2019]] | 276 |
| [[file:assets/Medecins_sans_frontieres_2019.pdf][Medecins Sans Frontieres 2019]] | 120 |
|-------------------------------+-----|
**** Loi Duflot (7FK)
- 3060€ dans la case 7FK (investissement Duflot 2014)
**** Comptes Morgan Stanley (Annexe)
num compte: 233 074973 126
date ouverture: 01/04/2016
** RSU/ESPP :ATTACH:
:PROPERTIES:
:ID: 4591374a-9183-4698-bae4-38193e88bb8b
:END:
Presentation déclaration:
[[attachment:_20210519_150647Cisco%20France%20%20-%20Pre%CC%81sentation%20RSU-SO-ESPP%20-%2018.05.2021.pdf]]
*** RSU 2020
2020-07-15: moins value -$19
2020-07-15: moins value -$74
2020-07-15: plus value $98
2020-01-02: moins value -$20.70
2020-01-02: plus value $45.38
*** ESPP 2020
30/06/2020 => Prix d'achat FMV (Aquisition Fair Market Value): $46.6400
Prix de vente: 05/08/2020 => $47.4918
Nombre d'actions: 70
Conversion EUR: 0.84
Plus value en €: 70x(47.4918 - 46.6400)*0.84 => 50.08€
=> Sale - 002873 - 01/02/2020
FMV: $47.9600
Sale Price: $47.9850
Conversion EUR: 0.88
NB Actions: 85
Plus value en €: 85 * (47.9850 - 47.9600) * 0.88 => 1.87€
*** Resultat
Moins value de 158€ a reporter en 3VH annexe 2042C

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