Compare commits

...

3 Commits

Author SHA1 Message Date
David Soulayrol 179bb0a850 Ajout de la rubrique rencontres. 2024-03-24 21:29:27 +01:00
Fx 89223cbf2b Relecture billet du 10 mars 2024. 2024-03-11 15:44:33 +01:00
David Soulayrol 0447ef964b Billet et CR de mars. 2024-03-10 11:18:10 +01:00
10 changed files with 258 additions and 12 deletions

View File

@ -9,13 +9,11 @@ Le site est créé à l'aide du logiciel libre [MetalSmith](http://www.metalsmit
### Préparation des sources
**Metalsmith** requiert la disponibilité de **NodeJS** et **npm**. L'installation de ces logiciels dépend du système d'exploitation utilisé.
Les sources peuvent être téléchargées depuis le dépôt **Gitea** ou bien copiées localement à l'aide de **git** avec la commande suivante.
Les sources du site peuvent être téléchargées depuis le dépôt **Gitea** ou bien copiées localement à l'aide de **git** avec la commande suivante.
git clone https://apps.ti-nuage.fr/gitea/ti-nuage/site.git
Le projet s'appuie sur un certain nombre de dépendances, utiles au développement ou à la génération du site lui-même. Pour installer ces dépendances :
Le projet s'appuie sur un certain nombre de dépendances, utiles au développement ou à la génération du site lui-même. Il est tout d'abord nécessaire d'installer **NodeJS** et **npm**. L'installation de ces logiciels dépend du système d'exploitation utilisé. Le reste des dépendances peut alors être assemblé avec la commande suivante.
npm install
@ -32,9 +30,17 @@ La liste des commandes existantes est disponible avec `npm run`. Il est possible
## Structure
Le site de l'association est essentiellement composé de pages statiques. Les billets d'actualité et les comptes-rendus de réunion sont eux-mêmes générés ou assemblés avec le reste des pages du site.
Sauf les exceptions détaillées plus bas, l'ensemble du site de l'association est composé de pages statiques dont les sources figurent dans ce projet. Les billets d'actualité et les comptes-rendus de réunion sont eux-mêmes générés ou assemblés avec le reste des pages du site.
Cependant, afin d'être réactif, l'affichage des événements du calendrier partagé de l'association est effectué depuis le navigateur. Si le navigateur dispose d'un support Javascript actif, alors :
### Supports de conférences
Les documents hébergés dans le projet [ti-nuage/talks](https://forge.ti-nuage.fr/gitea/ti-nuage/talks) peuvent être publiés sur la page /rencontres. Pour ce faire, il faut renseigner la variable d'environnement PATH_TALKS. Par exemple :
PATH_TALKS=../tinuage-talks/documents npm run server
### Intégration du calendrier
Afin d'être réactif, l'affichage des événements du calendrier partagé de l'association est effectué depuis le navigateur. Si le navigateur dispose d'un support Javascript actif, alors :
- les événements à venir sont mixés avec les billets récents du blog dans la rubrique Actualité de la page d'accueil ;
- le menu propose une entrée « Calendrier » à la suite de « Actualité ». Cette nouvelle page présente plus largement les événements récents ou à venir.

View File

@ -0,0 +1,17 @@
---
title: Libre en fête
date: 2024-03-10
author: David Soulayrol
---
L'édition 2024 de [Libre en fête](https://libre-en-fete.net/2024/) a commencé hier et va durer un mois. Ainsi, une nouvelle fois encore, des événements de découverte du Logiciel Libre et de la culture libre vont accompagner l'arrivée du printemps.
Nous participons à cet événement de deux manières. D'abord dès samedi 16 mars en proposant une nouvelle discussion au [café Théodore](http://www.cafetheodore.fr) autour, cette fois, des Conditions Générales d'Utilisation (CGU), ces petites lignes que l'on est censé lire quand on veut s'abonner à un service, et qui sont les plus courtes possible [chez nous](https://www.ti-nuage.fr/cgu.html). Cette rencontre est encore une fois à l'initiative de l'association [Tohu-Bohu](https://www.tohu.eu/) et est également annoncé sur le [programme du café](https://www.cafetheodore.fr/agenda/rencontres-autour-du-numerique-3/).
Ensuite, nous serons présents pour accompagner Nourdine qui propose le 24 mars, dès 9 heures à la salle Victor Hugo de Vieux-Marché, un *Repair Café* éphémère, c'est à dire un lieu ou il est possible d'apporter votre sèche-cheveux ou votre grille-pain récalcitrant pour le remettre en état plutôt que d'en changer. Ce café sera aussi le moment pour une *install party*, c'est à dire un atelier de discussion et d'installation de systèmes libres sur votre ordinateur (si vous prévoyez d'installer linux sur un ordinateur, veillez à sauvegarder vos données sur un disque dur externe).
## Prochains jeudis
Ce 7 mars se tenait notre troisième réunion de l'année. Une réunion à l'affluence surprenante et mémorable. Le compte-rendu est [disponible ici](/cr/2024/cr-20240307.pdf).
Notre prochaine rencontre régulière aura lieu le **4 avril**, toujours à la Hutte. L'ordre du jour se construit sur [ce pad](https://apps.ti-nuage.fr/pad/p/2024-04-reunion-mensuelle). Vous pouvez à tout moment y indiquer votre présence et proposer les sujets que vous voulez voir aborder.

View File

@ -0,0 +1,84 @@
.ND 07/03/2024
.TL
Compte-rendu de Réunion
.br
Jeudi 7 mars 2024 à Vieux-Marché
.AU "David"
.AST "Résumé"
.AS
Cette réunion fut un petit événement dans la vie de l'association, avec dix (10 !) personnes présentes, dont plusieurs membres de l'association Tohu-Bohu, un potentiel nouvel administrateur, une personne ayant envie d'essayer un système libre sur son ordinateur.
Avec pour bilan plein d'idées et d'informations intéressantes, deux nouvelles adhésions et au moins une troisième sans doute pour bientôt...
.AE
.MT 4
.hl
.PRESENT "Benoît, David, Dominique, Félix, Fx, Léna, Mathias, Michelle, Nourdine, Thierry"
.HU "Tohu-bohu et associations voisines"
Une partie du bureau et des animateurs des ateliers numériques de l'association Tohu-Bohu\*F
.FS
.URL https://www.tohu.eu/
.FE
nous a rendu visite.
L'occasion de discuter de la seconde conférence que nous proposerons au café Théodore le 16 mars prochain, à leur invitation, et aussi de faire davantage connaissance de leurs activités et de leurs besoins, à titre collectif ou individuel.
.P
Claire aurait dû être des nôtres ce soir aussi mais a eu un empêchement.
Outre ses besoins personnels d'hébergement Web, elle participe au Kafe\*F
.FS
.URL https://lekafe.fr/
.FE
à Pleumeur-Bodou, espace associatif où sont organisés de manière collégiale des ateliers divers ; réparations, terre cuite...
Elle imagine organiser un week-end autour du numérique, dont la forme et le contenu restent à inventer.
.P
Enfin, Ploum Informatik, mentionnée lors de notre dernière réunion, a été contactée mais n'a pas répondu à notre sollicitation.
.HU "Discussions diverses"
Parmi les sujets abordés, ce compte-rendu doit absolument mentionner le jeu Network & Magic\*F
.FS
.URL https://atelier.aquilenet.fr/projects/communication/wiki/Network_and_Magic
.FE
cité par Fx, nouveau membre enthousiaste déjà très investi dans le libre.
Il s'agit de représenter le parcours d'une requête pour une page Web sur le réseau, chaque joueur interprétant un serveur ; le DNS, Google, Facebook, etc.
Le résultat, très visuel et vivant, est certainement très instructif.
.P
Par ailleurs, les présents ont été invités à questionner le fonctionnement de l'association.
Et ont aussi été abordés l'événement Libre en Fête, le principe du
.I "repair café" ,
les systèmes d'exploitation, les besoins des associations, ... et l'IA.
.HU "Journée d'interconnaissance"
Nous avons été invités à participer à une journée de
.I "rencontre, d'interconnaissance et d'échange entre acteurs du territoire de Lannion-Trégor Communauté" .
Organisée par Lannion-Trégor Communauté en partenariat avec le Hub Bretagne\*F
.FS
.URL https://hub-bretagne.net
.FE
dans le cadre de la démarche PorTReA, laquelle cherche à identifier les besoins et ressources du territoire en matière d'accompagnement au numérique et de mettre en réseau les acteurs locaux.
David ou Nourdine devraient répondre favorablement à l'invitation.
.HU "Accès à Internet"
Nous avions opté il y a un an pour le fournisseur Free, d'une part pour profiter du tarif préférentiel la première année, et d'autre part parce que son offre nous apportait les services réseaux dont nous avions besoin.
L'offre tarifaire est maintenant terminée, et nous envisageons de rejoindre l'association FDN\*F
.FS
.URL https://www.fdn.fr/
.FE
\&.
FDN fournit un accès à Internet nu, mais
.I "propre, neutre et militant" .
David et Nourdine doivent vérifier le coût exact avant très certainement d'adhérer à cette offre.
.HU "Services"
Le logiciel Forgejo\*F
.FS
.URL https://forgejo.org
.FE
a été créé afin de développer une forge similaire à Gitea, que nous utilisons, mais débarrassée de tout contrôle de la part d'une société commerciale.
David propose d'envisager la migration de notre service pour utiliser ce nouvel outil.
Une telle migration est normalement encore assez simple, les deux projets n'ayant pas trop fortement divergé encore.
.HU "Install Party"
Léna nous rendait visite ce soir pour évaluer la possibilité de remplacer le système d'exploitation, et chiffer le disque sur son ordinateur.
Devant l'affluence inattendue, nous avons seulement répondu à quelques questions et l'avons invité à revenir le 24 mars pour le
.I "repair café"
éphémère que propose Nourdine ce jour-là, et qui s'accompagnera d'une
.I "install party"
avec l'aide de membres de l'association.
Cela se déroulera dès 9 heures à la salle Victor Hugo (à la mairie).
.HU "Administration"
Le changement de banque est acté !
Ou presque.
Nous quittons donc le Crédit Coopératif, pour lequel nous avions une préférence mais qui s'est avéré peu... coopératif justement, et très onéreux pour une structure comme la notre.
Nos comptes seront hébergés très bientôt au Crédit Mutuel de Bretagne.

View File

@ -0,0 +1,7 @@
---
permalink: false
title: Rencontres
---
Outre l'accueil offert par l'association le premier jeudi de chaque mois, Ti Nuage va aussi à la rencontre d'autres lieux pour présenter et discuter les thèmes qui lui sont chers : la liberté de l'utilisateur de services numériques et la protection de ses données.
Voici les documents utilisés comme support lors des rencontres, conférences et autres causeries faites par l'association. Tous sont disponibles selon la licence [CC-BY-SA version 2.0 ou ultérieure](https://creativecommons.org/licenses/by-sa/2.0/fr/). Leurs fichiers sources sont disponibles sur notre [forge logicielle](https://forge.ti-nuage.fr/gitea/ti-nuage/talks).

View File

@ -21,6 +21,7 @@
<ul id="menu-association">
<li><a href="/association.html">Découvrir l'association</a></li>
<li><a href="/blog">Actualités</a></li>
<li><a href="/rencontres">Rencontres</a></li>
</ul>
</section>
<section>

View File

@ -6,9 +6,9 @@
"main": "",
"scripts": {
"build": "npm run clean && npm run build:metalsmith",
"build:prod": "NODE_ENV=production npm run build",
"build:metalsmith": "node scripts/run.js build",
"clean": "rimraf dist",
"build:prod": "NODE_ENV=production npm run build",
"clean": "rimraf dist && rm -rf content/talks",
"dev": "npm run build && nodemon scripts/run.js serve",
"server": "npm run build && http-server dist",
"deploy": "npm run build:prod && cd dist && rsync -v -rlptz --relative -e \"ssh -p $SERVER_PORT\" ./ $SERVER_PATH",

View File

@ -9,6 +9,7 @@ module.exports = {
hostname,
paths: {
projectRoot,
talksRoot: process.env.PATH_TALKS,
/* Nodes */
leaflet: join(projectRoot, 'node_modules', 'leaflet', 'dist'),
/* Metalsmith */

View File

@ -10,10 +10,9 @@ function plugin (options) {
return function (files, metalsmith, done) {
const dest = options.destination
const items = options.files.length
const promises = []
const addTask = function (promise) {
const addTask = function (items, promise) {
promises.push(promise)
if (items === promises.length) {
debug('Waiting for ' + items + 'copy operations.')
@ -27,8 +26,19 @@ function plugin (options) {
}
}
options.files.forEach((filename) => {
addTask(new Promise(function (resolve, reject) {
const iterateFiles = function (options, action) {
if (options.files != null) {
options.files.forEach((filename) => action(filename, options.files.length))
}
if (options.generator != null) {
options.generator(documents => {
documents.forEach((filename) => action(filename, documents.length))
})
}
}
iterateFiles(options, (filename, items) => {
addTask(items, new Promise(function (resolve, reject) {
fs.stat(filename, function (err, stats) {
if (err) return reject(err)
fs.readFile(filename, function (err, buffer) {

View File

@ -0,0 +1,97 @@
const { Buffer } = require('node:buffer')
const config = require('./config.js')
const debug = require('debug')('metalsmith-tinuage-talks')
const path = require('path')
module.exports = plugin
/**
* Un plugin pour Metalsmith qui lit une collection de fichiers PDF la section
* rencontres du site.
*
* @return {Function}
*/
function plugin () {
const IndexCreator = {
setup: function (page) {
this.page = page
this.talks = []
},
add: function (filename) {
const basename = path.basename(filename)
const names = basename.substring(0, basename.lastIndexOf('.')).split('__')
if (names.length >= 2) {
const name = names[0].replaceAll('_', ' ')
const location = names[1].substring(0, names[1].lastIndexOf('_')).replaceAll('_', ' ')
const year = names[1].substring(names[1].lastIndexOf('_') + 1)
const talk = this.getEntry(year, location, name)
if (names.length === 3 && names[2] === ('notes')) {
talk.notes = filename
} else {
talk.doc = filename
}
} else {
console.log('Ignoring talk ' + filename)
}
},
fill: function (files) {
let html = ''
this.talks
.reduce(
(map, talk) => {
(map.get(talk.year) || map.set(talk.year, []).get(talk.year)).push(talk)
return map
},
new Map())
.forEach((talks, year) => {
html += '<h2>' + year + '</h2>\n'
talks
.sort((a, b) => a.year - b.year || a.title - b.title)
.forEach(talk => {
html += '<p>' + talk.title + ', ' + talk.location + '&nbsp;: <a href="/' + talk.doc + '">Présentation</a>, <a href="/' + talk.notes + '">Notes</a></p>\n'
})
})
this.page.contents = Buffer.concat([
this.page.contents,
Buffer.from(html)
])
},
getEntry: function (year, location, title) {
let talk = this.talks.find(t => t.year === year && t.location === location && t.title === title)
if (talk == null) {
talk = { location, title, year }
this.talks.push(talk)
}
return talk
}
}
return function (files, metalsmith, done) {
if (config.paths.talksRoot) {
const creator = Object.create(IndexCreator)
creator.setup(files['rencontres/index.html'])
Object.keys(files).forEach(filename => {
if (/^rencontres\/.*\.pdf$/.test(filename)) {
debug('Handling', filename)
creator.add(filename)
}
})
creator.fill()
}
done()
}
}

View File

@ -7,6 +7,7 @@ const config = require('./config.js')
const collections = require('@metalsmith/collections')
const copy = require('./metalsmith-copy')
const excerpts = require('@metalsmith/excerpts')
const fs = require('node:fs')
const groff = require('metalsmith-groff')
const layouts = require('@metalsmith/layouts')
const Metalsmith = require('metalsmith')
@ -15,6 +16,7 @@ const marked = require('marked')
const permalinks = require('@metalsmith/permalinks')
const rename = require('metalsmith-rename')
const services = require('./metalsmith-tinuage-services')
const talks = require('./metalsmith-tinuage-talks')
const sitemap = require('metalsmith-sitemap')
const slug = require('slug')
const statistics = require('./metalsmith-statistics-plugin')
@ -77,6 +79,26 @@ module.exports = new Metalsmith(config.paths.projectRoot)
files: [join(config.paths.leaflet, 'leaflet.css')],
destination: './css'
}))
.use(copy({
generator: (callback) => {
if (config.paths.talksRoot != null) {
return fs.readdir(config.paths.talksRoot, (err, filenames) => {
let documents = []
if (err) {
console.error('%s: %s', config.paths.talksRoot, err)
} else {
documents = filenames
.filter(f => { return f.indexOf('.pdf') !== -1 })
.map(f => { return join(config.paths.talksRoot, f) })
}
callback(documents)
})
}
},
destination: './rencontres'
}))
.use(copy({
files: [
join(config.paths.leaflet, 'images', 'marker-icon.png'),
@ -106,6 +128,7 @@ module.exports = new Metalsmith(config.paths.projectRoot)
}))
.use(chatons())
.use(services())
.use(talks())
.use(excerpts())
.use(permalinks({
pattern: 'blog/:date/:title',