Recherche effectué dans :

Filtre actif, cliquez pour en enlever un tag :

Cliquez sur un tag pour affiner votre recherche :

Résultat de la recherche (36 notes) :

Journal du mercredi 14 mai 2025 à 13:25 #projet, #communication, #présentiel

Depuis que j'ai commencé ma mission chez la DINUM, je me retrouve à rencontrer de nombreuses personnes en présentiel.

En ligne — sur Internet, le partage d'informations personnelles est simple et fluide. Je peux facilement communiquer mon prénom, mon nom, et des URLs avec précision. C'est pourquoi j'ai créé https://sklein.xyz, porte d'entrée vers toutes les informations me concernant.

Quand une rencontre s'effectue en présentiel, les choses sont plus compliquées.

Il y a deux semaines, par exemple, j'échangeais avec un collègue assis en face de moi. Après plusieurs minutes, il a lancé la discussion et a cherché à mieux me connaître. Ma présentation a été maladroite et je doute qu'il ait retenu mon prénom ou mon nom...

Lorsque j'ai commencé à l'interroger à mon tour, j'ai découvert qu'il était l'un des deux créateurs du projet Open Food Facts, un projet que j'admire depuis plusieurs années.

Cette expérience m'a fait prendre conscience une nouvelle fois de deux choses : j'aurais vraiment apprécié avoir des cartes de visite à partager, et si je n'avais pas posé de questions, j'aurais manqué l'opportunité d'échanger pendant près d'une heure sur un projet qui me passionne.

Suite à cela, j'ai pour objectif :

  • Concevoir une carte de visite personnelle
  • Créer un sticker personnalisé à apposer sur le capot de mon Thinkpad T14s

Par le passé, j'avais le sticker suivant sur mon laptop, acheté chez Redbubble :

Ce dessin suscitait des discussions autour du Yak shaving à presque chacune de mes nouvelles rencontres. Je trouvais cela à la fois amusant et efficace pour briser la glace.

Informations que je souhaite intégrer sur ces supports :

Rien de plus.

Pour me permettre d'analyser les sources de connexion (tracking), je souhaite :

Journal du vendredi 25 avril 2025 à 18:33 #projet, #Inference, #intentions

Au mois de janvier, j'ai écrit :

Voici mes prochaines #intentions d'amélioration de ma workstation :

source

Le hasard de la vie fait que je commence une mission professionnelle pour la DINUM en lien avec Open WebUI : Ablert Conversation.

Au mois de décembre, j'ai déjà installé et testé rapidement Open WebUI connecté à Scaleway Generative APIs, mais je n'ai pas pris le temps de le faire avec rigueur.

Dans les prochains jours, je souhaite réaliser les projets suivants :

J'ai publié le projet "pg_back-docker-sidecar" #iteration, #projet, #postgresql, #backup, #JaimeraisUnJour

Je viens de terminer une première itération de travail sur Projet 27 - "Créer un POC de pg_back".

Le résultat se trouve dans le repository GitHub : pg_back-docker-sidecar

J'ai passé en tout 17 h 30 sur ce projet, écriture de notes incluse.

Ce projet a évolué par rapport à mon objectif initial :

Initialement, dans ce dépôt, je voulais tester l'implémentation de pg_back déployé dans un conteneur Docker comme un « sidecar » pour sauvegarder une base de données PostgreSQL déployée via Docker.

Et progressivement, j'ai changé l'objectif de ce projet. Il contient maintenant

source

Voici tous les éléments testés dans le tutoriel :

  • pg_back est dépolyé dans un Docker sidecar
  • L'instance PostgreSQL est sauvegardée dans une instance Minio
  • Les archives sont chiffrées avec age
  • Les archives sont générées au format custom
  • J'ai documenté une méthode pour télécharger une archive dans un dossier du workspace du développeur
  • J'ai documenté une méthode pour restaurer l'archive dans un serveur PostgreSQL déployé via Docker
  • J'ai testé le fonctionnement du système d'expiration des archives
  • J'ai testé la fonctionnalité de "purge" automatique

Éléments que j'ai implémentés

L'image Docker proposée par pg_back ne contient pas de scheduler de type cron et ne suit pas les recommandations The Twelve-Factors App.

J'ai décidé d'implémenter ma propre image Docker stephaneklein/pg_back-docker-sidecar:2.5.0-delete-local-file-after-upload avec les ajouts suivants :

  • Support de configuration basé sur des variables d'environnement, par exemple :
  pg_back:
    image: stephaneklein/pg_back-docker-sidecar:2.5.0-delete-local-file-after-upload
    environment:
      POSTGRES_HOST: postgres1
      POSTGRES_PORT: 5432
      POSTGRES_USER: postgres
      POSTGRES_DBNAME: postgres
      POSTGRES_PASSWORD: password
      
      BACKUP_CRON: ${BACKUP_CRON:-0 3 * * *}
      UPLOAD: "s3"
      UPLOAD_PREFIX: "foobar"
      ...
  • Intégration de Supercronic pour exécuter pg_back régulièrement, une fonctionnalité de type cron

Patch envoyé en upstream

J'ai proposé deux patchs à pg_back :

Le premier patch est totalement mineur.

Dans la version actuelle 2.5.0 de pg_back, les archives dump ne sont pas supprimées du filesystem de container après l'upload vers l'Object Storage.
Ce choix me perturbe, car je préfère éviter de surcharger le disque avec des fichiers d'archives volumineux qui risquent de saturer l'espace disponible.

Pour éviter cela, j'ai implémenté "Add the --delete-local-file-after-upload to delete local file after upload" qui permet de supprimer les fichiers intermédiaires après upload.

Bilan

J'ai réussi à effectuer un cycle complet de la sauvegarde à la restauration.
J'ai décidé d'utiliser pg_back pour mes sauvegardes PostgreSQL automatique vers Object Storage.

J'ai déprécié le projet restic-pg_dump-docker pour inviter à utiliser pg_back.

Idée d'amélioration

#JaimeraisUnJour créer et implémenter les issues suivantes.

1. Implémenter une commande pg_back snapshots pour lister les snapshots sous une forme facilement lisible par un humain. Actuellement, le retour de la commande ressemble à ceci :

$ pg_back --list-remote s3
foobar/hba_file_2025-04-14T14:58:08Z.out.age
foobar/hba_file_2025-04-14T14:58:39Z.out.age
foobar/ident_file_2025-04-14T14:58:08Z.out.age
foobar/ident_file_2025-04-14T14:58:39Z.out.age
foobar/pg_globals_2025-04-14T14:58:08Z.sql.age
foobar/pg_globals_2025-04-14T14:58:39Z.sql.age
foobar/pg_settings_2025-04-14T14:58:08Z.out.age
foobar/pg_settings_2025-04-14T14:58:39Z.out.age
foobar/postgres_2025-04-14T14:58:08Z.dump.age
foobar/postgres_2025-04-14T14:58:39Z.dump.age

Je ne trouve pas ce rendu agréable à lire. J'aimerais afficher quelque chose qui ressemble à la sortie de restic. Par exemple :

$ pg_back snapshots
ID        Date                 Folder
---------------------------------------
40dc1520  2025-04-14 14:58:08  foobar
79766175  2025-04-14 14:58:39  foobar

2. Implémenter un système de suppressions des archives basé sur des règles plus avancées, comme celle de restic

3. Implémenter un refactoring vers cobra pour utiliser des sous-commandes (subcommands) et éviter le mélange entre paramètres et commandes.

Journal du jeudi 10 avril 2025 à 20:34 #backup, #projet, #postgresql, #DevOps, #admin-sys, #JaimeraisUnJour, #JaiDécouvert

Je me relance sur mes sujets de backup de PostgreSQL.

Au mois de février dernier, j'ai initié le « Projet 23 - "Ajouter le support pg_basebackup incremental à restic-pg_dump-docker" ».

J'ai ensuite publié les notes suivantes à ce sujet :

À ce jour, je n'ai pas fini mes POC suivants :

poc-pg_basebackup_incremental est la seule méthode que j'ai réussi à faire fonctionner totalement.

#JaimeraisUnJour terminer ces POC.

Aujourd'hui, je m'interroge sur les motivations qui m'ont conduit en 2020 à intégrer restic dans mon projet restic-pg_dump-docker. Avec le recul, l'utilisation de cet outil pour la simple sauvegarde d'archives pg_dump me semble désormais moins évidente qu'à l'époque.

J'ai fait ce choix peut-être pour bénéficier directement du support des fonctionnalités suivantes :

Après réflexion, je pense que pour la sauvegarde d'archives pg_dump, les fonctionnalités de déduplication et de sauvegarde incrémentale offertes par restic génèrent en réalité une surconsommation d'espace disque et de ressources CPU sans apporter aucun bénéfice.

J'ai ensuite effectué quelques recherches pour savoir s'il existait un système de sauvegarde PostgreSQL basé sur pg_dump et un système d'upload vers Object Storage et #JaiDécouvert pg_back (https://github.com/orgrim/pg_back/).

En 2020, quand j'ai créé restic-pg_dump-docker, je pense que je n'avais pas retenu pg_back car celui-ci était minimaliste et ne supportait pas encore l'upload vers de l'Object Storage.

En 2025, pg_back supporte toutes les fonctionnalités dont j'ai besoin :

pg_back is a dump tool for PostgreSQL. The goal is to dump all or some databases with globals at once in the format you want, because a simple call to pg_dumpall only dumps databases in the plain SQL format.

Behind the scene, pg_back uses pg_dumpall to dump roles and tablespaces definitions, pg_dump to dump all or each selected database to a separate file in the custom format. ...

Features

  • ...
  • Choose the format of the dump for each database
  • ...
  • Dump databases concurrently
  • ...
  • Purge based on age and number of dumps to keep
  • Dump from a hot standby by pausing replication replay
  • Encrypt and decrypt dumps and other files
  • Upload and download dumps to S3, GCS, Azure, B2 or a remote host with SFTP

source

Je souhaite :

  • Créer et publier un playground pour tester pg_back
  • Si le résultat est positif, alors je souhaite ajouter une note en introduction de restic-pg_dump-docker pour inviter à ne pas utiliser ce projet et renvoyer les lecteurs vers le projet pg_back.

Expérimentation de migration de deux utilisateurs grand public vers des laptops sous Fedora #projet, #desktop, #linux-desktop, #hardware

J'envisage de proposer à ma mère et à ma compagne de se prêter à une expérimentation : une transition en douceur vers des portables sous GNU/Linux, avec mon assistance complète durant tout le processus.

Leur situation actuelle :

Choix de la distribution Linux : une Fedora version n-1 (voir la note 2024-01-29 pour plus d'informations sur ce choix).

Plus précisément, j'envisage d'utiliser l'édition Fedora Silverblue, une variante immutable (ou « atomic ») de Fedora Workstation qui propose l'environnement de bureau GNOME.

Je souhaite configurer et rendre très facilement accessibles les applications Signal et RustDesk :

  • Signal pour facilement échanger avec moi en cas de difficulté ;
  • RustDesk pour me permettre de prendre directement le contrôle du desktop à distance, pour les aider.

Pour ma maman, je souhaite lui faire tester Libre Office. Pour éviter de la perturber avec les formats de fichier, je souhaite configurer Libre Office pour qu'il enregistre par défaut au format de Microsoft Word et Microsoft Excel.

Je souhaite installer quelques extensions GNOME pour que l'environnement Linux ressemble au maximum à MS Windows, par exemple :

Je souhaite leur proposer un laptop qui répond aux caractéristiques suivantes :

  • si possible à moins de 1000 € ;
  • entre 14 et 15 pouces, avec une résolution verticale de 1200 pixels minimum ;
  • 16Go de RAM ;
  • un trackpad et un châssis avec un maximum de qualité ;
  • idéalement convertible en 2 en 1 ou 3 en 1 ;
  • silencieux ;
  • support GNU/Linux parfait ;

Pour le moment, j'ai identifié les modèles suivants :

Journal du dimanche 09 février 2025 à 17:05 #postgresql, #backup, #projet, #JaiDécidé

J'utilise depuis 2019 les containers Docker suivant en sidecar pour sauvegarder automatiquement et régulièrement directement un volume Docker et un volume PostgreSQL :

restic-pg_dump-docker est très pratique et facile d'usage, voici un exemple d'utilisation dans un docker-compose.yml :

    restic-pg-dump:
        image: stephaneklein/restic-pg_dump:latest
        environment:
            AWS_ACCESS_KEY_ID: "admin"
            AWS_SECRET_ACCESS_KEY: "password"
            RESTIC_REPOSITORY: "s3:http://minio:9000/bucket1"
            RESTIC_PASSWORD: secret
            POSTGRES_USER: postgres
            POSTGRES_PASSWORD: password
            POSTGRES_HOST: postgres
            POSTGRES_DB: postgres

    postgres:
        image: postgres:16.1
        environment:
            POSTGRES_USER: postgres
            POSTGRES_DB: postgres
            POSTGRES_PASSWORD: password
        ports:
            - "5432:5432"
        volumes:
            - ./volumes/postgres/:/var/lib/postgresql/data/
        healthcheck:
            test: ["CMD", "sh", "-c", "pg_isready -U $$POSTGRES_USER -h $$(hostname -i)"]
            interval: 10s
            start_period: 30s

Il suffit de configurer les paramètres d'accès à l'instance PostgreSQL à sauvegarder et ceux de l'Object Storage où uploader les backups. Rien de plus, 😉.
Pour plus de paramètres, voir la section Configuration du README.md.

Cependant, je ne suis pas totalement satisfait de restic-pg_dump-docker. Cet outil effectue seulement des sauvegardes complètes de la base de données.
Ceci ne pose généralement pas trop de problème quand la base de données est d'une taille modeste, mais c'est bien plus compliqué dès que celle-ci fait, par exemple, plusieurs centaines de mégas.

Pour faire face à ce problème, j'ai exploré fin 2023 une solution basée sur pgBackRest : Implémenter un POC de pgBackRest.
Je suis plus ou moins arrivé au bout de ce POC mais je n'ai pas été satisfait du résultat.
Je n'ai pas réussi à configurer pgBackRest en "pure Docker sidecar".
De plus, j'ai trouvé la restauration du backup difficile à exécuter.

Un élément a changé depuis septembre 2024. Comme je le disais dans cette note 2024-11-03_1151, la version 17 de PostgreSQL propose de nouvelles options de sauvegarde :

  • l'outil pg_basebackup qui permet de réaliser les sauvegardes incrémentales,
  • et un nouvel utilitaire, pg_combinebackup, qui permet de reconstituer une sauvegarde complète à partir de sauvegardes incrémentales.

Cette nouvelle méthode semble apporter certains avantages par rapport aux solutions basées sur WAL comme pgBackRest ou barman.

Une consommation d'espace réduite :

In this mailing list thread on the Postgres-hackers mailing list, Jakub from EDB ran a test. This is a pgbench test. The idea is that the data size doesn't really change much throughout this test. This is a 24 hour long test. At the start the database is 3.3GB. At the end, the database is 4.3GB. Then, as it's running, it's continuously running pgbench workloads. In those 24 hours, if you looked at the WAL archive, there were 77 GB of WAL produced.

That's a lot of WAL to replay if you wanted to restore to a particular point in time within that timeframe!

Jakub ran one full backup in the beginning and then incremental backups every two hours. The full backup in the beginning is 3.4 GB, but then all the 11 other backups are 3.5 in total, they're essentially one 10th of a full backup size.

source

Une vitesse de restauration grandement accélérée :

A 10x time safe

What Jakub tested then was the restore to a particular point in time. Previously, to restore to a particular point in time would take more than an hour to replay the WAL versus in this case because we have more frequent, incremental backups, it's going to be much, much faster to restore. In this particular test case 78 minutes compared to 4 minutes. This is a more than a 10 times improvement in recovery time. Of course you won't necessarily always see this amount of benefit, but I think this shows why you might want to do this. It is because you want to enable more frequent backups and incremental backups are the way to do that.

source

Nombre 2024 j'ai passé un peu de temps à étudier les solutions de backup qui utilisent la nouvelle fonctionnalité de PostgreSQL 17, mais je n'avais rien trouvé

Je viens à nouveau de chercher dans les archives de Postgre Weely, sur GitHub, sur le forum de Restic, etc., et je n'ai rien trouvé d'intéressant.

#JaiDécidé de prendre les choses en main et de faire évoluer le projet restic-pg_dump-docker pour y ajouter le support du backup incrémental de PostgreSQL 17.

Voir : Projet 23 - "Ajouter le support pg_basebackup incremental à restic-pg_dump-docker".

Journal du samedi 21 septembre 2024 à 11:42 #projet, #javascript, #WebDev, #playground

Je souhaite essayer de créer un #playground qui intègre UnoCSS et qui permet de builder un fichier HTML qui contient toutes les dépendances.

Journal du mercredi 11 septembre 2024 à 11:14 #projet, #javascript, #playground, #JeMeDemande

Dans la branche gibbon-replay-js du projet Idée d'un outil de session recoding web minimaliste basé sur rrweb, j'ai essayé sans succès d'extraire du code dans un package Javascript.

Pour le moment l'import suivant ne fonctionne pas :

import gibbonReplayJs from 'gibbon-replay-js';

Quand je lance pnpm run build, j'ai l'erreur suivante :

$ pnpm run build
...
x Build failed in 336ms
error during build:
src/routes/(record)/+layout.svelte (2:11): "default" is not exported by "packages/gibbon-replay-js/dist/index.js", imported by "src/routes/(record)/+layout.svelte".
file: /home/stephane/git/github.com/stephane-klein/gibbon-replay-poc/src/routes/(record)/+layout.svelte:2:11

1: <script>
2:     import gibbonReplayJs from 'gibbon-replay-js';

Et quand je lance pnpm run dev, j'ai l'erreur suivante :

$ pnpm run dev

...

11:21:21 [vite] Error when evaluating SSR module /packages/gibbon-replay-js/dist/index.js:
|- ReferenceError: exports is not defined
    at eval (/home/stephane/git/github.com/stephane-klein/gibbon-replay-poc/packages/gibbon-replay-js/dist/index.js:5:23)
    at instantiateModule (file:///home/stephane/git/github.com/stephane-klein/gibbon-replay-poc/node_modules/.pnpm/vite@5.4.3/node_modules/vite/dist/node/chunks/dep-BaOMuo4I.js:52904:11)

11:21:21 [vite] Error when evaluating SSR module /src/routes/(record)/+layout.svelte:
|- ReferenceError: exports is not defined
    at eval (/home/stephane/git/github.com/stephane-klein/gibbon-replay-poc/packages/gibbon-replay-js/dist/index.js:5:23)
    at instantiateModule (file:///home/stephane/git/github.com/stephane-klein/gibbon-replay-poc/node_modules/.pnpm/vite@5.4.3/node_modules/vite/dist/node/chunks/dep-BaOMuo4I.js:52904:11)

Suite à cette frustration, j'ai envie de créer un projet, sans doute nommé javascript-package-playground dans lequel je souhaite étudier les sujets suivants :

  • mise en place d'une librairie /packages/lib1/ qui contient une librairie javascript, qui peut être importé avec la méthode ECMAScript Modules ;
  • mise en place d'une app NodeJS dans /services/app1_nodejs/ qui utilise lib1 ;
  • mise en place d'une app SvelteKit dans /services/app2_sveltekit/ qui utilise lib1 dans un fichier coté server et dans une page web coté browser ;
  • mise en place d'une librairie /packages/lib2 qui utilise lib1

Je souhaite décliner ces 2 libs et 2 apps sous plusieurs déclinaisons d'implémentation :

Et le tout encore dans deux déclinaisons : Javascript et TypeScript.

Je ne souhaite pas supporter CommonJS qui est sur le déclin, remplacé par ECMAScript Modules.

Dans ce playground, je souhaite aussi me perfectionner dans l'usage de pnpm link et pnpm workspace.

#JeMeDemande si ces connaissances sont totalement maitrisées et évidentes chez mes amis développeurs Javascript 🤔 et s'ils les considèrent comme "basiques".

Journal du jeudi 29 août 2024 à 13:23 #iteration, #projet

Voici les nouveautés depuis ma dernière itération du Projet 11 - "Première version d'un moteur web PKM".

Ce commit contient le résultat du travail du Projet 13, c'est-à-dire le refactoring de PostgreSQL vers Elasticsearch ainsi que la page /src/routes/search qui permet à la fois d'effectuer une recherche sur le contenu des notes et un filtrage de type and sur les tags.

Une démo est visible ici https://notes.develop.sklein.xyz/

Ma Developer eXperience avec Elasticsearch est excellente. J'ai trouvé toutes les fonctionnalités dont j'avais besoin.

Je pense que mon utilisation des Fleeting Note n'est pas la bonne. Je pense que les notes que je qualifie de Fleeting Note sont en réalité des Diary notes ou Journal notes.

J'ai donc décidé de :

  • [x] Renommer partout fleeting_note en journal_notes

Après implémentation, j'ai réalisé que j'ai fait l'erreur de mélanger l'implémentation de le page qui affiche la liste des notes antéchronologiques et la page de recherche.

Pour être efficace, le résultat de la page recherche doit être affiché en fonction du scoring de la recherche, alors que les pages listes de notes par date de publication.

J'ai donc décidé de :

  • [x] Implémenter une page /diaries/ (pour la cohérence des path en anglais, je préfère "diaries" à "journaux") qui affiche une liste de notes de type Diary notes ;
    • [x] Cette page doit permettre un filtrage par tags
  • [x] Implémenter une page /notes/ qui affiche une liste des notes qui ne sont pas de type Diary notes, comme des Evergreen Note, Hub note
    • [x] Contrairement à la page liste des Diary notes, cette page de liste ne doit pas afficher le contenu des notes, mais seulement le titre des notes ;
    • [x] Je propose de classer ces titres de notes par ordre alphabétique ;
    • [x] Je propose aussi de séparer ces notes par lettre, A, B… c'est-à-dire un index alphabétique.
    • [x] Cette page doit permettre un filtrage par tags
  • [x] Refactoring la page /search/ pour ordonner le résultat de la recherche par scoring.
    • [x] Cette page doit afficher le contenu des notes avec highligthing ;
    • [x] Cette page doit permettre un filtrage sur les types de notes, pour le moment Diary notes et Evergreen Note.
    • [x] Cette page doit permettre un filtrage par tags

Au moment où j'écris ces lignes, je ne sais pas encore comment je vais gérer les opérateurs or, (.

Pour le moment, le filtrage multi tags est effectué avec des and.

Journal du mercredi 10 juillet 2024 à 09:41 #iteration, #pg_search, #typesense, #coding, #projet

Suite à 2024-07-09_0846 (Projet 5) et suite à la publication de poc-meilisearch-blog-sveltekit en 2023, je souhaite tester l'intégration de Typesense à obsidian-vault-to-apache-age-poc en complément de pg_search.

J'ai bien conscience que Typesense fait doublon avec pg_search, mais mon objectif dans ce projet est de comparer les résultats de Typesense avec ceux de pg_search.
J'espère que cet environnement de travail me permettra d'itérer afin de répondre à cette question.

Idéalement, j'aimerais uniquement utiliser pg_search afin de mettre en œuvre un seul serveur de base de données et de bénéficier de la mise à jour automatique de l'index du moteur de recherche :

A BM25 index must be created over a table before it can be searched. This index is strongly consistent, which means that new data is immediately searchable across all connections. Once an index is created, it automatically stays in sync with the underlying table as the data changes. (from)

Journal du lundi 21 août 2023 à 11:57 #iteration, #projet

Pour le moment, j'ai passé 17h sur le Projet GH-289 - Créer un simulateur de manque à gagner suite à une rupture conventionnelle, licenciement économique ou licenciement simple.

Je ne comprends pas comment j'ai fait pour y passer autant de temps.

Peut-être le cumul de la recherche d'information juridique, le refactoring UX de la page 🤔.

À noter que je ne suis pas satisfait de cette version de l'UX.

Le projet est déployé sur Vercel à l'adresse suivante : https://comparateur-rupture-conventionnelle-cdi.sklein.xyz/

Projet GH-360 - Implémenter un POC de Fuzzy Search en PostgreSQL #projet, #POC, #postgresql

Ce projet a été initialement commencé dans une issue, le 10 janvier 2024.

Quel est l'objectif de ce projet ?

Je souhaite mettre en pratique l'extension PostgreSQL fuzzystrmatch pour implémenter une fonctionnaltié Fuzzy Search.

Je souhaite que cette implémentation permette :

  • de trouver les éléments à partir d'erreurs d'insertion, de suppression et de substitution (voir paragraphe "Distances entre mots") ;
  • de trouver les éléments même si des lettres ont été transposées, par exemple, cout → touc est une transposition.

Repository de ce projet :

  • postgresql-fuzzysearch-poc (pas encore créé)

Ressources :

Projet GH-339 - Implémenter un POC de Automerge #projet, #CRDT, #POC

Ce projet a été initialement commencé dans une issue, le 16 novembre 2023.

Quel est l'objectif de ce projet ?

Je souhaite implémenter et publier un POC de https://automerge.org.

Ce que je souhaite réaliser dans ce POC :

  • Une implémentation du serveur
  • Un client Javascript
    • User story
      • Sur le client A, un user saisie "item 1", celui-ci est ajouté dans une liste ordonné par timestamp
      • "item 1" est affiché en temps réel sur client B
      • Le client A passe offline
      • Sur le client B, un user saisie "item 2"
      • Sur le client A, un user saisie "item 3"
      • Le client A passe online
      • Le client A se synchronise automatiquement et contient la liste "item 1", "item 2", "item 3"

Repository de ce projet :

Ressources :

Projet 21 - "Rechercher un AI code assistant qui ressemble à Cursor mais pour Neovim" #CodeAssistant, #neovim, #projet, #JeMeDemande

Date de la création de cette note : 12 janvier 2025.

Quel est l'objectif de ce projet ?

Étudier, installer et configurer un AI code assistant qui ressemble à Cursor mais pour Neovim.

Pourquoi je souhaite réaliser ce projet ?

J'avais déjà envie de tester avante.nvim en août 2024.

Je constate que depuis plus de 6 mois, j'utilise de plus en plus ChatGPT ou Claude.ia lorsque je code ou je rédige des textes. Rien que pour la dernière semaine, j'ai compté 7 conversations par jour.

Je constate aussi que mon expérience utilisateur n'est pas optimale : je dois effectuer de nombreux copier-coller pour donner du contexte à l'agent conversationnel.
Je lui donne du code source, je lui indique le nom des fichiers…

#JeMeDemande aussi si l'agent conversationnel pourrait me donner de meilleures réponses s'il a accès à l'intégralité du code source de projet 🤔.

Fonctionnalités

Exemples de tâches que j'aimerais facilement effectuer avec le AI code assistant, directement dans Neovim :

  • Avoir des suggestions de code sur des projets : Javascript, TypeScript, Bash, Ansible, Svelte, Tailwind CSS
  • Avoir des suggestions de corrections de bug
  • Génération de message de Git commit à partir du contenu modifié et d'une explication du commit que j'aurais rédigé en français
  • Suggestion / correction de documentation en Markdown, en anglais et français
  • Suggestion de namming de variables
  • Suggestion de refactoring
  • Me donner les explications macro ou micro d'un projet
  • Correction de fautes d'orthographe et de grammaire en français et anglais

Les questions que je me pose

Comme je le disais en août 2024 :

Cependant, une question me revient sans cesse à l'esprit en voyant ce genre d'outil utilisant les API d'AI Provider : est-ce que le coût d'utilisation de ce type de service ne risque pas d'être exorbitant ? 🤔

source

#JeMeDemande combien un AI code assistant va me coûter par mois 🤔.

Sur la page de pricing de Cursor, je lis :

$20/month :

  • Unlimited completions
  • 500 fast premium requests per month
  • Unlimited slow premium requests
  • 10 o1-mini uses per day

source

#JeMeDemande si Cursor a des réductions sur les volumes ou si je peux avoir le même prix en utilisant directement les API des AI Provider OpenAI ou Anthropic.

Est-ce que la location d'un serveur GPU sur Vast.ai pourrait être un choix plus économique 🤔.

Choix de modèle

#JeMeDemande quel modèle AI code assistant offre le meilleur rapport coût/performance ? Quel est le plus performant ?

J'ai lu ici que Salvatore Sanfilippo conseille Claude Sonnet 3.5 :

About "people still thinking LLMs are quite useless", I still believe that the problem is that most people are exposed to ChatGPT 4o that at this point for my use case (programming / design partner) is basically a useless toy. And I guess that in tech many folks try LLMs for the same use cases. Try Claude Sonnet 3.5 (not Haiku!) and tell me if, while still flawed, is not helpful.

source

Repository de ce projet :

Ressources :

Projet 2 - "Réaliser un petit projet basé sur NextJS pour le comparer avec SvelteKit" #NextJS, #ReactJS, #svelte, #SvelteKit, #coding, #projet, #POC

Date de la création de cette note : mardi 30 avril 2024.

Quel est l'objectif de ce projet ?

Ce projet remplace l'issue Étudier la version 12 de NextJS que j'ai créé en mars 2023.

Contexte : J'utilise SvelteKit depuis avril 2022, j'apprécie très fortement l'élégence de toutes les fonctionnalités de routing de SvelteKit.

Mon objectif est de créer un projet de type #POC pour apprendre les bases de NextJS et de comparer ce framework avec SvelteKit.

Artefacts à produire :

  • Un repository GitHub qui contient le projet de type POC que j'aurais réaliser pour apprendre à utiliser NextJS
  • Une note d'opinion qui présente ma comparaison entre SvelteKit et NextJS

Objectif secondaire de ce projet:

Je pense pas dire de bétise, en déclarant qu'en 2024 ReactJS est plus populaire que VueJS et Svelte, par conséquent, je pense que maitriser Nuxt me sera utile à l'avenir, par exemple pour des projets en freelance.
Je souhaite ajouter Nuxt sur mon CV.

Repository de ce projet :

Aucun pour le moment.

Ressources :

Projet 17 - Créer un POC de création d'une app smartphone avec Capacitor #projet, #POC, #WebDev, #capacitor

Date de création de cette note : 2024-11-18.

Quel est l'objectif de ce projet ?

Je souhaite apprendre à créer une app smartphone avec Capacitor.

Idéalement, suivre la documentation "Using Capacitor in a Web Project" pour transformer l'app PWA créée dans Projet 16 - Créer un POC d'application PWA en application smartphone.

Capacitor fully supports traditional web and Progressive Web Apps. In fact, using Capacitor makes it easy to ship a PWA version of your iOS and Android app store apps with minimal work.

-- from

Todo :

Repository de ce projet :

Projet 16 - Créer un POC d'application PWA #WebDev, #POC, #projet

Date de création de cette note : 2024-11-18.

Quel est l'objectif de ce projet ?

Je souhaite apprendre à créer des applications web de type Progressive Web Apps (PWA).

J'ai déjà une certaine culture dans ce domaine, mais je n'ai jamais créé d'application de ce type.

Voici les éléments que je souhaite apprendre / tester dans ce POC :

Si possible, j'aimerais implémenter ce POC avec SvelteKit.

Idéalement, j'aimerais intégrer le travail de "Projet GH-339 - Implémenter un POC de Automerge" dans un PWA.

Ressources :

Projet 14 - Script de base d'installation d'un serveur Ubuntu LTS #projet, #DevOps, #security, #admin-sys

Date de création de cette note : 2024-10-11.

Quel est l'objectif de ce projet ?

Je souhaite implémenter et publier un projet de "référence", de type skeleton, dont la fonction est d'installer les éléments de base d'un serveur Ubuntu LTS sécurisé.

Comme point de départ, je peux utiliser mon repository poc-bash-ssh-docker-deployement-example et le faire évoluer.

Le script _install_basic_server_configuration.sh se contente d'installer Docker.

J'aimerais y intégrer les recommandations présentes dans l'excellent article "Securing A Linux Server".

J'aimerais, entre autres, ajouter les fonctionnalités suivantes :

  • [x] Amélioration de la configuration de OpenSSH ;
  • [x] Installation et configuration de ufw ;
  • [x] Mise en place de ipsum ;
  • [x] Installation et configuration de fail2ban ;
  • [x] Système d'installation / suppression de clés ssh ;
  • [x] En option : installation et configuration de node exporter ;
  • [x] En option : installation et configuration de l'envoi des logs de journald et Docker vers Loki en utilisatant Promtail (installation et configuration de l'envoi des logs de journald vers Loki en utilisant Vector) ;
  • [x] En option : installation de configuration de Grafana ; avec Grizzly configuration des dashboards
    • [x] des logs et
    • [x] metrics des serveurs
  • [x] En option : installer et configurer apticron pour envoyer un message dans les logs dès qu'un package de sécurité doit être installé.
    • [x] Génération d'une alerte Grafana si une mise à jour de sécurité doit être installé
  • [x] En option : envoie de notification sur smartphone en cas d'alerte Grafana, via ntfy
  • [ ] En option : installation et configuration de Linux Audit ;

Le repository doit présenter cette installation :

Repository de ce projet :

Ressources :

Projet 13 - "POC Elasticsearch sur un PKM" #projet, #ElasticSearch, #personal-knowledge-management

Date de la création de cette note : 2024-08-17 .

Quel est l'objectif de ce projet ?

Suite à :

Contenu de ce constat, je vais peut-être redonner une chance à Elasticsearch malgré mon aversion pour la JVM 🤔. -- from

et dans le cadre de Projet 11 - "Première version d'un moteur web PKM", je souhaite réaliser une alternative à obsidian-vault-to-pg_search et obsidian-vault-to-typesense basé sur Elasticsearch.

Tâches :

Repository de ce projet :

Ressources :

Projet 12 - "Implémentation nodemailer-scaleway-transport" #scaleway, #admin-sys, #projet, #JaiDécidé, #transports

Date de la création de cette note : 2024-07-30.

Quel est l'objectif de ce projet ?

Implémenter et publier un plugin Nodemailer de transport pour l'API HTTP Transactional Email de Scaleway.

Pourquoi je souhaite réaliser ce projet ?

Les ports SMTP des instances computes de Scaleway sont par défaut fermés. Pour contourner cette contrainte, il est nécessaire d'effectuer une demande au support pour les ouvrir.
Partant de ce constat, #JaiDécidé d'utiliser le protocole HTTP autant que possible pour envoyer des e-mails.

Problème : je n'ai pas trouvé de plugin de transport Nodemailer pour Scaleway, ce qui a motivé la création de ce projet.

Repository de ce projet :

https://github.com/stephane-klein/nodemailer-scaleway-transport (non publié au moment de la rédaction de cette note)

Ressources :

Projet 11 - "Première version d'un moteur web PKM" #projet, #personal-knowledge-management

Date de la création de cette note : 2024-07-16.

Quel est l'objectif de ce projet ?

À partir des POC listés ci-dessous, je souhaite implémenter un moteur HTML de rendu de mon Personal knowledge management, que je nomme sklein-pkm-engine.

Celui-ci sera propulsé par SvelteKit.

Voir plus loin "Objectif détaillé".

Pourquoi je souhaite réaliser ce projet ?

Le 30 avril je disais :

Pour le moment, j'utilise Obsidian Quartz pour déployer https://notes.sklein.xyz.

Est-ce que j'en suis satisfait ? Pour le moment, la réponse est non, parce que je ne le maitrise pas assez.

J'ai une grande envie d'implémenter une version personnelle basée sur SvelteKit et Apache Age, mais j'essaie de ne pas tomber dans ce Yak!.

Via de multiples itérations, je souhaite transformer https://notes.sklein.xyz et https://sklein.xyz vers un site qui s'inspire de gwern.net, Andy's working notes et de Simon Willison - TIL.

Objectif détaillé de ce projet

Dans un premier temps, j'aimerais implémenter une page https://notes.sklein.xyz qui ressemble, par exemple, à la page https://simonwillison.net/2024/Jan/ de Simon Willison.

C'est-à-dire, une page infinie, qui rassemble mes Notes éphémères, avec un système de pagination.

Je souhaite que l'intégralité du contenu de chaque note soit rendue, séparée, par des <hr />.

Pour chaque note, je souhaite, comme dans cet exemple, afficher l'heure et des tags de la note :

Je souhaite aussi séparer les notes par des dates.

La date et l'heure des notes sont définies dans le nom de fichier des notes (YYYY-mm-dd_HHMM.md).

Je souhaite aussi implémenter les pages suivantes :

  • /{date}/ liste toutes les notes d'une journée ;
  • /{note_filename}/ (sans .md) affiche une seule note.

Toutes les notes sont classés à "plat", c'est-à-dire directement à la racine du site /{note_filename}/ (sans .md).

Roadmap

  • [x] Implémentation d'un script qui injecte des nanoid dans le frontmatter de toutes les notes ;
  • [x] Implémentation d'un script qui injecte type: fleeting_note dans toutes les notes qui se trouvent dans le dossier /Notes éphémères/ ;
  • [x] Implémentation d'un script qui injecte type: evergreen_note à toutes les notes sans type ;
  • [x] Implémentation d'un script qui injecte created_at: ISO 8601 sur les Fleeting Note ;
  • [x] /{note_filename}/ (sans .md) affiche une seule Fleeting Note ;
  • [ ] /{date}/ liste toutes les Fleeting Note d'une journée ;
  • [x] / liste de toutes les Fleeting Note de la plus récente à la plus ancienne ;
  • [x] Afficher les Fleeting Note liées aux Evergreen Note en bas des Evergreen Note ;
  • [ ] Afficher les backlink sur les Fleeting Note ;
  • [ ] Afficher les backlink autre que Fleeting Note sur les pages Evergreen Note ;
  • [x] Rendering des wikilink ;
  • [x] Rendering des #tags ;
  • [ ] /tags/{tag_name}/
  • [x] /search/?tags=tagname
  • [x] Support des fichiers binaires (image…)
  • [ ] Rendering des Callouts ;
  • [ ] Permettre de partager un permalien vers une note, basé sur un nanoid ;
  • [ ] Sur la page / implémenter un moteur de recherche, qui permet :
  • [x] Activer l'attribue loading="lazy" sur les images ;
  • [x] Ajouter de la pagination sur / ;
  • [x] Rendering markdown :
    • [x] Rendering des simples liens;
    • [x] Rendering des codes sources.
  • [x] Affichage des tags derrière l'heure : ;
  • [ ] Permettre de remplacer les tages du type JaiDécouvert par J'ai découvert pour simplifier la lecture.
  • [ ] Améliorer le rendu des listes de todo (voici à quoi cela ressemble actuellement Pasted image 20241001115211.png)
  • [ ] Lors du clique sur "Réduire l'affichage de la note", j'aimerais que

Choses que je ne souhaite pas faire

Je souhaite publier quelque chose au plus tôt. Pour cela, dans la première itération, je ne souhaite pas consacrer trop de temps à la mise en forme. Cette première itération sera minimaliste dans son style.

Repository de ce projet :

https://github.com/stephane-klein/sklein-pkm-engine/

Ressources :

Projet 25 - "Évaluer SilverBullet.mb afin d'évaluer sa capacité à remplacer Obsidian pour la gestion de notes.sklein.xyz" #projet, #personal-knowledge-management

Date de la création de cette note : 2025-03-04.

Quel est l'objectif de ce projet ?

Implémenter un POC de SilverBullet.mb afin d'évaluer sa capacité à remplacer Obsidian pour la gestion et l'édition de mon Personal knowledge management : notes.sklein.xyz.

Pourquoi je souhaite réaliser ce projet ?

Je suis le projet SilverBullet.mb depuis plus d'un an. J'aime beaucoup "l'ADN" du projet, ses fonctionnalités et la vision de son auteur.

À la différence d'Obsidian, SilverBullet.mb est un logiciel libre.

J'envisage d'utiliser le plugin Git pour publier du contenu vers notes.sklein.xyz.

Je suis intéressé par le support PWA de SilverBullet.md.

Fonctionnalités à évaluer

Repository de ce projet :

  • poc-silverbullet-for-notes-sklein-xyz (pas encore créé)

Ressources :

Projet 3 - "Réaliser un petit projet basé sur Nuxt pour le comparer avec SvelteKit" #Nuxt, #VueJS, #coding, #svelte, #SvelteKit, #projet, #POC

Date de la création de cette note : mardi 30 avril 2024 .

Quel est l'objectif de ce projet ?

Pour les mêmes raisons qui me motive à réaliser Projet - 2 "Réaliser un petit projet basé sur NextJS pour le comparer avec SvelteKit", je souhaite réaliser la même chose pour Nuxt.

Contexte : J'utilise SvelteKit depuis avril 2022, j'apprécie très fortement l'élégence de toutes les fonctionnalités de routing de SvelteKit.

Mon objectif est de créer un projet de type #POC pour apprendre les bases de Nuxt et de comparer ce framework avec SvelteKit.

Artefacts à produire :

  • Un repository GitHub qui contient le projet de type POC que j'aurais réaliser pour apprendre à utiliser Nuxt
  • Une note d'opinion qui présente ma comparaison entre SvelteKit et NextJS

Projet 29 - "Publier un repository playground de déploiement de Open WebUI sur un cluster Kubernetes" #Kubernetes, #scaleway, #projet, #Inference

Date de la création de cette note : 2025-04-25 .

Quel est l'objectif de ce projet ?

Ce projet est la suite du Projet 28. Le but est de créer un dépôt GitHub playground d'installation d'Open WebUI chez Scaleway, sur un k8s, en utilisant Open WebUI Helm Charts.

Quelques précisions sur l'objectif :

Pourquoi je souhaite réaliser ce projet ?

J'ai commencé une mission liée à Open WebUI, service qui est déployé sur un cluster Kubernetes avec ArgoCD.

Je souhaite mieux comprendre le projet Open WebUI et remettre à niveau mon expérience pratique en Kubernetes.

Repository de ce projet :

Ressources :

Projet GH-271 - Installer Proxmox sur mon serveur NUC Intel i3-5010U, 8Go de Ram #projet, #selfhosting, #proxmox, #DevOps

Ce projet a été initialement commencé dans une issue le 27 juillet 2023.

Objectifs :

Je souhaite documenter mes apprentissages dans des notes.

Ressources :

Dernière page.